/ Hex Artifact Content
Login

Artifact cf5e10af9125b245f1b962e8ba4d520a37818795:


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 7d 0a 20 20 77 68 69 6c 65 28 20 6e 4e 65    }.  while( nNe
16e0: 65 64 6c 65 3c 3d 6e 48 61 79 73 74 61 63 6b 20  edle<=nHaystack 
16f0: 26 26 20 6d 65 6d 63 6d 70 28 7a 48 61 79 73 74  && memcmp(zHayst
1700: 61 63 6b 2c 20 7a 4e 65 65 64 6c 65 2c 20 6e 4e  ack, zNeedle, nN
1710: 65 65 64 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20  eedle)!=0 ){.   
1720: 20 4e 2b 2b 3b 0a 20 20 20 20 64 6f 7b 0a 20 20   N++;.    do{.  
1730: 20 20 20 20 6e 48 61 79 73 74 61 63 6b 2d 2d 3b      nHaystack--;
1740: 0a 20 20 20 20 20 20 7a 48 61 79 73 74 61 63 6b  .      zHaystack
1750: 2b 2b 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ++;.    }while( 
1760: 69 73 54 65 78 74 20 26 26 20 28 7a 48 61 79 73  isText && (zHays
1770: 74 61 63 6b 5b 30 5d 26 30 78 63 30 29 3d 3d 30  tack[0]&0xc0)==0
1780: 78 38 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  x80 );.  }.  if(
1790: 20 6e 4e 65 65 64 6c 65 3e 6e 48 61 79 73 74 61   nNeedle>nHaysta
17a0: 63 6b 20 29 20 4e 20 3d 20 30 3b 0a 20 20 73 71  ck ) N = 0;.  sq
17b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
17c0: 28 63 6f 6e 74 65 78 74 2c 20 4e 29 3b 0a 7d 0a  (context, N);.}.
17d0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
17e0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 69  ation of the pri
17f0: 6e 74 66 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ntf() function..
1800: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1810: 72 69 6e 74 66 46 75 6e 63 28 0a 20 20 73 71 6c  rintfFunc(.  sql
1820: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1830: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
1840: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
1850: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50  ue **argv.){.  P
1860: 72 69 6e 74 66 41 72 67 75 6d 65 6e 74 73 20 78  rintfArguments x
1870: 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 73 74 72  ;.  StrAccum str
1880: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1890: 7a 46 6f 72 6d 61 74 3b 0a 20 20 69 6e 74 20 6e  zFormat;.  int n
18a0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
18b0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
18c0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
18d0: 65 78 74 29 3b 0a 0a 20 20 69 66 28 20 61 72 67  ext);..  if( arg
18e0: 63 3e 3d 31 20 26 26 20 28 7a 46 6f 72 6d 61 74  c>=1 && (zFormat
18f0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1900: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1910: 78 74 28 61 72 67 76 5b 30 5d 29 29 21 3d 30 20  xt(argv[0]))!=0 
1920: 29 7b 0a 20 20 20 20 78 2e 6e 41 72 67 20 3d 20  ){.    x.nArg = 
1930: 61 72 67 63 2d 31 3b 0a 20 20 20 20 78 2e 6e 55  argc-1;.    x.nU
1940: 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 78 2e 61  sed = 0;.    x.a
1950: 70 41 72 67 20 3d 20 61 72 67 76 2b 31 3b 0a 20  pArg = argv+1;. 
1960: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
1970: 75 6d 49 6e 69 74 28 26 73 74 72 2c 20 64 62 2c  umInit(&str, db,
1980: 20 30 2c 20 30 2c 20 64 62 2d 3e 61 4c 69 6d 69   0, 0, db->aLimi
1990: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
19a0: 45 4e 47 54 48 5d 29 3b 0a 20 20 20 20 73 71 6c  ENGTH]);.    sql
19b0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72  ite3XPrintf(&str
19c0: 2c 20 53 51 4c 49 54 45 5f 50 52 49 4e 54 46 5f  , SQLITE_PRINTF_
19d0: 53 51 4c 46 55 4e 43 2c 20 7a 46 6f 72 6d 61 74  SQLFUNC, zFormat
19e0: 2c 20 26 78 29 3b 0a 20 20 20 20 6e 20 3d 20 73  , &x);.    n = s
19f0: 74 72 2e 6e 43 68 61 72 3b 0a 20 20 20 20 73 71  tr.nChar;.    sq
1a00: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
1a10: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
1a20: 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
1a30: 28 26 73 74 72 29 2c 20 6e 2c 0a 20 20 20 20 20  (&str), n,.     
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49     SQLITE_DYNAMI
1a60: 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
1a70: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
1a80: 6f 66 20 74 68 65 20 73 75 62 73 74 72 28 29 20  of the substr() 
1a90: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
1aa0: 73 75 62 73 74 72 28 78 2c 70 31 2c 70 32 29 20  substr(x,p1,p2) 
1ab0: 20 72 65 74 75 72 6e 73 20 70 32 20 63 68 61 72   returns p2 char
1ac0: 61 63 74 65 72 73 20 6f 66 20 78 5b 5d 20 62 65  acters of x[] be
1ad0: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 70 31 2e  ginning with p1.
1ae0: 0a 2a 2a 20 70 31 20 69 73 20 31 2d 69 6e 64 65  .** p1 is 1-inde
1af0: 78 65 64 2e 20 20 53 6f 20 73 75 62 73 74 72 28  xed.  So substr(
1b00: 78 2c 31 2c 31 29 20 72 65 74 75 72 6e 73 20 74  x,1,1) returns t
1b10: 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
1b20: 65 72 0a 2a 2a 20 6f 66 20 78 2e 20 20 49 66 20  er.** of x.  If 
1b30: 78 20 69 73 20 74 65 78 74 2c 20 74 68 65 6e 20  x is text, then 
1b40: 77 65 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e  we actually coun
1b50: 74 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65  t UTF-8 characte
1b60: 72 73 2e 0a 2a 2a 20 49 66 20 78 20 69 73 20 61  rs..** If x is a
1b70: 20 62 6c 6f 62 2c 20 74 68 65 6e 20 77 65 20 63   blob, then we c
1b80: 6f 75 6e 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ount bytes..**.*
1b90: 2a 20 49 66 20 70 31 20 69 73 20 6e 65 67 61 74  * If p1 is negat
1ba0: 69 76 65 2c 20 74 68 65 6e 20 77 65 20 62 65 67  ive, then we beg
1bb0: 69 6e 20 61 62 73 28 70 31 29 20 66 72 6f 6d 20  in abs(p1) from 
1bc0: 74 68 65 20 65 6e 64 20 6f 66 20 78 5b 5d 2e 0a  the end of x[]..
1bd0: 2a 2a 0a 2a 2a 20 49 66 20 70 32 20 69 73 20 6e  **.** If p2 is n
1be0: 65 67 61 74 69 76 65 2c 20 72 65 74 75 72 6e 20  egative, return 
1bf0: 74 68 65 20 70 32 20 63 68 61 72 61 63 74 65 72  the p2 character
1c00: 73 20 70 72 65 63 65 64 69 6e 67 20 70 31 2e 0a  s preceding p1..
1c10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1c20: 75 62 73 74 72 46 75 6e 63 28 0a 20 20 73 71 6c  ubstrFunc(.  sql
1c30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1c40: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
1c50: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
1c60: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
1c70: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1c80: 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 75  ar *z;.  const u
1c90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 32  nsigned char *z2
1ca0: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69  ;.  int len;.  i
1cb0: 6e 74 20 70 30 74 79 70 65 3b 0a 20 20 69 36 34  nt p0type;.  i64
1cc0: 20 70 31 2c 20 70 32 3b 0a 20 20 69 6e 74 20 6e   p1, p2;.  int n
1cd0: 65 67 50 32 20 3d 20 30 3b 0a 0a 20 20 61 73 73  egP2 = 0;..  ass
1ce0: 65 72 74 28 20 61 72 67 63 3d 3d 33 20 7c 7c 20  ert( argc==3 || 
1cf0: 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28  argc==2 );.  if(
1d00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
1d10: 79 70 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51  ype(argv[1])==SQ
1d20: 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 7c 7c 20  LITE_NULL.   || 
1d30: 28 61 72 67 63 3d 3d 33 20 26 26 20 73 71 6c 69  (argc==3 && sqli
1d40: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
1d50: 72 67 76 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[2])==SQLITE_
1d60: 4e 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 72  NULL).  ){.    r
1d70: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 30 74  eturn;.  }.  p0t
1d80: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ype = sqlite3_va
1d90: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
1da0: 29 3b 0a 20 20 70 31 20 3d 20 73 71 6c 69 74 65  );.  p1 = sqlite
1db0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
1dc0: 5b 31 5d 29 3b 0a 20 20 69 66 28 20 70 30 74 79  [1]);.  if( p0ty
1dd0: 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe==SQLITE_BLOB 
1de0: 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c  ){.    len = sql
1df0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
1e00: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 7a  (argv[0]);.    z
1e10: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1e20: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
1e30: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72      if( z==0 ) r
1e40: 65 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72  eturn;.    asser
1e50: 74 28 20 6c 65 6e 3d 3d 73 71 6c 69 74 65 33 5f  t( len==sqlite3_
1e60: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
1e70: 5b 30 5d 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  [0]) );.  }else{
1e80: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
1e90: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1ea0: 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  [0]);.    if( z=
1eb0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
1ec0: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66   len = 0;.    if
1ed0: 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( p1<0 ){.      
1ee0: 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32 3b 20 6c  for(z2=z; *z2; l
1ef0: 65 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 53  en++){.        S
1f00: 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28  QLITE_SKIP_UTF8(
1f10: 7a 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  z2);.      }.   
1f20: 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
1f30: 4c 49 54 45 5f 53 55 42 53 54 52 5f 43 4f 4d 50  LITE_SUBSTR_COMP
1f40: 41 54 49 42 49 4c 49 54 59 0a 20 20 2f 2a 20 49  ATIBILITY.  /* I
1f50: 66 20 53 55 42 53 54 52 5f 43 4f 4d 50 41 54 49  f SUBSTR_COMPATI
1f60: 42 49 4c 49 54 59 20 69 73 20 64 65 66 69 6e 65  BILITY is define
1f70: 64 20 74 68 65 6e 20 73 75 62 73 74 72 28 58 2c  d then substr(X,
1f80: 30 2c 4e 29 20 77 6f 72 6b 20 74 68 65 20 73 61  0,N) work the sa
1f90: 6d 65 20 61 73 0a 20 20 2a 2a 20 61 73 20 73 75  me as.  ** as su
1fa0: 62 73 74 72 28 58 2c 31 2c 4e 29 20 2d 20 69 74  bstr(X,1,N) - it
1fb0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 66 69 72   returns the fir
1fc0: 73 74 20 4e 20 63 68 61 72 61 63 74 65 72 73 20  st N characters 
1fd0: 6f 66 20 58 2e 20 20 54 68 69 73 0a 20 20 2a 2a  of X.  This.  **
1fe0: 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20   is essentially 
1ff0: 61 20 62 61 63 6b 2d 6f 75 74 20 6f 66 20 74 68  a back-out of th
2000: 65 20 62 75 67 2d 66 69 78 20 69 6e 20 63 68 65  e bug-fix in che
2010: 63 6b 2d 69 6e 20 5b 35 66 63 31 32 35 64 33 36  ck-in [5fc125d36
2020: 32 64 66 34 62 38 5d 0a 20 20 2a 2a 20 66 72 6f  2df4b8].  ** fro
2030: 6d 20 32 30 30 39 2d 30 32 2d 30 32 20 66 6f 72  m 2009-02-02 for
2040: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f   compatibility o
2050: 66 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74  f applications t
2060: 68 61 74 20 65 78 70 6c 6f 69 74 65 64 20 74 68  hat exploited th
2070: 65 0a 20 20 2a 2a 20 6f 6c 64 20 62 75 67 67 79  e.  ** old buggy
2080: 20 62 65 68 61 76 69 6f 72 2e 20 2a 2f 0a 20 20   behavior. */.  
2090: 69 66 28 20 70 31 3d 3d 30 20 29 20 70 31 20 3d  if( p1==0 ) p1 =
20a0: 20 31 3b 20 2f 2a 20 3c 72 64 61 72 3a 2f 2f 70   1; /* <rdar://p
20b0: 72 6f 62 6c 65 6d 2f 36 37 37 38 33 33 39 3e 20  roblem/6778339> 
20c0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  */.#endif.  if( 
20d0: 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20 70  argc==3 ){.    p
20e0: 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  2 = sqlite3_valu
20f0: 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a  e_int(argv[2]);.
2100: 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 7b 0a      if( p2<0 ){.
2110: 20 20 20 20 20 20 70 32 20 3d 20 2d 70 32 3b 0a        p2 = -p2;.
2120: 20 20 20 20 20 20 6e 65 67 50 32 20 3d 20 31 3b        negP2 = 1;
2130: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2140: 20 20 20 20 70 32 20 3d 20 73 71 6c 69 74 65 33      p2 = sqlite3
2150: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
2160: 6c 65 28 63 6f 6e 74 65 78 74 29 2d 3e 61 4c 69  le(context)->aLi
2170: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
2180: 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 7d 0a 20 20  _LENGTH];.  }.  
2190: 69 66 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20  if( p1<0 ){.    
21a0: 70 31 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 69  p1 += len;.    i
21b0: 66 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20  f( p1<0 ){.     
21c0: 20 70 32 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20   p2 += p1;.     
21d0: 20 69 66 28 20 70 32 3c 30 20 29 20 70 32 20 3d   if( p2<0 ) p2 =
21e0: 20 30 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 30   0;.      p1 = 0
21f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
2200: 69 66 28 20 70 31 3e 30 20 29 7b 0a 20 20 20 20  if( p1>0 ){.    
2210: 70 31 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66  p1--;.  }else if
2220: 28 20 70 32 3e 30 20 29 7b 0a 20 20 20 20 70 32  ( p2>0 ){.    p2
2230: 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  --;.  }.  if( ne
2240: 67 50 32 20 29 7b 0a 20 20 20 20 70 31 20 2d 3d  gP2 ){.    p1 -=
2250: 20 70 32 3b 0a 20 20 20 20 69 66 28 20 70 31 3c   p2;.    if( p1<
2260: 30 20 29 7b 0a 20 20 20 20 20 20 70 32 20 2b 3d  0 ){.      p2 +=
2270: 20 70 31 3b 0a 20 20 20 20 20 20 70 31 20 3d 20   p1;.      p1 = 
2280: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  0;.    }.  }.  a
2290: 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
22a0: 70 32 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  p2>=0 );.  if( p
22b0: 30 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 42 4c  0type!=SQLITE_BL
22c0: 4f 42 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  OB ){.    while(
22d0: 20 2a 7a 20 26 26 20 70 31 20 29 7b 0a 20 20 20   *z && p1 ){.   
22e0: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
22f0: 54 46 38 28 7a 29 3b 0a 20 20 20 20 20 20 70 31  TF8(z);.      p1
2300: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  --;.    }.    fo
2310: 72 28 7a 32 3d 7a 3b 20 2a 7a 32 20 26 26 20 70  r(z2=z; *z2 && p
2320: 32 3b 20 70 32 2d 2d 29 7b 0a 20 20 20 20 20 20  2; p2--){.      
2330: 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38  SQLITE_SKIP_UTF8
2340: 28 7a 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  (z2);.    }.    
2350: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
2360: 65 78 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28  ext64(context, (
2370: 63 68 61 72 2a 29 7a 2c 20 7a 32 2d 7a 2c 20 53  char*)z, z2-z, S
2380: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2c  QLITE_TRANSIENT,
2390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23a0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
23b0: 45 5f 55 54 46 38 29 3b 0a 20 20 7d 65 6c 73 65  E_UTF8);.  }else
23c0: 7b 0a 20 20 20 20 69 66 28 20 70 31 2b 70 32 3e  {.    if( p1+p2>
23d0: 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20 70 32 20  len ){.      p2 
23e0: 3d 20 6c 65 6e 2d 70 31 3b 0a 20 20 20 20 20 20  = len-p1;.      
23f0: 69 66 28 20 70 32 3c 30 20 29 20 70 32 20 3d 20  if( p2<0 ) p2 = 
2400: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  0;.    }.    sql
2410: 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
2420: 36 34 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  64(context, (cha
2430: 72 2a 29 26 7a 5b 70 31 5d 2c 20 28 75 36 34 29  r*)&z[p1], (u64)
2440: 70 32 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  p2, SQLITE_TRANS
2450: 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  IENT);.  }.}../*
2460: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2470: 6f 6e 20 6f 66 20 74 68 65 20 72 6f 75 6e 64 28  on of the round(
2480: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 23 69  ) function.*/.#i
2490: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24a0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
24b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 75  .static void rou
24c0: 6e 64 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ndFunc(sqlite3_c
24d0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
24e0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
24f0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
2500: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
2510: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61   double r;.  cha
2520: 72 20 2a 7a 42 75 66 3b 0a 20 20 61 73 73 65 72  r *zBuf;.  asser
2530: 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72  t( argc==1 || ar
2540: 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 61  gc==2 );.  if( a
2550: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66  rgc==2 ){.    if
2560: 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73  ( SQLITE_NULL==s
2570: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2580: 65 28 61 72 67 76 5b 31 5d 29 20 29 20 72 65 74  e(argv[1]) ) ret
2590: 75 72 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  urn;.    n = sql
25a0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
25b0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[1]);.    if(
25c0: 20 6e 3e 33 30 20 29 20 6e 20 3d 20 33 30 3b 0a   n>30 ) n = 30;.
25d0: 20 20 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20      if( n<0 ) n 
25e0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
25f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2600: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
2610: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
2620: 3b 0a 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  r = sqlite3_
2630: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
2640: 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20 49 66 20 59  v[0]);.  /* If Y
2650: 3d 3d 30 20 61 6e 64 20 58 20 77 69 6c 6c 20 66  ==0 and X will f
2660: 69 74 20 69 6e 20 61 20 36 34 2d 62 69 74 20 69  it in a 64-bit i
2670: 6e 74 2c 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  nt,.  ** handle 
2680: 74 68 65 20 72 6f 75 6e 64 69 6e 67 20 64 69 72  the rounding dir
2690: 65 63 74 6c 79 2c 0a 20 20 2a 2a 20 6f 74 68 65  ectly,.  ** othe
26a0: 72 77 69 73 65 20 75 73 65 20 70 72 69 6e 74 66  rwise use printf
26b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 3d 3d  ..  */.  if( n==
26c0: 30 20 26 26 20 72 3e 3d 30 20 26 26 20 72 3c 4c  0 && r>=0 && r<L
26d0: 41 52 47 45 53 54 5f 49 4e 54 36 34 2d 31 20 29  ARGEST_INT64-1 )
26e0: 7b 0a 20 20 20 20 72 20 3d 20 28 64 6f 75 62 6c  {.    r = (doubl
26f0: 65 29 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34  e)((sqlite_int64
2700: 29 28 72 2b 30 2e 35 29 29 3b 0a 20 20 7d 65 6c  )(r+0.5));.  }el
2710: 73 65 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 72  se if( n==0 && r
2720: 3c 30 20 26 26 20 28 2d 72 29 3c 4c 41 52 47 45  <0 && (-r)<LARGE
2730: 53 54 5f 49 4e 54 36 34 2d 31 20 29 7b 0a 20 20  ST_INT64-1 ){.  
2740: 20 20 72 20 3d 20 2d 28 64 6f 75 62 6c 65 29 28    r = -(double)(
2750: 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 28 28  (sqlite_int64)((
2760: 2d 72 29 2b 30 2e 35 29 29 3b 0a 20 20 7d 65 6c  -r)+0.5));.  }el
2770: 73 65 7b 0a 20 20 20 20 7a 42 75 66 20 3d 20 73  se{.    zBuf = s
2780: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2790: 25 2e 2a 66 22 2c 6e 2c 72 29 3b 0a 20 20 20 20  %.*f",n,r);.    
27a0: 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 7b 0a 20  if( zBuf==0 ){. 
27b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
27c0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
27d0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
27e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
27f0: 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 42    sqlite3AtoF(zB
2800: 75 66 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53  uf, &r, sqlite3S
2810: 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 2c 20 53  trlen30(zBuf), S
2820: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
2830: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
2840: 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  uf);.  }.  sqlit
2850: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2860: 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 7d 0a  (context, r);.}.
2870: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c  #endif../*.** Al
2880: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
2890: 65 73 20 6f 66 20 73 70 61 63 65 20 75 73 69 6e  es of space usin
28a0: 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  g sqlite3Malloc(
28b0: 29 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 6c 6c  ). If the.** all
28c0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 63  ocation fails, c
28d0: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 72 65 73 75  all sqlite3_resu
28e0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 29  lt_error_nomem()
28f0: 20 74 6f 20 6e 6f 74 69 66 79 0a 2a 2a 20 74 68   to notify.** th
2900: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
2910: 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 28 29 20  e that malloc() 
2920: 68 61 73 20 66 61 69 6c 65 64 20 61 6e 64 20 72  has failed and r
2930: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20 49  eturn NULL..** I
2940: 66 20 6e 42 79 74 65 20 69 73 20 6c 61 72 67 65  f nByte is large
2950: 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d  r than the maxim
2960: 75 6d 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f  um string or blo
2970: 62 20 6c 65 6e 67 74 68 2c 20 74 68 65 6e 0a 2a  b length, then.*
2980: 2a 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49 54  * raise an SQLIT
2990: 45 5f 54 4f 4f 42 49 47 20 65 78 63 65 70 74 69  E_TOOBIG excepti
29a0: 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  on and return NU
29b0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
29c0: 69 64 20 2a 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  id *contextMallo
29d0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
29e0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 36 34 20  t *context, i64 
29f0: 6e 42 79 74 65 29 7b 0a 20 20 63 68 61 72 20 2a  nByte){.  char *
2a00: 7a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  z;.  sqlite3 *db
2a10: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
2a20: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
2a30: 74 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28  text);.  assert(
2a40: 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20 74 65   nByte>0 );.  te
2a50: 73 74 63 61 73 65 28 20 6e 42 79 74 65 3d 3d 64  stcase( nByte==d
2a60: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
2a70: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
2a80: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 42  ;.  testcase( nB
2a90: 79 74 65 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  yte==db->aLimit[
2aa0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
2ab0: 47 54 48 5d 2b 31 20 29 3b 0a 20 20 69 66 28 20  GTH]+1 );.  if( 
2ac0: 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74  nByte>db->aLimit
2ad0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
2ae0: 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c  NGTH] ){.    sql
2af0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2b00: 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74  r_toobig(context
2b10: 29 3b 0a 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20  );.    z = 0;.  
2b20: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
2b30: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 42 79  qlite3Malloc(nBy
2b40: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 20  te);.    if( !z 
2b50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2b60: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
2b70: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
2b80: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2b90: 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70   z;.}../*.** Imp
2ba0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
2bb0: 68 65 20 75 70 70 65 72 28 29 20 61 6e 64 20 6c  he upper() and l
2bc0: 6f 77 65 72 28 29 20 53 51 4c 20 66 75 6e 63 74  ower() SQL funct
2bd0: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
2be0: 76 6f 69 64 20 75 70 70 65 72 46 75 6e 63 28 73  void upperFunc(s
2bf0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2c00: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
2c10: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
2c20: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72   **argv){.  char
2c30: 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *z1;.  const ch
2c40: 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 69 2c  ar *z2;.  int i,
2c50: 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   n;.  UNUSED_PAR
2c60: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
2c70: 7a 32 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  z2 = (char*)sqli
2c80: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
2c90: 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73  rgv[0]);.  n = s
2ca0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
2cb0: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f  es(argv[0]);.  /
2cc0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
2cd0: 65 20 63 61 6c 6c 20 74 6f 20 5f 62 79 74 65 73  e call to _bytes
2ce0: 28 29 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61  () does not inva
2cf0: 6c 69 64 61 74 65 20 74 68 65 20 5f 74 65 78 74  lidate the _text
2d00: 28 29 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  () pointer */.  
2d10: 61 73 73 65 72 74 28 20 7a 32 3d 3d 28 63 68 61  assert( z2==(cha
2d20: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
2d30: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29  _text(argv[0]) )
2d40: 3b 0a 20 20 69 66 28 20 7a 32 20 29 7b 0a 20 20  ;.  if( z2 ){.  
2d50: 20 20 7a 31 20 3d 20 63 6f 6e 74 65 78 74 4d 61    z1 = contextMa
2d60: 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28  lloc(context, ((
2d70: 69 36 34 29 6e 29 2b 31 29 3b 0a 20 20 20 20 69  i64)n)+1);.    i
2d80: 66 28 20 7a 31 20 29 7b 0a 20 20 20 20 20 20 66  f( z1 ){.      f
2d90: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
2da0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 31 5b 69 5d  ){.        z1[i]
2db0: 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65 33   = (char)sqlite3
2dc0: 54 6f 75 70 70 65 72 28 7a 32 5b 69 5d 29 3b 0a  Toupper(z2[i]);.
2dd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2de0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
2df0: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 31 2c 20 6e  t(context, z1, n
2e00: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
2e10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
2e20: 74 69 63 20 76 6f 69 64 20 6c 6f 77 65 72 46 75  tic void lowerFu
2e30: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
2e40: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
2e50: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
2e60: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
2e70: 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73  char *z1;.  cons
2e80: 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e  t char *z2;.  in
2e90: 74 20 69 2c 20 6e 3b 0a 20 20 55 4e 55 53 45 44  t i, n;.  UNUSED
2ea0: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
2eb0: 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72 2a 29  ;.  z2 = (char*)
2ec0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
2ed0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e  xt(argv[0]);.  n
2ee0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2ef0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
2f00: 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
2f10: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f 62  t the call to _b
2f20: 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f 74 20  ytes() does not 
2f30: 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 5f  invalidate the _
2f40: 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72 20 2a  text() pointer *
2f50: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32 3d 3d  /.  assert( z2==
2f60: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
2f70: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
2f80: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32 20 29  ]) );.  if( z2 )
2f90: 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74 65  {.    z1 = conte
2fa0: 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74  xtMalloc(context
2fb0: 2c 20 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a 20  , ((i64)n)+1);. 
2fc0: 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20 20 20     if( z1 ){.   
2fd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
2fe0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a   i++){.        z
2ff0: 31 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f  1[i] = sqlite3To
3000: 6c 6f 77 65 72 28 7a 32 5b 69 5d 29 3b 0a 20 20  lower(z2[i]);.  
3010: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
3020: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
3030: 63 6f 6e 74 65 78 74 2c 20 7a 31 2c 20 6e 2c 20  context, z1, n, 
3040: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
3050: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
3060: 2a 20 53 6f 6d 65 20 66 75 6e 63 74 69 6f 6e 73  * Some functions
3070: 20 6c 69 6b 65 20 43 4f 41 4c 45 53 43 45 28 29   like COALESCE()
3080: 20 61 6e 64 20 49 46 4e 55 4c 4c 28 29 20 61 6e   and IFNULL() an
3090: 64 20 55 4e 4c 49 4b 45 4c 59 28 29 20 61 72 65  d UNLIKELY() are
30a0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
30b0: 61 73 20 56 44 42 45 20 63 6f 64 65 20 73 6f 20  as VDBE code so 
30c0: 74 68 61 74 20 75 6e 75 73 65 64 20 61 72 67 75  that unused argu
30d0: 6d 65 6e 74 20 76 61 6c 75 65 73 20 64 6f 20 6e  ment values do n
30e0: 6f 74 20 68 61 76 65 20 74 6f 20 62 65 20 63 6f  ot have to be co
30f0: 6d 70 75 74 65 64 2e 0a 2a 2a 20 48 6f 77 65 76  mputed..** Howev
3100: 65 72 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  er, we still nee
3110: 64 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 66  d some kind of f
3120: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
3130: 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 0a  tation for this.
3140: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
3150: 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 61 62 6c  he function tabl
3160: 65 2e 20 20 54 68 65 20 6e 6f 6f 70 46 75 6e 63  e.  The noopFunc
3170: 20 6d 61 63 72 6f 20 70 72 6f 76 69 64 65 73 20   macro provides 
3180: 74 68 69 73 2e 0a 2a 2a 20 6e 6f 6f 70 46 75 6e  this..** noopFun
3190: 63 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  c will never be 
31a0: 63 61 6c 6c 65 64 20 73 6f 20 69 74 20 64 6f 65  called so it doe
31b0: 73 6e 27 74 20 6d 61 74 74 65 72 20 77 68 61 74  sn't matter what
31c0: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
31d0: 69 6f 6e 0a 2a 2a 20 69 73 2e 20 20 57 65 20 6d  ion.** is.  We m
31e0: 69 67 68 74 20 61 73 20 77 65 6c 6c 20 75 73 65  ight as well use
31f0: 20 74 68 65 20 22 76 65 72 73 69 6f 6e 28 29 22   the "version()"
3200: 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 61 20 73   function as a s
3210: 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 64  ubstitute..*/.#d
3220: 65 66 69 6e 65 20 6e 6f 6f 70 46 75 6e 63 20 76  efine noopFunc v
3230: 65 72 73 69 6f 6e 46 75 6e 63 20 20 20 2f 2a 20  ersionFunc   /* 
3240: 53 75 62 73 74 69 74 75 74 65 20 66 75 6e 63 74  Substitute funct
3250: 69 6f 6e 20 2d 20 6e 65 76 65 72 20 63 61 6c 6c  ion - never call
3260: 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  ed */../*.** Imp
3270: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72  lementation of r
3280: 61 6e 64 6f 6d 28 29 2e 20 20 52 65 74 75 72 6e  andom().  Return
3290: 20 61 20 72 61 6e 64 6f 6d 20 69 6e 74 65 67 65   a random intege
32a0: 72 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  r.  .*/.static v
32b0: 6f 69 64 20 72 61 6e 64 6f 6d 46 75 6e 63 28 0a  oid randomFunc(.
32c0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
32d0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
32e0: 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c  t NotUsed,.  sql
32f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74  ite3_value **Not
3300: 55 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74  Used2.){.  sqlit
3310: 65 5f 69 6e 74 36 34 20 72 3b 0a 20 20 55 4e 55  e_int64 r;.  UNU
3320: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
3330: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
3340: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  );.  sqlite3_ran
3350: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
3360: 29 2c 20 26 72 29 3b 0a 20 20 69 66 28 20 72 3c  ), &r);.  if( r<
3370: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 6e  0 ){.    /* We n
3380: 65 65 64 20 74 6f 20 70 72 65 76 65 6e 74 20 61  eed to prevent a
3390: 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 6f   random number o
33a0: 66 20 30 78 38 30 30 30 30 30 30 30 30 30 30 30  f 0x800000000000
33b0: 30 30 30 30 20 0a 20 20 20 20 2a 2a 20 28 6f 72  0000 .    ** (or
33c0: 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37   -92233720368547
33d0: 37 35 38 30 38 29 20 73 69 6e 63 65 20 77 68 65  75808) since whe
33e0: 6e 20 79 6f 75 20 64 6f 20 61 62 73 28 29 20 6f  n you do abs() o
33f0: 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 6e 75  f that.    ** nu
3400: 6d 62 65 72 20 6f 66 20 79 6f 75 20 67 65 74 20  mber of you get 
3410: 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 62  the same value b
3420: 61 63 6b 20 61 67 61 69 6e 2e 20 20 54 6f 20 64  ack again.  To d
3430: 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e  o this.    ** in
3440: 20 61 20 77 61 79 20 74 68 61 74 20 69 73 20 74   a way that is t
3450: 65 73 74 61 62 6c 65 2c 20 6d 61 73 6b 20 74 68  estable, mask th
3460: 65 20 73 69 67 6e 20 62 69 74 20 6f 66 66 20 6f  e sign bit off o
3470: 66 20 6e 65 67 61 74 69 76 65 0a 20 20 20 20 2a  f negative.    *
3480: 2a 20 76 61 6c 75 65 73 2c 20 72 65 73 75 6c 74  * values, result
3490: 69 6e 67 20 69 6e 20 61 20 70 6f 73 69 74 69 76  ing in a positiv
34a0: 65 20 76 61 6c 75 65 2e 20 20 54 68 65 6e 20 74  e value.  Then t
34b0: 61 6b 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ake the .    ** 
34c0: 32 73 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66  2s complement of
34d0: 20 74 68 61 74 20 70 6f 73 69 74 69 76 65 20 76   that positive v
34e0: 61 6c 75 65 2e 20 20 54 68 65 20 65 6e 64 20 72  alue.  The end r
34f0: 65 73 75 6c 74 20 63 61 6e 0a 20 20 20 20 2a 2a  esult can.    **
3500: 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 6e 6f   therefore be no
3510: 20 6c 65 73 73 20 74 68 61 6e 20 2d 39 32 32 33   less than -9223
3520: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 2e  372036854775807.
3530: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 20 3d 20  .    */.    r = 
3540: 2d 28 72 20 26 20 4c 41 52 47 45 53 54 5f 49 4e  -(r & LARGEST_IN
3550: 54 36 34 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  T64);.  }.  sqli
3560: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
3570: 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 7d 0a  (context, r);.}.
3580: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
3590: 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d 62  ation of randomb
35a0: 6c 6f 62 28 4e 29 2e 20 20 52 65 74 75 72 6e 20  lob(N).  Return 
35b0: 61 20 72 61 6e 64 6f 6d 20 62 6c 6f 62 0a 2a 2a  a random blob.**
35c0: 20 74 68 61 74 20 69 73 20 4e 20 62 79 74 65 73   that is N bytes
35d0: 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   long..*/.static
35e0: 20 76 6f 69 64 20 72 61 6e 64 6f 6d 42 6c 6f 62   void randomBlob
35f0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
3600: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
3610: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
3620: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
3630: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 75  .){.  int n;.  u
3640: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b  nsigned char *p;
3650: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
3660: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
3670: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
3680: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
3690: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29  lue_int(argv[0])
36a0: 3b 0a 20 20 69 66 28 20 6e 3c 31 20 29 7b 0a 20  ;.  if( n<1 ){. 
36b0: 20 20 20 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20 20     n = 1;.  }.  
36c0: 70 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  p = contextMallo
36d0: 63 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20  c(context, n);. 
36e0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
36f0: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
3700: 28 6e 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  (n, p);.    sqli
3710: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
3720: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
3730: 70 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72  p, n, sqlite3_fr
3740: 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ee);.  }.}../*.*
3750: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3760: 20 6f 66 20 74 68 65 20 6c 61 73 74 5f 69 6e 73   of the last_ins
3770: 65 72 74 5f 72 6f 77 69 64 28 29 20 53 51 4c 20  ert_rowid() SQL 
3780: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72  function.  The r
3790: 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 69  eturn.** value i
37a0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
37b0: 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  e sqlite3_last_i
37c0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 41 50  nsert_rowid() AP
37d0: 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  I function..*/.s
37e0: 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f  tatic void last_
37f0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 0a 20 20  insert_rowid(.  
3800: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3810: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
3820: 20 4e 6f 74 55 73 65 64 2c 20 0a 20 20 73 71 6c   NotUsed, .  sql
3830: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74  ite3_value **Not
3840: 55 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74  Used2.){.  sqlit
3850: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
3860: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
3870: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55  le(context);.  U
3880: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
3890: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
38a0: 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52  d2);.  /* IMP: R
38b0: 2d 35 31 35 31 33 2d 31 32 30 32 36 20 54 68 65  -51513-12026 The
38c0: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
38d0: 69 64 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  id() SQL functio
38e0: 6e 20 69 73 20 61 0a 20 20 2a 2a 20 77 72 61 70  n is a.  ** wrap
38f0: 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 73  per around the s
3900: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
3910: 72 74 5f 72 6f 77 69 64 28 29 20 43 2f 43 2b 2b  rt_rowid() C/C++
3920: 20 69 6e 74 65 72 66 61 63 65 0a 20 20 2a 2a 20   interface.  ** 
3930: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73  function. */.  s
3940: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
3950: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  t64(context, sql
3960: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
3970: 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 7d 0a 0a  _rowid(db));.}..
3980: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
3990: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 61 6e  tion of the chan
39a0: 67 65 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ges() SQL functi
39b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52  on..**.** IMP: R
39c0: 2d 36 32 30 37 33 2d 31 31 32 30 39 20 54 68 65  -62073-11209 The
39d0: 20 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66   changes() SQL f
39e0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61  unction is a wra
39f0: 70 70 65 72 0a 2a 2a 20 61 72 6f 75 6e 64 20 74  pper.** around t
3a00: 68 65 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  he sqlite3_chang
3a10: 65 73 28 29 20 43 2f 43 2b 2b 20 66 75 6e 63 74  es() C/C++ funct
3a20: 69 6f 6e 20 61 6e 64 20 68 65 6e 63 65 20 66 6f  ion and hence fo
3a30: 6c 6c 6f 77 73 20 74 68 65 20 73 61 6d 65 0a 2a  llows the same.*
3a40: 2a 20 72 75 6c 65 73 20 66 6f 72 20 63 6f 75 6e  * rules for coun
3a50: 74 69 6e 67 20 63 68 61 6e 67 65 73 2e 0a 2a 2f  ting changes..*/
3a60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61  .static void cha
3a70: 6e 67 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  nges(.  sqlite3_
3a80: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
3a90: 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c  ,.  int NotUsed,
3aa0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3ab0: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
3ac0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
3ad0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
3ae0: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
3af0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
3b00: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
3b10: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c  NotUsed2);.  sql
3b20: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
3b30: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
3b40: 5f 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d  _changes(db));.}
3b50: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
3b60: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 6f  tation of the to
3b70: 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 53 51  tal_changes() SQ
3b80: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  L function.  The
3b90: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
3ba0: 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20  .** the same as 
3bb0: 74 68 65 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  the sqlite3_tota
3bc0: 6c 5f 63 68 61 6e 67 65 73 28 29 20 41 50 49 20  l_changes() API 
3bd0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
3be0: 74 69 63 20 76 6f 69 64 20 74 6f 74 61 6c 5f 63  tic void total_c
3bf0: 68 61 6e 67 65 73 28 0a 20 20 73 71 6c 69 74 65  hanges(.  sqlite
3c00: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
3c10: 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  xt,.  int NotUse
3c20: 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  d,.  sqlite3_val
3c30: 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b  ue **NotUsed2.){
3c40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
3c50: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3c60: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
3c70: 78 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  xt);.  UNUSED_PA
3c80: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
3c90: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f  , NotUsed2);.  /
3ca0: 2a 20 49 4d 50 3a 20 52 2d 35 32 37 35 36 2d 34  * IMP: R-52756-4
3cb0: 31 39 39 33 20 54 68 69 73 20 66 75 6e 63 74 69  1993 This functi
3cc0: 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20  on is a wrapper 
3cd0: 61 72 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20  around the.  ** 
3ce0: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
3cf0: 61 6e 67 65 73 28 29 20 43 2f 43 2b 2b 20 69 6e  anges() C/C++ in
3d00: 74 65 72 66 61 63 65 2e 20 2a 2f 0a 20 20 73 71  terface. */.  sq
3d10: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
3d20: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
3d30: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
3d40: 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  db));.}../*.** A
3d50: 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e   structure defin
3d60: 69 6e 67 20 68 6f 77 20 74 6f 20 64 6f 20 47 4c  ing how to do GL
3d70: 4f 42 2d 73 74 79 6c 65 20 63 6f 6d 70 61 72 69  OB-style compari
3d80: 73 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  sons..*/.struct 
3d90: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 7b 0a 20 20  compareInfo {.  
3da0: 75 38 20 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75  u8 matchAll;.  u
3db0: 38 20 6d 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38  8 matchOne;.  u8
3dc0: 20 6d 61 74 63 68 53 65 74 3b 0a 20 20 75 38 20   matchSet;.  u8 
3dd0: 6e 6f 43 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  noCase;.};../*.*
3de0: 2a 20 46 6f 72 20 4c 49 4b 45 20 61 6e 64 20 47  * For LIKE and G
3df0: 4c 4f 42 20 6d 61 74 63 68 69 6e 67 20 6f 6e 20  LOB matching on 
3e00: 45 42 43 44 49 43 20 6d 61 63 68 69 6e 65 73 2c  EBCDIC machines,
3e10: 20 61 73 73 75 6d 65 20 74 68 61 74 20 65 76 65   assume that eve
3e20: 72 79 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20  ry.** character 
3e30: 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 62  is exactly one b
3e40: 79 74 65 20 69 6e 20 73 69 7a 65 2e 20 20 41 6c  yte in size.  Al
3e50: 73 6f 2c 20 70 72 6f 76 64 65 20 74 68 65 20 55  so, provde the U
3e60: 74 66 38 52 65 61 64 28 29 0a 2a 2a 20 6d 61 63  tf8Read().** mac
3e70: 72 6f 20 66 6f 72 20 66 61 73 74 20 72 65 61 64  ro for fast read
3e80: 69 6e 67 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ing of the next 
3e90: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65  character in the
3ea0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
3eb0: 72 65 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 63  re.** the next c
3ec0: 68 61 72 61 63 74 65 72 20 69 73 20 41 53 43 49  haracter is ASCI
3ed0: 49 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  I..*/.#if define
3ee0: 64 28 53 51 4c 49 54 45 5f 45 42 43 44 49 43 29  d(SQLITE_EBCDIC)
3ef0: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
3f00: 33 55 74 66 38 52 65 61 64 28 41 29 20 20 20 20  3Utf8Read(A)    
3f10: 20 20 20 20 28 2a 28 28 2a 41 29 2b 2b 29 29 0a      (*((*A)++)).
3f20: 23 20 64 65 66 69 6e 65 20 55 74 66 38 52 65 61  # define Utf8Rea
3f30: 64 28 41 29 20 20 20 20 20 20 20 20 20 20 20 20  d(A)            
3f40: 20 20 20 28 2a 28 41 2b 2b 29 29 0a 23 65 6c 73     (*(A++)).#els
3f50: 65 0a 23 20 64 65 66 69 6e 65 20 55 74 66 38 52  e.# define Utf8R
3f60: 65 61 64 28 41 29 20 20 20 20 20 20 20 20 20 20  ead(A)          
3f70: 20 20 20 20 20 28 41 5b 30 5d 3c 30 78 38 30 3f       (A[0]<0x80?
3f80: 2a 28 41 2b 2b 29 3a 73 71 6c 69 74 65 33 55 74  *(A++):sqlite3Ut
3f90: 66 38 52 65 61 64 28 26 41 29 29 0a 23 65 6e 64  f8Read(&A)).#end
3fa0: 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  if..static const
3fb0: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
3fc0: 6e 66 6f 20 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b  nfo globInfo = {
3fd0: 20 27 2a 27 2c 20 27 3f 27 2c 20 27 5b 27 2c 20   '*', '?', '[', 
3fe0: 30 20 7d 3b 0a 2f 2a 20 54 68 65 20 63 6f 72 72  0 };./* The corr
3ff0: 65 63 74 20 53 51 4c 2d 39 32 20 62 65 68 61 76  ect SQL-92 behav
4000: 69 6f 72 20 69 73 20 66 6f 72 20 74 68 65 20 4c  ior is for the L
4010: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  IKE operator to 
4020: 69 67 6e 6f 72 65 0a 2a 2a 20 63 61 73 65 2e 20  ignore.** case. 
4030: 20 54 68 75 73 20 20 27 61 27 20 4c 49 4b 45 20   Thus  'a' LIKE 
4040: 27 41 27 20 77 6f 75 6c 64 20 62 65 20 74 72 75  'A' would be tru
4050: 65 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e. */.static con
4060: 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72  st struct compar
4070: 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f  eInfo likeInfoNo
4080: 72 6d 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c  rm = { '%', '_',
4090: 20 20 20 30 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66     0, 1 };./* If
40a0: 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e   SQLITE_CASE_SEN
40b0: 53 49 54 49 56 45 5f 4c 49 4b 45 20 69 73 20 64  SITIVE_LIKE is d
40c0: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  efined, then the
40d0: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 0a 2a   LIKE operator.*
40e0: 2a 20 69 73 20 63 61 73 65 20 73 65 6e 73 69 74  * is case sensit
40f0: 69 76 65 20 63 61 75 73 69 6e 67 20 27 61 27 20  ive causing 'a' 
4100: 4c 49 4b 45 20 27 41 27 20 74 6f 20 62 65 20 66  LIKE 'A' to be f
4110: 61 6c 73 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  alse */.static c
4120: 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70  onst struct comp
4130: 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f  areInfo likeInfo
4140: 41 6c 74 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27  Alt = { '%', '_'
4150: 2c 20 20 20 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a  ,   0, 0 };../*.
4160: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 55  ** Compare two U
4170: 54 46 2d 38 20 73 74 72 69 6e 67 73 20 66 6f 72  TF-8 strings for
4180: 20 65 71 75 61 6c 69 74 79 20 77 68 65 72 65 20   equality where 
4190: 74 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67  the first string
41a0: 20 63 61 6e 0a 2a 2a 20 70 6f 74 65 6e 74 69 61   can.** potentia
41b0: 6c 6c 79 20 62 65 20 61 20 22 67 6c 6f 62 22 20  lly be a "glob" 
41c0: 6f 72 20 22 6c 69 6b 65 22 20 65 78 70 72 65 73  or "like" expres
41d0: 73 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74 72  sion.  Return tr
41e0: 75 65 20 28 31 29 20 69 66 20 74 68 65 79 0a 2a  ue (1) if they.*
41f0: 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
4200: 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69 66 20  nd false (0) if 
4210: 74 68 65 79 20 61 72 65 20 64 69 66 66 65 72 65  they are differe
4220: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69  nt..**.** Globbi
4230: 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ng rules:.**.** 
4240: 20 20 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d       '*'       M
4250: 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65  atches any seque
4260: 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  nce of zero or m
4270: 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a  ore characters..
4280: 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20  **.**      '?'  
4290: 20 20 20 20 20 4d 61 74 63 68 65 73 20 65 78 61       Matches exa
42a0: 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74  ctly one charact
42b0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e  er..**.**     [.
42c0: 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73  ..]      Matches
42d0: 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 66   one character f
42e0: 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64  rom the enclosed
42f0: 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20   list of.**     
4300: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 61             chara
4310: 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  cters..**.**    
4320: 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63   [^...]     Matc
4330: 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65  hes one characte
4340: 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63  r not in the enc
4350: 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  losed list..**.*
4360: 2a 20 57 69 74 68 20 74 68 65 20 5b 2e 2e 2e 5d  * With the [...]
4370: 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61 74 63   and [^...] matc
4380: 68 69 6e 67 2c 20 61 20 27 5d 27 20 63 68 61 72  hing, a ']' char
4390: 61 63 74 65 72 20 63 61 6e 20 62 65 20 69 6e 63  acter can be inc
43a0: 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  luded.** in the 
43b0: 6c 69 73 74 20 62 79 20 6d 61 6b 69 6e 67 20 69  list by making i
43c0: 74 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  t the first char
43d0: 61 63 74 65 72 20 61 66 74 65 72 20 27 5b 27 20  acter after '[' 
43e0: 6f 72 20 27 5e 27 2e 20 20 41 0a 2a 2a 20 72 61  or '^'.  A.** ra
43f0: 6e 67 65 20 6f 66 20 63 68 61 72 61 63 74 65 72  nge of character
4400: 73 20 63 61 6e 20 62 65 20 73 70 65 63 69 66 69  s can be specifi
4410: 65 64 20 75 73 69 6e 67 20 27 2d 27 2e 20 20 45  ed using '-'.  E
4420: 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61 2d 7a  xample:.** "[a-z
4430: 5d 22 20 6d 61 74 63 68 65 73 20 61 6e 79 20 73  ]" matches any s
4440: 69 6e 67 6c 65 20 6c 6f 77 65 72 2d 63 61 73 65  ingle lower-case
4450: 20 6c 65 74 74 65 72 2e 20 20 54 6f 20 6d 61 74   letter.  To mat
4460: 63 68 20 61 20 27 2d 27 2c 20 6d 61 6b 65 0a 2a  ch a '-', make.*
4470: 2a 20 69 74 20 74 68 65 20 6c 61 73 74 20 63 68  * it the last ch
4480: 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 6c  aracter in the l
4490: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 4c 69 6b 65 20  ist..**.** Like 
44a0: 6d 61 74 63 68 69 6e 67 20 72 75 6c 65 73 3a 0a  matching rules:.
44b0: 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 27 25 27 20  ** .**      '%' 
44c0: 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e        Matches an
44d0: 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65  y sequence of ze
44e0: 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61  ro or more chara
44f0: 63 74 65 72 73 0a 2a 2a 0a 2a 2a 2a 20 20 20 20  cters.**.***    
4500: 20 27 5f 27 20 20 20 20 20 20 20 4d 61 74 63 68   '_'       Match
4510: 65 73 20 61 6e 79 20 6f 6e 65 20 63 68 61 72 61  es any one chara
4520: 63 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  cter.**.**      
4530: 45 63 20 20 20 20 20 20 20 20 57 68 65 72 65 20  Ec        Where 
4540: 45 20 69 73 20 74 68 65 20 22 65 73 63 22 20 63  E is the "esc" c
4550: 68 61 72 61 63 74 65 72 20 61 6e 64 20 63 20 69  haracter and c i
4560: 73 20 61 6e 79 20 6f 74 68 65 72 0a 2a 2a 20 20  s any other.**  
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
4580: 61 72 61 63 74 65 72 2c 20 69 6e 63 6c 75 64 69  aracter, includi
4590: 6e 67 20 27 25 27 2c 20 27 5f 27 2c 20 61 6e 64  ng '%', '_', and
45a0: 20 65 73 63 2c 20 6d 61 74 63 68 20 65 78 61 63   esc, match exac
45b0: 74 6c 79 20 63 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tly c..**.** The
45c0: 20 63 6f 6d 6d 65 6e 74 73 20 77 69 74 68 69 6e   comments within
45d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   this routine us
45e0: 75 61 6c 6c 79 20 61 73 73 75 6d 65 20 67 6c 6f  ually assume glo
45f0: 62 20 6d 61 74 63 68 69 6e 67 2e 0a 2a 2a 0a 2a  b matching..**.*
4600: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4610: 73 20 75 73 75 61 6c 6c 79 20 71 75 69 63 6b 2c  s usually quick,
4620: 20 62 75 74 20 63 61 6e 20 62 65 20 4e 2a 2a 32   but can be N**2
4630: 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61   in the worst ca
4640: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4650: 74 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  t patternCompare
4660: 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50  (.  const u8 *zP
4670: 61 74 74 65 72 6e 2c 20 20 20 20 20 20 20 20 20  attern,         
4680: 20 20 20 20 20 2f 2a 20 54 68 65 20 67 6c 6f 62       /* The glob
4690: 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63 6f   pattern */.  co
46a0: 6e 73 74 20 75 38 20 2a 7a 53 74 72 69 6e 67 2c  nst u8 *zString,
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
46c0: 2a 20 54 68 65 20 73 74 72 69 6e 67 20 74 6f 20  * The string to 
46d0: 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
46e0: 74 68 65 20 67 6c 6f 62 20 2a 2f 0a 20 20 63 6f  the glob */.  co
46f0: 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61  nst struct compa
4700: 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 2c 20 2f  reInfo *pInfo, /
4710: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
4720: 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f 20 74 68  out how to do th
4730: 65 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75  e compare */.  u
4740: 33 32 20 65 73 63 20 20 20 20 20 20 20 20 20 20  32 esc          
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4760: 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63 68  /* The escape ch
4770: 61 72 61 63 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  aracter */.){.  
4780: 75 33 32 20 63 2c 20 63 32 3b 20 20 20 20 20 20  u32 c, c2;      
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47a0: 20 2f 2a 20 4e 65 78 74 20 70 61 74 74 65 72 6e   /* Next pattern
47b0: 20 61 6e 64 20 69 6e 70 75 74 20 73 74 72 69 6e   and input strin
47c0: 67 20 63 68 61 72 73 20 2a 2f 0a 20 20 75 33 32  g chars */.  u32
47d0: 20 6d 61 74 63 68 4f 6e 65 20 3d 20 70 49 6e 66   matchOne = pInf
47e0: 6f 2d 3e 6d 61 74 63 68 4f 6e 65 3b 20 20 2f 2a  o->matchOne;  /*
47f0: 20 22 3f 22 20 6f 72 20 22 5f 22 20 2a 2f 0a 20   "?" or "_" */. 
4800: 20 75 33 32 20 6d 61 74 63 68 41 6c 6c 20 3d 20   u32 matchAll = 
4810: 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 41 6c 6c 3b  pInfo->matchAll;
4820: 20 20 2f 2a 20 22 2a 22 20 6f 72 20 22 25 22 20    /* "*" or "%" 
4830: 2a 2f 0a 20 20 75 33 32 20 6d 61 74 63 68 4f 74  */.  u32 matchOt
4840: 68 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  her;            
4850: 20 20 20 20 20 20 2f 2a 20 22 5b 22 20 6f 72 20        /* "[" or 
4860: 74 68 65 20 65 73 63 61 70 65 20 63 68 61 72 61  the escape chara
4870: 63 74 65 72 20 2a 2f 0a 20 20 75 38 20 6e 6f 43  cter */.  u8 noC
4880: 61 73 65 20 3d 20 70 49 6e 66 6f 2d 3e 6e 6f 43  ase = pInfo->noC
4890: 61 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  ase;       /* Tr
48a0: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 3d  ue if uppercase=
48b0: 3d 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 20 20  =lowercase */.  
48c0: 63 6f 6e 73 74 20 75 38 20 2a 7a 45 73 63 61 70  const u8 *zEscap
48d0: 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
48e0: 20 2f 2a 20 4f 6e 65 20 70 61 73 74 20 74 68 65   /* One past the
48f0: 20 6c 61 73 74 20 65 73 63 61 70 65 64 20 69 6e   last escaped in
4900: 70 75 74 20 63 68 61 72 20 2a 2f 0a 20 20 0a 20  put char */.  . 
4910: 20 2f 2a 20 54 68 65 20 47 4c 4f 42 20 6f 70 65   /* The GLOB ope
4920: 72 61 74 6f 72 20 64 6f 65 73 20 6e 6f 74 20 68  rator does not h
4930: 61 76 65 20 61 6e 20 45 53 43 41 50 45 20 63 6c  ave an ESCAPE cl
4940: 61 75 73 65 2e 20 20 41 6e 64 20 4c 49 4b 45 20  ause.  And LIKE 
4950: 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 68 61  does not.  ** ha
4960: 76 65 20 74 68 65 20 6d 61 74 63 68 53 65 74 20  ve the matchSet 
4970: 6f 70 65 72 61 74 6f 72 2e 20 20 53 6f 20 77 65  operator.  So we
4980: 20 65 69 74 68 65 72 20 68 61 76 65 20 74 6f 20   either have to 
4990: 6c 6f 6f 6b 20 66 6f 72 20 6f 6e 65 20 6f 72 0a  look for one or.
49a0: 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 2c 20    ** the other, 
49b0: 6e 65 76 65 72 20 62 6f 74 68 2e 20 20 48 65 6e  never both.  Hen
49c0: 63 65 20 74 68 65 20 73 69 6e 67 6c 65 20 76 61  ce the single va
49d0: 72 69 61 62 6c 65 20 6d 61 74 63 68 4f 74 68 65  riable matchOthe
49e0: 72 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74  r is used.  ** t
49f0: 6f 20 73 74 6f 72 65 20 74 68 65 20 6f 6e 65 20  o store the one 
4a00: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
4a10: 66 6f 72 2e 0a 20 20 2a 2f 0a 20 20 6d 61 74 63  for..  */.  matc
4a20: 68 4f 74 68 65 72 20 3d 20 65 73 63 20 3f 20 65  hOther = esc ? e
4a30: 73 63 20 3a 20 70 49 6e 66 6f 2d 3e 6d 61 74 63  sc : pInfo->matc
4a40: 68 53 65 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20  hSet;..  while( 
4a50: 28 63 20 3d 20 55 74 66 38 52 65 61 64 28 7a 50  (c = Utf8Read(zP
4a60: 61 74 74 65 72 6e 29 29 21 3d 30 20 29 7b 0a 20  attern))!=0 ){. 
4a70: 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 41     if( c==matchA
4a80: 6c 6c 20 29 7b 20 20 2f 2a 20 4d 61 74 63 68 20  ll ){  /* Match 
4a90: 22 2a 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  "*" */.      /* 
4aa0: 53 6b 69 70 20 6f 76 65 72 20 6d 75 6c 74 69 70  Skip over multip
4ab0: 6c 65 20 22 2a 22 20 63 68 61 72 61 63 74 65 72  le "*" character
4ac0: 73 20 69 6e 20 74 68 65 20 70 61 74 74 65 72 6e  s in the pattern
4ad0: 2e 20 20 49 66 20 74 68 65 72 65 0a 20 20 20 20  .  If there.    
4ae0: 20 20 2a 2a 20 61 72 65 20 61 6c 73 6f 20 22 3f    ** are also "?
4af0: 22 20 63 68 61 72 61 63 74 65 72 73 2c 20 73 6b  " characters, sk
4b00: 69 70 20 74 68 6f 73 65 20 61 73 20 77 65 6c 6c  ip those as well
4b10: 2c 20 62 75 74 20 63 6f 6e 73 75 6d 65 20 61 0a  , but consume a.
4b20: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
4b30: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
4b40: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 66 6f   input string fo
4b50: 72 20 65 61 63 68 20 22 3f 22 20 73 6b 69 70 70  r each "?" skipp
4b60: 65 64 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  ed */.      whil
4b70: 65 28 20 28 63 3d 55 74 66 38 52 65 61 64 28 7a  e( (c=Utf8Read(z
4b80: 50 61 74 74 65 72 6e 29 29 20 3d 3d 20 6d 61 74  Pattern)) == mat
4b90: 63 68 41 6c 6c 20 7c 7c 20 63 20 3d 3d 20 6d 61  chAll || c == ma
4ba0: 74 63 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20  tchOne ){.      
4bb0: 20 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e    if( c==matchOn
4bc0: 65 20 26 26 20 73 71 6c 69 74 65 33 55 74 66 38  e && sqlite3Utf8
4bd0: 52 65 61 64 28 26 7a 53 74 72 69 6e 67 29 3d 3d  Read(&zString)==
4be0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
4bf0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
4c00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
4c10: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
4c20: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20       return 1;  
4c30: 20 2f 2a 20 22 2a 22 20 61 74 20 74 68 65 20 65   /* "*" at the e
4c40: 6e 64 20 6f 66 20 74 68 65 20 70 61 74 74 65 72  nd of the patter
4c50: 6e 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  n matches */.   
4c60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
4c70: 6d 61 74 63 68 4f 74 68 65 72 20 29 7b 0a 20 20  matchOther ){.  
4c80: 20 20 20 20 20 20 69 66 28 20 65 73 63 20 29 7b        if( esc ){
4c90: 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
4ca0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
4cb0: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
4cc0: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
4cd0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
4ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4cf0: 20 20 20 2f 2a 20 22 5b 2e 2e 2e 5d 22 20 69 6d     /* "[...]" im
4d00: 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
4d10: 73 20 74 68 65 20 22 2a 22 2e 20 20 57 65 20 68  s the "*".  We h
4d20: 61 76 65 20 74 6f 20 64 6f 20 61 20 73 6c 6f 77  ave to do a slow
4d30: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65  .          ** re
4d40: 63 75 72 73 69 76 65 20 73 65 61 72 63 68 20 69  cursive search i
4d50: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 62 75 74  n this case, but
4d60: 20 69 74 20 69 73 20 61 6e 20 75 6e 75 73 75 61   it is an unusua
4d70: 6c 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20  l case. */.     
4d80: 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 74       assert( mat
4d90: 63 68 4f 74 68 65 72 3c 30 78 38 30 20 29 3b 20  chOther<0x80 ); 
4da0: 20 2f 2a 20 27 5b 27 20 69 73 20 61 20 73 69 6e   /* '[' is a sin
4db0: 67 6c 65 2d 62 79 74 65 20 63 68 61 72 61 63 74  gle-byte charact
4dc0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  er */.          
4dd0: 77 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 0a  while( *zString.
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 20 26 26 20 70 61 74 74 65 72 6e 43 6f 6d 70 61   && patternCompa
4e00: 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 2d 31 5d  re(&zPattern[-1]
4e10: 2c 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 65  ,zString,pInfo,e
4e20: 73 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sc)==0 ){.      
4e30: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
4e40: 50 5f 55 54 46 38 28 7a 53 74 72 69 6e 67 29 3b  P_UTF8(zString);
4e50: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4e60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2a 7a         return *z
4e70: 53 74 72 69 6e 67 21 3d 30 3b 0a 20 20 20 20 20  String!=0;.     
4e80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
4e90: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
4ea0: 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 20 63 20  oint variable c 
4eb0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72  contains the fir
4ec0: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
4ed0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 74  the.      ** pat
4ee0: 74 65 72 6e 20 73 74 72 69 6e 67 20 70 61 73 74  tern string past
4ef0: 20 74 68 65 20 22 2a 22 2e 20 20 53 65 61 72 63   the "*".  Searc
4f00: 68 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73  h in the input s
4f10: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tring for the.  
4f20: 20 20 20 20 2a 2a 20 66 69 72 73 74 20 6d 61 74      ** first mat
4f30: 63 68 69 6e 67 20 63 68 61 72 61 63 74 65 72 20  ching character 
4f40: 61 6e 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  and recursively 
4f50: 63 6f 6e 74 69 6e 65 20 74 68 65 20 6d 61 74 63  contine the matc
4f60: 68 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  h from.      ** 
4f70: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 20 20 20 20  that point..    
4f80: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
4f90: 72 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69  r a case-insensi
4fa0: 74 69 76 65 20 73 65 61 72 63 68 2c 20 73 65 74  tive search, set
4fb0: 20 76 61 72 69 61 62 6c 65 20 63 78 20 74 6f 20   variable cx to 
4fc0: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
4fd0: 20 20 20 20 20 2a 2a 20 63 20 62 75 74 20 69 6e       ** c but in
4fe0: 20 74 68 65 20 6f 74 68 65 72 20 63 61 73 65 20   the other case 
4ff0: 61 6e 64 20 73 65 61 72 63 68 20 74 68 65 20 69  and search the i
5000: 6e 70 75 74 20 73 74 72 69 6e 67 20 66 6f 72 20  nput string for 
5010: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
5020: 63 20 6f 72 20 63 78 2e 0a 20 20 20 20 20 20 2a  c or cx..      *
5030: 2f 0a 20 20 20 20 20 20 69 66 28 20 63 3c 3d 30  /.      if( c<=0
5040: 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  x80 ){.        u
5050: 33 32 20 63 78 3b 0a 20 20 20 20 20 20 20 20 69  32 cx;.        i
5060: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
5070: 20 20 20 20 20 20 20 63 78 20 3d 20 73 71 6c 69         cx = sqli
5080: 74 65 33 54 6f 75 70 70 65 72 28 63 29 3b 0a 20  te3Toupper(c);. 
5090: 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
50a0: 69 74 65 33 54 6f 6c 6f 77 65 72 28 63 29 3b 0a  ite3Tolower(c);.
50b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
50c0: 20 20 20 20 20 20 20 20 20 63 78 20 3d 20 63 3b           cx = c;
50d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
50e0: 20 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20     while( (c2 = 
50f0: 2a 28 7a 53 74 72 69 6e 67 2b 2b 29 29 21 3d 30  *(zString++))!=0
5100: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
5110: 28 20 63 32 21 3d 63 20 26 26 20 63 32 21 3d 63  ( c2!=c && c2!=c
5120: 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  x ) continue;.  
5130: 20 20 20 20 20 20 20 20 69 66 28 20 70 61 74 74          if( patt
5140: 65 72 6e 43 6f 6d 70 61 72 65 28 7a 50 61 74 74  ernCompare(zPatt
5150: 65 72 6e 2c 7a 53 74 72 69 6e 67 2c 70 49 6e 66  ern,zString,pInf
5160: 6f 2c 65 73 63 29 20 29 20 72 65 74 75 72 6e 20  o,esc) ) return 
5170: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
5180: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5190: 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 55    while( (c2 = U
51a0: 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67 29  tf8Read(zString)
51b0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
51c0: 20 20 69 66 28 20 63 32 21 3d 63 20 29 20 63 6f    if( c2!=c ) co
51d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
51e0: 20 20 69 66 28 20 70 61 74 74 65 72 6e 43 6f 6d    if( patternCom
51f0: 70 61 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a 53  pare(zPattern,zS
5200: 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63 29  tring,pInfo,esc)
5210: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
5220: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5230: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
5240: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d     }.    if( c==
5250: 6d 61 74 63 68 4f 74 68 65 72 20 29 7b 0a 20 20  matchOther ){.  
5260: 20 20 20 20 69 66 28 20 65 73 63 20 29 7b 0a 20      if( esc ){. 
5270: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
5280: 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74  e3Utf8Read(&zPat
5290: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  tern);.        i
52a0: 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( c==0 ) return
52b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 45 73 63   0;.        zEsc
52c0: 61 70 65 64 20 3d 20 7a 50 61 74 74 65 72 6e 3b  aped = zPattern;
52d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
52e0: 20 20 20 20 20 20 75 33 32 20 70 72 69 6f 72 5f        u32 prior_
52f0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  c = 0;.        i
5300: 6e 74 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20  nt seen = 0;.   
5310: 20 20 20 20 20 69 6e 74 20 69 6e 76 65 72 74 20       int invert 
5320: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d  = 0;.        c =
5330: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
5340: 28 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20  (&zString);.    
5350: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
5360: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
5370: 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66   c2 = sqlite3Utf
5380: 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29  8Read(&zPattern)
5390: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32  ;.        if( c2
53a0: 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='^' ){.       
53b0: 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20     invert = 1;. 
53c0: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
53d0: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
53e0: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
53f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5400: 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  c2==']' ){.     
5410: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20       if( c==']' 
5420: 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ) seen = 1;.    
5430: 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74        c2 = sqlit
5440: 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74  e3Utf8Read(&zPat
5450: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  tern);.        }
5460: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
5470: 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b  c2 && c2!=']' ){
5480: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
5490: 32 3d 3d 27 2d 27 20 26 26 20 7a 50 61 74 74 65  2=='-' && zPatte
54a0: 72 6e 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 50  rn[0]!=']' && zP
54b0: 61 74 74 65 72 6e 5b 30 5d 21 3d 30 20 26 26 20  attern[0]!=0 && 
54c0: 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20  prior_c>0 ){.   
54d0: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
54e0: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
54f0: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
5500: 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69        if( c>=pri
5510: 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20  or_c && c<=c2 ) 
5520: 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
5530: 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
5540: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
5550: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
5560: 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20  if( c==c2 ){.   
5570: 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20             seen 
5580: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
5590: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
55a0: 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20  rior_c = c2;.   
55b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
55c0: 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55     c2 = sqlite3U
55d0: 74 66 38 52 65 61 64 28 26 7a 50 61 74 74 65 72  tf8Read(&zPatter
55e0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
55f0: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
5600: 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72  || (seen ^ inver
5610: 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
5620: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
5630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
5640: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
5650: 0a 20 20 20 20 7d 0a 20 20 20 20 63 32 20 3d 20  .    }.    c2 = 
5660: 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67  Utf8Read(zString
5670: 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 63 32  );.    if( c==c2
5680: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5690: 20 69 66 28 20 6e 6f 43 61 73 65 20 26 26 20 73   if( noCase && s
56a0: 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 63 29  qlite3Tolower(c)
56b0: 3d 3d 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72  ==sqlite3Tolower
56c0: 28 63 32 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  (c2) ){.      co
56d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
56e0: 20 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e    if( c==matchOn
56f0: 65 20 26 26 20 7a 50 61 74 74 65 72 6e 21 3d 7a  e && zPattern!=z
5700: 45 73 63 61 70 65 64 20 26 26 20 63 32 21 3d 30  Escaped && c2!=0
5710: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5720: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5730: 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67   return *zString
5740: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ==0;.}../*.** Th
5750: 65 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  e sqlite3_strglo
5760: 62 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  b() interface..*
5770: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  /.int sqlite3_st
5780: 72 67 6c 6f 62 28 63 6f 6e 73 74 20 63 68 61 72  rglob(const char
5790: 20 2a 7a 47 6c 6f 62 50 61 74 74 65 72 6e 2c 20   *zGlobPattern, 
57a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72  const char *zStr
57b0: 69 6e 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ing){.  return p
57c0: 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 28 75  atternCompare((u
57d0: 38 2a 29 7a 47 6c 6f 62 50 61 74 74 65 72 6e 2c  8*)zGlobPattern,
57e0: 20 28 75 38 2a 29 7a 53 74 72 69 6e 67 2c 20 26   (u8*)zString, &
57f0: 67 6c 6f 62 49 6e 66 6f 2c 20 30 29 3d 3d 30 3b  globInfo, 0)==0;
5800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  .}../*.** The sq
5810: 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 29 20  lite3_strlike() 
5820: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e  interface..*/.in
5830: 74 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  t sqlite3_strlik
5840: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  e(const char *zP
5850: 61 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 63 68  attern, const ch
5860: 61 72 20 2a 7a 53 74 72 2c 20 75 6e 73 69 67 6e  ar *zStr, unsign
5870: 65 64 20 69 6e 74 20 65 73 63 29 7b 0a 20 20 72  ed int esc){.  r
5880: 65 74 75 72 6e 20 70 61 74 74 65 72 6e 43 6f 6d  eturn patternCom
5890: 70 61 72 65 28 28 75 38 2a 29 7a 50 61 74 74 65  pare((u8*)zPatte
58a0: 72 6e 2c 20 28 75 38 2a 29 7a 53 74 72 2c 20 26  rn, (u8*)zStr, &
58b0: 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 65 73  likeInfoNorm, es
58c0: 63 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c)==0;.}../*.** 
58d0: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
58e0: 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 74   of times that t
58f0: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
5900: 20 28 6f 72 20 47 4c 4f 42 20 77 68 69 63 68 20   (or GLOB which 
5910: 69 73 0a 2a 2a 20 6a 75 73 74 20 61 20 76 61 72  is.** just a var
5920: 69 61 74 69 6f 6e 20 6f 66 20 4c 49 4b 45 29 20  iation of LIKE) 
5930: 67 65 74 73 20 63 61 6c 6c 65 64 2e 20 20 54 68  gets called.  Th
5940: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
5950: 65 73 74 69 6e 67 0a 2a 2a 20 6f 6e 6c 79 2e 0a  esting.** only..
5960: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
5970: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
5980: 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 3d 20 30  3_like_count = 0
5990: 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ;.#endif.../*.**
59a0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
59b0: 6f 66 20 74 68 65 20 6c 69 6b 65 28 29 20 53 51  of the like() SQ
59c0: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  L function.  Thi
59d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  s function imple
59e0: 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 62 75 69  ments.** the bui
59f0: 6c 64 2d 69 6e 20 4c 49 4b 45 20 6f 70 65 72 61  ld-in LIKE opera
5a00: 74 6f 72 2e 20 20 54 68 65 20 66 69 72 73 74 20  tor.  The first 
5a10: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
5a20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 0a  function is the.
5a30: 2a 2a 20 70 61 74 74 65 72 6e 20 61 6e 64 20 74  ** pattern and t
5a40: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
5a50: 6e 74 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  nt is the string
5a60: 2e 20 20 53 6f 2c 20 74 68 65 20 53 51 4c 20 73  .  So, the SQL s
5a70: 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a  tatements:.**.**
5a80: 20 20 20 20 20 20 20 41 20 4c 49 4b 45 20 42 0a         A LIKE B.
5a90: 2a 2a 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65  **.** is impleme
5aa0: 6e 74 65 64 20 61 73 20 6c 69 6b 65 28 42 2c 41  nted as like(B,A
5ab0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 61  )..**.** This sa
5ac0: 6d 65 20 66 75 6e 63 74 69 6f 6e 20 28 77 69 74  me function (wit
5ad0: 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6f  h a different co
5ae0: 6d 70 61 72 65 49 6e 66 6f 20 73 74 72 75 63 74  mpareInfo struct
5af0: 75 72 65 29 20 63 6f 6d 70 75 74 65 73 0a 2a 2a  ure) computes.**
5b00: 20 74 68 65 20 47 4c 4f 42 20 6f 70 65 72 61 74   the GLOB operat
5b10: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
5b20: 69 64 20 6c 69 6b 65 46 75 6e 63 28 0a 20 20 73  id likeFunc(.  s
5b30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5b40: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
5b50: 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  argc, .  sqlite3
5b60: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
5b70: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
5b80: 64 20 63 68 61 72 20 2a 7a 41 2c 20 2a 7a 42 3b  d char *zA, *zB;
5b90: 0a 20 20 75 33 32 20 65 73 63 61 70 65 20 3d 20  .  u32 escape = 
5ba0: 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 3b 0a 20  0;.  int nPat;. 
5bb0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
5bc0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
5bd0: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
5be0: 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
5bf0: 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41  E_LIKE_DOESNT_MA
5c00: 54 43 48 5f 42 4c 4f 42 53 0a 20 20 69 66 28 20  TCH_BLOBS.  if( 
5c10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
5c20: 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c  pe(argv[0])==SQL
5c30: 49 54 45 5f 42 4c 4f 42 0a 20 20 20 7c 7c 20 73  ITE_BLOB.   || s
5c40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
5c50: 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49  e(argv[1])==SQLI
5c60: 54 45 5f 42 4c 4f 42 0a 20 20 29 7b 0a 23 69 66  TE_BLOB.  ){.#if
5c70: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
5c80: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65      sqlite3_like
5c90: 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
5ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
5cb0: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
5cc0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
5cd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 42  .  }.#endif.  zB
5ce0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5cf0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
5d00: 20 20 7a 41 20 3d 20 73 71 6c 69 74 65 33 5f 76    zA = sqlite3_v
5d10: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
5d20: 5d 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6d 69 74 20  ]);..  /* Limit 
5d30: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
5d40: 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70  e LIKE or GLOB p
5d50: 61 74 74 65 72 6e 20 74 6f 20 61 76 6f 69 64 20  attern to avoid 
5d60: 70 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 6f 66  problems.  ** of
5d70: 20 64 65 65 70 20 72 65 63 75 72 73 69 6f 6e 20   deep recursion 
5d80: 61 6e 64 20 4e 2a 4e 20 62 65 68 61 76 69 6f 72  and N*N behavior
5d90: 20 69 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61   in patternCompa
5da0: 72 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61  re()..  */.  nPa
5db0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
5dc0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
5dd0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
5de0: 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  at==db->aLimit[S
5df0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
5e00: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
5e10: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
5e20: 6e 50 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  nPat==db->aLimit
5e30: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49  [SQLITE_LIMIT_LI
5e40: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
5e50: 48 5d 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  H]+1 );.  if( nP
5e60: 61 74 20 3e 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  at > db->aLimit[
5e70: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
5e80: 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
5e90: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
5ea0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
5eb0: 6e 74 65 78 74 2c 20 22 4c 49 4b 45 20 6f 72 20  ntext, "LIKE or 
5ec0: 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 6f  GLOB pattern too
5ed0: 20 63 6f 6d 70 6c 65 78 22 2c 20 2d 31 29 3b 0a   complex", -1);.
5ee0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5ef0: 20 20 61 73 73 65 72 74 28 20 7a 42 3d 3d 73 71    assert( zB==sq
5f00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5f10: 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a  (argv[0]) );  /*
5f20: 20 45 6e 63 6f 64 69 6e 67 20 64 69 64 20 6e 6f   Encoding did no
5f30: 74 20 63 68 61 6e 67 65 20 2a 2f 0a 0a 20 20 69  t change */..  i
5f40: 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20  f( argc==3 ){.  
5f50: 20 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20    /* The escape 
5f60: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
5f70: 20 6d 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66   must consist of
5f80: 20 61 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20   a single UTF-8 
5f90: 63 68 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a  character..    *
5fa0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
5fb0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
5fc0: 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75    */.    const u
5fd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45  nsigned char *zE
5fe0: 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  sc = sqlite3_val
5ff0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29  ue_text(argv[2])
6000: 3b 0a 20 20 20 20 69 66 28 20 7a 45 73 63 3d 3d  ;.    if( zEsc==
6010: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
6020: 69 66 28 20 73 71 6c 69 74 65 33 55 74 66 38 43  if( sqlite3Utf8C
6030: 68 61 72 4c 65 6e 28 28 63 68 61 72 2a 29 7a 45  harLen((char*)zE
6040: 73 63 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20 20  sc, -1)!=1 ){.  
6050: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6060: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
6070: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 45 53  , .          "ES
6080: 43 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20  CAPE expression 
6090: 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65  must be a single
60a0: 20 63 68 61 72 61 63 74 65 72 22 2c 20 2d 31 29   character", -1)
60b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
60c0: 20 20 20 20 7d 0a 20 20 20 20 65 73 63 61 70 65      }.    escape
60d0: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
60e0: 61 64 28 26 7a 45 73 63 29 3b 0a 20 20 7d 0a 20  ad(&zEsc);.  }. 
60f0: 20 69 66 28 20 7a 41 20 26 26 20 7a 42 20 29 7b   if( zA && zB ){
6100: 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6d 70  .    struct comp
6110: 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  areInfo *pInfo =
6120: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
6130: 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 23 69 66  ta(context);.#if
6140: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
6150: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65      sqlite3_like
6160: 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
6170: 0a 20 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65  .    .    sqlite
6180: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
6190: 74 65 78 74 2c 20 70 61 74 74 65 72 6e 43 6f 6d  text, patternCom
61a0: 70 61 72 65 28 7a 42 2c 20 7a 41 2c 20 70 49 6e  pare(zB, zA, pIn
61b0: 66 6f 2c 20 65 73 63 61 70 65 29 29 3b 0a 20 20  fo, escape));.  
61c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  }.}../*.** Imple
61d0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
61e0: 20 4e 55 4c 4c 49 46 28 78 2c 79 29 20 66 75 6e   NULLIF(x,y) fun
61f0: 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 73 75  ction.  The resu
6200: 6c 74 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  lt is the first.
6210: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 66 20 74  ** argument if t
6220: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  he arguments are
6230: 20 64 69 66 66 65 72 65 6e 74 2e 20 20 54 68 65   different.  The
6240: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20   result is NULL 
6250: 69 66 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  if the.** argume
6260: 6e 74 73 20 61 72 65 20 65 71 75 61 6c 20 74 6f  nts are equal to
6270: 20 65 61 63 68 20 6f 74 68 65 72 2e 0a 2a 2f 0a   each other..*/.
6280: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 75 6c 6c  static void null
6290: 69 66 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  ifFunc(.  sqlite
62a0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
62b0: 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  xt,.  int NotUse
62c0: 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  d,.  sqlite3_val
62d0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 43  ue **argv.){.  C
62e0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
62f0: 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f  sqlite3GetFuncCo
6300: 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a  llSeq(context);.
6310: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
6320: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  ER(NotUsed);.  i
6330: 66 28 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  f( sqlite3MemCom
6340: 70 61 72 65 28 61 72 67 76 5b 30 5d 2c 20 61 72  pare(argv[0], ar
6350: 67 76 5b 31 5d 2c 20 70 43 6f 6c 6c 29 21 3d 30  gv[1], pColl)!=0
6360: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6370: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
6380: 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  text, argv[0]);.
6390: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70    }.}../*.** Imp
63a0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
63b0: 68 65 20 73 71 6c 69 74 65 5f 76 65 72 73 69 6f  he sqlite_versio
63c0: 6e 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  n() function.  T
63d0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65  he result is the
63e0: 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74   version.** of t
63f0: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
6400: 79 20 74 68 61 74 20 69 73 20 72 75 6e 6e 69 6e  y that is runnin
6410: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
6420: 64 20 76 65 72 73 69 6f 6e 46 75 6e 63 28 0a 20  d versionFunc(. 
6430: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6440: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
6450: 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69   NotUsed,.  sqli
6460: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55  te3_value **NotU
6470: 73 65 64 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44  sed2.){.  UNUSED
6480: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
6490: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
64a0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38 36 39    /* IMP: R-4869
64b0: 39 2d 34 38 36 31 37 20 54 68 69 73 20 66 75 6e  9-48617 This fun
64c0: 63 74 69 6f 6e 20 69 73 20 61 6e 20 53 51 4c 20  ction is an SQL 
64d0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74  wrapper around t
64e0: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  he.  ** sqlite3_
64f0: 6c 69 62 76 65 72 73 69 6f 6e 28 29 20 43 2d 69  libversion() C-i
6500: 6e 74 65 72 66 61 63 65 2e 20 2a 2f 0a 20 20 73  nterface. */.  s
6510: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6520: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  xt(context, sqli
6530: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
6540: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
6550: 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  TIC);.}../*.** I
6560: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
6570: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 6f 75 72   the sqlite_sour
6580: 63 65 5f 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  ce_id() function
6590: 2e 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  . The result is 
65a0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
65b0: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
65c0: 70 61 72 74 69 63 75 6c 61 72 20 76 65 72 73 69  particular versi
65d0: 6f 6e 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  on of the source
65e0: 20 63 6f 64 65 20 75 73 65 64 20 74 6f 20 62 75   code used to bu
65f0: 69 6c 64 0a 2a 2a 20 53 51 4c 69 74 65 2e 0a 2a  ild.** SQLite..*
6600: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 6f  /.static void so
6610: 75 72 63 65 69 64 46 75 6e 63 28 0a 20 20 73 71  urceidFunc(.  sq
6620: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6630: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
6640: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
6650: 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
6660: 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  2.){.  UNUSED_PA
6670: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
6680: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f  , NotUsed2);.  /
6690: 2a 20 49 4d 50 3a 20 52 2d 32 34 34 37 30 2d 33  * IMP: R-24470-3
66a0: 31 31 33 36 20 54 68 69 73 20 66 75 6e 63 74 69  1136 This functi
66b0: 6f 6e 20 69 73 20 61 6e 20 53 51 4c 20 77 72 61  on is an SQL wra
66c0: 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 0a  pper around the.
66d0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 75    ** sqlite3_sou
66e0: 72 63 65 69 64 28 29 20 43 20 69 6e 74 65 72 66  rceid() C interf
66f0: 61 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ace. */.  sqlite
6700: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
6710: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 73  ntext, sqlite3_s
6720: 6f 75 72 63 65 69 64 28 29 2c 20 2d 31 2c 20 53  ourceid(), -1, S
6730: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d  QLITE_STATIC);.}
6740: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
6750: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  tation of the sq
6760: 6c 69 74 65 5f 6c 6f 67 28 29 20 66 75 6e 63 74  lite_log() funct
6770: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 61 20  ion.  This is a 
6780: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a  wrapper around.*
6790: 2a 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 2e  * sqlite3_log().
67a0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
67b0: 75 65 20 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65  ue is NULL.  The
67c0: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
67d0: 20 70 75 72 65 6c 79 20 66 6f 72 0a 2a 2a 20 69   purely for.** i
67e0: 74 73 20 73 69 64 65 2d 65 66 66 65 63 74 73 2e  ts side-effects.
67f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6800: 65 72 72 6c 6f 67 46 75 6e 63 28 0a 20 20 73 71  errlogFunc(.  sq
6810: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6820: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
6830: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
6840: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
6850: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6860: 28 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44  (argc);.  UNUSED
6870: 5f 50 41 52 41 4d 45 54 45 52 28 63 6f 6e 74 65  _PARAMETER(conte
6880: 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  xt);.  sqlite3_l
6890: 6f 67 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  og(sqlite3_value
68a0: 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 2c 20 22  _int(argv[0]), "
68b0: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  %s", sqlite3_val
68c0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
68d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
68e0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
68f0: 65 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65  e sqlite_compile
6900: 6f 70 74 69 6f 6e 5f 75 73 65 64 28 29 20 66 75  option_used() fu
6910: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72  nction..** The r
6920: 65 73 75 6c 74 20 69 73 20 61 6e 20 69 6e 74 65  esult is an inte
6930: 67 65 72 20 74 68 61 74 20 69 64 65 6e 74 69 66  ger that identif
6940: 69 65 73 20 69 66 20 74 68 65 20 63 6f 6d 70 69  ies if the compi
6950: 6c 65 72 20 6f 70 74 69 6f 6e 0a 2a 2a 20 77 61  ler option.** wa
6960: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
6970: 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e 64  SQLite..*/.#ifnd
6980: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
6990: 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41  OMPILEOPTION_DIA
69a0: 47 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  GS.static void c
69b0: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 75 73 65 64  ompileoptionused
69c0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
69d0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
69e0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
69f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6a00: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
6a10: 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a  char *zOptName;.
6a20: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
6a30: 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  1 );.  UNUSED_PA
6a40: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
6a50: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 39 35 36 34   /* IMP: R-39564
6a60: 2d 33 36 33 30 35 20 54 68 65 20 73 71 6c 69 74  -36305 The sqlit
6a70: 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  e_compileoption_
6a80: 75 73 65 64 28 29 20 53 51 4c 0a 20 20 2a 2a 20  used() SQL.  ** 
6a90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
6aa0: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65  apper around the
6ab0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65   sqlite3_compile
6ac0: 6f 70 74 69 6f 6e 5f 75 73 65 64 28 29 20 43 2f  option_used() C/
6ad0: 43 2b 2b 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  C++.  ** functio
6ae0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 7a  n..  */.  if( (z
6af0: 4f 70 74 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  OptName = (const
6b00: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
6b10: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6b20: 5d 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  ]))!=0 ){.    sq
6b30: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
6b40: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
6b50: 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
6b60: 75 73 65 64 28 7a 4f 70 74 4e 61 6d 65 29 29 3b  used(zOptName));
6b70: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
6b80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
6b90: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
6ba0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65   */../*.** Imple
6bb0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
6bc0: 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f   sqlite_compileo
6bd0: 70 74 69 6f 6e 5f 67 65 74 28 29 20 66 75 6e 63  ption_get() func
6be0: 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 72 65  tion. .** The re
6bf0: 73 75 6c 74 20 69 73 20 61 20 73 74 72 69 6e 67  sult is a string
6c00: 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 73   that identifies
6c10: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70   the compiler op
6c20: 74 69 6f 6e 73 20 0a 2a 2a 20 75 73 65 64 20 74  tions .** used t
6c30: 6f 20 62 75 69 6c 64 20 53 51 4c 69 74 65 2e 0a  o build SQLite..
6c40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
6c50: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
6c60: 54 49 4f 4e 5f 44 49 41 47 53 0a 73 74 61 74 69  TION_DIAGS.stati
6c70: 63 20 76 6f 69 64 20 63 6f 6d 70 69 6c 65 6f 70  c void compileop
6c80: 74 69 6f 6e 67 65 74 46 75 6e 63 28 0a 20 20 73  tiongetFunc(.  s
6c90: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6ca0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
6cb0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
6cc0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
6cd0: 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74   int n;.  assert
6ce0: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55  ( argc==1 );.  U
6cf0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6d00: 61 72 67 63 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a  argc);.  /* IMP:
6d10: 20 52 2d 30 34 39 32 32 2d 32 34 30 37 36 20 54   R-04922-24076 T
6d20: 68 65 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c  he sqlite_compil
6d30: 65 6f 70 74 69 6f 6e 5f 67 65 74 28 29 20 53 51  eoption_get() SQ
6d40: 4c 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  L function.  ** 
6d50: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
6d60: 75 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f  und the sqlite3_
6d70: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65  compileoption_ge
6d80: 74 28 29 20 43 2f 43 2b 2b 20 66 75 6e 63 74 69  t() C/C++ functi
6d90: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 73  on..  */.  n = s
6da0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
6db0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c  (argv[0]);.  sql
6dc0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
6dd0: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
6de0: 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
6df0: 67 65 74 28 6e 29 2c 20 2d 31 2c 20 53 51 4c 49  get(n), -1, SQLI
6e00: 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 23 65  TE_STATIC);.}.#e
6e10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6e20: 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
6e30: 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 2f 2a 20 41  N_DIAGS */../* A
6e40: 72 72 61 79 20 66 6f 72 20 63 6f 6e 76 65 72 74  rray for convert
6e50: 69 6e 67 20 66 72 6f 6d 20 68 61 6c 66 2d 62 79  ing from half-by
6e60: 74 65 73 20 28 6e 79 62 62 6c 65 73 29 20 69 6e  tes (nybbles) in
6e70: 74 6f 20 41 53 43 49 49 20 68 65 78 0a 2a 2a 20  to ASCII hex.** 
6e80: 64 69 67 69 74 73 2e 20 2a 2f 0a 73 74 61 74 69  digits. */.stati
6e90: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 68 65 78  c const char hex
6ea0: 64 69 67 69 74 73 5b 5d 20 3d 20 7b 0a 20 20 27  digits[] = {.  '
6eb0: 30 27 2c 20 27 31 27 2c 20 27 32 27 2c 20 27 33  0', '1', '2', '3
6ec0: 27 2c 20 27 34 27 2c 20 27 35 27 2c 20 27 36 27  ', '4', '5', '6'
6ed0: 2c 20 27 37 27 2c 0a 20 20 27 38 27 2c 20 27 39  , '7',.  '8', '9
6ee0: 27 2c 20 27 41 27 2c 20 27 42 27 2c 20 27 43 27  ', 'A', 'B', 'C'
6ef0: 2c 20 27 44 27 2c 20 27 45 27 2c 20 27 46 27 20  , 'D', 'E', 'F' 
6f00: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .};../*.** Imple
6f10: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
6f20: 20 51 55 4f 54 45 28 29 20 66 75 6e 63 74 69 6f   QUOTE() functio
6f30: 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  n.  This functio
6f40: 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65  n takes a single
6f50: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 49  .** argument.  I
6f60: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
6f70: 73 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 20 72  s numeric, the r
6f80: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
6f90: 68 65 20 73 61 6d 65 20 61 73 0a 2a 2a 20 74 68  he same as.** th
6fa0: 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20  e argument.  If 
6fb0: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
6fc0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 74 75 72 6e  NULL, the return
6fd0: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 74   value is the st
6fe0: 72 69 6e 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e 20  ring.** "NULL". 
6ff0: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
7000: 61 72 67 75 6d 65 6e 74 20 69 73 20 65 6e 63 6c  argument is encl
7010: 6f 73 65 64 20 69 6e 20 73 69 6e 67 6c 65 20 71  osed in single q
7020: 75 6f 74 65 73 20 77 69 74 68 0a 2a 2a 20 73 69  uotes with.** si
7030: 6e 67 6c 65 2d 71 75 6f 74 65 20 65 73 63 61 70  ngle-quote escap
7040: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
7050: 69 64 20 71 75 6f 74 65 46 75 6e 63 28 73 71 6c  id quoteFunc(sql
7060: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
7070: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
7080: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7090: 2a 61 72 67 76 29 7b 0a 20 20 61 73 73 65 72 74  *argv){.  assert
70a0: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55  ( argc==1 );.  U
70b0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
70c0: 61 72 67 63 29 3b 0a 20 20 73 77 69 74 63 68 28  argc);.  switch(
70d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
70e0: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a  ype(argv[0]) ){.
70f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7100: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 64  FLOAT: {.      d
7110: 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20  ouble r1, r2;.  
7120: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30      char zBuf[50
7130: 5d 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  ];.      r1 = sq
7140: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
7150: 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  le(argv[0]);.   
7160: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7170: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
7180: 2c 20 7a 42 75 66 2c 20 22 25 21 2e 31 35 67 22  , zBuf, "%!.15g"
7190: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
71a0: 69 74 65 33 41 74 6f 46 28 7a 42 75 66 2c 20 26  ite3AtoF(zBuf, &
71b0: 72 32 2c 20 32 30 2c 20 53 51 4c 49 54 45 5f 55  r2, 20, SQLITE_U
71c0: 54 46 38 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TF8);.      if( 
71d0: 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20  r1!=r2 ){.      
71e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
71f0: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
7200: 20 7a 42 75 66 2c 20 22 25 21 2e 32 30 65 22 2c   zBuf, "%!.20e",
7210: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r1);.      }.  
7220: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7230: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
7240: 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54   zBuf, -1, SQLIT
7250: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
7260: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7270: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7280: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
7290: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
72a0: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
72b0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
72c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
72d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f   case SQLITE_BLO
72e0: 42 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  B: {.      char 
72f0: 2a 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  *zText = 0;.    
7300: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 42    char const *zB
7310: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
7320: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
7330: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c  );.      int nBl
7340: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
7350: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
7360: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
7370: 20 7a 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f   zBlob==sqlite3_
7380: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
7390: 30 5d 29 20 29 3b 20 2f 2a 20 4e 6f 20 65 6e 63  0]) ); /* No enc
73a0: 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a  oding change */.
73b0: 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 28 63        zText = (c
73c0: 68 61 72 20 2a 29 63 6f 6e 74 65 78 74 4d 61 6c  har *)contextMal
73d0: 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 32 2a  loc(context, (2*
73e0: 28 69 36 34 29 6e 42 6c 6f 62 29 2b 34 29 3b 20  (i64)nBlob)+4); 
73f0: 0a 20 20 20 20 20 20 69 66 28 20 7a 54 65 78 74  .      if( zText
7400: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
7410: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
7420: 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b  =0; i<nBlob; i++
7430: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65  ){.          zTe
7440: 78 74 5b 28 69 2a 32 29 2b 32 5d 20 3d 20 68 65  xt[(i*2)+2] = he
7450: 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f 62 5b 69  xdigits[(zBlob[i
7460: 5d 3e 3e 34 29 26 30 78 30 46 5d 3b 0a 20 20 20  ]>>4)&0x0F];.   
7470: 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a         zText[(i*
7480: 32 29 2b 33 5d 20 3d 20 68 65 78 64 69 67 69 74  2)+3] = hexdigit
7490: 73 5b 28 7a 42 6c 6f 62 5b 69 5d 29 26 30 78 30  s[(zBlob[i])&0x0
74a0: 46 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  F];.        }.  
74b0: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c        zText[(nBl
74c0: 6f 62 2a 32 29 2b 32 5d 20 3d 20 27 5c 27 27 3b  ob*2)+2] = '\'';
74d0: 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28  .        zText[(
74e0: 6e 42 6c 6f 62 2a 32 29 2b 33 5d 20 3d 20 27 5c  nBlob*2)+3] = '\
74f0: 30 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78  0';.        zTex
7500: 74 5b 30 5d 20 3d 20 27 58 27 3b 0a 20 20 20 20  t[0] = 'X';.    
7510: 20 20 20 20 7a 54 65 78 74 5b 31 5d 20 3d 20 27      zText[1] = '
7520: 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  \'';.        sql
7530: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7540: 28 63 6f 6e 74 65 78 74 2c 20 7a 54 65 78 74 2c  (context, zText,
7550: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
7560: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20  SIENT);.        
7570: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
7580: 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
7590: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
75a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
75b0: 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TEXT: {.      in
75c0: 74 20 69 2c 6a 3b 0a 20 20 20 20 20 20 75 36 34  t i,j;.      u64
75d0: 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
75e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
75f0: 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Arg = sqlite3_va
7600: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
7610: 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
7620: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 7a 41 72  ;..      if( zAr
7630: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  g==0 ) return;. 
7640: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d       for(i=0, n=
7650: 30 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29  0; zArg[i]; i++)
7660: 7b 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27  { if( zArg[i]=='
7670: 5c 27 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20  \'' ) n++; }.   
7680: 20 20 20 7a 20 3d 20 63 6f 6e 74 65 78 74 4d 61     z = contextMa
7690: 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28  lloc(context, ((
76a0: 69 36 34 29 69 29 2b 28 28 69 36 34 29 6e 29 2b  i64)i)+((i64)n)+
76b0: 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20  3);.      if( z 
76c0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 5b 30 5d 20  ){.        z[0] 
76d0: 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  = '\'';.        
76e0: 66 6f 72 28 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41  for(i=0, j=1; zA
76f0: 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  rg[i]; i++){.   
7700: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
7710: 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
7720: 20 20 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d     if( zArg[i]==
7730: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
7740: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27      z[j++] = '\'
7750: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
7760: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7770: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[j++] = '\'';.
7780: 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30          z[j] = 0
7790: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
77a0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
77b0: 6e 74 65 78 74 2c 20 7a 2c 20 6a 2c 20 73 71 6c  ntext, z, j, sql
77c0: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20  ite3_free);.    
77d0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
77e0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
77f0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
7800: 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rt( sqlite3_valu
7810: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
7820: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a  =SQLITE_NULL );.
7830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7840: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
7850: 74 2c 20 22 4e 55 4c 4c 22 2c 20 34 2c 20 53 51  t, "NULL", 4, SQ
7860: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7870: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7880: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
7890: 65 20 75 6e 69 63 6f 64 65 28 29 20 66 75 6e 63  e unicode() func
78a0: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74 68  tion.  Return th
78b0: 65 20 69 6e 74 65 67 65 72 20 75 6e 69 63 6f 64  e integer unicod
78c0: 65 20 63 6f 64 65 2d 70 6f 69 6e 74 20 76 61 6c  e code-point val
78d0: 75 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 69  ue.** for the fi
78e0: 72 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  rst character of
78f0: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
7900: 67 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  g. .*/.static vo
7910: 69 64 20 75 6e 69 63 6f 64 65 46 75 6e 63 28 0a  id unicodeFunc(.
7920: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
7930: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
7940: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
7950: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
7960: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
7970: 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  ed char *z = sql
7980: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
7990: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 28 76 6f 69  argv[0]);.  (voi
79a0: 64 29 61 72 67 63 3b 0a 20 20 69 66 28 20 7a 20  d)argc;.  if( z 
79b0: 26 26 20 7a 5b 30 5d 20 29 20 73 71 6c 69 74 65  && z[0] ) sqlite
79c0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
79d0: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 55 74 66  text, sqlite3Utf
79e0: 38 52 65 61 64 28 26 7a 29 29 3b 0a 7d 0a 0a 2f  8Read(&z));.}../
79f0: 2a 0a 2a 2a 20 54 68 65 20 63 68 61 72 28 29 20  *.** The char() 
7a00: 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 7a  function takes z
7a10: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75  ero or more argu
7a20: 6d 65 6e 74 73 2c 20 65 61 63 68 20 6f 66 20 77  ments, each of w
7a30: 68 69 63 68 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  hich is.** an in
7a40: 74 65 67 65 72 2e 20 20 49 74 20 63 6f 6e 73 74  teger.  It const
7a50: 72 75 63 74 73 20 61 20 73 74 72 69 6e 67 20 77  ructs a string w
7a60: 68 65 72 65 20 65 61 63 68 20 63 68 61 72 61 63  here each charac
7a70: 74 65 72 20 6f 66 20 74 68 65 20 73 74 72 69 6e  ter of the strin
7a80: 67 0a 2a 2a 20 69 73 20 74 68 65 20 75 6e 69 63  g.** is the unic
7a90: 6f 64 65 20 63 68 61 72 61 63 74 65 72 20 66 6f  ode character fo
7aa0: 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  r the correspond
7ab0: 69 6e 67 20 69 6e 74 65 67 65 72 20 61 72 67 75  ing integer argu
7ac0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
7ad0: 76 6f 69 64 20 63 68 61 72 46 75 6e 63 28 0a 20  void charFunc(. 
7ae0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7af0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
7b00: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
7b10: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
7b20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
7b30: 20 2a 7a 2c 20 2a 7a 4f 75 74 3b 0a 20 20 69 6e   *z, *zOut;.  in
7b40: 74 20 69 3b 0a 20 20 7a 4f 75 74 20 3d 20 7a 20  t i;.  zOut = z 
7b50: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
7b60: 36 34 28 20 61 72 67 63 2a 34 2b 31 20 29 3b 0a  64( argc*4+1 );.
7b70: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
7b80: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7b90: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
7ba0: 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72  text);.    retur
7bb0: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
7bc0: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
7bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
7be0: 34 20 78 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  4 x;.    unsigne
7bf0: 64 20 63 3b 0a 20 20 20 20 78 20 3d 20 73 71 6c  d c;.    x = sql
7c00: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
7c10: 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69  (argv[i]);.    i
7c20: 66 28 20 78 3c 30 20 7c 7c 20 78 3e 30 78 31 30  f( x<0 || x>0x10
7c30: 66 66 66 66 20 29 20 78 20 3d 20 30 78 66 66 66  ffff ) x = 0xfff
7c40: 64 3b 0a 20 20 20 20 63 20 3d 20 28 75 6e 73 69  d;.    c = (unsi
7c50: 67 6e 65 64 29 28 78 20 26 20 30 78 31 66 66 66  gned)(x & 0x1fff
7c60: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 63 3c 30  ff);.    if( c<0
7c70: 78 30 30 30 38 30 20 29 7b 0a 20 20 20 20 20 20  x00080 ){.      
7c80: 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28 63  *zOut++ = (u8)(c
7c90: 26 30 78 46 46 29 3b 0a 20 20 20 20 7d 65 6c 73  &0xFF);.    }els
7ca0: 65 20 69 66 28 20 63 3c 30 78 30 30 38 30 30 20  e if( c<0x00800 
7cb0: 29 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b  ){.      *zOut++
7cc0: 20 3d 20 30 78 43 30 20 2b 20 28 75 38 29 28 28   = 0xC0 + (u8)((
7cd0: 63 3e 3e 36 29 26 30 78 31 46 29 3b 0a 20 20 20  c>>6)&0x1F);.   
7ce0: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38     *zOut++ = 0x8
7cf0: 30 20 2b 20 28 75 38 29 28 63 20 26 20 30 78 33  0 + (u8)(c & 0x3
7d00: 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  F);.    }else if
7d10: 28 20 63 3c 30 78 31 30 30 30 30 20 29 7b 0a 20  ( c<0x10000 ){. 
7d20: 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30       *zOut++ = 0
7d30: 78 45 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 31  xE0 + (u8)((c>>1
7d40: 32 29 26 30 78 30 46 29 3b 0a 20 20 20 20 20 20  2)&0x0F);.      
7d50: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b  *zOut++ = 0x80 +
7d60: 20 28 75 38 29 28 28 63 3e 3e 36 29 20 26 20 30   (u8)((c>>6) & 0
7d70: 78 33 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75  x3F);.      *zOu
7d80: 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38  t++ = 0x80 + (u8
7d90: 29 28 63 20 26 20 30 78 33 46 29 3b 0a 20 20 20  )(c & 0x3F);.   
7da0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 7a   }else{.      *z
7db0: 4f 75 74 2b 2b 20 3d 20 30 78 46 30 20 2b 20 28  Out++ = 0xF0 + (
7dc0: 75 38 29 28 28 63 3e 3e 31 38 29 20 26 20 30 78  u8)((c>>18) & 0x
7dd0: 30 37 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74  07);.      *zOut
7de0: 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29  ++ = 0x80 + (u8)
7df0: 28 28 63 3e 3e 31 32 29 20 26 20 30 78 33 46 29  ((c>>12) & 0x3F)
7e00: 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20  ;.      *zOut++ 
7e10: 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 28 63  = 0x80 + (u8)((c
7e20: 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 0a 20 20  >>6) & 0x3F);.  
7e30: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
7e40: 38 30 20 2b 20 28 75 38 29 28 63 20 26 20 30 78  80 + (u8)(c & 0x
7e50: 33 46 29 3b 0a 20 20 20 20 7d 20 20 20 20 20 20  3F);.    }      
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
7e90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65    }.  sqlite3_re
7ea0: 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74  sult_text64(cont
7eb0: 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 7a  ext, (char*)z, z
7ec0: 4f 75 74 2d 7a 2c 20 73 71 6c 69 74 65 33 5f 66  Out-z, sqlite3_f
7ed0: 72 65 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ree, SQLITE_UTF8
7ee0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
7ef0: 68 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  hex() function. 
7f00: 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 61   Interpret the a
7f10: 72 67 75 6d 65 6e 74 20 61 73 20 61 20 62 6c 6f  rgument as a blo
7f20: 62 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  b.  Return.** a 
7f30: 68 65 78 61 64 65 63 69 6d 61 6c 20 72 65 6e 64  hexadecimal rend
7f40: 65 72 69 6e 67 20 61 73 20 74 65 78 74 2e 0a 2a  ering as text..*
7f50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
7f60: 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  xFunc(.  sqlite3
7f70: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
7f80: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
7f90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7fa0: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69  *argv.){.  int i
7fb0: 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  , n;.  const uns
7fc0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 6c 6f  igned char *pBlo
7fd0: 62 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 78 2c  b;.  char *zHex,
7fe0: 20 2a 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 61   *z;.  assert( a
7ff0: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
8000: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
8010: 63 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71  c);.  pBlob = sq
8020: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
8030: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d  (argv[0]);.  n =
8040: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
8050: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
8060: 20 61 73 73 65 72 74 28 20 70 42 6c 6f 62 3d 3d   assert( pBlob==
8070: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
8080: 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 20  ob(argv[0]) );  
8090: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
80a0: 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 20 3d 20 7a  hange */.  z = z
80b0: 48 65 78 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c  Hex = contextMal
80c0: 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69  loc(context, ((i
80d0: 36 34 29 6e 29 2a 32 20 2b 20 31 29 3b 0a 20 20  64)n)*2 + 1);.  
80e0: 69 66 28 20 7a 48 65 78 20 29 7b 0a 20 20 20 20  if( zHex ){.    
80f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
8100: 2b 2c 20 70 42 6c 6f 62 2b 2b 29 7b 0a 20 20 20  +, pBlob++){.   
8110: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
8120: 20 63 20 3d 20 2a 70 42 6c 6f 62 3b 0a 20 20 20   c = *pBlob;.   
8130: 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64     *(z++) = hexd
8140: 69 67 69 74 73 5b 28 63 3e 3e 34 29 26 30 78 66  igits[(c>>4)&0xf
8150: 5d 3b 0a 20 20 20 20 20 20 2a 28 7a 2b 2b 29 20  ];.      *(z++) 
8160: 3d 20 68 65 78 64 69 67 69 74 73 5b 63 26 30 78  = hexdigits[c&0x
8170: 66 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  f];.    }.    *z
8180: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
8190: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
81a0: 6e 74 65 78 74 2c 20 7a 48 65 78 2c 20 6e 2a 32  ntext, zHex, n*2
81b0: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
81c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
81d0: 65 20 7a 65 72 6f 62 6c 6f 62 28 4e 29 20 66 75  e zeroblob(N) fu
81e0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
81f0: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 62 6c 6f   zero-filled blo
8200: 62 20 6f 66 20 73 69 7a 65 20 4e 20 62 79 74 65  b of size N byte
8210: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
8220: 64 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63 28 0a  d zeroblobFunc(.
8230: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
8240: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
8250: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
8260: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
8270: 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74  {.  i64 n;.  int
8280: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61   rc;.  assert( a
8290: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
82a0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
82b0: 63 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  c);.  n = sqlite
82c0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
82d0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3c  gv[0]);.  if( n<
82e0: 30 20 29 20 6e 20 3d 20 30 3b 0a 20 20 72 63 20  0 ) n = 0;.  rc 
82f0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  = sqlite3_result
8300: 5f 7a 65 72 6f 62 6c 6f 62 36 34 28 63 6f 6e 74  _zeroblob64(cont
8310: 65 78 74 2c 20 6e 29 3b 20 2f 2a 20 49 4d 50 3a  ext, n); /* IMP:
8320: 20 52 2d 30 30 32 39 33 2d 36 34 39 39 34 20 2a   R-00293-64994 *
8330: 2f 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  /.  if( rc ){.  
8340: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8350: 5f 65 72 72 6f 72 5f 63 6f 64 65 28 63 6f 6e 74  _error_code(cont
8360: 65 78 74 2c 20 72 63 29 3b 0a 20 20 7d 0a 7d 0a  ext, rc);.  }.}.
8370: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 70 6c 61  ./*.** The repla
8380: 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ce() function.  
8390: 54 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20  Three arguments 
83a0: 61 72 65 20 61 6c 6c 20 73 74 72 69 6e 67 73 3a  are all strings:
83b0: 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 6d 20 41 2c   call.** them A,
83c0: 20 42 2c 20 61 6e 64 20 43 2e 20 54 68 65 20 72   B, and C. The r
83d0: 65 73 75 6c 74 20 69 73 20 61 6c 73 6f 20 61 20  esult is also a 
83e0: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
83f0: 64 65 72 69 76 65 64 0a 2a 2a 20 66 72 6f 6d 20  derived.** from 
8400: 41 20 62 79 20 72 65 70 6c 61 63 69 6e 67 20 65  A by replacing e
8410: 76 65 72 79 20 6f 63 63 75 72 72 65 6e 63 65 20  very occurrence 
8420: 6f 66 20 42 20 77 69 74 68 20 43 2e 20 20 54 68  of B with C.  Th
8430: 65 20 6d 61 74 63 68 0a 2a 2a 20 6d 75 73 74 20  e match.** must 
8440: 62 65 20 65 78 61 63 74 2e 20 20 43 6f 6c 6c 61  be exact.  Colla
8450: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61  ting sequences a
8460: 72 65 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2f 0a  re not used..*/.
8470: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 70 6c  static void repl
8480: 61 63 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  aceFunc(.  sqlit
8490: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
84a0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
84b0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
84c0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
84d0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
84e0: 20 2a 7a 53 74 72 3b 20 20 20 20 20 20 20 20 2f   *zStr;        /
84f0: 2a 20 54 68 65 20 69 6e 70 75 74 20 73 74 72 69  * The input stri
8500: 6e 67 20 41 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ng A */.  const 
8510: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
8520: 50 61 74 74 65 72 6e 3b 20 20 20 20 2f 2a 20 54  Pattern;    /* T
8530: 68 65 20 70 61 74 74 65 72 6e 20 73 74 72 69 6e  he pattern strin
8540: 67 20 42 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  g B */.  const u
8550: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 52  nsigned char *zR
8560: 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ep;        /* Th
8570: 65 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 73 74  e replacement st
8580: 72 69 6e 67 20 43 20 2a 2f 0a 20 20 75 6e 73 69  ring C */.  unsi
8590: 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75 74 3b  gned char *zOut;
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
85b0: 20 54 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   The output */. 
85c0: 20 69 6e 74 20 6e 53 74 72 3b 20 20 20 20 20 20   int nStr;      
85d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
85e0: 65 20 6f 66 20 7a 53 74 72 20 2a 2f 0a 20 20 69  e of zStr */.  i
85f0: 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20 20 20 20  nt nPattern;    
8600: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
8610: 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20  of zPattern */. 
8620: 20 69 6e 74 20 6e 52 65 70 3b 20 20 20 20 20 20   int nRep;      
8630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
8640: 65 20 6f 66 20 7a 52 65 70 20 2a 2f 0a 20 20 69  e of zRep */.  i
8650: 36 34 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  64 nOut;        
8660: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
8670: 75 6d 20 73 69 7a 65 20 6f 66 20 7a 4f 75 74 20  um size of zOut 
8680: 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6f 70 4c 69 6d  */.  int loopLim
8690: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  it;           /*
86a0: 20 4c 61 73 74 20 7a 53 74 72 5b 5d 20 74 68 61   Last zStr[] tha
86b0: 74 20 6d 69 67 68 74 20 6d 61 74 63 68 20 7a 50  t might match zP
86c0: 61 74 74 65 72 6e 5b 5d 20 2a 2f 0a 20 20 69 6e  attern[] */.  in
86d0: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
86e0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
86f0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 0a 20 20 61 73  ounters */..  as
8700: 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20 29 3b  sert( argc==3 );
8710: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8720: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 7a 53 74  TER(argc);.  zSt
8730: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
8740: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
8750: 0a 20 20 69 66 28 20 7a 53 74 72 3d 3d 30 20 29  .  if( zStr==0 )
8760: 20 72 65 74 75 72 6e 3b 0a 20 20 6e 53 74 72 20   return;.  nStr 
8770: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8780: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
8790: 20 20 61 73 73 65 72 74 28 20 7a 53 74 72 3d 3d    assert( zStr==
87a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
87b0: 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 20  xt(argv[0]) );  
87c0: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
87d0: 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 50 61 74 74  hange */.  zPatt
87e0: 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ern = sqlite3_va
87f0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
8800: 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72  );.  if( zPatter
8810: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  n==0 ){.    asse
8820: 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rt( sqlite3_valu
8830: 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 3d  e_type(argv[1])=
8840: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20  =SQLITE_NULL.   
8850: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
8860: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
8870: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 2d 3e  andle(context)->
8880: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
8890: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
88a0: 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e 5b 30    if( zPattern[0
88b0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  ]==0 ){.    asse
88c0: 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rt( sqlite3_valu
88d0: 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 21  e_type(argv[1])!
88e0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a  =SQLITE_NULL );.
88f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8900: 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74  lt_value(context
8910: 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  , argv[0]);.    
8920: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 50  return;.  }.  nP
8930: 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33  attern = sqlite3
8940: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
8950: 76 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  v[1]);.  assert(
8960: 20 7a 50 61 74 74 65 72 6e 3d 3d 73 71 6c 69 74   zPattern==sqlit
8970: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8980: 67 76 5b 31 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f  gv[1]) );  /* No
8990: 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65   encoding change
89a0: 20 2a 2f 0a 20 20 7a 52 65 70 20 3d 20 73 71 6c   */.  zRep = sql
89b0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
89c0: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  argv[2]);.  if( 
89d0: 7a 52 65 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  zRep==0 ) return
89e0: 3b 0a 20 20 6e 52 65 70 20 3d 20 73 71 6c 69 74  ;.  nRep = sqlit
89f0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
8a00: 72 67 76 5b 32 5d 29 3b 0a 20 20 61 73 73 65 72  rgv[2]);.  asser
8a10: 74 28 20 7a 52 65 70 3d 3d 73 71 6c 69 74 65 33  t( zRep==sqlite3
8a20: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8a30: 5b 32 5d 29 20 29 3b 0a 20 20 6e 4f 75 74 20 3d  [2]) );.  nOut =
8a40: 20 6e 53 74 72 20 2b 20 31 3b 0a 20 20 61 73 73   nStr + 1;.  ass
8a50: 65 72 74 28 20 6e 4f 75 74 3c 53 51 4c 49 54 45  ert( nOut<SQLITE
8a60: 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _MAX_LENGTH );. 
8a70: 20 7a 4f 75 74 20 3d 20 63 6f 6e 74 65 78 74 4d   zOut = contextM
8a80: 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28  alloc(context, (
8a90: 69 36 34 29 6e 4f 75 74 29 3b 0a 20 20 69 66 28  i64)nOut);.  if(
8aa0: 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   zOut==0 ){.    
8ab0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 6f  return;.  }.  lo
8ac0: 6f 70 4c 69 6d 69 74 20 3d 20 6e 53 74 72 20 2d  opLimit = nStr -
8ad0: 20 6e 50 61 74 74 65 72 6e 3b 20 20 0a 20 20 66   nPattern;  .  f
8ae0: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 3d 6c 6f 6f  or(i=j=0; i<=loo
8af0: 70 4c 69 6d 69 74 3b 20 69 2b 2b 29 7b 0a 20 20  pLimit; i++){.  
8b00: 20 20 69 66 28 20 7a 53 74 72 5b 69 5d 21 3d 7a    if( zStr[i]!=z
8b10: 50 61 74 74 65 72 6e 5b 30 5d 20 7c 7c 20 6d 65  Pattern[0] || me
8b20: 6d 63 6d 70 28 26 7a 53 74 72 5b 69 5d 2c 20 7a  mcmp(&zStr[i], z
8b30: 50 61 74 74 65 72 6e 2c 20 6e 50 61 74 74 65 72  Pattern, nPatter
8b40: 6e 29 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74  n) ){.      zOut
8b50: 5b 6a 2b 2b 5d 20 3d 20 7a 53 74 72 5b 69 5d 3b  [j++] = zStr[i];
8b60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8b70: 20 20 75 38 20 2a 7a 4f 6c 64 3b 0a 20 20 20 20    u8 *zOld;.    
8b80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8b90: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
8ba0: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
8bb0: 74 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b  t);.      nOut +
8bc0: 3d 20 6e 52 65 70 20 2d 20 6e 50 61 74 74 65 72  = nRep - nPatter
8bd0: 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  n;.      testcas
8be0: 65 28 20 6e 4f 75 74 2d 31 3d 3d 64 62 2d 3e 61  e( nOut-1==db->a
8bf0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8c00: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20  IT_LENGTH] );.  
8c10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f      testcase( nO
8c20: 75 74 2d 32 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  ut-2==db->aLimit
8c30: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
8c40: 4e 47 54 48 5d 20 29 3b 0a 20 20 20 20 20 20 69  NGTH] );.      i
8c50: 66 28 20 6e 4f 75 74 2d 31 3e 64 62 2d 3e 61 4c  f( nOut-1>db->aL
8c60: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8c70: 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20  T_LENGTH] ){.   
8c80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8c90: 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67  ult_error_toobig
8ca0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
8cb0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8cc0: 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72  zOut);.        r
8cd0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
8ce0: 20 20 20 20 20 7a 4f 6c 64 20 3d 20 7a 4f 75 74       zOld = zOut
8cf0: 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73  ;.      zOut = s
8d00: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34  qlite3_realloc64
8d10: 28 7a 4f 75 74 2c 20 28 69 6e 74 29 6e 4f 75 74  (zOut, (int)nOut
8d20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 75  );.      if( zOu
8d30: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
8d40: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8d50: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
8d60: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  xt);.        sql
8d70: 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b  ite3_free(zOld);
8d80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
8d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
8da0: 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20  emcpy(&zOut[j], 
8db0: 7a 52 65 70 2c 20 6e 52 65 70 29 3b 0a 20 20 20  zRep, nRep);.   
8dc0: 20 20 20 6a 20 2b 3d 20 6e 52 65 70 3b 0a 20 20     j += nRep;.  
8dd0: 20 20 20 20 69 20 2b 3d 20 6e 50 61 74 74 65 72      i += nPatter
8de0: 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n-1;.    }.  }. 
8df0: 20 61 73 73 65 72 74 28 20 6a 2b 6e 53 74 72 2d   assert( j+nStr-
8e00: 69 2b 31 3d 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d  i+1==nOut );.  m
8e10: 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20  emcpy(&zOut[j], 
8e20: 26 7a 53 74 72 5b 69 5d 2c 20 6e 53 74 72 2d 69  &zStr[i], nStr-i
8e30: 29 3b 0a 20 20 6a 20 2b 3d 20 6e 53 74 72 20 2d  );.  j += nStr -
8e40: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   i;.  assert( j<
8e50: 3d 6e 4f 75 74 20 29 3b 0a 20 20 7a 4f 75 74 5b  =nOut );.  zOut[
8e60: 6a 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  j] = 0;.  sqlite
8e70: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
8e80: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f  ntext, (char*)zO
8e90: 75 74 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66  ut, j, sqlite3_f
8ea0: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ree);.}../*.** I
8eb0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
8ec0: 20 74 68 65 20 54 52 49 4d 28 29 2c 20 4c 54 52   the TRIM(), LTR
8ed0: 49 4d 28 29 2c 20 61 6e 64 20 52 54 52 49 4d 28  IM(), and RTRIM(
8ee0: 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20  ) functions..** 
8ef0: 54 68 65 20 75 73 65 72 64 61 74 61 20 69 73 20  The userdata is 
8f00: 30 78 31 20 66 6f 72 20 6c 65 66 74 20 74 72 69  0x1 for left tri
8f10: 6d 2c 20 30 78 32 20 66 6f 72 20 72 69 67 68 74  m, 0x2 for right
8f20: 20 74 72 69 6d 2c 20 30 78 33 20 66 6f 72 20 62   trim, 0x3 for b
8f30: 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oth..*/.static v
8f40: 6f 69 64 20 74 72 69 6d 46 75 6e 63 28 0a 20 20  oid trimFunc(.  
8f50: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8f60: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
8f70: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
8f80: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
8f90: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
8fa0: 20 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20   char *zIn;     
8fb0: 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 73 74 72      /* Input str
8fc0: 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ing */.  const u
8fd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 43  nsigned char *zC
8fe0: 68 61 72 53 65 74 3b 20 20 20 20 2f 2a 20 53 65  harSet;    /* Se
8ff0: 74 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  t of characters 
9000: 74 6f 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74  to trim */.  int
9010: 20 6e 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20   nIn;           
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9030: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9040: 73 20 69 6e 20 69 6e 70 75 74 20 2a 2f 0a 20 20  s in input */.  
9050: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 20 2f 2a 20 31 3a 20 74 72 69 6d 6c 65 66 74    /* 1: trimleft
9080: 20 20 32 3a 20 74 72 69 6d 72 69 67 68 74 20 20    2: trimright  
9090: 33 3a 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74  3: trim */.  int
90a0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
90c0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
90d0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
90e0: 72 20 2a 61 4c 65 6e 20 3d 20 30 3b 20 20 20 20  r *aLen = 0;    
90f0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
9100: 6f 66 20 65 61 63 68 20 63 68 61 72 61 63 74 65  of each characte
9110: 72 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f  r in zCharSet */
9120: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9130: 20 2a 2a 61 7a 43 68 61 72 20 3d 20 30 3b 20 20   **azChar = 0;  
9140: 20 20 20 20 20 2f 2a 20 49 6e 64 69 76 69 64 75       /* Individu
9150: 61 6c 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  al characters in
9160: 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20 69   zCharSet */.  i
9170: 6e 74 20 6e 43 68 61 72 3b 20 20 20 20 20 20 20  nt nChar;       
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9190: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
91a0: 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43 68 61  aracters in zCha
91b0: 72 53 65 74 20 2a 2f 0a 0a 20 20 69 66 28 20 73  rSet */..  if( s
91c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
91d0: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
91e0: 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_NULL ){.    r
91f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e  eturn;.  }.  zIn
9200: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
9210: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
9220: 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72    if( zIn==0 ) r
9230: 65 74 75 72 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73  eturn;.  nIn = s
9240: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
9250: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61  es(argv[0]);.  a
9260: 73 73 65 72 74 28 20 7a 49 6e 3d 3d 73 71 6c 69  ssert( zIn==sqli
9270: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
9280: 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  rgv[0]) );.  if(
9290: 20 61 72 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20   argc==1 ){.    
92a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
92b0: 69 67 6e 65 64 20 63 68 61 72 20 6c 65 6e 4f 6e  igned char lenOn
92c0: 65 5b 5d 20 3d 20 7b 20 31 20 7d 3b 0a 20 20 20  e[] = { 1 };.   
92d0: 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64   static unsigned
92e0: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
92f0: 4f 6e 65 5b 5d 20 3d 20 7b 20 28 75 38 2a 29 22  One[] = { (u8*)"
9300: 20 22 20 7d 3b 0a 20 20 20 20 6e 43 68 61 72 20   " };.    nChar 
9310: 3d 20 31 3b 0a 20 20 20 20 61 4c 65 6e 20 3d 20  = 1;.    aLen = 
9320: 28 75 38 2a 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20  (u8*)lenOne;.   
9330: 20 61 7a 43 68 61 72 20 3d 20 28 75 6e 73 69 67   azChar = (unsig
9340: 6e 65 64 20 63 68 61 72 20 2a 2a 29 61 7a 4f 6e  ned char **)azOn
9350: 65 3b 0a 20 20 20 20 7a 43 68 61 72 53 65 74 20  e;.    zCharSet 
9360: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
9370: 20 28 7a 43 68 61 72 53 65 74 20 3d 20 73 71 6c   (zCharSet = sql
9380: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
9390: 61 72 67 76 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a  argv[1]))==0 ){.
93a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
93b0: 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  lse{.    const u
93c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b  nsigned char *z;
93d0: 0a 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72  .    for(z=zChar
93e0: 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a  Set, nChar=0; *z
93f0: 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20  ; nChar++){.    
9400: 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54    SQLITE_SKIP_UT
9410: 46 38 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  F8(z);.    }.   
9420: 20 69 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a   if( nChar>0 ){.
9430: 20 20 20 20 20 20 61 7a 43 68 61 72 20 3d 20 63        azChar = c
9440: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
9450: 74 65 78 74 2c 20 28 28 69 36 34 29 6e 43 68 61  text, ((i64)nCha
9460: 72 29 2a 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  r)*(sizeof(char*
9470: 29 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28  )+1));.      if(
9480: 20 61 7a 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20   azChar==0 ){.  
9490: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
94a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4c 65 6e      }.      aLen
94b0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
94c0: 72 2a 29 26 61 7a 43 68 61 72 5b 6e 43 68 61 72  r*)&azChar[nChar
94d0: 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 7a 3d 7a  ];.      for(z=z
94e0: 43 68 61 72 53 65 74 2c 20 6e 43 68 61 72 3d 30  CharSet, nChar=0
94f0: 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a  ; *z; nChar++){.
9500: 20 20 20 20 20 20 20 20 61 7a 43 68 61 72 5b 6e          azChar[n
9510: 43 68 61 72 5d 20 3d 20 28 75 6e 73 69 67 6e 65  Char] = (unsigne
9520: 64 20 63 68 61 72 20 2a 29 7a 3b 0a 20 20 20 20  d char *)z;.    
9530: 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f      SQLITE_SKIP_
9540: 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 20 20 20  UTF8(z);.       
9550: 20 61 4c 65 6e 5b 6e 43 68 61 72 5d 20 3d 20 28   aLen[nChar] = (
9560: 75 38 29 28 7a 20 2d 20 61 7a 43 68 61 72 5b 6e  u8)(z - azChar[n
9570: 43 68 61 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Char]);.      }.
9580: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
9590: 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20 20 66  nChar>0 ){.    f
95a0: 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 50 54  lags = SQLITE_PT
95b0: 52 5f 54 4f 5f 49 4e 54 28 73 71 6c 69 74 65 33  R_TO_INT(sqlite3
95c0: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
95d0: 78 74 29 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  xt));.    if( fl
95e0: 61 67 73 20 26 20 31 20 29 7b 0a 20 20 20 20 20  ags & 1 ){.     
95f0: 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b   while( nIn>0 ){
9600: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  .        int len
9610: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
9620: 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20  r(i=0; i<nChar; 
9630: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
9640: 6c 65 6e 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20  len = aLen[i];. 
9650: 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e           if( len
9660: 3c 3d 6e 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28  <=nIn && memcmp(
9670: 7a 49 6e 2c 20 61 7a 43 68 61 72 5b 69 5d 2c 20  zIn, azChar[i], 
9680: 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  len)==0 ) break;
9690: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
96a0: 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20     if( i>=nChar 
96b0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
96c0: 20 7a 49 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20   zIn += len;.   
96d0: 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b       nIn -= len;
96e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
96f0: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 32     if( flags & 2
9700: 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
9710: 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   nIn>0 ){.      
9720: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20    int len = 0;. 
9730: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
9740: 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20  i<nChar; i++){. 
9750: 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 61           len = a
9760: 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Len[i];.        
9770: 20 20 69 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26    if( len<=nIn &
9780: 26 20 6d 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49  & memcmp(&zIn[nI
9790: 6e 2d 6c 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d  n-len],azChar[i]
97a0: 2c 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,len)==0 ) break
97b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
97c0: 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72      if( i>=nChar
97d0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
97e0: 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20    nIn -= len;.  
97f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9800: 69 66 28 20 7a 43 68 61 72 53 65 74 20 29 7b 0a  if( zCharSet ){.
9810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9820: 65 65 28 61 7a 43 68 61 72 29 3b 0a 20 20 20 20  ee(azChar);.    
9830: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
9840: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
9850: 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c  ext, (char*)zIn,
9860: 20 6e 49 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41   nIn, SQLITE_TRA
9870: 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 0a 2f 2a 20  NSIENT);.}.../* 
9880: 49 4d 50 3a 20 52 2d 32 35 33 36 31 2d 31 36 31  IMP: R-25361-161
9890: 35 30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  50 This function
98a0: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
98b0: 20 53 51 4c 69 74 65 20 62 79 20 64 65 66 61 75   SQLite by defau
98c0: 6c 74 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c  lt. It.** is onl
98d0: 79 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20 74  y available if t
98e0: 68 65 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45  he SQLITE_SOUNDE
98f0: 58 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  X compile-time o
9900: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 0a 2a 2a  ption is used.**
9910: 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20   when SQLite is 
9920: 62 75 69 6c 74 2e 0a 2a 2f 0a 23 69 66 64 65 66  built..*/.#ifdef
9930: 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a   SQLITE_SOUNDEX.
9940: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
9950: 65 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69  e soundex encodi
9960: 6e 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a 2a  ng of a word..**
9970: 0a 2a 2a 20 49 4d 50 3a 20 52 2d 35 39 37 38 32  .** IMP: R-59782
9980: 2d 30 30 30 37 32 20 54 68 65 20 73 6f 75 6e 64  -00072 The sound
9990: 65 78 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 72  ex(X) function r
99a0: 65 74 75 72 6e 73 20 61 20 73 74 72 69 6e 67 20  eturns a string 
99b0: 74 68 61 74 20 69 73 20 74 68 65 0a 2a 2a 20 73  that is the.** s
99c0: 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e 67 20  oundex encoding 
99d0: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 58 2e  of the string X.
99e0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
99f0: 20 73 6f 75 6e 64 65 78 46 75 6e 63 28 0a 20 20   soundexFunc(.  
9a00: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
9a10: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
9a20: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
9a30: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
9a40: 20 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b 38    char zResult[8
9a50: 5d 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  ];.  const u8 *z
9a60: 49 6e 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  In;.  int i, j;.
9a70: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
9a80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 43 6f  nsigned char iCo
9a90: 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20  de[] = {.    0, 
9aa0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9ab0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9ac0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
9ad0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9ae0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9af0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9b00: 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
9b10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9b20: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9b30: 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30  , 0,.    0, 0, 0
9b40: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9b50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9b60: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20  0, 0, 0,.    0, 
9b70: 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31  0, 1, 2, 3, 0, 1
9b80: 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c  , 2, 0, 0, 2, 2,
9b90: 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20   4, 5, 5, 0,.   
9ba0: 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20   1, 2, 6, 2, 3, 
9bb0: 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32  0, 1, 0, 2, 0, 2
9bc0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9bd0: 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c  .    0, 0, 1, 2,
9be0: 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20   3, 0, 1, 2, 0, 
9bf0: 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35  0, 2, 2, 4, 5, 5
9c00: 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36  , 0,.    1, 2, 6
9c10: 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c  , 2, 3, 0, 1, 0,
9c20: 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20   2, 0, 2, 0, 0, 
9c30: 30 2c 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20  0, 0, 0,.  };.  
9c40: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
9c50: 29 3b 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a 29  );.  zIn = (u8*)
9c60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
9c70: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
9c80: 66 28 20 7a 49 6e 3d 3d 30 20 29 20 7a 49 6e 20  f( zIn==0 ) zIn 
9c90: 3d 20 28 75 38 2a 29 22 22 3b 0a 20 20 66 6f 72  = (u8*)"";.  for
9ca0: 28 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26 26 20  (i=0; zIn[i] && 
9cb0: 21 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28  !sqlite3Isalpha(
9cc0: 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  zIn[i]); i++){}.
9cd0: 20 20 69 66 28 20 7a 49 6e 5b 69 5d 20 29 7b 0a    if( zIn[i] ){.
9ce0: 20 20 20 20 75 38 20 70 72 65 76 63 6f 64 65 20      u8 prevcode 
9cf0: 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30  = iCode[zIn[i]&0
9d00: 78 37 66 5d 3b 0a 20 20 20 20 7a 52 65 73 75 6c  x7f];.    zResul
9d10: 74 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f  t[0] = sqlite3To
9d20: 75 70 70 65 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20  upper(zIn[i]);. 
9d30: 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20     for(j=1; j<4 
9d40: 26 26 20 7a 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b  && zIn[i]; i++){
9d50: 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20  .      int code 
9d60: 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30  = iCode[zIn[i]&0
9d70: 78 37 66 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f];.      if( 
9d80: 63 6f 64 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  code>0 ){.      
9d90: 20 20 69 66 28 20 63 6f 64 65 21 3d 70 72 65 76    if( code!=prev
9da0: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  code ){.        
9db0: 20 20 70 72 65 76 63 6f 64 65 20 3d 20 63 6f 64    prevcode = cod
9dc0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65  e;.          zRe
9dd0: 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63 6f 64 65  sult[j++] = code
9de0: 20 2b 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   + '0';.        
9df0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
9e00: 20 20 20 20 20 20 20 70 72 65 76 63 6f 64 65 20         prevcode 
9e10: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9e20: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c   }.    while( j<
9e30: 34 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 73 75  4 ){.      zResu
9e40: 6c 74 5b 6a 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20  lt[j++] = '0';. 
9e50: 20 20 20 7d 0a 20 20 20 20 7a 52 65 73 75 6c 74     }.    zResult
9e60: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
9e70: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
9e80: 28 63 6f 6e 74 65 78 74 2c 20 7a 52 65 73 75 6c  (context, zResul
9e90: 74 2c 20 34 2c 20 53 51 4c 49 54 45 5f 54 52 41  t, 4, SQLITE_TRA
9ea0: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
9eb0: 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  {.    /* IMP: R-
9ec0: 36 34 38 39 34 2d 35 30 33 32 31 20 54 68 65 20  64894-50321 The 
9ed0: 73 74 72 69 6e 67 20 22 3f 30 30 30 22 20 69 73  string "?000" is
9ee0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
9ef0: 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a   argument.    **
9f00: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 74   is NULL or cont
9f10: 61 69 6e 73 20 6e 6f 20 41 53 43 49 49 20 61 6c  ains no ASCII al
9f20: 70 68 61 62 65 74 69 63 20 63 68 61 72 61 63 74  phabetic charact
9f30: 65 72 73 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ers. */.    sqli
9f40: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
9f50: 63 6f 6e 74 65 78 74 2c 20 22 3f 30 30 30 22 2c  context, "?000",
9f60: 20 34 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   4, SQLITE_STATI
9f70: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
9f80: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44   /* SQLITE_SOUND
9f90: 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EX */..#ifndef S
9fa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
9fb0: 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
9fc0: 41 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  A function that 
9fd0: 6c 6f 61 64 73 20 61 20 73 68 61 72 65 64 2d 6c  loads a shared-l
9fe0: 69 62 72 61 72 79 20 65 78 74 65 6e 73 69 6f 6e  ibrary extension
9ff0: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 4e 55   then returns NU
a000: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
a010: 69 64 20 6c 6f 61 64 45 78 74 28 73 71 6c 69 74  id loadExt(sqlit
a020: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
a030: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
a040: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
a050: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  rgv){.  const ch
a060: 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28 63 6f 6e  ar *zFile = (con
a070: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
a080: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
a090: 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63  v[0]);.  const c
a0a0: 68 61 72 20 2a 7a 50 72 6f 63 3b 0a 20 20 73 71  har *zProc;.  sq
a0b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
a0c0: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
a0d0: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
a0e0: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
a0f0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  = 0;..  if( argc
a100: 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63  ==2 ){.    zProc
a110: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
a120: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
a130: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
a140: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 63  }else{.    zProc
a150: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
a160: 7a 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33  zFile && sqlite3
a170: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
a180: 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63  db, zFile, zProc
a190: 2c 20 26 7a 45 72 72 4d 73 67 29 20 29 7b 0a 20  , &zErrMsg) ){. 
a1a0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
a1b0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
a1c0: 20 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b 0a 20   zErrMsg, -1);. 
a1d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a1e0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a  zErrMsg);.  }.}.
a1f0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
a200: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
a210: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
a220: 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20  cture holds the 
a230: 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20  context of a.** 
a240: 73 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20 61  sum() or avg() a
a250: 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74 61  ggregate computa
a260: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
a270: 20 73 74 72 75 63 74 20 53 75 6d 43 74 78 20 53   struct SumCtx S
a280: 75 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53 75  umCtx;.struct Su
a290: 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20  mCtx {.  double 
a2a0: 72 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20 46 6c  rSum;      /* Fl
a2b0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 73 75 6d  oating point sum
a2c0: 20 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d 3b 20   */.  i64 iSum; 
a2d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
a2e0: 65 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20 20 69  er sum */   .  i
a2f0: 36 34 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  64 cnt;         
a300: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
a310: 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a 2f  ements summed */
a320: 0a 20 20 75 38 20 6f 76 65 72 66 6c 6f 77 3b 20  .  u8 overflow; 
a330: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a340: 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77  integer overflow
a350: 20 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20 61 70   seen */.  u8 ap
a360: 70 72 6f 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  prox;        /* 
a370: 54 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e 74 65  True if non-inte
a380: 67 65 72 20 76 61 6c 75 65 20 77 61 73 20 69 6e  ger value was in
a390: 70 75 74 20 74 6f 20 74 68 65 20 73 75 6d 20 2a  put to the sum *
a3a0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  /.};../*.** Rout
a3b0: 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ines used to com
a3c0: 70 75 74 65 20 74 68 65 20 73 75 6d 2c 20 61 76  pute the sum, av
a3d0: 65 72 61 67 65 2c 20 61 6e 64 20 74 6f 74 61 6c  erage, and total
a3e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55 4d 28  ..**.** The SUM(
a3f0: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c 6c 6f  ) function follo
a400: 77 73 20 74 68 65 20 28 62 72 6f 6b 65 6e 29 20  ws the (broken) 
a410: 53 51 4c 20 73 74 61 6e 64 61 72 64 20 77 68 69  SQL standard whi
a420: 63 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ch means.** that
a430: 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c   it returns NULL
a440: 20 69 66 20 69 74 20 73 75 6d 73 20 6f 76 65 72   if it sums over
a450: 20 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54 4f 54   no inputs.  TOT
a460: 41 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30 2e  AL returns.** 0.
a470: 30 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20  0 in that case. 
a480: 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20 54 4f   In addition, TO
a490: 54 41 4c 20 61 6c 77 61 79 73 20 72 65 74 75 72  TAL always retur
a4a0: 6e 73 20 61 20 66 6c 6f 61 74 20 77 68 65 72 65  ns a float where
a4b0: 0a 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20 72 65  .** SUM might re
a4c0: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
a4d0: 69 66 20 69 74 20 6e 65 76 65 72 20 65 6e 63 6f  if it never enco
a4e0: 75 6e 74 65 72 73 20 61 20 66 6c 6f 61 74 69 6e  unters a floatin
a4f0: 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
a500: 2e 20 20 54 4f 54 41 4c 20 6e 65 76 65 72 20 66  .  TOTAL never f
a510: 61 69 6c 73 2c 20 62 75 74 20 53 55 4d 20 6d 69  ails, but SUM mi
a520: 67 68 74 20 74 68 72 6f 75 67 68 20 61 6e 20 65  ght through an e
a530: 78 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a 20 69  xception if.** i
a540: 74 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e 20 69  t overflows an i
a550: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nteger..*/.stati
a560: 63 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28 73  c void sumStep(s
a570: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
a580: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
a590: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
a5a0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43   **argv){.  SumC
a5b0: 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79 70  tx *p;.  int typ
a5c0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  e;.  assert( arg
a5d0: 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==1 );.  UNUSED
a5e0: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
a5f0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
a600: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
a610: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
a620: 66 28 2a 70 29 29 3b 0a 20 20 74 79 70 65 20 3d  f(*p));.  type =
a630: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e   sqlite3_value_n
a640: 75 6d 65 72 69 63 5f 74 79 70 65 28 61 72 67 76  umeric_type(argv
a650: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 20 26 26  [0]);.  if( p &&
a660: 20 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e 55   type!=SQLITE_NU
a670: 4c 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6e 74  LL ){.    p->cnt
a680: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 74 79 70 65  ++;.    if( type
a690: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
a6a0: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 20   ){.      i64 v 
a6b0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
a6c0: 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a  int64(argv[0]);.
a6d0: 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d        p->rSum +=
a6e0: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   v;.      if( (p
a6f0: 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f 76 65 72  ->approx|p->over
a700: 66 6c 6f 77 29 3d 3d 30 20 26 26 20 73 71 6c 69  flow)==0 && sqli
a710: 74 65 33 41 64 64 49 6e 74 36 34 28 26 70 2d 3e  te3AddInt64(&p->
a720: 69 53 75 6d 2c 20 76 29 20 29 7b 0a 20 20 20 20  iSum, v) ){.    
a730: 20 20 20 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20      p->overflow 
a740: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
a750: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
a760: 3e 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33  >rSum += sqlite3
a770: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
a780: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d  gv[0]);.      p-
a790: 3e 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20 20 20  >approx = 1;.   
a7a0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
a7b0: 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69 7a 65  void sumFinalize
a7c0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
a7d0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75   *context){.  Su
a7e0: 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  mCtx *p;.  p = s
a7f0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
a800: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
a810: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26  , 0);.  if( p &&
a820: 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20   p->cnt>0 ){.   
a830: 20 69 66 28 20 70 2d 3e 6f 76 65 72 66 6c 6f 77   if( p->overflow
a840: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a850: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
a860: 6f 6e 74 65 78 74 2c 22 69 6e 74 65 67 65 72 20  ontext,"integer 
a870: 6f 76 65 72 66 6c 6f 77 22 2c 2d 31 29 3b 0a 20  overflow",-1);. 
a880: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
a890: 61 70 70 72 6f 78 20 29 7b 0a 20 20 20 20 20 20  approx ){.      
a8a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
a8b0: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70  ouble(context, p
a8c0: 2d 3e 72 53 75 6d 29 3b 0a 20 20 20 20 7d 65 6c  ->rSum);.    }el
a8d0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
a8e0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
a8f0: 6f 6e 74 65 78 74 2c 20 70 2d 3e 69 53 75 6d 29  ontext, p->iSum)
a900: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
a910: 61 74 69 63 20 76 6f 69 64 20 61 76 67 46 69 6e  atic void avgFin
a920: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
a930: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
a940: 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20  .  SumCtx *p;.  
a950: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
a960: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
a970: 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28  ntext, 0);.  if(
a980: 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29   p && p->cnt>0 )
a990: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
a9a0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
a9b0: 65 78 74 2c 20 70 2d 3e 72 53 75 6d 2f 28 64 6f  ext, p->rSum/(do
a9c0: 75 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20  uble)p->cnt);.  
a9d0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
a9e0: 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 28 73 71  totalFinalize(sq
a9f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
aa00: 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74  ontext){.  SumCt
aa10: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
aa20: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
aa30: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
aa40: 29 3b 0a 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29  );.  /* (double)
aa50: 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c  0 In case of SQL
aa60: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
aa70: 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20  G_POINT... */.  
aa80: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
aa90: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70  ouble(context, p
aaa0: 20 3f 20 70 2d 3e 72 53 75 6d 20 3a 20 28 64 6f   ? p->rSum : (do
aab0: 75 62 6c 65 29 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  uble)0);.}../*.*
aac0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
aad0: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
aae0: 74 72 61 63 6b 20 6f 66 20 73 74 61 74 65 20 69  track of state i
aaf0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
ab00: 68 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20 61 67  he.** count() ag
ab10: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
ab20: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
ab30: 75 63 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75  uct CountCtx Cou
ab40: 6e 74 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f  ntCtx;.struct Co
ab50: 75 6e 74 43 74 78 20 7b 0a 20 20 69 36 34 20 6e  untCtx {.  i64 n
ab60: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ;.};../*.** Rout
ab70: 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ines to implemen
ab80: 74 20 74 68 65 20 63 6f 75 6e 74 28 29 20 61 67  t the count() ag
ab90: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
aba0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
abb0: 20 63 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74   countStep(sqlit
abc0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
abd0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
abe0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
abf0: 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78  rgv){.  CountCtx
ac00: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
ac10: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
ac20: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
ac30: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
ac40: 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c   (argc==0 || SQL
ac50: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
ac60: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
ac70: 76 5b 30 5d 29 29 20 26 26 20 70 20 29 7b 0a 20  v[0])) && p ){. 
ac80: 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 0a     p->n++;.  }..
ac90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
aca0: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
acb0: 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f   /* The sqlite3_
acc0: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
acd0: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65  ) function is de
ace0: 70 72 65 63 61 74 65 64 2e 20 20 42 75 74 20 6a  precated.  But j
acf0: 75 73 74 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  ust to make.  **
ad00: 20 73 75 72 65 20 69 74 20 73 74 69 6c 6c 20 6f   sure it still o
ad10: 70 65 72 61 74 65 73 20 63 6f 72 72 65 63 74 6c  perates correctl
ad20: 79 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 69  y, verify that i
ad30: 74 73 20 63 6f 75 6e 74 20 61 67 72 65 65 73 20  ts count agrees 
ad40: 77 69 74 68 20 6f 75 72 20 0a 20 20 2a 2a 20 69  with our .  ** i
ad50: 6e 74 65 72 6e 61 6c 20 63 6f 75 6e 74 20 77 68  nternal count wh
ad60: 65 6e 20 75 73 69 6e 67 20 63 6f 75 6e 74 28 2a  en using count(*
ad70: 29 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 74  ) and when the t
ad80: 6f 74 61 6c 20 63 6f 75 6e 74 20 63 61 6e 20 62  otal count can b
ad90: 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 65 64  e.  ** expressed
ada0: 20 61 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74   as a 32-bit int
adb0: 65 67 65 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72  eger. */.  asser
adc0: 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 70 3d  t( argc==1 || p=
add0: 3d 30 20 7c 7c 20 70 2d 3e 6e 3e 30 78 37 66 66  =0 || p->n>0x7ff
ade0: 66 66 66 66 66 0a 20 20 20 20 20 20 20 20 20 20  fffff.          
adf0: 7c 7c 20 70 2d 3e 6e 3d 3d 73 71 6c 69 74 65 33  || p->n==sqlite3
ae00: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74  _aggregate_count
ae10: 28 63 6f 6e 74 65 78 74 29 20 29 3b 0a 23 65 6e  (context) );.#en
ae20: 64 69 66 0a 7d 20 20 20 0a 73 74 61 74 69 63 20  dif.}   .static 
ae30: 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69  void countFinali
ae40: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
ae50: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
ae60: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
ae70: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
ae80: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
ae90: 74 65 78 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  text, 0);.  sqli
aea0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
aeb0: 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d  (context, p ? p-
aec0: 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >n : 0);.}../*.*
aed0: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d  * Routines to im
aee0: 70 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e  plement min() an
aef0: 64 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74  d max() aggregat
af00: 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  e functions..*/.
af10: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d  static void minm
af20: 61 78 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  axStep(.  sqlite
af30: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
af40: 78 74 2c 20 0a 20 20 69 6e 74 20 4e 6f 74 55 73  xt, .  int NotUs
af50: 65 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  ed, .  sqlite3_v
af60: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
af70: 20 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20 28 4d   Mem *pArg  = (M
af80: 65 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a 20 20  em *)argv[0];.  
af90: 4d 65 6d 20 2a 70 42 65 73 74 3b 0a 20 20 55 4e  Mem *pBest;.  UN
afa0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
afb0: 6f 74 55 73 65 64 29 3b 0a 0a 20 20 70 42 65 73  otUsed);..  pBes
afc0: 74 20 3d 20 28 4d 65 6d 20 2a 29 73 71 6c 69 74  t = (Mem *)sqlit
afd0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
afe0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
aff0: 7a 65 6f 66 28 2a 70 42 65 73 74 29 29 3b 0a 20  zeof(*pBest));. 
b000: 20 69 66 28 20 21 70 42 65 73 74 20 29 20 72 65   if( !pBest ) re
b010: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c  turn;..  if( sql
b020: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
b030: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
b040: 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _NULL ){.    if(
b050: 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 20   pBest->flags ) 
b060: 73 71 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d  sqlite3SkipAccum
b070: 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65  ulatorLoad(conte
b080: 78 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  xt);.  }else if(
b090: 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 7b   pBest->flags ){
b0a0: 0a 20 20 20 20 69 6e 74 20 6d 61 78 3b 0a 20 20  .    int max;.  
b0b0: 20 20 69 6e 74 20 63 6d 70 3b 0a 20 20 20 20 43    int cmp;.    C
b0c0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
b0d0: 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f  sqlite3GetFuncCo
b0e0: 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a  llSeq(context);.
b0f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 65 70      /* This step
b100: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
b110: 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 6d  d for both the m
b120: 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61  in() and max() a
b130: 67 67 72 65 67 61 74 65 73 2c 0a 20 20 20 20 2a  ggregates,.    *
b140: 2a 20 74 68 65 20 6f 6e 6c 79 20 64 69 66 66 65  * the only diffe
b150: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
b160: 65 20 74 77 6f 20 62 65 69 6e 67 20 74 68 61 74  e two being that
b170: 20 74 68 65 20 73 65 6e 73 65 20 6f 66 20 74 68   the sense of th
b180: 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69  e.    ** compari
b190: 73 6f 6e 20 69 73 20 69 6e 76 65 72 74 65 64 2e  son is inverted.
b1a0: 20 46 6f 72 20 74 68 65 20 6d 61 78 28 29 20 61   For the max() a
b1b0: 67 67 72 65 67 61 74 65 2c 20 74 68 65 0a 20 20  ggregate, the.  
b1c0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 73 65    ** sqlite3_use
b1d0: 72 5f 64 61 74 61 28 29 20 66 75 6e 63 74 69 6f  r_data() functio
b1e0: 6e 20 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20  n returns (void 
b1f0: 2a 29 2d 31 2e 20 46 6f 72 20 6d 69 6e 28 29 20  *)-1. For min() 
b200: 69 74 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  it.    ** return
b210: 73 20 28 76 6f 69 64 20 2a 29 64 62 2c 20 77 68  s (void *)db, wh
b220: 65 72 65 20 64 62 20 69 73 20 74 68 65 20 73 71  ere db is the sq
b230: 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73 65 20  lite3* database 
b240: 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20 2a 2a 20  pointer..    ** 
b250: 54 68 65 72 65 66 6f 72 65 20 74 68 65 20 6e 65  Therefore the ne
b260: 78 74 20 73 74 61 74 65 6d 65 6e 74 20 73 65 74  xt statement set
b270: 73 20 76 61 72 69 61 62 6c 65 20 27 6d 61 78 27  s variable 'max'
b280: 20 74 6f 20 31 20 66 6f 72 20 74 68 65 20 6d 61   to 1 for the ma
b290: 78 28 29 0a 20 20 20 20 2a 2a 20 61 67 67 72 65  x().    ** aggre
b2a0: 67 61 74 65 2c 20 6f 72 20 30 20 66 6f 72 20 6d  gate, or 0 for m
b2b0: 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  in()..    */.   
b2c0: 20 6d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 75   max = sqlite3_u
b2d0: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
b2e0: 29 21 3d 30 3b 0a 20 20 20 20 63 6d 70 20 3d 20  )!=0;.    cmp = 
b2f0: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
b300: 65 28 70 42 65 73 74 2c 20 70 41 72 67 2c 20 70  e(pBest, pArg, p
b310: 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 28  Coll);.    if( (
b320: 6d 61 78 20 26 26 20 63 6d 70 3c 30 29 20 7c 7c  max && cmp<0) ||
b330: 20 28 21 6d 61 78 20 26 26 20 63 6d 70 3e 30 29   (!max && cmp>0)
b340: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b350: 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65  3VdbeMemCopy(pBe
b360: 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d  st, pArg);.    }
b370: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
b380: 74 65 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74  te3SkipAccumulat
b390: 6f 72 4c 6f 61 64 28 63 6f 6e 74 65 78 74 29 3b  orLoad(context);
b3a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
b3b0: 20 20 20 20 70 42 65 73 74 2d 3e 64 62 20 3d 20      pBest->db = 
b3c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
b3d0: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
b3e0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
b3f0: 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74  dbeMemCopy(pBest
b400: 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 73  , pArg);.  }.}.s
b410: 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61  tatic void minMa
b420: 78 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  xFinalize(sqlite
b430: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
b440: 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  xt){.  sqlite3_v
b450: 61 6c 75 65 20 2a 70 52 65 73 3b 0a 20 20 70 52  alue *pRes;.  pR
b460: 65 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 61  es = (sqlite3_va
b470: 6c 75 65 20 2a 29 73 71 6c 69 74 65 33 5f 61 67  lue *)sqlite3_ag
b480: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
b490: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
b4a0: 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 69  f( pRes ){.    i
b4b0: 66 28 20 70 52 65 73 2d 3e 66 6c 61 67 73 20 29  f( pRes->flags )
b4c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b4d0: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
b4e0: 74 65 78 74 2c 20 70 52 65 73 29 3b 0a 20 20 20  text, pRes);.   
b4f0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
b500: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 65  beMemRelease(pRe
b510: 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  s);.  }.}../*.**
b520: 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 45 58   group_concat(EX
b530: 50 52 2c 20 3f 53 45 50 41 52 41 54 4f 52 3f 29  PR, ?SEPARATOR?)
b540: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b550: 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 28  groupConcatStep(
b560: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
b570: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
b580: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
b590: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
b5a0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
b5b0: 2a 7a 56 61 6c 3b 0a 20 20 53 74 72 41 63 63 75  *zVal;.  StrAccu
b5c0: 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 63 6f 6e  m *pAccum;.  con
b5d0: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20  st char *zSep;. 
b5e0: 20 69 6e 74 20 6e 56 61 6c 2c 20 6e 53 65 70 3b   int nVal, nSep;
b5f0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
b600: 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =1 || argc==2 );
b610: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
b620: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
b630: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
b640: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 41 63 63  ) return;.  pAcc
b650: 75 6d 20 3d 20 28 53 74 72 41 63 63 75 6d 2a 29  um = (StrAccum*)
b660: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
b670: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
b680: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 41 63 63 75  t, sizeof(*pAccu
b690: 6d 29 29 3b 0a 0a 20 20 69 66 28 20 70 41 63 63  m));..  if( pAcc
b6a0: 75 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  um ){.    sqlite
b6b0: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
b6c0: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
b6d0: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  e(context);.    
b6e0: 69 6e 74 20 66 69 72 73 74 54 65 72 6d 20 3d 20  int firstTerm = 
b6f0: 70 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 3d  pAccum->mxAlloc=
b700: 3d 30 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e  =0;.    pAccum->
b710: 6d 78 41 6c 6c 6f 63 20 3d 20 64 62 2d 3e 61 4c  mxAlloc = db->aL
b720: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
b730: 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20 20 69  T_LENGTH];.    i
b740: 66 28 20 21 66 69 72 73 74 54 65 72 6d 20 29 7b  f( !firstTerm ){
b750: 0a 20 20 20 20 20 20 69 66 28 20 61 72 67 63 3d  .      if( argc=
b760: 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  =2 ){.        zS
b770: 65 70 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ep = (char*)sqli
b780: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
b790: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[1]);.       
b7a0: 20 6e 53 65 70 20 3d 20 73 71 6c 69 74 65 33 5f   nSep = sqlite3_
b7b0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
b7c0: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [1]);.      }els
b7d0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20  e{.        zSep 
b7e0: 3d 20 22 2c 22 3b 0a 20 20 20 20 20 20 20 20 6e  = ",";.        n
b7f0: 53 65 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Sep = 1;.      }
b800: 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65 70 20  .      if( nSep 
b810: 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
b820: 6d 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20  mAppend(pAccum, 
b830: 7a 53 65 70 2c 20 6e 53 65 70 29 3b 0a 20 20 20  zSep, nSep);.   
b840: 20 7d 0a 20 20 20 20 7a 56 61 6c 20 3d 20 28 63   }.    zVal = (c
b850: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
b860: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
b870: 3b 0a 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c  ;.    nVal = sql
b880: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
b890: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
b8a0: 66 28 20 7a 56 61 6c 20 29 20 73 71 6c 69 74 65  f( zVal ) sqlite
b8b0: 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
b8c0: 70 41 63 63 75 6d 2c 20 7a 56 61 6c 2c 20 6e 56  pAccum, zVal, nV
b8d0: 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  al);.  }.}.stati
b8e0: 63 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63  c void groupConc
b8f0: 61 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  atFinalize(sqlit
b900: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
b910: 65 78 74 29 7b 0a 20 20 53 74 72 41 63 63 75 6d  ext){.  StrAccum
b920: 20 2a 70 41 63 63 75 6d 3b 0a 20 20 70 41 63 63   *pAccum;.  pAcc
b930: 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67  um = sqlite3_agg
b940: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
b950: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66  ontext, 0);.  if
b960: 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20 20  ( pAccum ){.    
b970: 69 66 28 20 70 41 63 63 75 6d 2d 3e 61 63 63 45  if( pAccum->accE
b980: 72 72 6f 72 3d 3d 53 54 52 41 43 43 55 4d 5f 54  rror==STRACCUM_T
b990: 4f 4f 42 49 47 20 29 7b 0a 20 20 20 20 20 20 73  OOBIG ){.      s
b9a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
b9b0: 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65  ror_toobig(conte
b9c0: 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  xt);.    }else i
b9d0: 66 28 20 70 41 63 63 75 6d 2d 3e 61 63 63 45 72  f( pAccum->accEr
b9e0: 72 6f 72 3d 3d 53 54 52 41 43 43 55 4d 5f 4e 4f  ror==STRACCUM_NO
b9f0: 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MEM ){.      sql
ba00: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
ba10: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
ba20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20  ;.    }else{    
ba30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
ba40: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
ba50: 78 74 2c 20 73 71 6c 69 74 65 33 53 74 72 41 63  xt, sqlite3StrAc
ba60: 63 75 6d 46 69 6e 69 73 68 28 70 41 63 63 75 6d  cumFinish(pAccum
ba70: 29 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  ), -1, .        
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b    sqlite3_free);
baa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
bab0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bac0: 20 64 6f 65 73 20 70 65 72 2d 63 6f 6e 6e 65 63   does per-connec
bad0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 72 65  tion function re
bae0: 67 69 73 74 72 61 74 69 6f 6e 2e 20 20 4d 6f 73  gistration.  Mos
baf0: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 62 75 69 6c  t.** of the buil
bb00: 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20 61  t-in functions a
bb10: 62 6f 76 65 20 61 72 65 20 70 61 72 74 20 6f 66  bove are part of
bb20: 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63   the global func
bb30: 74 69 6f 6e 20 73 65 74 2e 0a 2a 2a 20 54 68 69  tion set..** Thi
bb40: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 64  s routine only d
bb50: 65 61 6c 73 20 77 69 74 68 20 74 68 6f 73 65 20  eals with those 
bb60: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 67 6c 6f  that are not glo
bb70: 62 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  bal..*/.void sql
bb80: 69 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c  ite3RegisterBuil
bb90: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c  tinFunctions(sql
bba0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
bbb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76   rc = sqlite3_ov
bbc0: 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28  erload_function(
bbd0: 64 62 2c 20 22 4d 41 54 43 48 22 2c 20 32 29 3b  db, "MATCH", 2);
bbe0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
bbf0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72  QLITE_NOMEM || r
bc00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
bc10: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bc20: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 64 62  _NOMEM ){.    db
bc30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
bc40: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
bc50: 20 53 65 74 20 74 68 65 20 4c 49 4b 45 4f 50 54   Set the LIKEOPT
bc60: 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 32 2d 61   flag on the 2-a
bc70: 72 67 75 6d 65 6e 74 20 66 75 6e 63 74 69 6f 6e  rgument function
bc80: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
bc90: 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  name..*/.static 
bca0: 76 6f 69 64 20 73 65 74 4c 69 6b 65 4f 70 74 46  void setLikeOptF
bcb0: 6c 61 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  lag(sqlite3 *db,
bcc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
bcd0: 6d 65 2c 20 75 38 20 66 6c 61 67 56 61 6c 29 7b  me, u8 flagVal){
bce0: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66  .  FuncDef *pDef
bcf0: 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74  ;.  pDef = sqlit
bd00: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
bd10: 62 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65  b, zName, sqlite
bd20: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
bd30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
bd50: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
bd60: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
bd70: 70 44 65 66 29 20 29 7b 0a 20 20 20 20 70 44 65  pDef) ){.    pDe
bd80: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 7c 3d 20  f->funcFlags |= 
bd90: 66 6c 61 67 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  flagVal;.  }.}..
bda0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74  /*.** Register t
bdb0: 68 65 20 62 75 69 6c 74 2d 69 6e 20 4c 49 4b 45  he built-in LIKE
bdc0: 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69   and GLOB functi
bdd0: 6f 6e 73 2e 20 20 54 68 65 20 63 61 73 65 53 65  ons.  The caseSe
bde0: 6e 73 69 74 69 76 65 0a 2a 2a 20 70 61 72 61 6d  nsitive.** param
bdf0: 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
be00: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
be10: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
be20: 20 69 73 20 63 61 73 65 0a 2a 2a 20 73 65 6e 73   is case.** sens
be30: 69 74 69 76 65 2e 20 20 47 4c 4f 42 20 69 73 20  itive.  GLOB is 
be40: 61 6c 77 61 79 73 20 63 61 73 65 20 73 65 6e 73  always case sens
be50: 69 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  itive..*/.void s
be60: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c 69  qlite3RegisterLi
be70: 6b 65 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69  keFunctions(sqli
be80: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 63 61 73  te3 *db, int cas
be90: 65 53 65 6e 73 69 74 69 76 65 29 7b 0a 20 20 73  eSensitive){.  s
bea0: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
beb0: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 69 66 28 20  o *pInfo;.  if( 
bec0: 63 61 73 65 53 65 6e 73 69 74 69 76 65 20 29 7b  caseSensitive ){
bed0: 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73 74  .    pInfo = (st
bee0: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
bef0: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 3b 0a  *)&likeInfoAlt;.
bf00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
bf10: 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6d  fo = (struct com
bf20: 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49  pareInfo*)&likeI
bf30: 6e 66 6f 4e 6f 72 6d 3b 0a 20 20 7d 0a 20 20 73  nfoNorm;.  }.  s
bf40: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
bf50: 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 32 2c 20  (db, "like", 2, 
bf60: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 49 6e  SQLITE_UTF8, pIn
bf70: 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c  fo, likeFunc, 0,
bf80: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
bf90: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
bfa0: 22 6c 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49 54  "like", 3, SQLIT
bfb0: 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c  E_UTF8, pInfo, l
bfc0: 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30  ikeFunc, 0, 0, 0
bfd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61  );.  sqlite3Crea
bfe0: 74 65 46 75 6e 63 28 64 62 2c 20 22 67 6c 6f 62  teFunc(db, "glob
bff0: 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 2, SQLITE_UTF
c000: 38 2c 20 0a 20 20 20 20 20 20 28 73 74 72 75 63  8, .      (struc
c010: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26  t compareInfo*)&
c020: 67 6c 6f 62 49 6e 66 6f 2c 20 6c 69 6b 65 46 75  globInfo, likeFu
c030: 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nc, 0, 0, 0);.  
c040: 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64  setLikeOptFlag(d
c050: 62 2c 20 22 67 6c 6f 62 22 2c 20 53 51 4c 49 54  b, "glob", SQLIT
c060: 45 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51  E_FUNC_LIKE | SQ
c070: 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3b  LITE_FUNC_CASE);
c080: 0a 20 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61  .  setLikeOptFla
c090: 67 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 0a 20  g(db, "like", . 
c0a0: 20 20 20 20 20 63 61 73 65 53 65 6e 73 69 74 69       caseSensiti
c0b0: 76 65 20 3f 20 28 53 51 4c 49 54 45 5f 46 55 4e  ve ? (SQLITE_FUN
c0c0: 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f  C_LIKE | SQLITE_
c0d0: 46 55 4e 43 5f 43 41 53 45 29 20 3a 20 53 51 4c  FUNC_CASE) : SQL
c0e0: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a  ITE_FUNC_LIKE);.
c0f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 70  }../*.** pExpr p
c100: 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 78 70 72  oints to an expr
c110: 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69 6d 70  ession which imp
c120: 6c 65 6d 65 6e 74 73 20 61 20 66 75 6e 63 74 69  lements a functi
c130: 6f 6e 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69 73  on.  If.** it is
c140: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20   appropriate to 
c150: 61 70 70 6c 79 20 74 68 65 20 4c 49 4b 45 20 6f  apply the LIKE o
c160: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 74  ptimization to t
c170: 68 61 74 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  hat function.** 
c180: 74 68 65 6e 20 73 65 74 20 61 57 63 5b 30 5d 20  then set aWc[0] 
c190: 74 68 72 6f 75 67 68 20 61 57 63 5b 32 5d 20 74  through aWc[2] t
c1a0: 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63  o the wildcard c
c1b0: 68 61 72 61 63 74 65 72 73 20 61 6e 64 0a 2a 2a  haracters and.**
c1c0: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49   return TRUE.  I
c1d0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  f the function i
c1e0: 73 20 6e 6f 74 20 61 20 4c 49 4b 45 2d 73 74 79  s not a LIKE-sty
c1f0: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 65 6e  le function then
c200: 0a 2a 2a 20 72 65 74 75 72 6e 20 46 41 4c 53 45  .** return FALSE
c210: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 49 73 4e 6f 63 61  ..**.** *pIsNoca
c220: 73 65 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  se is set to tru
c230: 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20 61  e if uppercase a
c240: 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 61 72 65  nd lowercase are
c250: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 0a   equivalent for.
c260: 2a 2a 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ** the function 
c270: 28 64 65 66 61 75 6c 74 20 66 6f 72 20 4c 49 4b  (default for LIK
c280: 45 29 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63  E).  If the func
c290: 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
c2a0: 69 73 74 69 6e 63 74 69 6f 6e 0a 2a 2a 20 62 65  istinction.** be
c2b0: 74 77 65 65 6e 20 75 70 70 65 72 63 61 73 65 20  tween uppercase 
c2c0: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 28 61  and lowercase (a
c2d0: 73 20 64 6f 65 73 20 47 4c 4f 42 29 20 74 68 65  s does GLOB) the
c2e0: 6e 20 2a 70 49 73 4e 6f 63 61 73 65 20 69 73 20  n *pIsNocase is 
c2f0: 73 65 74 20 74 6f 0a 2a 2a 20 66 61 6c 73 65 2e  set to.** false.
c300: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
c310: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71  sLikeFunction(sq
c320: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
c330: 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 49 73  *pExpr, int *pIs
c340: 4e 6f 63 61 73 65 2c 20 63 68 61 72 20 2a 61 57  Nocase, char *aW
c350: 63 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70  c){.  FuncDef *p
c360: 44 65 66 3b 0a 20 20 69 66 28 20 70 45 78 70 72  Def;.  if( pExpr
c370: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
c380: 4e 20 0a 20 20 20 7c 7c 20 21 70 45 78 70 72 2d  N .   || !pExpr-
c390: 3e 78 2e 70 4c 69 73 74 20 0a 20 20 20 7c 7c 20  >x.pList .   || 
c3a0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
c3b0: 6e 45 78 70 72 21 3d 32 0a 20 20 29 7b 0a 20 20  nExpr!=2.  ){.  
c3c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c3d0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
c3e0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
c3f0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
c400: 29 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69  );.  pDef = sqli
c410: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
c420: 64 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  db, pExpr->u.zTo
c430: 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ken, .          
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c450: 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e     sqlite3Strlen
c460: 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
c470: 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  en),.           
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c490: 20 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38    2, SQLITE_UTF8
c4a0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  , 0);.  if( NEVE
c4b0: 52 28 70 44 65 66 3d 3d 30 29 20 7c 7c 20 28 70  R(pDef==0) || (p
c4c0: 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
c4d0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
c4e0: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  E)==0 ){.    ret
c4f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
c500: 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 73 74   The memcpy() st
c510: 61 74 65 6d 65 6e 74 20 61 73 73 75 6d 65 73 20  atement assumes 
c520: 74 68 61 74 20 74 68 65 20 77 69 6c 64 63 61 72  that the wildcar
c530: 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65  d characters are
c540: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
c550: 74 68 72 65 65 20 73 74 61 74 65 6d 65 6e 74 73  three statements
c560: 20 69 6e 20 74 68 65 20 63 6f 6d 70 61 72 65 49   in the compareI
c570: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
c580: 54 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 73  The.  ** asserts
c590: 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 76  () that follow v
c5a0: 65 72 69 66 79 20 74 68 61 74 20 61 73 73 75 6d  erify that assum
c5b0: 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ption.  */.  mem
c5c0: 63 70 79 28 61 57 63 2c 20 70 44 65 66 2d 3e 70  cpy(aWc, pDef->p
c5d0: 55 73 65 72 44 61 74 61 2c 20 33 29 3b 0a 20 20  UserData, 3);.  
c5e0: 61 73 73 65 72 74 28 20 28 63 68 61 72 2a 29 26  assert( (char*)&
c5f0: 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20 28  likeInfoAlt == (
c600: 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41  char*)&likeInfoA
c610: 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a 20  lt.matchAll );. 
c620: 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61 72   assert( &((char
c630: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b  *)&likeInfoAlt)[
c640: 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69  1] == (char*)&li
c650: 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 4f  keInfoAlt.matchO
c660: 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
c670: 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  &((char*)&likeIn
c680: 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63 68  foAlt)[2] == (ch
c690: 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74  ar*)&likeInfoAlt
c6a0: 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a 20 20 2a  .matchSet );.  *
c6b0: 70 49 73 4e 6f 63 61 73 65 20 3d 20 28 70 44 65  pIsNocase = (pDe
c6c0: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
c6d0: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29  QLITE_FUNC_CASE)
c6e0: 3d 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ==0;.  return 1;
c6f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  .}../*.** All of
c700: 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74 72   the FuncDef str
c710: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 61  uctures in the a
c720: 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 61 72  BuiltinFunc[] ar
c730: 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20  ray above.** to 
c740: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
c750: 69 6f 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 20  ion hash table. 
c760: 20 54 68 69 73 20 6f 63 63 75 72 73 20 61 74 20   This occurs at 
c770: 73 74 61 72 74 2d 74 69 6d 65 20 28 61 73 0a 2a  start-time (as.*
c780: 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  * a consequence 
c790: 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  of calling sqlit
c7a0: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 29  e3_initialize())
c7b0: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
c7c0: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 0a  is routine runs.
c7d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
c7e0: 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e  egisterGlobalFun
c7f0: 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20  ctions(void){.  
c800: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  /*.  ** The foll
c810: 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64  owing array hold
c820: 73 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  s FuncDef struct
c830: 75 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  ures for all of 
c840: 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20  the functions.  
c850: 2a 2a 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ** defined in th
c860: 69 73 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20  is file..  **.  
c870: 2a 2a 20 54 68 65 20 61 72 72 61 79 20 63 61 6e  ** The array can
c880: 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20  not be constant 
c890: 73 69 6e 63 65 20 63 68 61 6e 67 65 73 20 61 72  since changes ar
c8a0: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 0a 20 20  e made to the.  
c8b0: 2a 2a 20 46 75 6e 63 44 65 66 2e 70 48 61 73 68  ** FuncDef.pHash
c8c0: 20 65 6c 65 6d 65 6e 74 73 20 61 74 20 73 74 61   elements at sta
c8d0: 72 74 2d 74 69 6d 65 2e 20 20 54 68 65 20 65 6c  rt-time.  The el
c8e0: 65 6d 65 6e 74 73 20 6f 66 20 74 68 69 73 20 61  ements of this a
c8f0: 72 72 61 79 0a 20 20 2a 2a 20 61 72 65 20 72 65  rray.  ** are re
c900: 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 69 6e  ad-only after in
c910: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69 73 20  itialization is 
c920: 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a 2f 0a 20  complete..  */. 
c930: 20 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 57   static SQLITE_W
c940: 53 44 20 46 75 6e 63 44 65 66 20 61 42 75 69 6c  SD FuncDef aBuil
c950: 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20  tinFunc[] = {.  
c960: 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d    FUNCTION(ltrim
c970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
c980: 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 1, 0, trimFunc
c990: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
c9a0: 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20  FUNCTION(ltrim, 
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
c9c0: 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20  1, 0, trimFunc  
c9d0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
c9e0: 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20  NCTION(rtrim,   
c9f0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 32 2c             1, 2,
ca00: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
ca10: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
ca20: 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20 20  TION(rtrim,     
ca30: 20 20 20 20 20 20 20 20 20 32 2c 20 32 2c 20 30           2, 2, 0
ca40: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
ca50: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
ca60: 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20  ON(trim,        
ca70: 20 20 20 20 20 20 20 31 2c 20 33 2c 20 30 2c 20         1, 3, 0, 
ca80: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
ca90: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
caa0: 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20  (trim,          
cab0: 20 20 20 20 20 32 2c 20 33 2c 20 30 2c 20 74 72       2, 3, 0, tr
cac0: 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29  imFunc         )
cad0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d  ,.    FUNCTION(m
cae0: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
caf0: 20 20 2d 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d    -1, 0, 1, minm
cb00: 61 78 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  axFunc       ),.
cb10: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e      FUNCTION(min
cb20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
cb30: 20 30 2c 20 30 2c 20 31 2c 20 30 20 20 20 20 20   0, 0, 1, 0     
cb40: 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20             ),.  
cb50: 20 20 41 47 47 52 45 47 41 54 45 32 28 6d 69 6e    AGGREGATE2(min
cb60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
cb70: 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74  , 0, 1, minmaxSt
cb80: 65 70 2c 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  ep,      minMaxF
cb90: 69 6e 61 6c 69 7a 65 2c 0a 20 20 20 20 20 20 20  inalize,.       
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d     SQLITE_FUNC_M
cbd0: 49 4e 4d 41 58 20 29 2c 0a 20 20 20 20 46 55 4e  INMAX ),.    FUN
cbe0: 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20  CTION(max,      
cbf0: 20 20 20 20 20 20 20 20 20 2d 31 2c 20 31 2c 20           -1, 1, 
cc00: 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20 20 20  1, minmaxFunc   
cc10: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
cc20: 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20 20 20  ION(max,        
cc30: 20 20 20 20 20 20 20 20 30 2c 20 31 2c 20 31 2c          0, 1, 1,
cc40: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
cc50: 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41    ),.    AGGREGA
cc60: 54 45 32 28 6d 61 78 2c 20 20 20 20 20 20 20 20  TE2(max,        
cc70: 20 20 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 6d        1, 1, 1, m
cc80: 69 6e 6d 61 78 53 74 65 70 2c 20 20 20 20 20 20  inmaxStep,      
cc90: 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 2c 0a  minMaxFinalize,.
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccc0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
ccd0: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 20 29 2c 0a  _FUNC_MINMAX ),.
cce0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 74 79      FUNCTION2(ty
ccf0: 70 65 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  peof,           
cd00: 20 31 2c 20 30 2c 20 30 2c 20 74 79 70 65 6f 66   1, 0, 0, typeof
cd10: 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55  Func,  SQLITE_FU
cd20: 4e 43 5f 54 59 50 45 4f 46 29 2c 0a 20 20 20 20  NC_TYPEOF),.    
cd30: 46 55 4e 43 54 49 4f 4e 32 28 6c 65 6e 67 74 68  FUNCTION2(length
cd40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ,            1, 
cd50: 30 2c 20 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63  0, 0, lengthFunc
cd60: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  ,  SQLITE_FUNC_L
cd70: 45 4e 47 54 48 29 2c 0a 20 20 20 20 46 55 4e 43  ENGTH),.    FUNC
cd80: 54 49 4f 4e 28 69 6e 73 74 72 2c 20 20 20 20 20  TION(instr,     
cd90: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30           2, 0, 0
cda0: 2c 20 69 6e 73 74 72 46 75 6e 63 20 20 20 20 20  , instrFunc     
cdb0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
cdc0: 4f 4e 28 73 75 62 73 74 72 2c 20 20 20 20 20 20  ON(substr,      
cdd0: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20         2, 0, 0, 
cde0: 73 75 62 73 74 72 46 75 6e 63 20 20 20 20 20 20  substrFunc      
cdf0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
ce00: 28 73 75 62 73 74 72 2c 20 20 20 20 20 20 20 20  (substr,        
ce10: 20 20 20 20 20 33 2c 20 30 2c 20 30 2c 20 73 75       3, 0, 0, su
ce20: 62 73 74 72 46 75 6e 63 20 20 20 20 20 20 20 29  bstrFunc       )
ce30: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 70  ,.    FUNCTION(p
ce40: 72 69 6e 74 66 2c 20 20 20 20 20 20 20 20 20 20  rintf,          
ce50: 20 20 2d 31 2c 20 30 2c 20 30 2c 20 70 72 69 6e    -1, 0, 0, prin
ce60: 74 66 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  tfFunc       ),.
ce70: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 6e 69      FUNCTION(uni
ce80: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
ce90: 20 31 2c 20 30 2c 20 30 2c 20 75 6e 69 63 6f 64   1, 0, 0, unicod
cea0: 65 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20  eFunc      ),.  
ceb0: 20 20 46 55 4e 43 54 49 4f 4e 28 63 68 61 72 2c    FUNCTION(char,
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31                -1
ced0: 2c 20 30 2c 20 30 2c 20 63 68 61 72 46 75 6e 63  , 0, 0, charFunc
cee0: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
cef0: 46 55 4e 43 54 49 4f 4e 28 61 62 73 2c 20 20 20  FUNCTION(abs,   
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
cf10: 30 2c 20 30 2c 20 61 62 73 46 75 6e 63 20 20 20  0, 0, absFunc   
cf20: 20 20 20 20 20 20 20 29 2c 0a 23 69 66 6e 64 65         ),.#ifnde
cf30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
cf40: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
cf50: 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c   FUNCTION(round,
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
cf70: 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63   0, 0, roundFunc
cf80: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
cf90: 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20  UNCTION(round,  
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
cfb0: 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20  , 0, roundFunc  
cfc0: 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a        ),.#endif.
cfd0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 70 70      FUNCTION(upp
cfe0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
cff0: 20 31 2c 20 30 2c 20 30 2c 20 75 70 70 65 72 46   1, 0, 0, upperF
d000: 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20  unc        ),.  
d010: 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 77 65 72    FUNCTION(lower
d020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
d030: 2c 20 30 2c 20 30 2c 20 6c 6f 77 65 72 46 75 6e  , 0, 0, lowerFun
d040: 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  c        ),.    
d050: 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63  FUNCTION(coalesc
d060: 65 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  e,           1, 
d070: 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20 20  0, 0, 0         
d080: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
d090: 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c  NCTION(coalesce,
d0a0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
d0b0: 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20   0, 0           
d0c0: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
d0d0: 54 49 4f 4e 32 28 63 6f 61 6c 65 73 63 65 2c 20  TION2(coalesce, 
d0e0: 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30          -1, 0, 0
d0f0: 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c  , noopFunc,  SQL
d100: 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
d110: 45 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e  E),.    FUNCTION
d120: 28 68 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  (hex,           
d130: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 68 65       1, 0, 0, he
d140: 78 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 29  xFunc          )
d150: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28  ,.    FUNCTION2(
d160: 69 66 6e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20  ifnull,         
d170: 20 20 20 32 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70     2, 0, 0, noop
d180: 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55  Func,  SQLITE_FU
d190: 4e 43 5f 43 4f 41 4c 45 53 43 45 29 2c 0a 20 20  NC_COALESCE),.  
d1a0: 20 20 46 55 4e 43 54 49 4f 4e 32 28 75 6e 6c 69    FUNCTION2(unli
d1b0: 6b 65 6c 79 2c 20 20 20 20 20 20 20 20 20 20 31  kely,          1
d1c0: 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63  , 0, 0, noopFunc
d1d0: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55  ,  SQLITE_FUNC_U
d1e0: 4e 4c 49 4b 45 4c 59 29 2c 0a 20 20 20 20 46 55  NLIKELY),.    FU
d1f0: 4e 43 54 49 4f 4e 32 28 6c 69 6b 65 6c 69 68 6f  NCTION2(likeliho
d200: 6f 64 2c 20 20 20 20 20 20 20 20 32 2c 20 30 2c  od,        2, 0,
d210: 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53   0, noopFunc,  S
d220: 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b  QLITE_FUNC_UNLIK
d230: 45 4c 59 29 2c 0a 20 20 20 20 46 55 4e 43 54 49  ELY),.    FUNCTI
d240: 4f 4e 32 28 6c 69 6b 65 6c 79 2c 20 20 20 20 20  ON2(likely,     
d250: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
d260: 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54  noopFunc,  SQLIT
d270: 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29  E_FUNC_UNLIKELY)
d280: 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28  ,.    VFUNCTION(
d290: 72 61 6e 64 6f 6d 2c 20 20 20 20 20 20 20 20 20  random,         
d2a0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 72 61 6e 64     0, 0, 0, rand
d2b0: 6f 6d 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  omFunc       ),.
d2c0: 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 72 61      VFUNCTION(ra
d2d0: 6e 64 6f 6d 62 6c 6f 62 2c 20 20 20 20 20 20 20  ndomblob,       
d2e0: 20 31 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d   1, 0, 0, random
d2f0: 42 6c 6f 62 20 20 20 20 20 20 20 29 2c 0a 20 20  Blob       ),.  
d300: 20 20 46 55 4e 43 54 49 4f 4e 28 6e 75 6c 6c 69    FUNCTION(nulli
d310: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 32  f,             2
d320: 2c 20 30 2c 20 31 2c 20 6e 75 6c 6c 69 66 46 75  , 0, 1, nullifFu
d330: 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  nc       ),.    
d340: 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65  DFUNCTION(sqlite
d350: 5f 76 65 72 73 69 6f 6e 2c 20 20 20 20 30 2c 20  _version,    0, 
d360: 30 2c 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e  0, 0, versionFun
d370: 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20 44 46  c      ),.    DF
d380: 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 73  UNCTION(sqlite_s
d390: 6f 75 72 63 65 5f 69 64 2c 20 20 30 2c 20 30 2c  ource_id,  0, 0,
d3a0: 20 30 2c 20 73 6f 75 72 63 65 69 64 46 75 6e 63   0, sourceidFunc
d3b0: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
d3c0: 54 49 4f 4e 28 73 71 6c 69 74 65 5f 6c 6f 67 2c  TION(sqlite_log,
d3d0: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30           2, 0, 0
d3e0: 2c 20 65 72 72 6c 6f 67 46 75 6e 63 20 20 20 20  , errlogFunc    
d3f0: 20 20 20 29 2c 0a 23 69 66 20 53 51 4c 49 54 45     ),.#if SQLITE
d400: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
d410: 54 49 4f 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f  TION.    FUNCTIO
d420: 4e 28 73 71 6c 69 74 65 5f 63 72 79 70 74 2c 20  N(sqlite_crypt, 
d430: 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 73        2, 0, 0, s
d440: 71 6c 69 74 65 33 43 72 79 70 74 46 75 6e 63 20  qlite3CryptFunc 
d450: 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  ),.#endif.#ifnde
d460: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
d470: 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
d480: 53 0a 20 20 20 20 44 46 55 4e 43 54 49 4f 4e 28  S.    DFUNCTION(
d490: 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70  sqlite_compileop
d4a0: 74 69 6f 6e 5f 75 73 65 64 2c 31 2c 20 30 2c 20  tion_used,1, 0, 
d4b0: 30 2c 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  0, compileoption
d4c0: 75 73 65 64 46 75 6e 63 20 20 29 2c 0a 20 20 20  usedFunc  ),.   
d4d0: 20 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74   DFUNCTION(sqlit
d4e0: 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  e_compileoption_
d4f0: 67 65 74 2c 20 31 2c 20 30 2c 20 30 2c 20 63 6f  get, 1, 0, 0, co
d500: 6d 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74 46 75  mpileoptiongetFu
d510: 6e 63 20 20 29 2c 0a 23 65 6e 64 69 66 20 2f 2a  nc  ),.#endif /*
d520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
d530: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
d540: 20 2a 2f 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   */.    FUNCTION
d550: 28 71 75 6f 74 65 2c 20 20 20 20 20 20 20 20 20  (quote,         
d560: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 71 75       1, 0, 0, qu
d570: 6f 74 65 46 75 6e 63 20 20 20 20 20 20 20 20 29  oteFunc        )
d580: 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28  ,.    VFUNCTION(
d590: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
d5a0: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 6c 61 73 74  d, 0, 0, 0, last
d5b0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 29 2c 0a  _insert_rowid),.
d5c0: 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 63 68      VFUNCTION(ch
d5d0: 61 6e 67 65 73 2c 20 20 20 20 20 20 20 20 20 20  anges,          
d5e0: 20 30 2c 20 30 2c 20 30 2c 20 63 68 61 6e 67 65   0, 0, 0, change
d5f0: 73 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  s          ),.  
d600: 20 20 56 46 55 4e 43 54 49 4f 4e 28 74 6f 74 61    VFUNCTION(tota
d610: 6c 5f 63 68 61 6e 67 65 73 2c 20 20 20 20 20 30  l_changes,     0
d620: 2c 20 30 2c 20 30 2c 20 74 6f 74 61 6c 5f 63 68  , 0, 0, total_ch
d630: 61 6e 67 65 73 20 20 20 20 29 2c 0a 20 20 20 20  anges    ),.    
d640: 46 55 4e 43 54 49 4f 4e 28 72 65 70 6c 61 63 65  FUNCTION(replace
d650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 33 2c 20  ,            3, 
d660: 30 2c 20 30 2c 20 72 65 70 6c 61 63 65 46 75 6e  0, 0, replaceFun
d670: 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55  c      ),.    FU
d680: 4e 43 54 49 4f 4e 28 7a 65 72 6f 62 6c 6f 62 2c  NCTION(zeroblob,
d690: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
d6a0: 20 30 2c 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63   0, zeroblobFunc
d6b0: 20 20 20 20 20 29 2c 0a 20 20 23 69 66 64 65 66       ),.  #ifdef
d6c0: 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a   SQLITE_SOUNDEX.
d6d0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 6f 75      FUNCTION(sou
d6e0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
d6f0: 20 31 2c 20 30 2c 20 30 2c 20 73 6f 75 6e 64 65   1, 0, 0, sounde
d700: 78 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20  xFunc      ),.  
d710: 23 65 6e 64 69 66 0a 20 20 23 69 66 6e 64 65 66  #endif.  #ifndef
d720: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
d730: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
d740: 56 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65  VFUNCTION(load_e
d750: 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 31 2c 20  xtension,    1, 
d760: 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20  0, 0, loadExt   
d770: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 56 46         ),.    VF
d780: 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78 74  UNCTION(load_ext
d790: 65 6e 73 69 6f 6e 2c 20 20 20 20 32 2c 20 30 2c  ension,    2, 0,
d7a0: 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20 20 20   0, loadExt     
d7b0: 20 20 20 20 20 29 2c 0a 20 20 23 65 6e 64 69 66       ),.  #endif
d7c0: 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28 73  .    AGGREGATE(s
d7d0: 75 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  um,             
d7e0: 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74    1, 0, 0, sumSt
d7f0: 65 70 2c 20 20 20 20 20 20 20 20 20 73 75 6d 46  ep,         sumF
d800: 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20  inalize    ),.  
d810: 20 20 41 47 47 52 45 47 41 54 45 28 74 6f 74 61    AGGREGATE(tota
d820: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31  l,             1
d830: 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c  , 0, 0, sumStep,
d840: 20 20 20 20 20 20 20 20 20 74 6f 74 61 6c 46 69           totalFi
d850: 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20 20  nalize    ),.   
d860: 20 41 47 47 52 45 47 41 54 45 28 61 76 67 2c 20   AGGREGATE(avg, 
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
d880: 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20   0, 0, sumStep, 
d890: 20 20 20 20 20 20 20 20 61 76 67 46 69 6e 61 6c          avgFinal
d8a0: 69 7a 65 20 20 20 20 29 2c 0a 20 20 20 20 41 47  ize    ),.    AG
d8b0: 47 52 45 47 41 54 45 32 28 63 6f 75 6e 74 2c 20  GREGATE2(count, 
d8c0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
d8d0: 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20   0, countStep,  
d8e0: 20 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69       countFinali
d8f0: 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
d900: 20 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43     SQLITE_FUNC_C
d910: 4f 55 4e 54 20 20 29 2c 0a 20 20 20 20 41 47 47  OUNT  ),.    AGG
d920: 52 45 47 41 54 45 28 63 6f 75 6e 74 2c 20 20 20  REGATE(count,   
d930: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
d940: 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20 20  0, countStep,   
d950: 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a      countFinaliz
d960: 65 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47  e  ),.    AGGREG
d970: 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ATE(group_concat
d980: 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20  ,      1, 0, 0, 
d990: 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 2c  groupConcatStep,
d9a0: 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61   groupConcatFina
d9b0: 6c 69 7a 65 29 2c 0a 20 20 20 20 41 47 47 52 45  lize),.    AGGRE
d9c0: 47 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61  GATE(group_conca
d9d0: 74 2c 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c  t,      2, 0, 0,
d9e0: 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70   groupConcatStep
d9f0: 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e  , groupConcatFin
da00: 61 6c 69 7a 65 29 2c 0a 20 20 0a 20 20 20 20 4c  alize),.  .    L
da10: 49 4b 45 46 55 4e 43 28 67 6c 6f 62 2c 20 32 2c  IKEFUNC(glob, 2,
da20: 20 26 67 6c 6f 62 49 6e 66 6f 2c 20 53 51 4c 49   &globInfo, SQLI
da30: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c  TE_FUNC_LIKE|SQL
da40: 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a  ITE_FUNC_CASE),.
da50: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
da60: 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c  CASE_SENSITIVE_L
da70: 49 4b 45 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43  IKE.    LIKEFUNC
da80: 28 6c 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49  (like, 2, &likeI
da90: 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46  nfoAlt, SQLITE_F
daa0: 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f  UNC_LIKE|SQLITE_
dab0: 46 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20 20 20  FUNC_CASE),.    
dac0: 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33  LIKEFUNC(like, 3
dad0: 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20  , &likeInfoAlt, 
dae0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
daf0: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53  |SQLITE_FUNC_CAS
db00: 45 29 2c 0a 20 20 23 65 6c 73 65 0a 20 20 20 20  E),.  #else.    
db10: 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32  LIKEFUNC(like, 2
db20: 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c  , &likeInfoNorm,
db30: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
db40: 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43  E),.    LIKEFUNC
db50: 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49  (like, 3, &likeI
db60: 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f  nfoNorm, SQLITE_
db70: 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20 23 65  FUNC_LIKE),.  #e
db80: 6e 64 69 66 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74  ndif.  };..  int
db90: 20 69 3b 0a 20 20 46 75 6e 63 44 65 66 48 61 73   i;.  FuncDefHas
dba0: 68 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42  h *pHash = &GLOB
dbb0: 41 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20  AL(FuncDefHash, 
dbc0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e  sqlite3GlobalFun
dbd0: 63 74 69 6f 6e 73 29 3b 0a 20 20 46 75 6e 63 44  ctions);.  FuncD
dbe0: 65 66 20 2a 61 46 75 6e 63 20 3d 20 28 46 75 6e  ef *aFunc = (Fun
dbf0: 63 44 65 66 2a 29 26 47 4c 4f 42 41 4c 28 46 75  cDef*)&GLOBAL(Fu
dc00: 6e 63 44 65 66 2c 20 61 42 75 69 6c 74 69 6e 46  ncDef, aBuiltinF
dc10: 75 6e 63 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  unc);..  for(i=0
dc20: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 42  ; i<ArraySize(aB
dc30: 75 69 6c 74 69 6e 46 75 6e 63 29 3b 20 69 2b 2b  uiltinFunc); i++
dc40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 75  ){.    sqlite3Fu
dc50: 6e 63 44 65 66 49 6e 73 65 72 74 28 70 48 61 73  ncDefInsert(pHas
dc60: 68 2c 20 26 61 46 75 6e 63 5b 69 5d 29 3b 0a 20  h, &aFunc[i]);. 
dc70: 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69   }.  sqlite3Regi
dc80: 73 74 65 72 44 61 74 65 54 69 6d 65 46 75 6e 63  sterDateTimeFunc
dc90: 74 69 6f 6e 73 28 29 3b 0a 23 69 66 6e 64 65 66  tions();.#ifndef
dca0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
dcb0: 45 52 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65  ERTABLE.  sqlite
dcc0: 33 41 6c 74 65 72 46 75 6e 63 74 69 6f 6e 73 28  3AlterFunctions(
dcd0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
dce0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
dcf0: 42 4c 45 5f 53 54 41 54 33 29 20 7c 7c 20 64 65  BLE_STAT3) || de
dd00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
dd10: 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 73 71 6c  BLE_STAT4).  sql
dd20: 69 74 65 33 41 6e 61 6c 79 7a 65 46 75 6e 63 74  ite3AnalyzeFunct
dd30: 69 6f 6e 73 28 29 3b 0a 23 65 6e 64 69 66 0a 7d  ions();.#endif.}
dd40: 0a                                               .