/ Hex Artifact Content
Login

Artifact d08d2106ba10dddbee45e001b8516f4d1df2b20e:


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 63   if( noCase && c
56a0: 3c 30 78 38 30 20 26 26 20 63 32 3c 30 78 38 30  <0x80 && c2<0x80
56b0: 20 26 26 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77   && sqlite3Tolow
56c0: 65 72 28 63 29 3d 3d 73 71 6c 69 74 65 33 54 6f  er(c)==sqlite3To
56d0: 6c 6f 77 65 72 28 63 32 29 20 29 7b 0a 20 20 20  lower(c2) ){.   
56e0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
56f0: 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 6d 61   }.    if( c==ma
5700: 74 63 68 4f 6e 65 20 26 26 20 7a 50 61 74 74 65  tchOne && zPatte
5710: 72 6e 21 3d 7a 45 73 63 61 70 65 64 20 26 26 20  rn!=zEscaped && 
5720: 63 32 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  c2!=0 ) continue
5730: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
5740: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53    }.  return *zS
5750: 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  tring==0;.}../*.
5760: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  ** The sqlite3_s
5770: 74 72 67 6c 6f 62 28 29 20 69 6e 74 65 72 66 61  trglob() interfa
5780: 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
5790: 65 33 5f 73 74 72 67 6c 6f 62 28 63 6f 6e 73 74  e3_strglob(const
57a0: 20 63 68 61 72 20 2a 7a 47 6c 6f 62 50 61 74 74   char *zGlobPatt
57b0: 65 72 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ern, const char 
57c0: 2a 7a 53 74 72 69 6e 67 29 7b 0a 20 20 72 65 74  *zString){.  ret
57d0: 75 72 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61  urn patternCompa
57e0: 72 65 28 28 75 38 2a 29 7a 47 6c 6f 62 50 61 74  re((u8*)zGlobPat
57f0: 74 65 72 6e 2c 20 28 75 38 2a 29 7a 53 74 72 69  tern, (u8*)zStri
5800: 6e 67 2c 20 26 67 6c 6f 62 49 6e 66 6f 2c 20 30  ng, &globInfo, 0
5810: 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  )==0;.}../*.** C
5820: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
5830: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 74 68  of times that th
5840: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
5850: 28 6f 72 20 47 4c 4f 42 20 77 68 69 63 68 20 69  (or GLOB which i
5860: 73 0a 2a 2a 20 6a 75 73 74 20 61 20 76 61 72 69  s.** just a vari
5870: 61 74 69 6f 6e 20 6f 66 20 4c 49 4b 45 29 20 67  ation of LIKE) g
5880: 65 74 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ets called.  Thi
5890: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
58a0: 73 74 69 6e 67 0a 2a 2a 20 6f 6e 6c 79 2e 0a 2a  sting.** only..*
58b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
58c0: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
58d0: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 3d 20 30 3b  _like_count = 0;
58e0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
58f0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
5900: 66 20 74 68 65 20 6c 69 6b 65 28 29 20 53 51 4c  f the like() SQL
5910: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
5920: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
5930: 65 6e 74 73 0a 2a 2a 20 74 68 65 20 62 75 69 6c  ents.** the buil
5940: 64 2d 69 6e 20 4c 49 4b 45 20 6f 70 65 72 61 74  d-in LIKE operat
5950: 6f 72 2e 20 20 54 68 65 20 66 69 72 73 74 20 61  or.  The first a
5960: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
5970: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 0a 2a  unction is the.*
5980: 2a 20 70 61 74 74 65 72 6e 20 61 6e 64 20 74 68  * pattern and th
5990: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
59a0: 74 20 69 73 20 74 68 65 20 73 74 72 69 6e 67 2e  t is the string.
59b0: 20 20 53 6f 2c 20 74 68 65 20 53 51 4c 20 73 74    So, the SQL st
59c0: 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  atements:.**.** 
59d0: 20 20 20 20 20 20 41 20 4c 49 4b 45 20 42 0a 2a        A LIKE B.*
59e0: 2a 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e  *.** is implemen
59f0: 74 65 64 20 61 73 20 6c 69 6b 65 28 42 2c 41 29  ted as like(B,A)
5a00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 61 6d  ..**.** This sam
5a10: 65 20 66 75 6e 63 74 69 6f 6e 20 28 77 69 74 68  e function (with
5a20: 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6d   a different com
5a30: 70 61 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  pareInfo structu
5a40: 72 65 29 20 63 6f 6d 70 75 74 65 73 0a 2a 2a 20  re) computes.** 
5a50: 74 68 65 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f  the GLOB operato
5a60: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
5a70: 64 20 6c 69 6b 65 46 75 6e 63 28 0a 20 20 73 71  d likeFunc(.  sq
5a80: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5a90: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
5aa0: 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  rgc, .  sqlite3_
5ab0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
5ac0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
5ad0: 20 63 68 61 72 20 2a 7a 41 2c 20 2a 7a 42 3b 0a   char *zA, *zB;.
5ae0: 20 20 75 33 32 20 65 73 63 61 70 65 20 3d 20 30    u32 escape = 0
5af0: 3b 0a 20 20 69 6e 74 20 6e 50 61 74 3b 0a 20 20  ;.  int nPat;.  
5b00: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
5b10: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
5b20: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
5b30: 3b 0a 0a 20 20 7a 42 20 3d 20 73 71 6c 69 74 65  ;..  zB = sqlite
5b40: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5b50: 76 5b 30 5d 29 3b 0a 20 20 7a 41 20 3d 20 73 71  v[0]);.  zA = sq
5b60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5b70: 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a  (argv[1]);..  /*
5b80: 20 4c 69 6d 69 74 20 74 68 65 20 6c 65 6e 67 74   Limit the lengt
5b90: 68 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72  h of the LIKE or
5ba0: 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f   GLOB pattern to
5bb0: 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a   avoid problems.
5bc0: 20 20 2a 2a 20 6f 66 20 64 65 65 70 20 72 65 63    ** of deep rec
5bd0: 75 72 73 69 6f 6e 20 61 6e 64 20 4e 2a 4e 20 62  ursion and N*N b
5be0: 65 68 61 76 69 6f 72 20 69 6e 20 70 61 74 74 65  ehavior in patte
5bf0: 72 6e 43 6f 6d 70 61 72 65 28 29 2e 0a 20 20 2a  rnCompare()..  *
5c00: 2f 0a 20 20 6e 50 61 74 20 3d 20 73 71 6c 69 74  /.  nPat = sqlit
5c10: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
5c20: 72 67 76 5b 30 5d 29 3b 0a 20 20 74 65 73 74 63  rgv[0]);.  testc
5c30: 61 73 65 28 20 6e 50 61 74 3d 3d 64 62 2d 3e 61  ase( nPat==db->a
5c40: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5c50: 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
5c60: 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 74 65 73  LENGTH] );.  tes
5c70: 74 63 61 73 65 28 20 6e 50 61 74 3d 3d 64 62 2d  tcase( nPat==db-
5c80: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
5c90: 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
5ca0: 4e 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20  N_LENGTH]+1 );. 
5cb0: 20 69 66 28 20 6e 50 61 74 20 3e 20 64 62 2d 3e   if( nPat > db->
5cc0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
5cd0: 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
5ce0: 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
5cf0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5d00: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 4c  rror(context, "L
5d10: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61 74 74  IKE or GLOB patt
5d20: 65 72 6e 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 22  ern too complex"
5d30: 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
5d40: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
5d50: 20 7a 42 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c   zB==sqlite3_val
5d60: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
5d70: 20 29 3b 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67   );  /* Encoding
5d80: 20 64 69 64 20 6e 6f 74 20 63 68 61 6e 67 65 20   did not change 
5d90: 2a 2f 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  */..  if( argc==
5da0: 33 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  3 ){.    /* The 
5db0: 65 73 63 61 70 65 20 63 68 61 72 61 63 74 65 72  escape character
5dc0: 20 73 74 72 69 6e 67 20 6d 75 73 74 20 63 6f 6e   string must con
5dd0: 73 69 73 74 20 6f 66 20 61 20 73 69 6e 67 6c 65  sist of a single
5de0: 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72   UTF-8 character
5df0: 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69  ..    ** Otherwi
5e00: 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
5e10: 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ror..    */.    
5e20: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5e30: 68 61 72 20 2a 7a 45 73 63 20 3d 20 73 71 6c 69  har *zEsc = sqli
5e40: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5e50: 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[2]);.    if(
5e60: 20 7a 45 73 63 3d 3d 30 20 29 20 72 65 74 75 72   zEsc==0 ) retur
5e70: 6e 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  n;.    if( sqlit
5e80: 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 28 63  e3Utf8CharLen((c
5e90: 68 61 72 2a 29 7a 45 73 63 2c 20 2d 31 29 21 3d  har*)zEsc, -1)!=
5ea0: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
5eb0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
5ec0: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  context, .      
5ed0: 20 20 20 20 22 45 53 43 41 50 45 20 65 78 70 72      "ESCAPE expr
5ee0: 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  ession must be a
5ef0: 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65   single characte
5f00: 72 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 72  r", -1);.      r
5f10: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
5f20: 20 65 73 63 61 70 65 20 3d 20 73 71 6c 69 74 65   escape = sqlite
5f30: 33 55 74 66 38 52 65 61 64 28 26 7a 45 73 63 29  3Utf8Read(&zEsc)
5f40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 20 26  ;.  }.  if( zA &
5f50: 26 20 7a 42 20 29 7b 0a 20 20 20 20 73 74 72 75  & zB ){.    stru
5f60: 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a  ct compareInfo *
5f70: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f  pInfo = sqlite3_
5f80: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
5f90: 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
5fa0: 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74  E_TEST.    sqlit
5fb0: 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b  e3_like_count++;
5fc0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20  .#endif.    .   
5fd0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5fe0: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 61 74  int(context, pat
5ff0: 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a 42 2c 20  ternCompare(zB, 
6000: 7a 41 2c 20 70 49 6e 66 6f 2c 20 65 73 63 61 70  zA, pInfo, escap
6010: 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e));.  }.}../*.*
6020: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
6030: 20 6f 66 20 74 68 65 20 4e 55 4c 4c 49 46 28 78   of the NULLIF(x
6040: 2c 79 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ,y) function.  T
6050: 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65  he result is the
6060: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
6070: 6e 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  nt if the argume
6080: 6e 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  nts are differen
6090: 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69  t.  The result i
60a0: 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a 2a 2a  s NULL if the.**
60b0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 65   arguments are e
60c0: 71 75 61 6c 20 74 6f 20 65 61 63 68 20 6f 74 68  qual to each oth
60d0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
60e0: 69 64 20 6e 75 6c 6c 69 66 46 75 6e 63 28 0a 20  id nullifFunc(. 
60f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6100: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
6110: 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69   NotUsed,.  sqli
6120: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
6130: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
6140: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
6150: 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e  tFuncCollSeq(con
6160: 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f  text);.  UNUSED_
6170: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
6180: 64 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  d);.  if( sqlite
6190: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72 67 76  3MemCompare(argv
61a0: 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 2c 20 70 43  [0], argv[1], pC
61b0: 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  oll)!=0 ){.    s
61c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
61d0: 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  lue(context, arg
61e0: 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  v[0]);.  }.}../*
61f0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
6200: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
6210: 5f 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  _version() funct
6220: 69 6f 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ion.  The result
6230: 20 69 73 20 74 68 65 20 76 65 72 73 69 6f 6e 0a   is the version.
6240: 2a 2a 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  ** of the SQLite
6250: 20 6c 69 62 72 61 72 79 20 74 68 61 74 20 69 73   library that is
6260: 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61   running..*/.sta
6270: 74 69 63 20 76 6f 69 64 20 76 65 72 73 69 6f 6e  tic void version
6280: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
6290: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
62a0: 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c  ,.  int NotUsed,
62b0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
62c0: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
62d0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
62e0: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
62f0: 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a  sed2);.  /* IMP:
6300: 20 52 2d 34 38 36 39 39 2d 34 38 36 31 37 20 54   R-48699-48617 T
6310: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
6320: 61 6e 20 53 51 4c 20 77 72 61 70 70 65 72 20 61  an SQL wrapper a
6330: 72 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73  round the.  ** s
6340: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
6350: 6e 28 29 20 43 2d 69 6e 74 65 72 66 61 63 65 2e  n() C-interface.
6360: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   */.  sqlite3_re
6370: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
6380: 74 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  t, sqlite3_libve
6390: 72 73 69 6f 6e 28 29 2c 20 2d 31 2c 20 53 51 4c  rsion(), -1, SQL
63a0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a  ITE_STATIC);.}..
63b0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
63c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
63d0: 74 65 5f 73 6f 75 72 63 65 5f 69 64 28 29 20 66  te_source_id() f
63e0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 72 65 73  unction. The res
63f0: 75 6c 74 20 69 73 20 61 20 73 74 72 69 6e 67 0a  ult is a string.
6400: 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69 66 69  ** that identifi
6410: 65 73 20 74 68 65 20 70 61 72 74 69 63 75 6c 61  es the particula
6420: 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  r version of the
6430: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 75 73 65   source code use
6440: 64 20 74 6f 20 62 75 69 6c 64 0a 2a 2a 20 53 51  d to build.** SQ
6450: 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Lite..*/.static 
6460: 76 6f 69 64 20 73 6f 75 72 63 65 69 64 46 75 6e  void sourceidFun
6470: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
6480: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6490: 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20   int NotUsed,.  
64a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
64b0: 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 55 4e  NotUsed2.){.  UN
64c0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
64d0: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
64e0: 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  2);.  /* IMP: R-
64f0: 32 34 34 37 30 2d 33 31 31 33 36 20 54 68 69 73  24470-31136 This
6500: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
6510: 53 51 4c 20 77 72 61 70 70 65 72 20 61 72 6f 75  SQL wrapper arou
6520: 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  nd the.  ** sqli
6530: 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 20 43  te3_sourceid() C
6540: 20 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f 0a 20   interface. */. 
6550: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6560: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  text(context, sq
6570: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
6580: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
6590: 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  TIC);.}../*.** I
65a0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
65b0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6c 6f 67 28   the sqlite_log(
65c0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  ) function.  Thi
65d0: 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  s is a wrapper a
65e0: 72 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33  round.** sqlite3
65f0: 5f 6c 6f 67 28 29 2e 20 20 54 68 65 20 72 65 74  _log().  The ret
6600: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  urn value is NUL
6610: 4c 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  L.  The function
6620: 20 65 78 69 73 74 73 20 70 75 72 65 6c 79 20 66   exists purely f
6630: 6f 72 0a 2a 2a 20 69 74 73 20 73 69 64 65 2d 65  or.** its side-e
6640: 66 66 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ffects..*/.stati
6650: 63 20 76 6f 69 64 20 65 72 72 6c 6f 67 46 75 6e  c void errlogFun
6660: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
6670: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6680: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
6690: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
66a0: 76 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  v.){.  UNUSED_PA
66b0: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
66c0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
66d0: 52 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71  R(context);.  sq
66e0: 6c 69 74 65 33 5f 6c 6f 67 28 73 71 6c 69 74 65  lite3_log(sqlite
66f0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
6700: 5b 30 5d 29 2c 20 22 25 73 22 2c 20 73 71 6c 69  [0]), "%s", sqli
6710: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6720: 72 67 76 5b 31 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a  rgv[1]));.}../*.
6730: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
6740: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
6750: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73  compileoption_us
6760: 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ed() function..*
6770: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
6780: 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  an integer that 
6790: 69 64 65 6e 74 69 66 69 65 73 20 69 66 20 74 68  identifies if th
67a0: 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f  e compiler optio
67b0: 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64 20 74 6f  n.** was used to
67c0: 20 62 75 69 6c 64 20 53 51 4c 69 74 65 2e 0a 2a   build SQLite..*
67d0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
67e0: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
67f0: 49 4f 4e 5f 44 49 41 47 53 0a 73 74 61 74 69 63  ION_DIAGS.static
6800: 20 76 6f 69 64 20 63 6f 6d 70 69 6c 65 6f 70 74   void compileopt
6810: 69 6f 6e 75 73 65 64 46 75 6e 63 28 0a 20 20 73  ionusedFunc(.  s
6820: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6830: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
6840: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
6850: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
6860: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
6870: 74 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  tName;.  assert(
6880: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
6890: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
68a0: 72 67 63 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20  rgc);.  /* IMP: 
68b0: 52 2d 33 39 35 36 34 2d 33 36 33 30 35 20 54 68  R-39564-36305 Th
68c0: 65 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65  e sqlite_compile
68d0: 6f 70 74 69 6f 6e 5f 75 73 65 64 28 29 20 53 51  option_used() SQ
68e0: 4c 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  L.  ** function 
68f0: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
6900: 75 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f  und the sqlite3_
6910: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73  compileoption_us
6920: 65 64 28 29 20 43 2f 43 2b 2b 0a 20 20 2a 2a 20  ed() C/C++.  ** 
6930: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
6940: 20 69 66 28 20 28 7a 4f 70 74 4e 61 6d 65 20 3d   if( (zOptName =
6950: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
6960: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6970: 28 61 72 67 76 5b 30 5d 29 29 21 3d 30 20 29 7b  (argv[0]))!=0 ){
6980: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
6990: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
69a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65   sqlite3_compile
69b0: 6f 70 74 69 6f 6e 5f 75 73 65 64 28 7a 4f 70 74  option_used(zOpt
69c0: 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 23 65  Name));.  }.}.#e
69d0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
69e0: 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
69f0: 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 2f 2a 0a 2a  N_DIAGS */../*.*
6a00: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
6a10: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 63   of the sqlite_c
6a20: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74  ompileoption_get
6a30: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  () function. .**
6a40: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   The result is a
6a50: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 64 65   string that ide
6a60: 6e 74 69 66 69 65 73 20 74 68 65 20 63 6f 6d 70  ntifies the comp
6a70: 69 6c 65 72 20 6f 70 74 69 6f 6e 73 20 0a 2a 2a  iler options .**
6a80: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 53   used to build S
6a90: 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  QLite..*/.#ifnde
6aa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
6ab0: 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
6ac0: 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  S.static void co
6ad0: 6d 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74 46 75  mpileoptiongetFu
6ae0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
6af0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
6b00: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
6b10: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
6b20: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  gv.){.  int n;. 
6b30: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
6b40: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
6b50: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
6b60: 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 39 32 32 2d  /* IMP: R-04922-
6b70: 32 34 30 37 36 20 54 68 65 20 73 71 6c 69 74 65  24076 The sqlite
6b80: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67  _compileoption_g
6b90: 65 74 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  et() SQL functio
6ba0: 6e 0a 20 20 2a 2a 20 69 73 20 61 20 77 72 61 70  n.  ** is a wrap
6bb0: 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 73  per around the s
6bc0: 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70  qlite3_compileop
6bd0: 74 69 6f 6e 5f 67 65 74 28 29 20 43 2f 43 2b 2b  tion_get() C/C++
6be0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
6bf0: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
6c00: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29  lue_int(argv[0])
6c10: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
6c20: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
6c30: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65   sqlite3_compile
6c40: 6f 70 74 69 6f 6e 5f 67 65 74 28 6e 29 2c 20 2d  option_get(n), -
6c50: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
6c60: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
6c70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49  QLITE_OMIT_COMPI
6c80: 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a  LEOPTION_DIAGS *
6c90: 2f 0a 0a 2f 2a 20 41 72 72 61 79 20 66 6f 72 20  /../* Array for 
6ca0: 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d 20  converting from 
6cb0: 68 61 6c 66 2d 62 79 74 65 73 20 28 6e 79 62 62  half-bytes (nybb
6cc0: 6c 65 73 29 20 69 6e 74 6f 20 41 53 43 49 49 20  les) into ASCII 
6cd0: 68 65 78 0a 2a 2a 20 64 69 67 69 74 73 2e 20 2a  hex.** digits. *
6ce0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6cf0: 68 61 72 20 68 65 78 64 69 67 69 74 73 5b 5d 20  har hexdigits[] 
6d00: 3d 20 7b 0a 20 20 27 30 27 2c 20 27 31 27 2c 20  = {.  '0', '1', 
6d10: 27 32 27 2c 20 27 33 27 2c 20 27 34 27 2c 20 27  '2', '3', '4', '
6d20: 35 27 2c 20 27 36 27 2c 20 27 37 27 2c 0a 20 20  5', '6', '7',.  
6d30: 27 38 27 2c 20 27 39 27 2c 20 27 41 27 2c 20 27  '8', '9', 'A', '
6d40: 42 27 2c 20 27 43 27 2c 20 27 44 27 2c 20 27 45  B', 'C', 'D', 'E
6d50: 27 2c 20 27 46 27 20 0a 7d 3b 0a 0a 2f 2a 0a 2a  ', 'F' .};../*.*
6d60: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
6d70: 20 6f 66 20 74 68 65 20 51 55 4f 54 45 28 29 20   of the QUOTE() 
6d80: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
6d90: 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61  function takes a
6da0: 20 73 69 6e 67 6c 65 0a 2a 2a 20 61 72 67 75 6d   single.** argum
6db0: 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72 67  ent.  If the arg
6dc0: 75 6d 65 6e 74 20 69 73 20 6e 75 6d 65 72 69 63  ument is numeric
6dd0: 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  , the return val
6de0: 75 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ue is the same a
6df0: 73 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e  s.** the argumen
6e00: 74 2e 20 20 49 66 20 74 68 65 20 61 72 67 75 6d  t.  If the argum
6e10: 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
6e20: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
6e30: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
6e40: 4e 55 4c 4c 22 2e 20 20 4f 74 68 65 72 77 69 73  NULL".  Otherwis
6e50: 65 2c 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  e, the argument 
6e60: 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 73  is enclosed in s
6e70: 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 77 69 74  ingle quotes wit
6e80: 68 0a 2a 2a 20 73 69 6e 67 6c 65 2d 71 75 6f 74  h.** single-quot
6e90: 65 20 65 73 63 61 70 65 73 2e 0a 2a 2f 0a 73 74  e escapes..*/.st
6ea0: 61 74 69 63 20 76 6f 69 64 20 71 75 6f 74 65 46  atic void quoteF
6eb0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
6ec0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
6ed0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
6ee0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
6ef0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
6f00: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
6f10: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
6f20: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
6f30: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
6f40: 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  0]) ){.    case 
6f50: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
6f60: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 31 2c        double r1,
6f70: 20 72 32 3b 0a 20 20 20 20 20 20 63 68 61 72 20   r2;.      char 
6f80: 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 20 20  zBuf[50];.      
6f90: 72 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  r1 = sqlite3_val
6fa0: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30  ue_double(argv[0
6fb0: 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ]);.      sqlite
6fc0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
6fd0: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
6fe0: 25 21 2e 31 35 67 22 2c 20 72 31 29 3b 0a 20 20  %!.15g", r1);.  
6ff0: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28      sqlite3AtoF(
7000: 7a 42 75 66 2c 20 26 72 32 2c 20 32 30 2c 20 53  zBuf, &r2, 20, S
7010: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
7020: 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b     if( r1!=r2 ){
7030: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7040: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
7050: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
7060: 21 2e 32 30 65 22 2c 20 72 31 29 3b 0a 20 20 20  !.20e", r1);.   
7070: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7080: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
7090: 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31  ontext, zBuf, -1
70a0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
70b0: 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  NT);.      break
70c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
70d0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
70e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
70f0: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f  _result_value(co
7100: 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b  ntext, argv[0]);
7110: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7120: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
7130: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
7140: 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20    char *zText = 
7150: 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 6f  0;.      char co
7160: 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c  nst *zBlob = sql
7170: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
7180: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
7190: 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  int nBlob = sqli
71a0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
71b0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
71c0: 61 73 73 65 72 74 28 20 7a 42 6c 6f 62 3d 3d 73  assert( zBlob==s
71d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
71e0: 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 2f 2a  b(argv[0]) ); /*
71f0: 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68 61   No encoding cha
7200: 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 65  nge */.      zTe
7210: 78 74 20 3d 20 28 63 68 61 72 20 2a 29 63 6f 6e  xt = (char *)con
7220: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
7230: 78 74 2c 20 28 32 2a 28 69 36 34 29 6e 42 6c 6f  xt, (2*(i64)nBlo
7240: 62 29 2b 34 29 3b 20 0a 20 20 20 20 20 20 69 66  b)+4); .      if
7250: 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 20  ( zText ){.     
7260: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
7270: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c    for(i=0; i<nBl
7280: 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ob; i++){.      
7290: 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29 2b      zText[(i*2)+
72a0: 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28  2] = hexdigits[(
72b0: 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30 78 30  zBlob[i]>>4)&0x0
72c0: 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  F];.          zT
72d0: 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d 20 68  ext[(i*2)+3] = h
72e0: 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f 62 5b  exdigits[(zBlob[
72f0: 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20 20 20  i])&0x0F];.     
7300: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 54 65     }.        zTe
7310: 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32 5d 20  xt[(nBlob*2)+2] 
7320: 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  = '\'';.        
7330: 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b  zText[(nBlob*2)+
7340: 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  3] = '\0';.     
7350: 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20 27 58     zText[0] = 'X
7360: 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74  ';.        zText
7370: 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  [1] = '\'';.    
7380: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7390: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
73a0: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51 4c 49   zText, -1, SQLI
73b0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
73c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
73d0: 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20 20  ree(zText);.    
73e0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
73f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7400: 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20  SQLITE_TEXT: {. 
7410: 20 20 20 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20       int i,j;.  
7420: 20 20 20 20 75 36 34 20 6e 3b 0a 20 20 20 20 20      u64 n;.     
7430: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7440: 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 73 71 6c  char *zArg = sql
7450: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
7460: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
7470: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20 20 20  char *z;..      
7480: 69 66 28 20 7a 41 72 67 3d 3d 30 20 29 20 72 65  if( zArg==0 ) re
7490: 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  turn;.      for(
74a0: 69 3d 30 2c 20 6e 3d 30 3b 20 7a 41 72 67 5b 69  i=0, n=0; zArg[i
74b0: 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a 41 72  ]; i++){ if( zAr
74c0: 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 2b 2b  g[i]=='\'' ) n++
74d0: 3b 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20 63 6f  ; }.      z = co
74e0: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74  ntextMalloc(cont
74f0: 65 78 74 2c 20 28 28 69 36 34 29 69 29 2b 28 28  ext, ((i64)i)+((
7500: 69 36 34 29 6e 29 2b 33 29 3b 0a 20 20 20 20 20  i64)n)+3);.     
7510: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
7520: 20 20 7a 5b 30 5d 20 3d 20 27 5c 27 27 3b 0a 20    z[0] = '\'';. 
7530: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
7540: 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b  j=1; zArg[i]; i+
7550: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b  +){.          z[
7560: 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b 69 5d 3b 0a  j++] = zArg[i];.
7570: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 41            if( zA
7580: 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20  rg[i]=='\'' ){. 
7590: 20 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b             z[j++
75a0: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20  ] = '\'';.      
75b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
75c0: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
75d0: 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 7a   '\'';.        z
75e0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [j] = 0;.       
75f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7600: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 2c  text(context, z,
7610: 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   j, sqlite3_free
7620: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7630: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7640: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
7650: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7660: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
7670: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
7680: 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
7690: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
76a0: 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 22  (context, "NULL"
76b0: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , 4, SQLITE_STAT
76c0: 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
76d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
76e0: 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 63 6f 64 65  *.** The unicode
76f0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65  () function.  Re
7700: 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72  turn the integer
7710: 20 75 6e 69 63 6f 64 65 20 63 6f 64 65 2d 70 6f   unicode code-po
7720: 69 6e 74 20 76 61 6c 75 65 0a 2a 2a 20 66 6f 72  int value.** for
7730: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61   the first chara
7740: 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e 70 75  cter of the inpu
7750: 74 20 73 74 72 69 6e 67 2e 20 0a 2a 2f 0a 73 74  t string. .*/.st
7760: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 63 6f 64  atic void unicod
7770: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
7780: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
7790: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
77a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
77b0: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
77c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
77d0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
77e0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
77f0: 0a 20 20 28 76 6f 69 64 29 61 72 67 63 3b 0a 20  .  (void)argc;. 
7800: 20 69 66 28 20 7a 20 26 26 20 7a 5b 30 5d 20 29   if( z && z[0] )
7810: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7820: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
7830: 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 29  ite3Utf8Read(&z)
7840: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
7850: 63 68 61 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  char() function 
7860: 74 61 6b 65 73 20 7a 65 72 6f 20 6f 72 20 6d 6f  takes zero or mo
7870: 72 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 65 61  re arguments, ea
7880: 63 68 20 6f 66 20 77 68 69 63 68 20 69 73 0a 2a  ch of which is.*
7890: 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49  * an integer.  I
78a0: 74 20 63 6f 6e 73 74 72 75 63 74 73 20 61 20 73  t constructs a s
78b0: 74 72 69 6e 67 20 77 68 65 72 65 20 65 61 63 68  tring where each
78c0: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
78d0: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 74  e string.** is t
78e0: 68 65 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61  he unicode chara
78f0: 63 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72  cter for the cor
7900: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 74 65 67  responding integ
7910: 65 72 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  er argument..*/.
7920: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 72  static void char
7930: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
7940: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
7950: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
7960: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
7970: 61 72 67 76 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  argv.){.  unsign
7980: 65 64 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 4f 75  ed char *z, *zOu
7990: 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 7a 4f  t;.  int i;.  zO
79a0: 75 74 20 3d 20 7a 20 3d 20 73 71 6c 69 74 65 33  ut = z = sqlite3
79b0: 5f 6d 61 6c 6c 6f 63 36 34 28 20 61 72 67 63 2a  _malloc64( argc*
79c0: 34 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  4+1 );.  if( z==
79d0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
79e0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
79f0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
7a00: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7a10: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
7a20: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
7a30: 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20 20 20  e3_int64 x;.    
7a40: 75 6e 73 69 67 6e 65 64 20 63 3b 0a 20 20 20 20  unsigned c;.    
7a50: 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  x = sqlite3_valu
7a60: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 69 5d 29  e_int64(argv[i])
7a70: 3b 0a 20 20 20 20 69 66 28 20 78 3c 30 20 7c 7c  ;.    if( x<0 ||
7a80: 20 78 3e 30 78 31 30 66 66 66 66 20 29 20 78 20   x>0x10ffff ) x 
7a90: 3d 20 30 78 66 66 66 64 3b 0a 20 20 20 20 63 20  = 0xfffd;.    c 
7aa0: 3d 20 28 75 6e 73 69 67 6e 65 64 29 28 78 20 26  = (unsigned)(x &
7ab0: 20 30 78 31 66 66 66 66 66 29 3b 0a 20 20 20 20   0x1fffff);.    
7ac0: 69 66 28 20 63 3c 30 78 30 30 30 38 30 20 29 7b  if( c<0x00080 ){
7ad0: 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d  .      *zOut++ =
7ae0: 20 28 75 38 29 28 63 26 30 78 46 46 29 3b 0a 20   (u8)(c&0xFF);. 
7af0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c 30     }else if( c<0
7b00: 78 30 30 38 30 30 20 29 7b 0a 20 20 20 20 20 20  x00800 ){.      
7b10: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 43 30 20 2b  *zOut++ = 0xC0 +
7b20: 20 28 75 38 29 28 28 63 3e 3e 36 29 26 30 78 31   (u8)((c>>6)&0x1
7b30: 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b  F);.      *zOut+
7b40: 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28  + = 0x80 + (u8)(
7b50: 63 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 7d  c & 0x3F);.    }
7b60: 65 6c 73 65 20 69 66 28 20 63 3c 30 78 31 30 30  else if( c<0x100
7b70: 30 30 20 29 7b 0a 20 20 20 20 20 20 2a 7a 4f 75  00 ){.      *zOu
7b80: 74 2b 2b 20 3d 20 30 78 45 30 20 2b 20 28 75 38  t++ = 0xE0 + (u8
7b90: 29 28 28 63 3e 3e 31 32 29 26 30 78 30 46 29 3b  )((c>>12)&0x0F);
7ba0: 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d  .      *zOut++ =
7bb0: 20 30 78 38 30 20 2b 20 28 75 38 29 28 28 63 3e   0x80 + (u8)((c>
7bc0: 3e 36 29 20 26 20 30 78 33 46 29 3b 0a 20 20 20  >6) & 0x3F);.   
7bd0: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38     *zOut++ = 0x8
7be0: 30 20 2b 20 28 75 38 29 28 63 20 26 20 30 78 33  0 + (u8)(c & 0x3
7bf0: 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  F);.    }else{. 
7c00: 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30       *zOut++ = 0
7c10: 78 46 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 31  xF0 + (u8)((c>>1
7c20: 38 29 20 26 20 30 78 30 37 29 3b 0a 20 20 20 20  8) & 0x07);.    
7c30: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30    *zOut++ = 0x80
7c40: 20 2b 20 28 75 38 29 28 28 63 3e 3e 31 32 29 20   + (u8)((c>>12) 
7c50: 26 20 30 78 33 46 29 3b 0a 20 20 20 20 20 20 2a  & 0x3F);.      *
7c60: 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20  zOut++ = 0x80 + 
7c70: 28 75 38 29 28 28 63 3e 3e 36 29 20 26 20 30 78  (u8)((c>>6) & 0x
7c80: 33 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74  3F);.      *zOut
7c90: 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29  ++ = 0x80 + (u8)
7ca0: 28 63 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20  (c & 0x3F);.    
7cb0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 20 20 20 20 5c 0a 20 20 7d 0a 20 20 73 71 6c       \.  }.  sql
7cf0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7d00: 36 34 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  64(context, (cha
7d10: 72 2a 29 7a 2c 20 7a 4f 75 74 2d 7a 2c 20 73 71  r*)z, zOut-z, sq
7d20: 6c 69 74 65 33 5f 66 72 65 65 2c 20 53 51 4c 49  lite3_free, SQLI
7d30: 54 45 5f 55 54 46 38 29 3b 0a 7d 0a 0a 2f 2a 0a  TE_UTF8);.}../*.
7d40: 2a 2a 20 54 68 65 20 68 65 78 28 29 20 66 75 6e  ** The hex() fun
7d50: 63 74 69 6f 6e 2e 20 20 49 6e 74 65 72 70 72 65  ction.  Interpre
7d60: 74 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 61  t the argument a
7d70: 73 20 61 20 62 6c 6f 62 2e 20 20 52 65 74 75 72  s a blob.  Retur
7d80: 6e 0a 2a 2a 20 61 20 68 65 78 61 64 65 63 69 6d  n.** a hexadecim
7d90: 61 6c 20 72 65 6e 64 65 72 69 6e 67 20 61 73 20  al rendering as 
7da0: 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  text..*/.static 
7db0: 76 6f 69 64 20 68 65 78 46 75 6e 63 28 0a 20 20  void hexFunc(.  
7dc0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7dd0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
7de0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
7df0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
7e00: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 6f    int i, n;.  co
7e10: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
7e20: 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 63 68 61 72  r *pBlob;.  char
7e30: 20 2a 7a 48 65 78 2c 20 2a 7a 3b 0a 20 20 61 73   *zHex, *z;.  as
7e40: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
7e50: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
7e60: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 70 42 6c  TER(argc);.  pBl
7e70: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
7e80: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
7e90: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  n = sqlite3_
7ea0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
7eb0: 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [0]);.  assert( 
7ec0: 70 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76  pBlob==sqlite3_v
7ed0: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
7ee0: 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63  ]) );  /* No enc
7ef0: 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a  oding change */.
7f00: 20 20 7a 20 3d 20 7a 48 65 78 20 3d 20 63 6f 6e    z = zHex = con
7f10: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
7f20: 78 74 2c 20 28 28 69 36 34 29 6e 29 2a 32 20 2b  xt, ((i64)n)*2 +
7f30: 20 31 29 3b 0a 20 20 69 66 28 20 7a 48 65 78 20   1);.  if( zHex 
7f40: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
7f50: 69 3c 6e 3b 20 69 2b 2b 2c 20 70 42 6c 6f 62 2b  i<n; i++, pBlob+
7f60: 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e  +){.      unsign
7f70: 65 64 20 63 68 61 72 20 63 20 3d 20 2a 70 42 6c  ed char c = *pBl
7f80: 6f 62 3b 0a 20 20 20 20 20 20 2a 28 7a 2b 2b 29  ob;.      *(z++)
7f90: 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28 63 3e   = hexdigits[(c>
7fa0: 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20 20 20  >4)&0xf];.      
7fb0: 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69 67 69  *(z++) = hexdigi
7fc0: 74 73 5b 63 26 30 78 66 5d 3b 0a 20 20 20 20 7d  ts[c&0xf];.    }
7fd0: 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20  .    *z = 0;.   
7fe0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7ff0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 48  text(context, zH
8000: 65 78 2c 20 6e 2a 32 2c 20 73 71 6c 69 74 65 33  ex, n*2, sqlite3
8010: 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _free);.  }.}../
8020: 2a 0a 2a 2a 20 54 68 65 20 7a 65 72 6f 62 6c 6f  *.** The zeroblo
8030: 62 28 4e 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  b(N) function re
8040: 74 75 72 6e 73 20 61 20 7a 65 72 6f 2d 66 69 6c  turns a zero-fil
8050: 6c 65 64 20 62 6c 6f 62 20 6f 66 20 73 69 7a 65  led blob of size
8060: 20 4e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61   N bytes..*/.sta
8070: 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 62 6c 6f  tic void zeroblo
8080: 62 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  bFunc(.  sqlite3
8090: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
80a0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
80b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
80c0: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 36 34 20 6e  *argv.){.  i64 n
80d0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
80e0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
80f0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
8100: 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ext);.  assert( 
8110: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55  argc==1 );.  UNU
8120: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
8130: 67 63 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  gc);.  n = sqlit
8140: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
8150: 72 67 76 5b 30 5d 29 3b 0a 20 20 74 65 73 74 63  rgv[0]);.  testc
8160: 61 73 65 28 20 6e 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( n==db->aLim
8170: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8180: 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 74 65 73  LENGTH] );.  tes
8190: 74 63 61 73 65 28 20 6e 3d 3d 64 62 2d 3e 61 4c  tcase( n==db->aL
81a0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
81b0: 54 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20  T_LENGTH]+1 );. 
81c0: 20 69 66 28 20 6e 3e 64 62 2d 3e 61 4c 69 6d 69   if( n>db->aLimi
81d0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
81e0: 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 73 71  ENGTH] ){.    sq
81f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
8200: 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78  or_toobig(contex
8210: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
8220: 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 30   if( n<0 ) n = 0
8230: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
8240: 73 75 6c 74 5f 7a 65 72 6f 62 6c 6f 62 28 63 6f  sult_zeroblob(co
8250: 6e 74 65 78 74 2c 20 28 69 6e 74 29 6e 29 3b 20  ntext, (int)n); 
8260: 2f 2a 20 49 4d 50 3a 20 52 2d 30 30 32 39 33 2d  /* IMP: R-00293-
8270: 36 34 39 39 34 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a  64994 */.  }.}..
8280: 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 70 6c 61 63  /*.** The replac
8290: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  e() function.  T
82a0: 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 61  hree arguments a
82b0: 72 65 20 61 6c 6c 20 73 74 72 69 6e 67 73 3a 20  re all strings: 
82c0: 63 61 6c 6c 0a 2a 2a 20 74 68 65 6d 20 41 2c 20  call.** them A, 
82d0: 42 2c 20 61 6e 64 20 43 2e 20 54 68 65 20 72 65  B, and C. The re
82e0: 73 75 6c 74 20 69 73 20 61 6c 73 6f 20 61 20 73  sult is also a s
82f0: 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 64  tring which is d
8300: 65 72 69 76 65 64 0a 2a 2a 20 66 72 6f 6d 20 41  erived.** from A
8310: 20 62 79 20 72 65 70 6c 61 63 69 6e 67 20 65 76   by replacing ev
8320: 65 72 79 20 6f 63 63 75 72 72 65 6e 63 65 20 6f  ery occurrence o
8330: 66 20 42 20 77 69 74 68 20 43 2e 20 20 54 68 65  f B with C.  The
8340: 20 6d 61 74 63 68 0a 2a 2a 20 6d 75 73 74 20 62   match.** must b
8350: 65 20 65 78 61 63 74 2e 20 20 43 6f 6c 6c 61 74  e exact.  Collat
8360: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 72  ing sequences ar
8370: 65 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2f 0a 73  e not used..*/.s
8380: 74 61 74 69 63 20 76 6f 69 64 20 72 65 70 6c 61  tatic void repla
8390: 63 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  ceFunc(.  sqlite
83a0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
83b0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
83c0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
83d0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73  **argv.){.  cons
83e0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
83f0: 2a 7a 53 74 72 3b 20 20 20 20 20 20 20 20 2f 2a  *zStr;        /*
8400: 20 54 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   The input strin
8410: 67 20 41 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  g A */.  const u
8420: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 50  nsigned char *zP
8430: 61 74 74 65 72 6e 3b 20 20 20 20 2f 2a 20 54 68  attern;    /* Th
8440: 65 20 70 61 74 74 65 72 6e 20 73 74 72 69 6e 67  e pattern string
8450: 20 42 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e   B */.  const un
8460: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 52 65  signed char *zRe
8470: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p;        /* The
8480: 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 73 74 72   replacement str
8490: 69 6e 67 20 43 20 2a 2f 0a 20 20 75 6e 73 69 67  ing C */.  unsig
84a0: 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75 74 3b 20  ned char *zOut; 
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
84c0: 54 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  The output */.  
84d0: 69 6e 74 20 6e 53 74 72 3b 20 20 20 20 20 20 20  int nStr;       
84e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
84f0: 20 6f 66 20 7a 53 74 72 20 2a 2f 0a 20 20 69 6e   of zStr */.  in
8500: 74 20 6e 50 61 74 74 65 72 6e 3b 20 20 20 20 20  t nPattern;     
8510: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8520: 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20  f zPattern */.  
8530: 69 6e 74 20 6e 52 65 70 3b 20 20 20 20 20 20 20  int nRep;       
8540: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
8550: 20 6f 66 20 7a 52 65 70 20 2a 2f 0a 20 20 69 36   of zRep */.  i6
8560: 34 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  4 nOut;         
8570: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
8580: 6d 20 73 69 7a 65 20 6f 66 20 7a 4f 75 74 20 2a  m size of zOut *
8590: 2f 0a 20 20 69 6e 74 20 6c 6f 6f 70 4c 69 6d 69  /.  int loopLimi
85a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
85b0: 4c 61 73 74 20 7a 53 74 72 5b 5d 20 74 68 61 74  Last zStr[] that
85c0: 20 6d 69 67 68 74 20 6d 61 74 63 68 20 7a 50 61   might match zPa
85d0: 74 74 65 72 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ttern[] */.  int
85e0: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
85f0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
8600: 75 6e 74 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73  unters */..  ass
8610: 65 72 74 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a  ert( argc==3 );.
8620: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8630: 45 52 28 61 72 67 63 29 3b 0a 20 20 7a 53 74 72  ER(argc);.  zStr
8640: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
8650: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
8660: 20 20 69 66 28 20 7a 53 74 72 3d 3d 30 20 29 20    if( zStr==0 ) 
8670: 72 65 74 75 72 6e 3b 0a 20 20 6e 53 74 72 20 3d  return;.  nStr =
8680: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
8690: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
86a0: 20 61 73 73 65 72 74 28 20 7a 53 74 72 3d 3d 73   assert( zStr==s
86b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
86c0: 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f  t(argv[0]) );  /
86d0: 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68  * No encoding ch
86e0: 61 6e 67 65 20 2a 2f 0a 20 20 7a 50 61 74 74 65  ange */.  zPatte
86f0: 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  rn = sqlite3_val
8700: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
8710: 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e  ;.  if( zPattern
8720: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
8730: 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t( sqlite3_value
8740: 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 3d 3d  _type(argv[1])==
8750: 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 20  SQLITE_NULL.    
8760: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
8770: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
8780: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 2d 3e 6d  ndle(context)->m
8790: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
87a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
87b0: 20 69 66 28 20 7a 50 61 74 74 65 72 6e 5b 30 5d   if( zPattern[0]
87c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
87d0: 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t( sqlite3_value
87e0: 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 21 3d  _type(argv[1])!=
87f0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20  SQLITE_NULL );. 
8800: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8810: 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  t_value(context,
8820: 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72   argv[0]);.    r
8830: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 50 61  eturn;.  }.  nPa
8840: 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ttern = sqlite3_
8850: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
8860: 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [1]);.  assert( 
8870: 7a 50 61 74 74 65 72 6e 3d 3d 73 71 6c 69 74 65  zPattern==sqlite
8880: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8890: 76 5b 31 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20  v[1]) );  /* No 
88a0: 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20  encoding change 
88b0: 2a 2f 0a 20 20 7a 52 65 70 20 3d 20 73 71 6c 69  */.  zRep = sqli
88c0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
88d0: 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[2]);.  if( z
88e0: 52 65 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Rep==0 ) return;
88f0: 0a 20 20 6e 52 65 70 20 3d 20 73 71 6c 69 74 65  .  nRep = sqlite
8900: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
8910: 67 76 5b 32 5d 29 3b 0a 20 20 61 73 73 65 72 74  gv[2]);.  assert
8920: 28 20 7a 52 65 70 3d 3d 73 71 6c 69 74 65 33 5f  ( zRep==sqlite3_
8930: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
8940: 32 5d 29 20 29 3b 0a 20 20 6e 4f 75 74 20 3d 20  2]) );.  nOut = 
8950: 6e 53 74 72 20 2b 20 31 3b 0a 20 20 61 73 73 65  nStr + 1;.  asse
8960: 72 74 28 20 6e 4f 75 74 3c 53 51 4c 49 54 45 5f  rt( nOut<SQLITE_
8970: 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  MAX_LENGTH );.  
8980: 7a 4f 75 74 20 3d 20 63 6f 6e 74 65 78 74 4d 61  zOut = contextMa
8990: 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 69  lloc(context, (i
89a0: 36 34 29 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20  64)nOut);.  if( 
89b0: 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zOut==0 ){.    r
89c0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 6f 6f  eturn;.  }.  loo
89d0: 70 4c 69 6d 69 74 20 3d 20 6e 53 74 72 20 2d 20  pLimit = nStr - 
89e0: 6e 50 61 74 74 65 72 6e 3b 20 20 0a 20 20 66 6f  nPattern;  .  fo
89f0: 72 28 69 3d 6a 3d 30 3b 20 69 3c 3d 6c 6f 6f 70  r(i=j=0; i<=loop
8a00: 4c 69 6d 69 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  Limit; i++){.   
8a10: 20 69 66 28 20 7a 53 74 72 5b 69 5d 21 3d 7a 50   if( zStr[i]!=zP
8a20: 61 74 74 65 72 6e 5b 30 5d 20 7c 7c 20 6d 65 6d  attern[0] || mem
8a30: 63 6d 70 28 26 7a 53 74 72 5b 69 5d 2c 20 7a 50  cmp(&zStr[i], zP
8a40: 61 74 74 65 72 6e 2c 20 6e 50 61 74 74 65 72 6e  attern, nPattern
8a50: 29 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b  ) ){.      zOut[
8a60: 6a 2b 2b 5d 20 3d 20 7a 53 74 72 5b 69 5d 3b 0a  j++] = zStr[i];.
8a70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8a80: 20 75 38 20 2a 7a 4f 6c 64 3b 0a 20 20 20 20 20   u8 *zOld;.     
8a90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
8aa0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
8ab0: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
8ac0: 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d  );.      nOut +=
8ad0: 20 6e 52 65 70 20 2d 20 6e 50 61 74 74 65 72 6e   nRep - nPattern
8ae0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8af0: 28 20 6e 4f 75 74 2d 31 3d 3d 64 62 2d 3e 61 4c  ( nOut-1==db->aL
8b00: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8b10: 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20  T_LENGTH] );.   
8b20: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 75     testcase( nOu
8b30: 74 2d 32 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  t-2==db->aLimit[
8b40: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
8b50: 47 54 48 5d 20 29 3b 0a 20 20 20 20 20 20 69 66  GTH] );.      if
8b60: 28 20 6e 4f 75 74 2d 31 3e 64 62 2d 3e 61 4c 69  ( nOut-1>db->aLi
8b70: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8b80: 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
8b90: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8ba0: 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28  lt_error_toobig(
8bb0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
8bc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8bd0: 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Out);.        re
8be0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
8bf0: 20 20 20 20 7a 4f 6c 64 20 3d 20 7a 4f 75 74 3b      zOld = zOut;
8c00: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  .      zOut = sq
8c10: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
8c20: 7a 4f 75 74 2c 20 28 69 6e 74 29 6e 4f 75 74 29  zOut, (int)nOut)
8c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74  ;.      if( zOut
8c40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
8c50: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
8c60: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
8c70: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
8c80: 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a  te3_free(zOld);.
8c90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
8ca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
8cb0: 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a  mcpy(&zOut[j], z
8cc0: 52 65 70 2c 20 6e 52 65 70 29 3b 0a 20 20 20 20  Rep, nRep);.    
8cd0: 20 20 6a 20 2b 3d 20 6e 52 65 70 3b 0a 20 20 20    j += nRep;.   
8ce0: 20 20 20 69 20 2b 3d 20 6e 50 61 74 74 65 72 6e     i += nPattern
8cf0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  -1;.    }.  }.  
8d00: 61 73 73 65 72 74 28 20 6a 2b 6e 53 74 72 2d 69  assert( j+nStr-i
8d10: 2b 31 3d 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d 65  +1==nOut );.  me
8d20: 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26  mcpy(&zOut[j], &
8d30: 7a 53 74 72 5b 69 5d 2c 20 6e 53 74 72 2d 69 29  zStr[i], nStr-i)
8d40: 3b 0a 20 20 6a 20 2b 3d 20 6e 53 74 72 20 2d 20  ;.  j += nStr - 
8d50: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 3d  i;.  assert( j<=
8d60: 6e 4f 75 74 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a  nOut );.  zOut[j
8d70: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
8d80: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
8d90: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75  text, (char*)zOu
8da0: 74 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72  t, j, sqlite3_fr
8db0: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  ee);.}../*.** Im
8dc0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
8dd0: 74 68 65 20 54 52 49 4d 28 29 2c 20 4c 54 52 49  the TRIM(), LTRI
8de0: 4d 28 29 2c 20 61 6e 64 20 52 54 52 49 4d 28 29  M(), and RTRIM()
8df0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54   functions..** T
8e00: 68 65 20 75 73 65 72 64 61 74 61 20 69 73 20 30  he userdata is 0
8e10: 78 31 20 66 6f 72 20 6c 65 66 74 20 74 72 69 6d  x1 for left trim
8e20: 2c 20 30 78 32 20 66 6f 72 20 72 69 67 68 74 20  , 0x2 for right 
8e30: 74 72 69 6d 2c 20 30 78 33 20 66 6f 72 20 62 6f  trim, 0x3 for bo
8e40: 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  th..*/.static vo
8e50: 69 64 20 74 72 69 6d 46 75 6e 63 28 0a 20 20 73  id trimFunc(.  s
8e60: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
8e70: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
8e80: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
8e90: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
8ea0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
8eb0: 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20  char *zIn;      
8ec0: 20 20 20 2f 2a 20 49 6e 70 75 74 20 73 74 72 69     /* Input stri
8ed0: 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e  ng */.  const un
8ee0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 43 68  signed char *zCh
8ef0: 61 72 53 65 74 3b 20 20 20 20 2f 2a 20 53 65 74  arSet;    /* Set
8f00: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 74   of characters t
8f10: 6f 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20  o trim */.  int 
8f20: 6e 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  nIn;            
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8f40: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
8f50: 20 69 6e 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69   in input */.  i
8f60: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 2f 2a 20 31 3a 20 74 72 69 6d 6c 65 66 74 20   /* 1: trimleft 
8f90: 20 32 3a 20 74 72 69 6d 72 69 67 68 74 20 20 33   2: trimright  3
8fa0: 3a 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20  : trim */.  int 
8fb0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8fd0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
8fe0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8ff0: 20 2a 61 4c 65 6e 20 3d 20 30 3b 20 20 20 20 20   *aLen = 0;     
9000: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
9010: 66 20 65 61 63 68 20 63 68 61 72 61 63 74 65 72  f each character
9020: 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a   in zCharSet */.
9030: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9040: 2a 2a 61 7a 43 68 61 72 20 3d 20 30 3b 20 20 20  **azChar = 0;   
9050: 20 20 20 20 2f 2a 20 49 6e 64 69 76 69 64 75 61      /* Individua
9060: 6c 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  l characters in 
9070: 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20 69 6e  zCharSet */.  in
9080: 74 20 6e 43 68 61 72 3b 20 20 20 20 20 20 20 20  t nChar;        
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
90b0: 72 61 63 74 65 72 73 20 69 6e 20 7a 43 68 61 72  racters in zChar
90c0: 53 65 74 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71  Set */..  if( sq
90d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
90e0: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
90f0: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_NULL ){.    re
9100: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20  turn;.  }.  zIn 
9110: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
9120: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
9130: 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65   if( zIn==0 ) re
9140: 74 75 72 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73 71  turn;.  nIn = sq
9150: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
9160: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73  s(argv[0]);.  as
9170: 73 65 72 74 28 20 7a 49 6e 3d 3d 73 71 6c 69 74  sert( zIn==sqlit
9180: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
9190: 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  gv[0]) );.  if( 
91a0: 61 72 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73  argc==1 ){.    s
91b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
91c0: 67 6e 65 64 20 63 68 61 72 20 6c 65 6e 4f 6e 65  gned char lenOne
91d0: 5b 5d 20 3d 20 7b 20 31 20 7d 3b 0a 20 20 20 20  [] = { 1 };.    
91e0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
91f0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4f  char * const azO
9200: 6e 65 5b 5d 20 3d 20 7b 20 28 75 38 2a 29 22 20  ne[] = { (u8*)" 
9210: 22 20 7d 3b 0a 20 20 20 20 6e 43 68 61 72 20 3d  " };.    nChar =
9220: 20 31 3b 0a 20 20 20 20 61 4c 65 6e 20 3d 20 28   1;.    aLen = (
9230: 75 38 2a 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20  u8*)lenOne;.    
9240: 61 7a 43 68 61 72 20 3d 20 28 75 6e 73 69 67 6e  azChar = (unsign
9250: 65 64 20 63 68 61 72 20 2a 2a 29 61 7a 4f 6e 65  ed char **)azOne
9260: 3b 0a 20 20 20 20 7a 43 68 61 72 53 65 74 20 3d  ;.    zCharSet =
9270: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
9280: 28 7a 43 68 61 72 53 65 74 20 3d 20 73 71 6c 69  (zCharSet = sqli
9290: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
92a0: 72 67 76 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a 20  rgv[1]))==0 ){. 
92b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
92c0: 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  se{.    const un
92d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
92e0: 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53      for(z=zCharS
92f0: 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b  et, nChar=0; *z;
9300: 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20   nChar++){.     
9310: 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46   SQLITE_SKIP_UTF
9320: 38 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  8(z);.    }.    
9330: 69 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20  if( nChar>0 ){. 
9340: 20 20 20 20 20 61 7a 43 68 61 72 20 3d 20 63 6f       azChar = co
9350: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74  ntextMalloc(cont
9360: 65 78 74 2c 20 28 28 69 36 34 29 6e 43 68 61 72  ext, ((i64)nChar
9370: 29 2a 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  )*(sizeof(char*)
9380: 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +1));.      if( 
9390: 61 7a 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20  azChar==0 ){.   
93a0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
93b0: 20 20 20 7d 0a 20 20 20 20 20 20 61 4c 65 6e 20     }.      aLen 
93c0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
93d0: 2a 29 26 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d  *)&azChar[nChar]
93e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 7a 3d 7a 43  ;.      for(z=zC
93f0: 68 61 72 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b  harSet, nChar=0;
9400: 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20   *z; nChar++){. 
9410: 20 20 20 20 20 20 20 61 7a 43 68 61 72 5b 6e 43         azChar[nC
9420: 68 61 72 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64  har] = (unsigned
9430: 20 63 68 61 72 20 2a 29 7a 3b 0a 20 20 20 20 20   char *)z;.     
9440: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
9450: 54 46 38 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  TF8(z);.        
9460: 61 4c 65 6e 5b 6e 43 68 61 72 5d 20 3d 20 28 75  aLen[nChar] = (u
9470: 38 29 28 7a 20 2d 20 61 7a 43 68 61 72 5b 6e 43  8)(z - azChar[nC
9480: 68 61 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  har]);.      }. 
9490: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
94a0: 43 68 61 72 3e 30 20 29 7b 0a 20 20 20 20 66 6c  Char>0 ){.    fl
94b0: 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  ags = SQLITE_PTR
94c0: 5f 54 4f 5f 49 4e 54 28 73 71 6c 69 74 65 33 5f  _TO_INT(sqlite3_
94d0: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
94e0: 74 29 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  t));.    if( fla
94f0: 67 73 20 26 20 31 20 29 7b 0a 20 20 20 20 20 20  gs & 1 ){.      
9500: 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a  while( nIn>0 ){.
9510: 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20          int len 
9520: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
9530: 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69  (i=0; i<nChar; i
9540: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  ++){.          l
9550: 65 6e 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20  en = aLen[i];.  
9560: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c          if( len<
9570: 3d 6e 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28 7a  =nIn && memcmp(z
9580: 49 6e 2c 20 61 7a 43 68 61 72 5b 69 5d 2c 20 6c  In, azChar[i], l
9590: 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  en)==0 ) break;.
95a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
95b0: 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29    if( i>=nChar )
95c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
95d0: 7a 49 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20  zIn += len;.    
95e0: 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a      nIn -= len;.
95f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9600: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 32 20    if( flags & 2 
9610: 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
9620: 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  nIn>0 ){.       
9630: 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20   int len = 0;.  
9640: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9650: 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nChar; i++){.  
9660: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c          len = aL
9670: 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  en[i];.         
9680: 20 69 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26   if( len<=nIn &&
9690: 20 6d 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e   memcmp(&zIn[nIn
96a0: 2d 6c 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c  -len],azChar[i],
96b0: 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  len)==0 ) break;
96c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
96d0: 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20     if( i>=nChar 
96e0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
96f0: 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20   nIn -= len;.   
9700: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
9710: 66 28 20 7a 43 68 61 72 53 65 74 20 29 7b 0a 20  f( zCharSet ){. 
9720: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9730: 65 28 61 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d  e(azChar);.    }
9740: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
9750: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
9760: 78 74 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20  xt, (char*)zIn, 
9770: 6e 49 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  nIn, SQLITE_TRAN
9780: 53 49 45 4e 54 29 3b 0a 7d 0a 0a 0a 2f 2a 20 49  SIENT);.}.../* I
9790: 4d 50 3a 20 52 2d 32 35 33 36 31 2d 31 36 31 35  MP: R-25361-1615
97a0: 30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  0 This function 
97b0: 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
97c0: 53 51 4c 69 74 65 20 62 79 20 64 65 66 61 75 6c  SQLite by defaul
97d0: 74 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79  t. It.** is only
97e0: 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20 74 68   available if th
97f0: 65 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58  e SQLITE_SOUNDEX
9800: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
9810: 74 69 6f 6e 20 69 73 20 75 73 65 64 0a 2a 2a 20  tion is used.** 
9820: 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 62  when SQLite is b
9830: 75 69 6c 74 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  uilt..*/.#ifdef 
9840: 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 2f  SQLITE_SOUNDEX./
9850: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9860: 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e   soundex encodin
9870: 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a 2a 0a  g of a word..**.
9880: 2a 2a 20 49 4d 50 3a 20 52 2d 35 39 37 38 32 2d  ** IMP: R-59782-
9890: 30 30 30 37 32 20 54 68 65 20 73 6f 75 6e 64 65  00072 The sounde
98a0: 78 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  x(X) function re
98b0: 74 75 72 6e 73 20 61 20 73 74 72 69 6e 67 20 74  turns a string t
98c0: 68 61 74 20 69 73 20 74 68 65 0a 2a 2a 20 73 6f  hat is the.** so
98d0: 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f  undex encoding o
98e0: 66 20 74 68 65 20 73 74 72 69 6e 67 20 58 2e 20  f the string X. 
98f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9900: 73 6f 75 6e 64 65 78 46 75 6e 63 28 0a 20 20 73  soundexFunc(.  s
9910: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9920: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
9930: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
9940: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
9950: 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b 38 5d   char zResult[8]
9960: 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 49  ;.  const u8 *zI
9970: 6e 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  n;.  int i, j;. 
9980: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
9990: 73 69 67 6e 65 64 20 63 68 61 72 20 69 43 6f 64  signed char iCod
99a0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20 30  e[] = {.    0, 0
99b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
99c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
99d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
99e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
99f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9a00: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
9a10: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
9a20: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9a30: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9a40: 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c   0,.    0, 0, 0,
9a50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9a60: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9a70: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30  , 0, 0,.    0, 0
9a80: 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c  , 1, 2, 3, 0, 1,
9a90: 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20   2, 0, 0, 2, 2, 
9aa0: 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20  4, 5, 5, 0,.    
9ab0: 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30  1, 2, 6, 2, 3, 0
9ac0: 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c  , 1, 0, 2, 0, 2,
9ad0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
9ae0: 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20      0, 0, 1, 2, 
9af0: 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30  3, 0, 1, 2, 0, 0
9b00: 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c  , 2, 2, 4, 5, 5,
9b10: 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c   0,.    1, 2, 6,
9b20: 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20   2, 3, 0, 1, 0, 
9b30: 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30  2, 0, 2, 0, 0, 0
9b40: 2c 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20 61  , 0, 0,.  };.  a
9b50: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
9b60: 3b 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a 29 73  ;.  zIn = (u8*)s
9b70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
9b80: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
9b90: 28 20 7a 49 6e 3d 3d 30 20 29 20 7a 49 6e 20 3d  ( zIn==0 ) zIn =
9ba0: 20 28 75 38 2a 29 22 22 3b 0a 20 20 66 6f 72 28   (u8*)"";.  for(
9bb0: 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26 26 20 21  i=0; zIn[i] && !
9bc0: 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a  sqlite3Isalpha(z
9bd0: 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  In[i]); i++){}. 
9be0: 20 69 66 28 20 7a 49 6e 5b 69 5d 20 29 7b 0a 20   if( zIn[i] ){. 
9bf0: 20 20 20 75 38 20 70 72 65 76 63 6f 64 65 20 3d     u8 prevcode =
9c00: 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78   iCode[zIn[i]&0x
9c10: 37 66 5d 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74  7f];.    zResult
9c20: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 75  [0] = sqlite3Tou
9c30: 70 70 65 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20  pper(zIn[i]);.  
9c40: 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20 26    for(j=1; j<4 &
9c50: 26 20 7a 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  & zIn[i]; i++){.
9c60: 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d        int code =
9c70: 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78   iCode[zIn[i]&0x
9c80: 37 66 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63  7f];.      if( c
9c90: 6f 64 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ode>0 ){.       
9ca0: 20 69 66 28 20 63 6f 64 65 21 3d 70 72 65 76 63   if( code!=prevc
9cb0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
9cc0: 20 70 72 65 76 63 6f 64 65 20 3d 20 63 6f 64 65   prevcode = code
9cd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65 73  ;.          zRes
9ce0: 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63 6f 64 65 20  ult[j++] = code 
9cf0: 2b 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 7d  + '0';.        }
9d00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9d10: 20 20 20 20 20 20 70 72 65 76 63 6f 64 65 20 3d        prevcode =
9d20: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
9d30: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 34  }.    while( j<4
9d40: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 73 75 6c   ){.      zResul
9d50: 74 5b 6a 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20  t[j++] = '0';.  
9d60: 20 20 7d 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b    }.    zResult[
9d70: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
9d80: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
9d90: 63 6f 6e 74 65 78 74 2c 20 7a 52 65 73 75 6c 74  context, zResult
9da0: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , 4, SQLITE_TRAN
9db0: 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b  SIENT);.  }else{
9dc0: 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36  .    /* IMP: R-6
9dd0: 34 38 39 34 2d 35 30 33 32 31 20 54 68 65 20 73  4894-50321 The s
9de0: 74 72 69 6e 67 20 22 3f 30 30 30 22 20 69 73 20  tring "?000" is 
9df0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
9e00: 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  argument.    ** 
9e10: 69 73 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 74 61  is NULL or conta
9e20: 69 6e 73 20 6e 6f 20 41 53 43 49 49 20 61 6c 70  ins no ASCII alp
9e30: 68 61 62 65 74 69 63 20 63 68 61 72 61 63 74 65  habetic characte
9e40: 72 73 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  rs. */.    sqlit
9e50: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
9e60: 6f 6e 74 65 78 74 2c 20 22 3f 30 30 30 22 2c 20  ontext, "?000", 
9e70: 34 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  4, SQLITE_STATIC
9e80: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
9e90: 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45  /* SQLITE_SOUNDE
9ea0: 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  X */..#ifndef SQ
9eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
9ec0: 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41  XTENSION./*.** A
9ed0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c   function that l
9ee0: 6f 61 64 73 20 61 20 73 68 61 72 65 64 2d 6c 69  oads a shared-li
9ef0: 62 72 61 72 79 20 65 78 74 65 6e 73 69 6f 6e 20  brary extension 
9f00: 74 68 65 6e 20 72 65 74 75 72 6e 73 20 4e 55 4c  then returns NUL
9f10: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  L..*/.static voi
9f20: 64 20 6c 6f 61 64 45 78 74 28 73 71 6c 69 74 65  d loadExt(sqlite
9f30: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
9f40: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
9f50: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
9f60: 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  gv){.  const cha
9f70: 72 20 2a 7a 46 69 6c 65 20 3d 20 28 63 6f 6e 73  r *zFile = (cons
9f80: 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
9f90: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9fa0: 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68  [0]);.  const ch
9fb0: 61 72 20 2a 7a 50 72 6f 63 3b 0a 20 20 73 71 6c  ar *zProc;.  sql
9fc0: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
9fd0: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
9fe0: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
9ff0: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
a000: 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d   0;..  if( argc=
a010: 3d 32 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20  =2 ){.    zProc 
a020: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
a030: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
a040: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7d  xt(argv[1]);.  }
a050: 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 63 20  else{.    zProc 
a060: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  = 0;.  }.  if( z
a070: 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33 5f  File && sqlite3_
a080: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64  load_extension(d
a090: 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c  b, zFile, zProc,
a0a0: 20 26 7a 45 72 72 4d 73 67 29 20 29 7b 0a 20 20   &zErrMsg) ){.  
a0b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
a0c0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
a0d0: 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b 0a 20 20  zErrMsg, -1);.  
a0e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a0f0: 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 23  ErrMsg);.  }.}.#
a100: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  endif.../*.** An
a110: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
a120: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
a130: 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20 63  ture holds the c
a140: 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20 73  ontext of a.** s
a150: 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20 61 67  um() or avg() ag
a160: 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74 61 74  gregate computat
a170: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
a180: 73 74 72 75 63 74 20 53 75 6d 43 74 78 20 53 75  struct SumCtx Su
a190: 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53 75 6d  mCtx;.struct Sum
a1a0: 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20 72  Ctx {.  double r
a1b0: 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20 46 6c 6f  Sum;      /* Flo
a1c0: 61 74 69 6e 67 20 70 6f 69 6e 74 20 73 75 6d 20  ating point sum 
a1d0: 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d 3b 20 20  */.  i64 iSum;  
a1e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
a1f0: 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20 20 69 36  r sum */   .  i6
a200: 34 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  4 cnt;          
a210: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
a220: 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a 2f 0a  ments summed */.
a230: 20 20 75 38 20 6f 76 65 72 66 6c 6f 77 3b 20 20    u8 overflow;  
a240: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
a250: 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20  nteger overflow 
a260: 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20 61 70 70  seen */.  u8 app
a270: 72 6f 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  rox;        /* T
a280: 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e 74 65 67  rue if non-integ
a290: 65 72 20 76 61 6c 75 65 20 77 61 73 20 69 6e 70  er value was inp
a2a0: 75 74 20 74 6f 20 74 68 65 20 73 75 6d 20 2a 2f  ut to the sum */
a2b0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  .};../*.** Routi
a2c0: 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  nes used to comp
a2d0: 75 74 65 20 74 68 65 20 73 75 6d 2c 20 61 76 65  ute the sum, ave
a2e0: 72 61 67 65 2c 20 61 6e 64 20 74 6f 74 61 6c 2e  rage, and total.
a2f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55 4d 28 29  .**.** The SUM()
a300: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c 6c 6f 77   function follow
a310: 73 20 74 68 65 20 28 62 72 6f 6b 65 6e 29 20 53  s the (broken) S
a320: 51 4c 20 73 74 61 6e 64 61 72 64 20 77 68 69 63  QL standard whic
a330: 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20  h means.** that 
a340: 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  it returns NULL 
a350: 69 66 20 69 74 20 73 75 6d 73 20 6f 76 65 72 20  if it sums over 
a360: 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54 4f 54 41  no inputs.  TOTA
a370: 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30 2e 30  L returns.** 0.0
a380: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 20   in that case.  
a390: 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20 54 4f 54  In addition, TOT
a3a0: 41 4c 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  AL always return
a3b0: 73 20 61 20 66 6c 6f 61 74 20 77 68 65 72 65 0a  s a float where.
a3c0: 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20 72 65 74  ** SUM might ret
a3d0: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 69  urn an integer i
a3e0: 66 20 69 74 20 6e 65 76 65 72 20 65 6e 63 6f 75  f it never encou
a3f0: 6e 74 65 72 73 20 61 20 66 6c 6f 61 74 69 6e 67  nters a floating
a400: 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 2e   point.** value.
a410: 20 20 54 4f 54 41 4c 20 6e 65 76 65 72 20 66 61    TOTAL never fa
a420: 69 6c 73 2c 20 62 75 74 20 53 55 4d 20 6d 69 67  ils, but SUM mig
a430: 68 74 20 74 68 72 6f 75 67 68 20 61 6e 20 65 78  ht through an ex
a440: 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a 20 69 74  ception if.** it
a450: 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e 20 69 6e   overflows an in
a460: 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
a470: 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28 73 71   void sumStep(sq
a480: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
a490: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
a4a0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
a4b0: 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43 74  **argv){.  SumCt
a4c0: 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79 70 65  x *p;.  int type
a4d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
a4e0: 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
a4f0: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
a500: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
a510: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
a520: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
a530: 28 2a 70 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  (*p));.  type = 
a540: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75  sqlite3_value_nu
a550: 6d 65 72 69 63 5f 74 79 70 65 28 61 72 67 76 5b  meric_type(argv[
a560: 30 5d 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  0]);.  if( p && 
a570: 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  type!=SQLITE_NUL
a580: 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6e 74 2b  L ){.    p->cnt+
a590: 2b 3b 0a 20 20 20 20 69 66 28 20 74 79 70 65 3d  +;.    if( type=
a5a0: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
a5b0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 20 3d  ){.      i64 v =
a5c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
a5d0: 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
a5e0: 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20       p->rSum += 
a5f0: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 2d  v;.      if( (p-
a600: 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f 76 65 72 66  >approx|p->overf
a610: 6c 6f 77 29 3d 3d 30 20 26 26 20 73 71 6c 69 74  low)==0 && sqlit
a620: 65 33 41 64 64 49 6e 74 36 34 28 26 70 2d 3e 69  e3AddInt64(&p->i
a630: 53 75 6d 2c 20 76 29 20 29 7b 0a 20 20 20 20 20  Sum, v) ){.     
a640: 20 20 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20 3d     p->overflow =
a650: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
a660: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
a670: 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33 5f  rSum += sqlite3_
a680: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
a690: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  v[0]);.      p->
a6a0: 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20 20 20 20  approx = 1;.    
a6b0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
a6c0: 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69 7a 65 28  oid sumFinalize(
a6d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
a6e0: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d  *context){.  Sum
a6f0: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
a700: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
a710: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
a720: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
a730: 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20  p->cnt>0 ){.    
a740: 69 66 28 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20  if( p->overflow 
a750: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a760: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
a770: 6e 74 65 78 74 2c 22 69 6e 74 65 67 65 72 20 6f  ntext,"integer o
a780: 76 65 72 66 6c 6f 77 22 2c 2d 31 29 3b 0a 20 20  verflow",-1);.  
a790: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 61    }else if( p->a
a7a0: 70 70 72 6f 78 20 29 7b 0a 20 20 20 20 20 20 73  pprox ){.      s
a7b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
a7c0: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d  uble(context, p-
a7d0: 3e 72 53 75 6d 29 3b 0a 20 20 20 20 7d 65 6c 73  >rSum);.    }els
a7e0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
a7f0: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
a800: 6e 74 65 78 74 2c 20 70 2d 3e 69 53 75 6d 29 3b  ntext, p->iSum);
a810: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
a820: 74 69 63 20 76 6f 69 64 20 61 76 67 46 69 6e 61  tic void avgFina
a830: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
a840: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
a850: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70    SumCtx *p;.  p
a860: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
a870: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
a880: 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  text, 0);.  if( 
a890: 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b  p && p->cnt>0 ){
a8a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
a8b0: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
a8c0: 78 74 2c 20 70 2d 3e 72 53 75 6d 2f 28 64 6f 75  xt, p->rSum/(dou
a8d0: 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20 7d  ble)p->cnt);.  }
a8e0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
a8f0: 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 28 73 71 6c  otalFinalize(sql
a900: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
a910: 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78  ntext){.  SumCtx
a920: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
a930: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
a940: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
a950: 3b 0a 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30  ;.  /* (double)0
a960: 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49   In case of SQLI
a970: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
a980: 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 73  _POINT... */.  s
a990: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
a9a0: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 20  uble(context, p 
a9b0: 3f 20 70 2d 3e 72 53 75 6d 20 3a 20 28 64 6f 75  ? p->rSum : (dou
a9c0: 62 6c 65 29 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ble)0);.}../*.**
a9d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
a9e0: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74  tructure keeps t
a9f0: 72 61 63 6b 20 6f 66 20 73 74 61 74 65 20 69 6e  rack of state in
aa00: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
aa10: 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20 61 67 67  e.** count() agg
aa20: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
aa30: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
aa40: 63 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e  ct CountCtx Coun
aa50: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f 75  tCtx;.struct Cou
aa60: 6e 74 43 74 78 20 7b 0a 20 20 69 36 34 20 6e 3b  ntCtx {.  i64 n;
aa70: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  .};../*.** Routi
aa80: 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  nes to implement
aa90: 20 74 68 65 20 63 6f 75 6e 74 28 29 20 61 67 67   the count() agg
aaa0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
aab0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
aac0: 63 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74 65  countStep(sqlite
aad0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
aae0: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
aaf0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
ab00: 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  gv){.  CountCtx 
ab10: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
ab20: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
ab30: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
ab40: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
ab50: 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49  (argc==0 || SQLI
ab60: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
ab70: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
ab80: 5b 30 5d 29 29 20 26 26 20 70 20 29 7b 0a 20 20  [0])) && p ){.  
ab90: 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 0a 23    p->n++;.  }..#
aba0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
abb0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
abc0: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 61  /* The sqlite3_a
abd0: 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29  ggregate_count()
abe0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 70   function is dep
abf0: 72 65 63 61 74 65 64 2e 20 20 42 75 74 20 6a 75  recated.  But ju
ac00: 73 74 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  st to make.  ** 
ac10: 73 75 72 65 20 69 74 20 73 74 69 6c 6c 20 6f 70  sure it still op
ac20: 65 72 61 74 65 73 20 63 6f 72 72 65 63 74 6c 79  erates correctly
ac30: 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 69 74  , verify that it
ac40: 73 20 63 6f 75 6e 74 20 61 67 72 65 65 73 20 77  s count agrees w
ac50: 69 74 68 20 6f 75 72 20 0a 20 20 2a 2a 20 69 6e  ith our .  ** in
ac60: 74 65 72 6e 61 6c 20 63 6f 75 6e 74 20 77 68 65  ternal count whe
ac70: 6e 20 75 73 69 6e 67 20 63 6f 75 6e 74 28 2a 29  n using count(*)
ac80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 74 6f   and when the to
ac90: 74 61 6c 20 63 6f 75 6e 74 20 63 61 6e 20 62 65  tal count can be
aca0: 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 65 64 20  .  ** expressed 
acb0: 61 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  as a 32-bit inte
acc0: 67 65 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ger. */.  assert
acd0: 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 70 3d 3d  ( argc==1 || p==
ace0: 30 20 7c 7c 20 70 2d 3e 6e 3e 30 78 37 66 66 66  0 || p->n>0x7fff
acf0: 66 66 66 66 0a 20 20 20 20 20 20 20 20 20 20 7c  ffff.          |
ad00: 7c 20 70 2d 3e 6e 3d 3d 73 71 6c 69 74 65 33 5f  | p->n==sqlite3_
ad10: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
ad20: 63 6f 6e 74 65 78 74 29 20 29 3b 0a 23 65 6e 64  context) );.#end
ad30: 69 66 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76  if.}   .static v
ad40: 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a  oid countFinaliz
ad50: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
ad60: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 43  t *context){.  C
ad70: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
ad80: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
ad90: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
ada0: 65 78 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ext, 0);.  sqlit
adb0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
adc0: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
add0: 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n : 0);.}../*.**
ade0: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70   Routines to imp
adf0: 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e 64  lement min() and
ae00: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
ae10: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   functions..*/.s
ae20: 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61  tatic void minma
ae30: 78 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  xStep(.  sqlite3
ae40: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
ae50: 74 2c 20 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  t, .  int NotUse
ae60: 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  d, .  sqlite3_va
ae70: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
ae80: 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20 28 4d 65  Mem *pArg  = (Me
ae90: 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a 20 20 4d  m *)argv[0];.  M
aea0: 65 6d 20 2a 70 42 65 73 74 3b 0a 20 20 55 4e 55  em *pBest;.  UNU
aeb0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
aec0: 74 55 73 65 64 29 3b 0a 0a 20 20 70 42 65 73 74  tUsed);..  pBest
aed0: 20 3d 20 28 4d 65 6d 20 2a 29 73 71 6c 69 74 65   = (Mem *)sqlite
aee0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
aef0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
af00: 65 6f 66 28 2a 70 42 65 73 74 29 29 3b 0a 20 20  eof(*pBest));.  
af10: 69 66 28 20 21 70 42 65 73 74 20 29 20 72 65 74  if( !pBest ) ret
af20: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
af30: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
af40: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
af50: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  NULL ){.    if( 
af60: 70 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 20 73  pBest->flags ) s
af70: 71 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d 75  qlite3SkipAccumu
af80: 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65 78  latorLoad(contex
af90: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
afa0: 70 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 7b 0a  pBest->flags ){.
afb0: 20 20 20 20 69 6e 74 20 6d 61 78 3b 0a 20 20 20      int max;.   
afc0: 20 69 6e 74 20 63 6d 70 3b 0a 20 20 20 20 43 6f   int cmp;.    Co
afd0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
afe0: 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c  qlite3GetFuncCol
aff0: 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20  lSeq(context);. 
b000: 20 20 20 2f 2a 20 54 68 69 73 20 73 74 65 70 20     /* This step 
b010: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
b020: 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 6d 69   for both the mi
b030: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67  n() and max() ag
b040: 67 72 65 67 61 74 65 73 2c 0a 20 20 20 20 2a 2a  gregates,.    **
b050: 20 74 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72   the only differ
b060: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65  ence between the
b070: 20 74 77 6f 20 62 65 69 6e 67 20 74 68 61 74 20   two being that 
b080: 74 68 65 20 73 65 6e 73 65 20 6f 66 20 74 68 65  the sense of the
b090: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73  .    ** comparis
b0a0: 6f 6e 20 69 73 20 69 6e 76 65 72 74 65 64 2e 20  on is inverted. 
b0b0: 46 6f 72 20 74 68 65 20 6d 61 78 28 29 20 61 67  For the max() ag
b0c0: 67 72 65 67 61 74 65 2c 20 74 68 65 0a 20 20 20  gregate, the.   
b0d0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 73 65 72   ** sqlite3_user
b0e0: 5f 64 61 74 61 28 29 20 66 75 6e 63 74 69 6f 6e  _data() function
b0f0: 20 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20 2a   returns (void *
b100: 29 2d 31 2e 20 46 6f 72 20 6d 69 6e 28 29 20 69  )-1. For min() i
b110: 74 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 73  t.    ** returns
b120: 20 28 76 6f 69 64 20 2a 29 64 62 2c 20 77 68 65   (void *)db, whe
b130: 72 65 20 64 62 20 69 73 20 74 68 65 20 73 71 6c  re db is the sql
b140: 69 74 65 33 2a 20 64 61 74 61 62 61 73 65 20 70  ite3* database p
b150: 6f 69 6e 74 65 72 2e 0a 20 20 20 20 2a 2a 20 54  ointer..    ** T
b160: 68 65 72 65 66 6f 72 65 20 74 68 65 20 6e 65 78  herefore the nex
b170: 74 20 73 74 61 74 65 6d 65 6e 74 20 73 65 74 73  t statement sets
b180: 20 76 61 72 69 61 62 6c 65 20 27 6d 61 78 27 20   variable 'max' 
b190: 74 6f 20 31 20 66 6f 72 20 74 68 65 20 6d 61 78  to 1 for the max
b1a0: 28 29 0a 20 20 20 20 2a 2a 20 61 67 67 72 65 67  ().    ** aggreg
b1b0: 61 74 65 2c 20 6f 72 20 30 20 66 6f 72 20 6d 69  ate, or 0 for mi
b1c0: 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n()..    */.    
b1d0: 6d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  max = sqlite3_us
b1e0: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
b1f0: 21 3d 30 3b 0a 20 20 20 20 63 6d 70 20 3d 20 73  !=0;.    cmp = s
b200: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
b210: 28 70 42 65 73 74 2c 20 70 41 72 67 2c 20 70 43  (pBest, pArg, pC
b220: 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 28 6d  oll);.    if( (m
b230: 61 78 20 26 26 20 63 6d 70 3c 30 29 20 7c 7c 20  ax && cmp<0) || 
b240: 28 21 6d 61 78 20 26 26 20 63 6d 70 3e 30 29 20  (!max && cmp>0) 
b250: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b260: 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73  VdbeMemCopy(pBes
b270: 74 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 65  t, pArg);.    }e
b280: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
b290: 65 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74 6f  e3SkipAccumulato
b2a0: 72 4c 6f 61 64 28 63 6f 6e 74 65 78 74 29 3b 0a  rLoad(context);.
b2b0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
b2c0: 20 20 20 70 42 65 73 74 2d 3e 64 62 20 3d 20 73     pBest->db = s
b2d0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
b2e0: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
b2f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b300: 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74 2c  beMemCopy(pBest,
b310: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74   pArg);.  }.}.st
b320: 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78  atic void minMax
b330: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
b340: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
b350: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  t){.  sqlite3_va
b360: 6c 75 65 20 2a 70 52 65 73 3b 0a 20 20 70 52 65  lue *pRes;.  pRe
b370: 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 61 6c  s = (sqlite3_val
b380: 75 65 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  ue *)sqlite3_agg
b390: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
b3a0: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66  ontext, 0);.  if
b3b0: 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 69 66  ( pRes ){.    if
b3c0: 28 20 70 52 65 73 2d 3e 66 6c 61 67 73 20 29 7b  ( pRes->flags ){
b3d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
b3e0: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74  esult_value(cont
b3f0: 65 78 74 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  ext, pRes);.    
b400: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
b410: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 65 73  eMemRelease(pRes
b420: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
b430: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 45 58 50  group_concat(EXP
b440: 52 2c 20 3f 53 45 50 41 52 41 54 4f 52 3f 29 0a  R, ?SEPARATOR?).
b450: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
b460: 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 28 0a  roupConcatStep(.
b470: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
b480: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
b490: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
b4a0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
b4b0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
b4c0: 7a 56 61 6c 3b 0a 20 20 53 74 72 41 63 63 75 6d  zVal;.  StrAccum
b4d0: 20 2a 70 41 63 63 75 6d 3b 0a 20 20 63 6f 6e 73   *pAccum;.  cons
b4e0: 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20  t char *zSep;.  
b4f0: 69 6e 74 20 6e 56 61 6c 2c 20 6e 53 65 70 3b 0a  int nVal, nSep;.
b500: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
b510: 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a  1 || argc==2 );.
b520: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
b530: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
b540: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
b550: 20 72 65 74 75 72 6e 3b 0a 20 20 70 41 63 63 75   return;.  pAccu
b560: 6d 20 3d 20 28 53 74 72 41 63 63 75 6d 2a 29 73  m = (StrAccum*)s
b570: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
b580: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
b590: 2c 20 73 69 7a 65 6f 66 28 2a 70 41 63 63 75 6d  , sizeof(*pAccum
b5a0: 29 29 3b 0a 0a 20 20 69 66 28 20 70 41 63 63 75  ));..  if( pAccu
b5b0: 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  m ){.    sqlite3
b5c0: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
b5d0: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
b5e0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 69  (context);.    i
b5f0: 6e 74 20 66 69 72 73 74 54 65 72 6d 20 3d 20 70  nt firstTerm = p
b600: 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 3d 3d  Accum->mxAlloc==
b610: 30 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e 6d  0;.    pAccum->m
b620: 78 41 6c 6c 6f 63 20 3d 20 64 62 2d 3e 61 4c 69  xAlloc = db->aLi
b630: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
b640: 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20 20 69 66  _LENGTH];.    if
b650: 28 20 21 66 69 72 73 74 54 65 72 6d 20 29 7b 0a  ( !firstTerm ){.
b660: 20 20 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d        if( argc==
b670: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65  2 ){.        zSe
b680: 70 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  p = (char*)sqlit
b690: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
b6a0: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  gv[1]);.        
b6b0: 6e 53 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76  nSep = sqlite3_v
b6c0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
b6d0: 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1]);.      }else
b6e0: 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  {.        zSep =
b6f0: 20 22 2c 22 3b 0a 20 20 20 20 20 20 20 20 6e 53   ",";.        nS
b700: 65 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ep = 1;.      }.
b710: 20 20 20 20 20 20 69 66 28 20 6e 53 65 70 20 29        if( nSep )
b720: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
b730: 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a  Append(pAccum, z
b740: 53 65 70 2c 20 6e 53 65 70 29 3b 0a 20 20 20 20  Sep, nSep);.    
b750: 7d 0a 20 20 20 20 7a 56 61 6c 20 3d 20 28 63 68  }.    zVal = (ch
b760: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
b770: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
b780: 0a 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69  .    nVal = sqli
b790: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
b7a0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
b7b0: 28 20 7a 56 61 6c 20 29 20 73 71 6c 69 74 65 33  ( zVal ) sqlite3
b7c0: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
b7d0: 41 63 63 75 6d 2c 20 7a 56 61 6c 2c 20 6e 56 61  Accum, zVal, nVa
b7e0: 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  l);.  }.}.static
b7f0: 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63 61   void groupConca
b800: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
b810: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
b820: 78 74 29 7b 0a 20 20 53 74 72 41 63 63 75 6d 20  xt){.  StrAccum 
b830: 2a 70 41 63 63 75 6d 3b 0a 20 20 70 41 63 63 75  *pAccum;.  pAccu
b840: 6d 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  m = sqlite3_aggr
b850: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
b860: 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28  ntext, 0);.  if(
b870: 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20 20 69   pAccum ){.    i
b880: 66 28 20 70 41 63 63 75 6d 2d 3e 61 63 63 45 72  f( pAccum->accEr
b890: 72 6f 72 3d 3d 53 54 52 41 43 43 55 4d 5f 54 4f  ror==STRACCUM_TO
b8a0: 4f 42 49 47 20 29 7b 0a 20 20 20 20 20 20 73 71  OBIG ){.      sq
b8b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
b8c0: 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78  or_toobig(contex
b8d0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
b8e0: 28 20 70 41 63 63 75 6d 2d 3e 61 63 63 45 72 72  ( pAccum->accErr
b8f0: 6f 72 3d 3d 53 54 52 41 43 43 55 4d 5f 4e 4f 4d  or==STRACCUM_NOM
b900: 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  EM ){.      sqli
b910: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
b920: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
b930: 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 0a  .    }else{    .
b940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
b950: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
b960: 74 2c 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  t, sqlite3StrAcc
b970: 75 6d 46 69 6e 69 73 68 28 70 41 63 63 75 6d 29  umFinish(pAccum)
b980: 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  , -1, .         
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
b9b0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
b9c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b9d0: 64 6f 65 73 20 70 65 72 2d 63 6f 6e 6e 65 63 74  does per-connect
b9e0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 72 65 67  ion function reg
b9f0: 69 73 74 72 61 74 69 6f 6e 2e 20 20 4d 6f 73 74  istration.  Most
ba00: 0a 2a 2a 20 6f 66 20 74 68 65 20 62 75 69 6c 74  .** of the built
ba10: 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20 61 62  -in functions ab
ba20: 6f 76 65 20 61 72 65 20 70 61 72 74 20 6f 66 20  ove are part of 
ba30: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
ba40: 69 6f 6e 20 73 65 74 2e 0a 2a 2a 20 54 68 69 73  ion set..** This
ba50: 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 64 65   routine only de
ba60: 61 6c 73 20 77 69 74 68 20 74 68 6f 73 65 20 74  als with those t
ba70: 68 61 74 20 61 72 65 20 6e 6f 74 20 67 6c 6f 62  hat are not glob
ba80: 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  al..*/.void sqli
ba90: 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74  te3RegisterBuilt
baa0: 69 6e 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69  inFunctions(sqli
bab0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
bac0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65  rc = sqlite3_ove
bad0: 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64  rload_function(d
bae0: 62 2c 20 22 4d 41 54 43 48 22 2c 20 32 29 3b 0a  b, "MATCH", 2);.
baf0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
bb00: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63  LITE_NOMEM || rc
bb10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
bb20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
bb30: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 64 62 2d  NOMEM ){.    db-
bb40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
bb50: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
bb60: 53 65 74 20 74 68 65 20 4c 49 4b 45 4f 50 54 20  Set the LIKEOPT 
bb70: 66 6c 61 67 20 6f 6e 20 74 68 65 20 32 2d 61 72  flag on the 2-ar
bb80: 67 75 6d 65 6e 74 20 66 75 6e 63 74 69 6f 6e 20  gument function 
bb90: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e  with the given n
bba0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ame..*/.static v
bbb0: 6f 69 64 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c  oid setLikeOptFl
bbc0: 61 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ag(sqlite3 *db, 
bbd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
bbe0: 65 2c 20 75 38 20 66 6c 61 67 56 61 6c 29 7b 0a  e, u8 flagVal){.
bbf0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
bc00: 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65  .  pDef = sqlite
bc10: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
bc20: 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  , zName, sqlite3
bc30: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c  Strlen30(zName),
bc40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c                2,
bc60: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
bc70: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
bc80: 44 65 66 29 20 29 7b 0a 20 20 20 20 70 44 65 66  Def) ){.    pDef
bc90: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 7c 3d 20 66  ->funcFlags |= f
bca0: 6c 61 67 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  lagVal;.  }.}../
bcb0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
bcc0: 65 20 62 75 69 6c 74 2d 69 6e 20 4c 49 4b 45 20  e built-in LIKE 
bcd0: 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f  and GLOB functio
bce0: 6e 73 2e 20 20 54 68 65 20 63 61 73 65 53 65 6e  ns.  The caseSen
bcf0: 73 69 74 69 76 65 0a 2a 2a 20 70 61 72 61 6d 65  sitive.** parame
bd00: 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
bd10: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
bd20: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
bd30: 69 73 20 63 61 73 65 0a 2a 2a 20 73 65 6e 73 69  is case.** sensi
bd40: 74 69 76 65 2e 20 20 47 4c 4f 42 20 69 73 20 61  tive.  GLOB is a
bd50: 6c 77 61 79 73 20 63 61 73 65 20 73 65 6e 73 69  lways case sensi
bd60: 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tive..*/.void sq
bd70: 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b  lite3RegisterLik
bd80: 65 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74  eFunctions(sqlit
bd90: 65 33 20 2a 64 62 2c 20 69 6e 74 20 63 61 73 65  e3 *db, int case
bda0: 53 65 6e 73 69 74 69 76 65 29 7b 0a 20 20 73 74  Sensitive){.  st
bdb0: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
bdc0: 20 2a 70 49 6e 66 6f 3b 0a 20 20 69 66 28 20 63   *pInfo;.  if( c
bdd0: 61 73 65 53 65 6e 73 69 74 69 76 65 20 29 7b 0a  aseSensitive ){.
bde0: 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73 74 72      pInfo = (str
bdf0: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a  uct compareInfo*
be00: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 3b 0a 20  )&likeInfoAlt;. 
be10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
be20: 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6d 70  o = (struct comp
be30: 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e  areInfo*)&likeIn
be40: 66 6f 4e 6f 72 6d 3b 0a 20 20 7d 0a 20 20 73 71  foNorm;.  }.  sq
be50: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
be60: 64 62 2c 20 22 6c 69 6b 65 22 2c 20 32 2c 20 53  db, "like", 2, S
be70: 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 49 6e 66  QLITE_UTF8, pInf
be80: 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20  o, likeFunc, 0, 
be90: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
bea0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22  CreateFunc(db, "
beb0: 6c 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49 54 45  like", 3, SQLITE
bec0: 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69  _UTF8, pInfo, li
bed0: 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29  keFunc, 0, 0, 0)
bee0: 3b 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74  ;.  sqlite3Creat
bef0: 65 46 75 6e 63 28 64 62 2c 20 22 67 6c 6f 62 22  eFunc(db, "glob"
bf00: 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
bf10: 2c 20 0a 20 20 20 20 20 20 28 73 74 72 75 63 74  , .      (struct
bf20: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 67   compareInfo*)&g
bf30: 6c 6f 62 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e  lobInfo, likeFun
bf40: 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73  c, 0, 0, 0);.  s
bf50: 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62  etLikeOptFlag(db
bf60: 2c 20 22 67 6c 6f 62 22 2c 20 53 51 4c 49 54 45  , "glob", SQLITE
bf70: 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c  _FUNC_LIKE | SQL
bf80: 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3b 0a  ITE_FUNC_CASE);.
bf90: 20 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67    setLikeOptFlag
bfa0: 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 0a 20 20  (db, "like", .  
bfb0: 20 20 20 20 63 61 73 65 53 65 6e 73 69 74 69 76      caseSensitiv
bfc0: 65 20 3f 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  e ? (SQLITE_FUNC
bfd0: 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46  _LIKE | SQLITE_F
bfe0: 55 4e 43 5f 43 41 53 45 29 20 3a 20 53 51 4c 49  UNC_CASE) : SQLI
bff0: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d  TE_FUNC_LIKE);.}
c000: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f  ../*.** pExpr po
c010: 69 6e 74 73 20 74 6f 20 61 6e 20 65 78 70 72 65  ints to an expre
c020: 73 73 69 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c  ssion which impl
c030: 65 6d 65 6e 74 73 20 61 20 66 75 6e 63 74 69 6f  ements a functio
c040: 6e 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69 73 20  n.  If.** it is 
c050: 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 61  appropriate to a
c060: 70 70 6c 79 20 74 68 65 20 4c 49 4b 45 20 6f 70  pply the LIKE op
c070: 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68  timization to th
c080: 61 74 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74  at function.** t
c090: 68 65 6e 20 73 65 74 20 61 57 63 5b 30 5d 20 74  hen set aWc[0] t
c0a0: 68 72 6f 75 67 68 20 61 57 63 5b 32 5d 20 74 6f  hrough aWc[2] to
c0b0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68   the wildcard ch
c0c0: 61 72 61 63 74 65 72 73 20 61 6e 64 0a 2a 2a 20  aracters and.** 
c0d0: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
c0e0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
c0f0: 20 6e 6f 74 20 61 20 4c 49 4b 45 2d 73 74 79 6c   not a LIKE-styl
c100: 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 65 6e 0a  e function then.
c110: 2a 2a 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  ** return FALSE.
c120: 0a 2a 2a 0a 2a 2a 20 2a 70 49 73 4e 6f 63 61 73  .**.** *pIsNocas
c130: 65 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  e is set to true
c140: 20 69 66 20 75 70 70 65 72 63 61 73 65 20 61 6e   if uppercase an
c150: 64 20 6c 6f 77 65 72 63 61 73 65 20 61 72 65 20  d lowercase are 
c160: 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 0a 2a  equivalent for.*
c170: 2a 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 28  * the function (
c180: 64 65 66 61 75 6c 74 20 66 6f 72 20 4c 49 4b 45  default for LIKE
c190: 29 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74  ).  If the funct
c1a0: 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 69  ion makes the di
c1b0: 73 74 69 6e 63 74 69 6f 6e 0a 2a 2a 20 62 65 74  stinction.** bet
c1c0: 77 65 65 6e 20 75 70 70 65 72 63 61 73 65 20 61  ween uppercase a
c1d0: 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 28 61 73  nd lowercase (as
c1e0: 20 64 6f 65 73 20 47 4c 4f 42 29 20 74 68 65 6e   does GLOB) then
c1f0: 20 2a 70 49 73 4e 6f 63 61 73 65 20 69 73 20 73   *pIsNocase is s
c200: 65 74 20 74 6f 0a 2a 2a 20 66 61 6c 73 65 2e 0a  et to.** false..
c210: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
c220: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71 6c  LikeFunction(sql
c230: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
c240: 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 49 73 4e  pExpr, int *pIsN
c250: 6f 63 61 73 65 2c 20 63 68 61 72 20 2a 61 57 63  ocase, char *aWc
c260: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44  ){.  FuncDef *pD
c270: 65 66 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  ef;.  if( pExpr-
c280: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
c290: 20 0a 20 20 20 7c 7c 20 21 70 45 78 70 72 2d 3e   .   || !pExpr->
c2a0: 78 2e 70 4c 69 73 74 20 0a 20 20 20 7c 7c 20 70  x.pList .   || p
c2b0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
c2c0: 45 78 70 72 21 3d 32 0a 20 20 29 7b 0a 20 20 20  Expr!=2.  ){.   
c2d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c2e0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
c2f0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
c300: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
c310: 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74  ;.  pDef = sqlit
c320: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
c330: 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  b, pExpr->u.zTok
c340: 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  en, .           
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c360: 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33    sqlite3Strlen3
c370: 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  0(pExpr->u.zToke
c380: 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n),.            
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3a0: 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
c3b0: 20 30 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52   0);.  if( NEVER
c3c0: 28 70 44 65 66 3d 3d 30 29 20 7c 7c 20 28 70 44  (pDef==0) || (pD
c3d0: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
c3e0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
c3f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
c400: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
c410: 54 68 65 20 6d 65 6d 63 70 79 28 29 20 73 74 61  The memcpy() sta
c420: 74 65 6d 65 6e 74 20 61 73 73 75 6d 65 73 20 74  tement assumes t
c430: 68 61 74 20 74 68 65 20 77 69 6c 64 63 61 72 64  hat the wildcard
c440: 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65 0a   characters are.
c450: 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74    ** the first t
c460: 68 72 65 65 20 73 74 61 74 65 6d 65 6e 74 73 20  hree statements 
c470: 69 6e 20 74 68 65 20 63 6f 6d 70 61 72 65 49 6e  in the compareIn
c480: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
c490: 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 28  he.  ** asserts(
c4a0: 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 76 65  ) that follow ve
c4b0: 72 69 66 79 20 74 68 61 74 20 61 73 73 75 6d 70  rify that assump
c4c0: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63  tion.  */.  memc
c4d0: 70 79 28 61 57 63 2c 20 70 44 65 66 2d 3e 70 55  py(aWc, pDef->pU
c4e0: 73 65 72 44 61 74 61 2c 20 33 29 3b 0a 20 20 61  serData, 3);.  a
c4f0: 73 73 65 72 74 28 20 28 63 68 61 72 2a 29 26 6c  ssert( (char*)&l
c500: 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20 28 63  ikeInfoAlt == (c
c510: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
c520: 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a 20 20  t.matchAll );.  
c530: 61 73 73 65 72 74 28 20 26 28 28 63 68 61 72 2a  assert( &((char*
c540: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 31  )&likeInfoAlt)[1
c550: 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b  ] == (char*)&lik
c560: 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e  eInfoAlt.matchOn
c570: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26  e );.  assert( &
c580: 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66  ((char*)&likeInf
c590: 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63 68 61  oAlt)[2] == (cha
c5a0: 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e  r*)&likeInfoAlt.
c5b0: 6d 61 74 63 68 53 65 74 20 29 3b 0a 20 20 2a 70  matchSet );.  *p
c5c0: 49 73 4e 6f 63 61 73 65 20 3d 20 28 70 44 65 66  IsNocase = (pDef
c5d0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
c5e0: 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3d  LITE_FUNC_CASE)=
c5f0: 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  =0;.  return 1;.
c600: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  }../*.** All of 
c610: 74 68 65 20 46 75 6e 63 44 65 66 20 73 74 72 75  the FuncDef stru
c620: 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 61 42  ctures in the aB
c630: 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 61 72 72  uiltinFunc[] arr
c640: 61 79 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 74  ay above.** to t
c650: 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  he global functi
c660: 6f 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  on hash table.  
c670: 54 68 69 73 20 6f 63 63 75 72 73 20 61 74 20 73  This occurs at s
c680: 74 61 72 74 2d 74 69 6d 65 20 28 61 73 0a 2a 2a  tart-time (as.**
c690: 20 61 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f   a consequence o
c6a0: 66 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  f calling sqlite
c6b0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 29 2e  3_initialize()).
c6c0: 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
c6d0: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 0a 2a  s routine runs.*
c6e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
c6f0: 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63  gisterGlobalFunc
c700: 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 2f  tions(void){.  /
c710: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  *.  ** The follo
c720: 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73  wing array holds
c730: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
c740: 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  res for all of t
c750: 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a  he functions.  *
c760: 2a 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  * defined in thi
c770: 73 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s file..  **.  *
c780: 2a 20 54 68 65 20 61 72 72 61 79 20 63 61 6e 6e  * The array cann
c790: 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 73  ot be constant s
c7a0: 69 6e 63 65 20 63 68 61 6e 67 65 73 20 61 72 65  ince changes are
c7b0: 20 6d 61 64 65 20 74 6f 20 74 68 65 0a 20 20 2a   made to the.  *
c7c0: 2a 20 46 75 6e 63 44 65 66 2e 70 48 61 73 68 20  * FuncDef.pHash 
c7d0: 65 6c 65 6d 65 6e 74 73 20 61 74 20 73 74 61 72  elements at star
c7e0: 74 2d 74 69 6d 65 2e 20 20 54 68 65 20 65 6c 65  t-time.  The ele
c7f0: 6d 65 6e 74 73 20 6f 66 20 74 68 69 73 20 61 72  ments of this ar
c800: 72 61 79 0a 20 20 2a 2a 20 61 72 65 20 72 65 61  ray.  ** are rea
c810: 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 69 6e 69  d-only after ini
c820: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69 73 20 63  tialization is c
c830: 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a 2f 0a 20 20  omplete..  */.  
c840: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 57 53  static SQLITE_WS
c850: 44 20 46 75 6e 63 44 65 66 20 61 42 75 69 6c 74  D FuncDef aBuilt
c860: 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20  inFunc[] = {.   
c870: 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c   FUNCTION(ltrim,
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
c890: 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20   1, 0, trimFunc 
c8a0: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
c8b0: 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20  UNCTION(ltrim,  
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 31              2, 1
c8d0: 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20  , 0, trimFunc   
c8e0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
c8f0: 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20  CTION(rtrim,    
c900: 20 20 20 20 20 20 20 20 20 20 31 2c 20 32 2c 20            1, 2, 
c910: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
c920: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
c930: 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20 20 20  ION(rtrim,      
c940: 20 20 20 20 20 20 20 20 32 2c 20 32 2c 20 30 2c          2, 2, 0,
c950: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
c960: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
c970: 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20  N(trim,         
c980: 20 20 20 20 20 20 31 2c 20 33 2c 20 30 2c 20 74        1, 3, 0, t
c990: 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20  rimFunc         
c9a0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
c9b0: 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20  trim,           
c9c0: 20 20 20 20 32 2c 20 33 2c 20 30 2c 20 74 72 69      2, 3, 0, tri
c9d0: 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c  mFunc         ),
c9e0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69  .    FUNCTION(mi
c9f0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
ca00: 20 2d 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61   -1, 0, 1, minma
ca10: 78 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  xFunc       ),. 
ca20: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c     FUNCTION(min,
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 30 2c 20 30 2c 20 31 2c 20 30 20 20 20 20 20 20  0, 0, 1, 0      
ca50: 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20            ),.   
ca60: 20 41 47 47 52 45 47 41 54 45 32 28 6d 69 6e 2c   AGGREGATE2(min,
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
ca80: 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65   0, 1, minmaxSte
ca90: 70 2c 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 69  p,      minMaxFi
caa0: 6e 61 6c 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  nalize,.        
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49    SQLITE_FUNC_MI
cae0: 4e 4d 41 58 20 29 2c 0a 20 20 20 20 46 55 4e 43  NMAX ),.    FUNC
caf0: 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20 20  TION(max,       
cb00: 20 20 20 20 20 20 20 20 2d 31 2c 20 31 2c 20 31          -1, 1, 1
cb10: 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20 20 20 20  , minmaxFunc    
cb20: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
cb30: 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20  ON(max,         
cb40: 20 20 20 20 20 20 20 30 2c 20 31 2c 20 31 2c 20         0, 1, 1, 
cb50: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
cb60: 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54   ),.    AGGREGAT
cb70: 45 32 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20  E2(max,         
cb80: 20 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 6d 69       1, 1, 1, mi
cb90: 6e 6d 61 78 53 74 65 70 2c 20 20 20 20 20 20 6d  nmaxStep,      m
cba0: 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 2c 0a 20  inMaxFinalize,. 
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
cbe0: 46 55 4e 43 5f 4d 49 4e 4d 41 58 20 29 2c 0a 20  FUNC_MINMAX ),. 
cbf0: 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 74 79 70     FUNCTION2(typ
cc00: 65 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  eof,            
cc10: 31 2c 20 30 2c 20 30 2c 20 74 79 70 65 6f 66 46  1, 0, 0, typeofF
cc20: 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e  unc,  SQLITE_FUN
cc30: 43 5f 54 59 50 45 4f 46 29 2c 0a 20 20 20 20 46  C_TYPEOF),.    F
cc40: 55 4e 43 54 49 4f 4e 32 28 6c 65 6e 67 74 68 2c  UNCTION2(length,
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
cc60: 2c 20 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63 2c  , 0, lengthFunc,
cc70: 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45    SQLITE_FUNC_LE
cc80: 4e 47 54 48 29 2c 0a 20 20 20 20 46 55 4e 43 54  NGTH),.    FUNCT
cc90: 49 4f 4e 28 69 6e 73 74 72 2c 20 20 20 20 20 20  ION(instr,      
cca0: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c          2, 0, 0,
ccb0: 20 69 6e 73 74 72 46 75 6e 63 20 20 20 20 20 20   instrFunc      
ccc0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
ccd0: 4e 28 73 75 62 73 74 72 2c 20 20 20 20 20 20 20  N(substr,       
cce0: 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 73        2, 0, 0, s
ccf0: 75 62 73 74 72 46 75 6e 63 20 20 20 20 20 20 20  ubstrFunc       
cd00: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
cd10: 73 75 62 73 74 72 2c 20 20 20 20 20 20 20 20 20  substr,         
cd20: 20 20 20 20 33 2c 20 30 2c 20 30 2c 20 73 75 62      3, 0, 0, sub
cd30: 73 74 72 46 75 6e 63 20 20 20 20 20 20 20 29 2c  strFunc       ),
cd40: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 70 72  .    FUNCTION(pr
cd50: 69 6e 74 66 2c 20 20 20 20 20 20 20 20 20 20 20  intf,           
cd60: 20 2d 31 2c 20 30 2c 20 30 2c 20 70 72 69 6e 74   -1, 0, 0, print
cd70: 66 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  fFunc       ),. 
cd80: 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 6e 69 63     FUNCTION(unic
cd90: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
cda0: 31 2c 20 30 2c 20 30 2c 20 75 6e 69 63 6f 64 65  1, 0, 0, unicode
cdb0: 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20  Func      ),.   
cdc0: 20 46 55 4e 43 54 49 4f 4e 28 63 68 61 72 2c 20   FUNCTION(char, 
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
cde0: 20 30 2c 20 30 2c 20 63 68 61 72 46 75 6e 63 20   0, 0, charFunc 
cdf0: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
ce00: 55 4e 43 54 49 4f 4e 28 61 62 73 2c 20 20 20 20  UNCTION(abs,    
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
ce20: 2c 20 30 2c 20 61 62 73 46 75 6e 63 20 20 20 20  , 0, absFunc    
ce30: 20 20 20 20 20 20 29 2c 0a 23 69 66 6e 64 65 66        ),.#ifndef
ce40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
ce50: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
ce60: 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20  FUNCTION(round, 
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
ce80: 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20  0, 0, roundFunc 
ce90: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
cea0: 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20 20  NCTION(round,   
ceb0: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
cec0: 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 20   0, roundFunc   
ced0: 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a 20       ),.#endif. 
cee0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 70 70 65     FUNCTION(uppe
cef0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
cf00: 31 2c 20 30 2c 20 30 2c 20 75 70 70 65 72 46 75  1, 0, 0, upperFu
cf10: 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  nc        ),.   
cf20: 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 77 65 72 2c   FUNCTION(lower,
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
cf40: 20 30 2c 20 30 2c 20 6c 6f 77 65 72 46 75 6e 63   0, 0, lowerFunc
cf50: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
cf60: 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65  UNCTION(coalesce
cf70: 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30  ,           1, 0
cf80: 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20  , 0, 0          
cf90: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
cfa0: 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20  CTION(coalesce, 
cfb0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
cfc0: 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  0, 0            
cfd0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
cfe0: 49 4f 4e 32 28 63 6f 61 6c 65 73 63 65 2c 20 20  ION2(coalesce,  
cff0: 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c         -1, 0, 0,
d000: 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49   noopFunc,  SQLI
d010: 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45  TE_FUNC_COALESCE
d020: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
d030: 68 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  hex,            
d040: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 68 65 78      1, 0, 0, hex
d050: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 29 2c  Func          ),
d060: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 69  .    FUNCTION2(i
d070: 66 6e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  fnull,          
d080: 20 20 32 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46    2, 0, 0, noopF
d090: 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e  unc,  SQLITE_FUN
d0a0: 43 5f 43 4f 41 4c 45 53 43 45 29 2c 0a 20 20 20  C_COALESCE),.   
d0b0: 20 46 55 4e 43 54 49 4f 4e 32 28 75 6e 6c 69 6b   FUNCTION2(unlik
d0c0: 65 6c 79 2c 20 20 20 20 20 20 20 20 20 20 31 2c  ely,          1,
d0d0: 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c   0, 0, noopFunc,
d0e0: 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e    SQLITE_FUNC_UN
d0f0: 4c 49 4b 45 4c 59 29 2c 0a 20 20 20 20 46 55 4e  LIKELY),.    FUN
d100: 43 54 49 4f 4e 32 28 6c 69 6b 65 6c 69 68 6f 6f  CTION2(likelihoo
d110: 64 2c 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20  d,        2, 0, 
d120: 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51  0, noopFunc,  SQ
d130: 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
d140: 4c 59 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f  LY),.    FUNCTIO
d150: 4e 32 28 6c 69 6b 65 6c 79 2c 20 20 20 20 20 20  N2(likely,      
d160: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6e        1, 0, 0, n
d170: 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45  oopFunc,  SQLITE
d180: 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29 2c  _FUNC_UNLIKELY),
d190: 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 72  .    VFUNCTION(r
d1a0: 61 6e 64 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  andom,          
d1b0: 20 20 30 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f    0, 0, 0, rando
d1c0: 6d 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  mFunc       ),. 
d1d0: 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 72 61 6e     VFUNCTION(ran
d1e0: 64 6f 6d 62 6c 6f 62 2c 20 20 20 20 20 20 20 20  domblob,        
d1f0: 31 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d 42  1, 0, 0, randomB
d200: 6c 6f 62 20 20 20 20 20 20 20 29 2c 0a 20 20 20  lob       ),.   
d210: 20 46 55 4e 43 54 49 4f 4e 28 6e 75 6c 6c 69 66   FUNCTION(nullif
d220: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c  ,             2,
d230: 20 30 2c 20 31 2c 20 6e 75 6c 6c 69 66 46 75 6e   0, 1, nullifFun
d240: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  c       ),.    F
d250: 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 76  UNCTION(sqlite_v
d260: 65 72 73 69 6f 6e 2c 20 20 20 20 20 30 2c 20 30  ersion,     0, 0
d270: 2c 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63  , 0, versionFunc
d280: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
d290: 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 73 6f 75  CTION(sqlite_sou
d2a0: 72 63 65 5f 69 64 2c 20 20 20 30 2c 20 30 2c 20  rce_id,   0, 0, 
d2b0: 30 2c 20 73 6f 75 72 63 65 69 64 46 75 6e 63 20  0, sourceidFunc 
d2c0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
d2d0: 49 4f 4e 28 73 71 6c 69 74 65 5f 6c 6f 67 2c 20  ION(sqlite_log, 
d2e0: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c          2, 0, 0,
d2f0: 20 65 72 72 6c 6f 67 46 75 6e 63 20 20 20 20 20   errlogFunc     
d300: 20 20 29 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f    ),.#if SQLITE_
d310: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
d320: 49 4f 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e  ION.    FUNCTION
d330: 28 73 71 6c 69 74 65 5f 63 72 79 70 74 2c 20 20  (sqlite_crypt,  
d340: 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 73 71       2, 0, 0, sq
d350: 6c 69 74 65 33 43 72 79 70 74 46 75 6e 63 20 29  lite3CryptFunc )
d360: 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ,.#endif.#ifndef
d370: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
d380: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
d390: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71  .    FUNCTION(sq
d3a0: 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  lite_compileopti
d3b0: 6f 6e 5f 75 73 65 64 2c 31 2c 20 30 2c 20 30 2c  on_used,1, 0, 0,
d3c0: 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 75 73   compileoptionus
d3d0: 65 64 46 75 6e 63 20 20 29 2c 0a 20 20 20 20 46  edFunc  ),.    F
d3e0: 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63  UNCTION(sqlite_c
d3f0: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74  ompileoption_get
d400: 2c 20 31 2c 20 30 2c 20 30 2c 20 63 6f 6d 70 69  , 1, 0, 0, compi
d410: 6c 65 6f 70 74 69 6f 6e 67 65 74 46 75 6e 63 20  leoptiongetFunc 
d420: 20 29 2c 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   ),.#endif /* SQ
d430: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
d440: 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f  EOPTION_DIAGS */
d450: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 71 75  .    FUNCTION(qu
d460: 6f 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ote,            
d470: 20 20 31 2c 20 30 2c 20 30 2c 20 71 75 6f 74 65    1, 0, 0, quote
d480: 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20  Func        ),. 
d490: 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 6c 61 73     VFUNCTION(las
d4a0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 2c 20  t_insert_rowid, 
d4b0: 30 2c 20 30 2c 20 30 2c 20 6c 61 73 74 5f 69 6e  0, 0, 0, last_in
d4c0: 73 65 72 74 5f 72 6f 77 69 64 29 2c 0a 20 20 20  sert_rowid),.   
d4d0: 20 56 46 55 4e 43 54 49 4f 4e 28 63 68 61 6e 67   VFUNCTION(chang
d4e0: 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 30 2c  es,           0,
d4f0: 20 30 2c 20 30 2c 20 63 68 61 6e 67 65 73 20 20   0, 0, changes  
d500: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 56          ),.    V
d510: 46 55 4e 43 54 49 4f 4e 28 74 6f 74 61 6c 5f 63  FUNCTION(total_c
d520: 68 61 6e 67 65 73 2c 20 20 20 20 20 30 2c 20 30  hanges,     0, 0
d530: 2c 20 30 2c 20 74 6f 74 61 6c 5f 63 68 61 6e 67  , 0, total_chang
d540: 65 73 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e  es    ),.    FUN
d550: 43 54 49 4f 4e 28 72 65 70 6c 61 63 65 2c 20 20  CTION(replace,  
d560: 20 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c 20            3, 0, 
d570: 30 2c 20 72 65 70 6c 61 63 65 46 75 6e 63 20 20  0, replaceFunc  
d580: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
d590: 49 4f 4e 28 7a 65 72 6f 62 6c 6f 62 2c 20 20 20  ION(zeroblob,   
d5a0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
d5b0: 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63 20 20 20   zeroblobFunc   
d5c0: 20 20 29 2c 0a 20 20 23 69 66 64 65 66 20 53 51    ),.  #ifdef SQ
d5d0: 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 20 20 20  LITE_SOUNDEX.   
d5e0: 20 46 55 4e 43 54 49 4f 4e 28 73 6f 75 6e 64 65   FUNCTION(sounde
d5f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  x,            1,
d600: 20 30 2c 20 30 2c 20 73 6f 75 6e 64 65 78 46 75   0, 0, soundexFu
d610: 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 23 65 6e  nc      ),.  #en
d620: 64 69 66 0a 20 20 23 69 66 6e 64 65 66 20 53 51  dif.  #ifndef SQ
d630: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
d640: 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 46 55 4e  XTENSION.    FUN
d650: 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65 6e  CTION(load_exten
d660: 73 69 6f 6e 2c 20 20 20 20 20 31 2c 20 30 2c 20  sion,     1, 0, 
d670: 30 2c 20 6c 6f 61 64 45 78 74 20 20 20 20 20 20  0, loadExt      
d680: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
d690: 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ION(load_extensi
d6a0: 6f 6e 2c 20 20 20 20 20 32 2c 20 30 2c 20 30 2c  on,     2, 0, 0,
d6b0: 20 6c 6f 61 64 45 78 74 20 20 20 20 20 20 20 20   loadExt        
d6c0: 20 20 29 2c 0a 20 20 23 65 6e 64 69 66 0a 20 20    ),.  #endif.  
d6d0: 20 20 41 47 47 52 45 47 41 54 45 28 73 75 6d 2c    AGGREGATE(sum,
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
d6f0: 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c  , 0, 0, sumStep,
d700: 20 20 20 20 20 20 20 20 20 73 75 6d 46 69 6e 61           sumFina
d710: 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20 20 20 41  lize    ),.    A
d720: 47 47 52 45 47 41 54 45 28 74 6f 74 61 6c 2c 20  GGREGATE(total, 
d730: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
d740: 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20  , 0, sumStep,   
d750: 20 20 20 20 20 20 74 6f 74 61 6c 46 69 6e 61 6c        totalFinal
d760: 69 7a 65 20 20 20 20 29 2c 0a 20 20 20 20 41 47  ize    ),.    AG
d770: 47 52 45 47 41 54 45 28 61 76 67 2c 20 20 20 20  GREGATE(avg,    
d780: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
d790: 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20   0, sumStep,    
d7a0: 20 20 20 20 20 61 76 67 46 69 6e 61 6c 69 7a 65       avgFinalize
d7b0: 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45      ),.    AGGRE
d7c0: 47 41 54 45 32 28 63 6f 75 6e 74 2c 20 20 20 20  GATE2(count,    
d7d0: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c          0, 0, 0,
d7e0: 20 63 6f 75 6e 74 53 74 65 70 2c 20 20 20 20 20   countStep,     
d7f0: 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c    countFinalize,
d800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d810: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
d820: 54 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47  T  ),.    AGGREG
d830: 41 54 45 28 63 6f 75 6e 74 2c 20 20 20 20 20 20  ATE(count,      
d840: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
d850: 63 6f 75 6e 74 53 74 65 70 2c 20 20 20 20 20 20  countStep,      
d860: 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20 20   countFinalize  
d870: 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54 45  ),.    AGGREGATE
d880: 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 2c 20 20  (group_concat,  
d890: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 67 72 6f      1, 0, 0, gro
d8a0: 75 70 43 6f 6e 63 61 74 53 74 65 70 2c 20 67 72  upConcatStep, gr
d8b0: 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a  oupConcatFinaliz
d8c0: 65 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54  e),.    AGGREGAT
d8d0: 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 2c 20  E(group_concat, 
d8e0: 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 67 72       2, 0, 0, gr
d8f0: 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 2c 20 67  oupConcatStep, g
d900: 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69  roupConcatFinali
d910: 7a 65 29 2c 0a 20 20 0a 20 20 20 20 4c 49 4b 45  ze),.  .    LIKE
d920: 46 55 4e 43 28 67 6c 6f 62 2c 20 32 2c 20 26 67  FUNC(glob, 2, &g
d930: 6c 6f 62 49 6e 66 6f 2c 20 53 51 4c 49 54 45 5f  lobInfo, SQLITE_
d940: 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45  FUNC_LIKE|SQLITE
d950: 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20 23  _FUNC_CASE),.  #
d960: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 41 53  ifdef SQLITE_CAS
d970: 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45  E_SENSITIVE_LIKE
d980: 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69  .    LIKEFUNC(li
d990: 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e 66 6f  ke, 2, &likeInfo
d9a0: 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  Alt, SQLITE_FUNC
d9b0: 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e  _LIKE|SQLITE_FUN
d9c0: 43 5f 43 41 53 45 29 2c 0a 20 20 20 20 4c 49 4b  C_CASE),.    LIK
d9d0: 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c 20 26  EFUNC(like, 3, &
d9e0: 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20 53 51 4c  likeInfoAlt, SQL
d9f0: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51  ITE_FUNC_LIKE|SQ
da00: 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c  LITE_FUNC_CASE),
da10: 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 4c 49 4b  .  #else.    LIK
da20: 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c 20 26  EFUNC(like, 2, &
da30: 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51  likeInfoNorm, SQ
da40: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c  LITE_FUNC_LIKE),
da50: 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69  .    LIKEFUNC(li
da60: 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49 6e 66 6f  ke, 3, &likeInfo
da70: 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55 4e  Norm, SQLITE_FUN
da80: 43 5f 4c 49 4b 45 29 2c 0a 20 20 23 65 6e 64 69  C_LIKE),.  #endi
da90: 66 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 69 3b  f.  };..  int i;
daa0: 0a 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a  .  FuncDefHash *
dab0: 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28  pHash = &GLOBAL(
dac0: 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c  FuncDefHash, sql
dad0: 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69  ite3GlobalFuncti
dae0: 6f 6e 73 29 3b 0a 20 20 46 75 6e 63 44 65 66 20  ons);.  FuncDef 
daf0: 2a 61 46 75 6e 63 20 3d 20 28 46 75 6e 63 44 65  *aFunc = (FuncDe
db00: 66 2a 29 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44  f*)&GLOBAL(FuncD
db10: 65 66 2c 20 61 42 75 69 6c 74 69 6e 46 75 6e 63  ef, aBuiltinFunc
db20: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
db30: 3c 41 72 72 61 79 53 69 7a 65 28 61 42 75 69 6c  <ArraySize(aBuil
db40: 74 69 6e 46 75 6e 63 29 3b 20 69 2b 2b 29 7b 0a  tinFunc); i++){.
db50: 20 20 20 20 73 71 6c 69 74 65 33 46 75 6e 63 44      sqlite3FuncD
db60: 65 66 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20  efInsert(pHash, 
db70: 26 61 46 75 6e 63 5b 69 5d 29 3b 0a 20 20 7d 0a  &aFunc[i]);.  }.
db80: 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65    sqlite3Registe
db90: 72 44 61 74 65 54 69 6d 65 46 75 6e 63 74 69 6f  rDateTimeFunctio
dba0: 6e 73 28 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ns();.#ifndef SQ
dbb0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
dbc0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 41 6c  ABLE.  sqlite3Al
dbd0: 74 65 72 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a  terFunctions();.
dbe0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
dbf0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
dc00: 5f 53 54 41 54 33 29 20 7c 7c 20 64 65 66 69 6e  _STAT3) || defin
dc10: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
dc20: 5f 53 54 41 54 34 29 0a 20 20 73 71 6c 69 74 65  _STAT4).  sqlite
dc30: 33 41 6e 61 6c 79 7a 65 46 75 6e 63 74 69 6f 6e  3AnalyzeFunction
dc40: 73 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a        s();.#endif.}.