/ Hex Artifact Content
Login

Artifact ef4c18c8a66143413ce41a58d582d2c14ddf78e1:


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 74 72  ENGTH]);.    str
19b0: 2e 70 72 69 6e 74 66 46 6c 61 67 73 20 3d 20 53  .printfFlags = S
19c0: 51 4c 49 54 45 5f 50 52 49 4e 54 46 5f 53 51 4c  QLITE_PRINTF_SQL
19d0: 46 55 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65  FUNC;.    sqlite
19e0: 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 7a  3XPrintf(&str, z
19f0: 46 6f 72 6d 61 74 2c 20 26 78 29 3b 0a 20 20 20  Format, &x);.   
1a00: 20 6e 20 3d 20 73 74 72 2e 6e 43 68 61 72 3b 0a   n = str.nChar;.
1a10: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1a20: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
1a30: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1a40: 46 69 6e 69 73 68 28 26 73 74 72 29 2c 20 6e 2c  Finish(&str), n,
1a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a60: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1a70: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
1a80: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1a90: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ation of the sub
1aa0: 73 74 72 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  str() function..
1ab0: 2a 2a 0a 2a 2a 20 73 75 62 73 74 72 28 78 2c 70  **.** substr(x,p
1ac0: 31 2c 70 32 29 20 20 72 65 74 75 72 6e 73 20 70  1,p2)  returns p
1ad0: 32 20 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  2 characters of 
1ae0: 78 5b 5d 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  x[] beginning wi
1af0: 74 68 20 70 31 2e 0a 2a 2a 20 70 31 20 69 73 20  th p1..** p1 is 
1b00: 31 2d 69 6e 64 65 78 65 64 2e 20 20 53 6f 20 73  1-indexed.  So s
1b10: 75 62 73 74 72 28 78 2c 31 2c 31 29 20 72 65 74  ubstr(x,1,1) ret
1b20: 75 72 6e 73 20 74 68 65 20 66 69 72 73 74 20 63  urns the first c
1b30: 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 78  haracter.** of x
1b40: 2e 20 20 49 66 20 78 20 69 73 20 74 65 78 74 2c  .  If x is text,
1b50: 20 74 68 65 6e 20 77 65 20 61 63 74 75 61 6c 6c   then we actuall
1b60: 79 20 63 6f 75 6e 74 20 55 54 46 2d 38 20 63 68  y count UTF-8 ch
1b70: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 20 49 66 20  aracters..** If 
1b80: 78 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65  x is a blob, the
1b90: 6e 20 77 65 20 63 6f 75 6e 74 20 62 79 74 65 73  n we count bytes
1ba0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 31 20 69 73  ..**.** If p1 is
1bb0: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
1bc0: 77 65 20 62 65 67 69 6e 20 61 62 73 28 70 31 29  we begin abs(p1)
1bd0: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
1be0: 20 78 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   x[]..**.** If p
1bf0: 32 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 72  2 is negative, r
1c00: 65 74 75 72 6e 20 74 68 65 20 70 32 20 63 68 61  eturn the p2 cha
1c10: 72 61 63 74 65 72 73 20 70 72 65 63 65 64 69 6e  racters precedin
1c20: 67 20 70 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  g p1..*/.static 
1c30: 76 6f 69 64 20 73 75 62 73 74 72 46 75 6e 63 28  void substrFunc(
1c40: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1c50: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
1c60: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
1c70: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1c80: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
1c90: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63  ned char *z;.  c
1ca0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1cb0: 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 6c 65  ar *z2;.  int le
1cc0: 6e 3b 0a 20 20 69 6e 74 20 70 30 74 79 70 65 3b  n;.  int p0type;
1cd0: 0a 20 20 69 36 34 20 70 31 2c 20 70 32 3b 0a 20  .  i64 p1, p2;. 
1ce0: 20 69 6e 74 20 6e 65 67 50 32 20 3d 20 30 3b 0a   int negP2 = 0;.
1cf0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
1d00: 3d 33 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =3 || argc==2 );
1d10: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
1d20: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31  alue_type(argv[1
1d30: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a  ])==SQLITE_NULL.
1d40: 20 20 20 7c 7c 20 28 61 72 67 63 3d 3d 33 20 26     || (argc==3 &
1d50: 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
1d60: 74 79 70 65 28 61 72 67 76 5b 32 5d 29 3d 3d 53  type(argv[2])==S
1d70: 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 20 20 29 7b  QLITE_NULL).  ){
1d80: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1d90: 0a 20 20 70 30 74 79 70 65 20 3d 20 73 71 6c 69  .  p0type = sqli
1da0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
1db0: 72 67 76 5b 30 5d 29 3b 0a 20 20 70 31 20 3d 20  rgv[0]);.  p1 = 
1dc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
1dd0: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66  t(argv[1]);.  if
1de0: 28 20 70 30 74 79 70 65 3d 3d 53 51 4c 49 54 45  ( p0type==SQLITE
1df0: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 6c 65 6e  _BLOB ){.    len
1e00: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1e10: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
1e20: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
1e30: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
1e40: 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  [0]);.    if( z=
1e50: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
1e60: 20 61 73 73 65 72 74 28 20 6c 65 6e 3d 3d 73 71   assert( len==sq
1e70: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
1e80: 73 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20  s(argv[0]) );.  
1e90: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
1ea0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1eb0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
1ec0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
1ed0: 6e 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a  n;.    len = 0;.
1ee0: 20 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a      if( p1<0 ){.
1ef0: 20 20 20 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20        for(z2=z; 
1f00: 2a 7a 32 3b 20 6c 65 6e 2b 2b 29 7b 0a 20 20 20  *z2; len++){.   
1f10: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50       SQLITE_SKIP
1f20: 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 20  _UTF8(z2);.     
1f30: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66   }.    }.  }.#if
1f40: 64 65 66 20 53 51 4c 49 54 45 5f 53 55 42 53 54  def SQLITE_SUBST
1f50: 52 5f 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 0a  R_COMPATIBILITY.
1f60: 20 20 2f 2a 20 49 66 20 53 55 42 53 54 52 5f 43    /* If SUBSTR_C
1f70: 4f 4d 50 41 54 49 42 49 4c 49 54 59 20 69 73 20  OMPATIBILITY is 
1f80: 64 65 66 69 6e 65 64 20 74 68 65 6e 20 73 75 62  defined then sub
1f90: 73 74 72 28 58 2c 30 2c 4e 29 20 77 6f 72 6b 20  str(X,0,N) work 
1fa0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
1fb0: 20 61 73 20 73 75 62 73 74 72 28 58 2c 31 2c 4e   as substr(X,1,N
1fc0: 29 20 2d 20 69 74 20 72 65 74 75 72 6e 73 20 74  ) - it returns t
1fd0: 68 65 20 66 69 72 73 74 20 4e 20 63 68 61 72 61  he first N chara
1fe0: 63 74 65 72 73 20 6f 66 20 58 2e 20 20 54 68 69  cters of X.  Thi
1ff0: 73 0a 20 20 2a 2a 20 69 73 20 65 73 73 65 6e 74  s.  ** is essent
2000: 69 61 6c 6c 79 20 61 20 62 61 63 6b 2d 6f 75 74  ially a back-out
2010: 20 6f 66 20 74 68 65 20 62 75 67 2d 66 69 78 20   of the bug-fix 
2020: 69 6e 20 63 68 65 63 6b 2d 69 6e 20 5b 35 66 63  in check-in [5fc
2030: 31 32 35 64 33 36 32 64 66 34 62 38 5d 0a 20 20  125d362df4b8].  
2040: 2a 2a 20 66 72 6f 6d 20 32 30 30 39 2d 30 32 2d  ** from 2009-02-
2050: 30 32 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  02 for compatibi
2060: 6c 69 74 79 20 6f 66 20 61 70 70 6c 69 63 61 74  lity of applicat
2070: 69 6f 6e 73 20 74 68 61 74 20 65 78 70 6c 6f 69  ions that exploi
2080: 74 65 64 20 74 68 65 0a 20 20 2a 2a 20 6f 6c 64  ted the.  ** old
2090: 20 62 75 67 67 79 20 62 65 68 61 76 69 6f 72 2e   buggy behavior.
20a0: 20 2a 2f 0a 20 20 69 66 28 20 70 31 3d 3d 30 20   */.  if( p1==0 
20b0: 29 20 70 31 20 3d 20 31 3b 20 2f 2a 20 3c 72 64  ) p1 = 1; /* <rd
20c0: 61 72 3a 2f 2f 70 72 6f 62 6c 65 6d 2f 36 37 37  ar://problem/677
20d0: 38 33 33 39 3e 20 2a 2f 0a 23 65 6e 64 69 66 0a  8339> */.#endif.
20e0: 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b    if( argc==3 ){
20f0: 0a 20 20 20 20 70 32 20 3d 20 73 71 6c 69 74 65  .    p2 = sqlite
2100: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
2110: 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 32  [2]);.    if( p2
2120: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32 20 3d  <0 ){.      p2 =
2130: 20 2d 70 32 3b 0a 20 20 20 20 20 20 6e 65 67 50   -p2;.      negP
2140: 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2 = 1;.    }.  }
2150: 65 6c 73 65 7b 0a 20 20 20 20 70 32 20 3d 20 73  else{.    p2 = s
2160: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
2170: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
2180: 29 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  )->aLimit[SQLITE
2190: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a  _LIMIT_LENGTH];.
21a0: 20 20 7d 0a 20 20 69 66 28 20 70 31 3c 30 20 29    }.  if( p1<0 )
21b0: 7b 0a 20 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b  {.    p1 += len;
21c0: 0a 20 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b  .    if( p1<0 ){
21d0: 0a 20 20 20 20 20 20 70 32 20 2b 3d 20 70 31 3b  .      p2 += p1;
21e0: 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20  .      if( p2<0 
21f0: 29 20 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20  ) p2 = 0;.      
2200: 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  p1 = 0;.    }.  
2210: 7d 65 6c 73 65 20 69 66 28 20 70 31 3e 30 20 29  }else if( p1>0 )
2220: 7b 0a 20 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 65  {.    p1--;.  }e
2230: 6c 73 65 20 69 66 28 20 70 32 3e 30 20 29 7b 0a  lse if( p2>0 ){.
2240: 20 20 20 20 70 32 2d 2d 3b 0a 20 20 7d 0a 20 20      p2--;.  }.  
2250: 69 66 28 20 6e 65 67 50 32 20 29 7b 0a 20 20 20  if( negP2 ){.   
2260: 20 70 31 20 2d 3d 20 70 32 3b 0a 20 20 20 20 69   p1 -= p2;.    i
2270: 66 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20  f( p1<0 ){.     
2280: 20 70 32 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20   p2 += p1;.     
2290: 20 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   p1 = 0;.    }. 
22a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 31 3e   }.  assert( p1>
22b0: 3d 30 20 26 26 20 70 32 3e 3d 30 20 29 3b 0a 20  =0 && p2>=0 );. 
22c0: 20 69 66 28 20 70 30 74 79 70 65 21 3d 53 51 4c   if( p0type!=SQL
22d0: 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
22e0: 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 70 31 20  while( *z && p1 
22f0: 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ){.      SQLITE_
2300: 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20  SKIP_UTF8(z);.  
2310: 20 20 20 20 70 31 2d 2d 3b 0a 20 20 20 20 7d 0a      p1--;.    }.
2320: 20 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a      for(z2=z; *z
2330: 32 20 26 26 20 70 32 3b 20 70 32 2d 2d 29 7b 0a  2 && p2; p2--){.
2340: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
2350: 50 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20  P_UTF8(z2);.    
2360: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  }.    sqlite3_re
2370: 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74  sult_text64(cont
2380: 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 7a  ext, (char*)z, z
2390: 32 2d 7a 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  2-z, SQLITE_TRAN
23a0: 53 49 45 4e 54 2c 0a 20 20 20 20 20 20 20 20 20  SIENT,.         
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
23d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
23e0: 70 31 2b 70 32 3e 6c 65 6e 20 29 7b 0a 20 20 20  p1+p2>len ){.   
23f0: 20 20 20 70 32 20 3d 20 6c 65 6e 2d 70 31 3b 0a     p2 = len-p1;.
2400: 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 29        if( p2<0 )
2410: 20 70 32 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   p2 = 0;.    }. 
2420: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2430: 74 5f 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74  t_blob64(context
2440: 2c 20 28 63 68 61 72 2a 29 26 7a 5b 70 31 5d 2c  , (char*)&z[p1],
2450: 20 28 75 36 34 29 70 32 2c 20 53 51 4c 49 54 45   (u64)p2, SQLITE
2460: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
2470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
2480: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2490: 72 6f 75 6e 64 28 29 20 66 75 6e 63 74 69 6f 6e  round() function
24a0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
24b0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
24c0: 5f 50 4f 49 4e 54 0a 73 74 61 74 69 63 20 76 6f  _POINT.static vo
24d0: 69 64 20 72 6f 75 6e 64 46 75 6e 63 28 73 71 6c  id roundFunc(sql
24e0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
24f0: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
2500: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2510: 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 6e 20  *argv){.  int n 
2520: 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b  = 0;.  double r;
2530: 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20  .  char *zBuf;. 
2540: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
2550: 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20   || argc==2 );. 
2560: 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a   if( argc==2 ){.
2570: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
2580: 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL==sqlite3_val
2590: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29  ue_type(argv[1])
25a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e   ) return;.    n
25b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
25c0: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  _int(argv[1]);. 
25d0: 20 20 20 69 66 28 20 6e 3e 33 30 20 29 20 6e 20     if( n>30 ) n 
25e0: 3d 20 33 30 3b 0a 20 20 20 20 69 66 28 20 6e 3c  = 30;.    if( n<
25f0: 30 20 29 20 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20  0 ) n = 0;.  }. 
2600: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
2610: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
2620: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
2630: 72 65 74 75 72 6e 3b 0a 20 20 72 20 3d 20 73 71  return;.  r = sq
2640: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
2650: 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f  le(argv[0]);.  /
2660: 2a 20 49 66 20 59 3d 3d 30 20 61 6e 64 20 58 20  * If Y==0 and X 
2670: 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 36 34  will fit in a 64
2680: 2d 62 69 74 20 69 6e 74 2c 0a 20 20 2a 2a 20 68  -bit int,.  ** h
2690: 61 6e 64 6c 65 20 74 68 65 20 72 6f 75 6e 64 69  andle the roundi
26a0: 6e 67 20 64 69 72 65 63 74 6c 79 2c 0a 20 20 2a  ng directly,.  *
26b0: 2a 20 6f 74 68 65 72 77 69 73 65 20 75 73 65 20  * otherwise use 
26c0: 70 72 69 6e 74 66 2e 0a 20 20 2a 2f 0a 20 20 69  printf..  */.  i
26d0: 66 28 20 6e 3d 3d 30 20 26 26 20 72 3e 3d 30 20  f( n==0 && r>=0 
26e0: 26 26 20 72 3c 4c 41 52 47 45 53 54 5f 49 4e 54  && r<LARGEST_INT
26f0: 36 34 2d 31 20 29 7b 0a 20 20 20 20 72 20 3d 20  64-1 ){.    r = 
2700: 28 64 6f 75 62 6c 65 29 28 28 73 71 6c 69 74 65  (double)((sqlite
2710: 5f 69 6e 74 36 34 29 28 72 2b 30 2e 35 29 29 3b  _int64)(r+0.5));
2720: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
2730: 30 20 26 26 20 72 3c 30 20 26 26 20 28 2d 72 29  0 && r<0 && (-r)
2740: 3c 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2d 31  <LARGEST_INT64-1
2750: 20 29 7b 0a 20 20 20 20 72 20 3d 20 2d 28 64 6f   ){.    r = -(do
2760: 75 62 6c 65 29 28 28 73 71 6c 69 74 65 5f 69 6e  uble)((sqlite_in
2770: 74 36 34 29 28 28 2d 72 29 2b 30 2e 35 29 29 3b  t64)((-r)+0.5));
2780: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 42  .  }else{.    zB
2790: 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  uf = sqlite3_mpr
27a0: 69 6e 74 66 28 22 25 2e 2a 66 22 2c 6e 2c 72 29  intf("%.*f",n,r)
27b0: 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 3d 3d  ;.    if( zBuf==
27c0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
27d0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
27e0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
27f0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2800: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 41    }.    sqlite3A
2810: 74 6f 46 28 7a 42 75 66 2c 20 26 72 2c 20 73 71  toF(zBuf, &r, sq
2820: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
2830: 75 66 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  uf), SQLITE_UTF8
2840: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2850: 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 20  ree(zBuf);.  }. 
2860: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2870: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
2880: 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  r);.}.#endif../*
2890: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
28a0: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
28b0: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4d  e using sqlite3M
28c0: 61 6c 6c 6f 63 28 29 2e 20 49 66 20 74 68 65 0a  alloc(). If the.
28d0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ** allocation fa
28e0: 69 6c 73 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65  ils, call sqlite
28f0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
2900: 6f 6d 65 6d 28 29 20 74 6f 20 6e 6f 74 69 66 79  omem() to notify
2910: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
2920: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6d 61 6c   handle that mal
2930: 6c 6f 63 28 29 20 68 61 73 20 66 61 69 6c 65 64  loc() has failed
2940: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
2950: 2e 0a 2a 2a 20 49 66 20 6e 42 79 74 65 20 69 73  ..** If nByte is
2960: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
2970: 20 6d 61 78 69 6d 75 6d 20 73 74 72 69 6e 67 20   maximum string 
2980: 6f 72 20 62 6c 6f 62 20 6c 65 6e 67 74 68 2c 20  or blob length, 
2990: 74 68 65 6e 0a 2a 2a 20 72 61 69 73 65 20 61 6e  then.** raise an
29a0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 65   SQLITE_TOOBIG e
29b0: 78 63 65 70 74 69 6f 6e 20 61 6e 64 20 72 65 74  xception and ret
29c0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
29d0: 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 74 65 78  tic void *contex
29e0: 74 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f  tMalloc(sqlite3_
29f0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
2a00: 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
2a10: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74  char *z;.  sqlit
2a20: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
2a30: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
2a40: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 61  le(context);.  a
2a50: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 30 20 29  ssert( nByte>0 )
2a60: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 42  ;.  testcase( nB
2a70: 79 74 65 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  yte==db->aLimit[
2a80: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
2a90: 47 54 48 5d 20 29 3b 0a 20 20 74 65 73 74 63 61  GTH] );.  testca
2aa0: 73 65 28 20 6e 42 79 74 65 3d 3d 64 62 2d 3e 61  se( nByte==db->a
2ab0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
2ac0: 49 54 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b 0a  IT_LENGTH]+1 );.
2ad0: 20 20 69 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e    if( nByte>db->
2ae0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
2af0: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
2b00: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2b10: 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63  t_error_toobig(c
2b20: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7a 20 3d  ontext);.    z =
2b30: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2b40: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   z = sqlite3Mall
2b50: 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  oc(nByte);.    i
2b60: 66 28 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 73  f( !z ){.      s
2b70: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2b80: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
2b90: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2ba0: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a  return z;.}../*.
2bb0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2bc0: 6e 20 6f 66 20 74 68 65 20 75 70 70 65 72 28 29  n of the upper()
2bd0: 20 61 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c   and lower() SQL
2be0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   functions..*/.s
2bf0: 74 61 74 69 63 20 76 6f 69 64 20 75 70 70 65 72  tatic void upper
2c00: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
2c10: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
2c20: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
2c30: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
2c40: 20 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f    char *z1;.  co
2c50: 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  nst char *z2;.  
2c60: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 55 4e 55 53  int i, n;.  UNUS
2c70: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
2c80: 63 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72  c);.  z2 = (char
2c90: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
2ca0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
2cb0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
2cc0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
2cd0: 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  );.  /* Verify t
2ce0: 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
2cf0: 5f 62 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f  _bytes() does no
2d00: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  t invalidate the
2d10: 20 5f 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72   _text() pointer
2d20: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32   */.  assert( z2
2d30: 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  ==(char*)sqlite3
2d40: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
2d50: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32  [0]) );.  if( z2
2d60: 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e   ){.    z1 = con
2d70: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
2d80: 78 74 2c 20 28 28 69 36 34 29 6e 29 2b 31 29 3b  xt, ((i64)n)+1);
2d90: 0a 20 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20  .    if( z1 ){. 
2da0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2db0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
2dc0: 20 7a 31 5b 69 5d 20 3d 20 28 63 68 61 72 29 73   z1[i] = (char)s
2dd0: 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28 7a 32  qlite3Toupper(z2
2de0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
2df0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2e00: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
2e10: 20 7a 31 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f   z1, n, sqlite3_
2e20: 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  free);.    }.  }
2e30: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
2e40: 6f 77 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33  owerFunc(sqlite3
2e50: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
2e60: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
2e70: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
2e80: 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31 3b 0a  v){.  char *z1;.
2e90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
2ea0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
2eb0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2ec0: 28 61 72 67 63 29 3b 0a 20 20 7a 32 20 3d 20 28  (argc);.  z2 = (
2ed0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
2ee0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
2ef0: 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
2f00: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
2f10: 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20 56 65 72 69  v[0]);.  /* Veri
2f20: 66 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  fy that the call
2f30: 20 74 6f 20 5f 62 79 74 65 73 28 29 20 64 6f 65   to _bytes() doe
2f40: 73 20 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65  s not invalidate
2f50: 20 74 68 65 20 5f 74 65 78 74 28 29 20 70 6f 69   the _text() poi
2f60: 6e 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  nter */.  assert
2f70: 28 20 7a 32 3d 3d 28 63 68 61 72 2a 29 73 71 6c  ( z2==(char*)sql
2f80: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
2f90: 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66  argv[0]) );.  if
2fa0: 28 20 7a 32 20 29 7b 0a 20 20 20 20 7a 31 20 3d  ( z2 ){.    z1 =
2fb0: 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63   contextMalloc(c
2fc0: 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29  ontext, ((i64)n)
2fd0: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 7a 31 20  +1);.    if( z1 
2fe0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
2ff0: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3000: 20 20 20 20 20 7a 31 5b 69 5d 20 3d 20 73 71 6c       z1[i] = sql
3010: 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a 32 5b 69  ite3Tolower(z2[i
3020: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
3030: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3040: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
3050: 31 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72  1, n, sqlite3_fr
3060: 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ee);.    }.  }.}
3070: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 66 75 6e  ../*.** Some fun
3080: 63 74 69 6f 6e 73 20 6c 69 6b 65 20 43 4f 41 4c  ctions like COAL
3090: 45 53 43 45 28 29 20 61 6e 64 20 49 46 4e 55 4c  ESCE() and IFNUL
30a0: 4c 28 29 20 61 6e 64 20 55 4e 4c 49 4b 45 4c 59  L() and UNLIKELY
30b0: 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  () are implement
30c0: 65 64 0a 2a 2a 20 61 73 20 56 44 42 45 20 63 6f  ed.** as VDBE co
30d0: 64 65 20 73 6f 20 74 68 61 74 20 75 6e 75 73 65  de so that unuse
30e0: 64 20 61 72 67 75 6d 65 6e 74 20 76 61 6c 75 65  d argument value
30f0: 73 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  s do not have to
3100: 20 62 65 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2a   be computed..**
3110: 20 48 6f 77 65 76 65 72 2c 20 77 65 20 73 74 69   However, we sti
3120: 6c 6c 20 6e 65 65 64 20 73 6f 6d 65 20 6b 69 6e  ll need some kin
3130: 64 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 69 6d  d of function im
3140: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  plementation for
3150: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
3160: 73 20 69 6e 20 74 68 65 20 66 75 6e 63 74 69 6f  s in the functio
3170: 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6e 6f  n table.  The no
3180: 6f 70 46 75 6e 63 20 6d 61 63 72 6f 20 70 72 6f  opFunc macro pro
3190: 76 69 64 65 73 20 74 68 69 73 2e 0a 2a 2a 20 6e  vides this..** n
31a0: 6f 6f 70 46 75 6e 63 20 77 69 6c 6c 20 6e 65 76  oopFunc will nev
31b0: 65 72 20 62 65 20 63 61 6c 6c 65 64 20 73 6f 20  er be called so 
31c0: 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  it doesn't matte
31d0: 72 20 77 68 61 74 20 74 68 65 20 69 6d 70 6c 65  r what the imple
31e0: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 69 73 2e  mentation.** is.
31f0: 20 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65    We might as we
3200: 6c 6c 20 75 73 65 20 74 68 65 20 22 76 65 72 73  ll use the "vers
3210: 69 6f 6e 28 29 22 20 66 75 6e 63 74 69 6f 6e 20  ion()" function 
3220: 61 73 20 61 20 73 75 62 73 74 69 74 75 74 65 2e  as a substitute.
3230: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 6e 6f 6f 70  .*/.#define noop
3240: 46 75 6e 63 20 76 65 72 73 69 6f 6e 46 75 6e 63  Func versionFunc
3250: 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
3260: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 6e 65 76 65   function - neve
3270: 72 20 63 61 6c 6c 65 64 20 2a 2f 0a 0a 2f 2a 0a  r called */../*.
3280: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3290: 6e 20 6f 66 20 72 61 6e 64 6f 6d 28 29 2e 20 20  n of random().  
32a0: 52 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20  Return a random 
32b0: 69 6e 74 65 67 65 72 2e 20 20 0a 2a 2f 0a 73 74  integer.  .*/.st
32c0: 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d  atic void random
32d0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
32e0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
32f0: 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c  ,.  int NotUsed,
3300: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3310: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
3320: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 3b   sqlite_int64 r;
3330: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
3340: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
3350: 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74  tUsed2);.  sqlit
3360: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
3370: 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20  zeof(r), &r);.  
3380: 69 66 28 20 72 3c 30 20 29 7b 0a 20 20 20 20 2f  if( r<0 ){.    /
3390: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 70 72 65  * We need to pre
33a0: 76 65 6e 74 20 61 20 72 61 6e 64 6f 6d 20 6e 75  vent a random nu
33b0: 6d 62 65 72 20 6f 66 20 30 78 38 30 30 30 30 30  mber of 0x800000
33c0: 30 30 30 30 30 30 30 30 30 30 20 0a 20 20 20 20  0000000000 .    
33d0: 2a 2a 20 28 6f 72 20 2d 39 32 32 33 33 37 32 30  ** (or -92233720
33e0: 33 36 38 35 34 37 37 35 38 30 38 29 20 73 69 6e  36854775808) sin
33f0: 63 65 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 61  ce when you do a
3400: 62 73 28 29 20 6f 66 20 74 68 61 74 0a 20 20 20  bs() of that.   
3410: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 79 6f   ** number of yo
3420: 75 20 67 65 74 20 74 68 65 20 73 61 6d 65 20 76  u get the same v
3430: 61 6c 75 65 20 62 61 63 6b 20 61 67 61 69 6e 2e  alue back again.
3440: 20 20 54 6f 20 64 6f 20 74 68 69 73 0a 20 20 20    To do this.   
3450: 20 2a 2a 20 69 6e 20 61 20 77 61 79 20 74 68 61   ** in a way tha
3460: 74 20 69 73 20 74 65 73 74 61 62 6c 65 2c 20 6d  t is testable, m
3470: 61 73 6b 20 74 68 65 20 73 69 67 6e 20 62 69 74  ask the sign bit
3480: 20 6f 66 66 20 6f 66 20 6e 65 67 61 74 69 76 65   off of negative
3490: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 2c 20  .    ** values, 
34a0: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 70  resulting in a p
34b0: 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2e 20 20  ositive value.  
34c0: 54 68 65 6e 20 74 61 6b 65 20 74 68 65 20 0a 20  Then take the . 
34d0: 20 20 20 2a 2a 20 32 73 20 63 6f 6d 70 6c 65 6d     ** 2s complem
34e0: 65 6e 74 20 6f 66 20 74 68 61 74 20 70 6f 73 69  ent of that posi
34f0: 74 69 76 65 20 76 61 6c 75 65 2e 20 20 54 68 65  tive value.  The
3500: 20 65 6e 64 20 72 65 73 75 6c 74 20 63 61 6e 0a   end result can.
3510: 20 20 20 20 2a 2a 20 74 68 65 72 65 66 6f 72 65      ** therefore
3520: 20 62 65 20 6e 6f 20 6c 65 73 73 20 74 68 61 6e   be no less than
3530: 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37   -92233720368547
3540: 37 35 38 30 37 2e 0a 20 20 20 20 2a 2f 0a 20 20  75807..    */.  
3550: 20 20 72 20 3d 20 2d 28 72 20 26 20 4c 41 52 47    r = -(r & LARG
3560: 45 53 54 5f 49 4e 54 36 34 29 3b 0a 20 20 7d 0a  EST_INT64);.  }.
3570: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3580: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
3590: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  r);.}../*.** Imp
35a0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72  lementation of r
35b0: 61 6e 64 6f 6d 62 6c 6f 62 28 4e 29 2e 20 20 52  andomblob(N).  R
35c0: 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 62  eturn a random b
35d0: 6c 6f 62 0a 2a 2a 20 74 68 61 74 20 69 73 20 4e  lob.** that is N
35e0: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a   bytes long..*/.
35f0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64  static void rand
3600: 6f 6d 42 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65  omBlob(.  sqlite
3610: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
3620: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
3630: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3640: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
3650: 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  n;.  unsigned ch
3660: 61 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  ar *p;.  assert(
3670: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
3680: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
3690: 72 67 63 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  rgc);.  n = sqli
36a0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
36b0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3c  gv[0]);.  if( n<
36c0: 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 31 3b 0a  1 ){.    n = 1;.
36d0: 20 20 7d 0a 20 20 70 20 3d 20 63 6f 6e 74 65 78    }.  p = contex
36e0: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
36f0: 20 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   n);.  if( p ){.
3700: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
3710: 6f 6d 6e 65 73 73 28 6e 2c 20 70 29 3b 0a 20 20  omness(n, p);.  
3720: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3730: 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28  _blob(context, (
3740: 63 68 61 72 2a 29 70 2c 20 6e 2c 20 73 71 6c 69  char*)p, n, sqli
3750: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d  te3_free);.  }.}
3760: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
3770: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
3780: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
3790: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
37a0: 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76   The return.** v
37b0: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
37c0: 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f   as the sqlite3_
37d0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
37e0: 64 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  d() API function
37f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3800: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
3810: 69 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  id(.  sqlite3_co
3820: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
3830: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20  .  int NotUsed, 
3840: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3850: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
3860: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
3870: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
3880: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
3890: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
38a0: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
38b0: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20  NotUsed2);.  /* 
38c0: 49 4d 50 3a 20 52 2d 35 31 35 31 33 2d 31 32 30  IMP: R-51513-120
38d0: 32 36 20 54 68 65 20 6c 61 73 74 5f 69 6e 73 65  26 The last_inse
38e0: 72 74 5f 72 6f 77 69 64 28 29 20 53 51 4c 20 66  rt_rowid() SQL f
38f0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 20 20 2a  unction is a.  *
3900: 2a 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  * wrapper around
3910: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73   the sqlite3_las
3920: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
3930: 20 43 2f 43 2b 2b 20 69 6e 74 65 72 66 61 63 65   C/C++ interface
3940: 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  .  ** function. 
3950: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  */.  sqlite3_res
3960: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
3970: 74 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  t, sqlite3_last_
3980: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62 29  insert_rowid(db)
3990: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
39a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
39b0: 65 20 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20  e changes() SQL 
39c0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
39d0: 49 4d 50 3a 20 52 2d 36 32 30 37 33 2d 31 31 32  IMP: R-62073-112
39e0: 30 39 20 54 68 65 20 63 68 61 6e 67 65 73 28 29  09 The changes()
39f0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73   SQL function is
3a00: 20 61 20 77 72 61 70 70 65 72 0a 2a 2a 20 61 72   a wrapper.** ar
3a10: 6f 75 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33  ound the sqlite3
3a20: 5f 63 68 61 6e 67 65 73 28 29 20 43 2f 43 2b 2b  _changes() C/C++
3a30: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 68 65   function and he
3a40: 6e 63 65 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  nce follows the 
3a50: 73 61 6d 65 0a 2a 2a 20 72 75 6c 65 73 20 66 6f  same.** rules fo
3a60: 72 20 63 6f 75 6e 74 69 6e 67 20 63 68 61 6e 67  r counting chang
3a70: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
3a80: 69 64 20 63 68 61 6e 67 65 73 28 0a 20 20 73 71  id changes(.  sq
3a90: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3aa0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
3ab0: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
3ac0: 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
3ad0: 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  2.){.  sqlite3 *
3ae0: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
3af0: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
3b00: 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45  ontext);.  UNUSE
3b10: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
3b20: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
3b30: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
3b40: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
3b50: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64  qlite3_changes(d
3b60: 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  b));.}../*.** Im
3b70: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
3b80: 74 68 65 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65  the total_change
3b90: 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  s() SQL function
3ba0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
3bb0: 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 73 61  lue is.** the sa
3bc0: 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  me as the sqlite
3bd0: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
3be0: 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  ) API function..
3bf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
3c00: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 0a 20 20  otal_changes(.  
3c10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3c20: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
3c30: 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74  NotUsed,.  sqlit
3c40: 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73  e3_value **NotUs
3c50: 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  ed2.){.  sqlite3
3c60: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
3c70: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
3c80: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55  (context);.  UNU
3c90: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
3ca0: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
3cb0: 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  );.  /* IMP: R-5
3cc0: 32 37 35 36 2d 34 31 39 39 33 20 54 68 69 73 20  2756-41993 This 
3cd0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
3ce0: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65  apper around the
3cf0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 6f  .  ** sqlite3_to
3d00: 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 43 2f  tal_changes() C/
3d10: 43 2b 2b 20 69 6e 74 65 72 66 61 63 65 2e 20 2a  C++ interface. *
3d20: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  /.  sqlite3_resu
3d30: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
3d40: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
3d50: 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f  anges(db));.}../
3d60: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
3d70: 20 64 65 66 69 6e 69 6e 67 20 68 6f 77 20 74 6f   defining how to
3d80: 20 64 6f 20 47 4c 4f 42 2d 73 74 79 6c 65 20 63   do GLOB-style c
3d90: 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2f 0a 73  omparisons..*/.s
3da0: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
3db0: 6f 20 7b 0a 20 20 75 38 20 6d 61 74 63 68 41 6c  o {.  u8 matchAl
3dc0: 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22  l;          /* "
3dd0: 2a 22 20 6f 72 20 22 25 22 20 2a 2f 0a 20 20 75  *" or "%" */.  u
3de0: 38 20 6d 61 74 63 68 4f 6e 65 3b 20 20 20 20 20  8 matchOne;     
3df0: 20 20 20 20 20 2f 2a 20 22 3f 22 20 6f 72 20 22       /* "?" or "
3e00: 5f 22 20 2a 2f 0a 20 20 75 38 20 6d 61 74 63 68  _" */.  u8 match
3e10: 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Set;          /*
3e20: 20 22 5b 22 20 6f 72 20 30 20 2a 2f 0a 20 20 75   "[" or 0 */.  u
3e30: 38 20 6e 6f 43 61 73 65 3b 20 20 20 20 20 20 20  8 noCase;       
3e40: 20 20 20 20 20 2f 2a 20 74 72 75 65 20 74 6f 20       /* true to 
3e50: 69 67 6e 6f 72 65 20 63 61 73 65 20 64 69 66 66  ignore case diff
3e60: 65 72 65 6e 63 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  erences */.};../
3e70: 2a 0a 2a 2a 20 46 6f 72 20 4c 49 4b 45 20 61 6e  *.** For LIKE an
3e80: 64 20 47 4c 4f 42 20 6d 61 74 63 68 69 6e 67 20  d GLOB matching 
3e90: 6f 6e 20 45 42 43 44 49 43 20 6d 61 63 68 69 6e  on EBCDIC machin
3ea0: 65 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  es, assume that 
3eb0: 65 76 65 72 79 0a 2a 2a 20 63 68 61 72 61 63 74  every.** charact
3ec0: 65 72 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e  er is exactly on
3ed0: 65 20 62 79 74 65 20 69 6e 20 73 69 7a 65 2e 20  e byte in size. 
3ee0: 20 41 6c 73 6f 2c 20 70 72 6f 76 64 65 20 74 68   Also, provde th
3ef0: 65 20 55 74 66 38 52 65 61 64 28 29 0a 2a 2a 20  e Utf8Read().** 
3f00: 6d 61 63 72 6f 20 66 6f 72 20 66 61 73 74 20 72  macro for fast r
3f10: 65 61 64 69 6e 67 20 6f 66 20 74 68 65 20 6e 65  eading of the ne
3f20: 78 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  xt character in 
3f30: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
3f40: 77 68 65 72 65 0a 2a 2a 20 74 68 65 20 6e 65 78  where.** the nex
3f50: 74 20 63 68 61 72 61 63 74 65 72 20 69 73 20 41  t character is A
3f60: 53 43 49 49 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  SCII..*/.#if def
3f70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 42 43 44  ined(SQLITE_EBCD
3f80: 49 43 29 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  IC).# define sql
3f90: 69 74 65 33 55 74 66 38 52 65 61 64 28 41 29 20  ite3Utf8Read(A) 
3fa0: 20 20 20 20 20 20 20 28 2a 28 28 2a 41 29 2b 2b         (*((*A)++
3fb0: 29 29 0a 23 20 64 65 66 69 6e 65 20 55 74 66 38  )).# define Utf8
3fc0: 52 65 61 64 28 41 29 20 20 20 20 20 20 20 20 20  Read(A)         
3fd0: 20 20 20 20 20 20 28 2a 28 41 2b 2b 29 29 0a 23        (*(A++)).#
3fe0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 74  else.# define Ut
3ff0: 66 38 52 65 61 64 28 41 29 20 20 20 20 20 20 20  f8Read(A)       
4000: 20 20 20 20 20 20 20 20 28 41 5b 30 5d 3c 30 78          (A[0]<0x
4010: 38 30 3f 2a 28 41 2b 2b 29 3a 73 71 6c 69 74 65  80?*(A++):sqlite
4020: 33 55 74 66 38 52 65 61 64 28 26 41 29 29 0a 23  3Utf8Read(&A)).#
4030: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 63 6f  endif..static co
4040: 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61  nst struct compa
4050: 72 65 49 6e 66 6f 20 67 6c 6f 62 49 6e 66 6f 20  reInfo globInfo 
4060: 3d 20 7b 20 27 2a 27 2c 20 27 3f 27 2c 20 27 5b  = { '*', '?', '[
4070: 27 2c 20 30 20 7d 3b 0a 2f 2a 20 54 68 65 20 63  ', 0 };./* The c
4080: 6f 72 72 65 63 74 20 53 51 4c 2d 39 32 20 62 65  orrect SQL-92 be
4090: 68 61 76 69 6f 72 20 69 73 20 66 6f 72 20 74 68  havior is for th
40a0: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
40b0: 74 6f 20 69 67 6e 6f 72 65 0a 2a 2a 20 63 61 73  to ignore.** cas
40c0: 65 2e 20 20 54 68 75 73 20 20 27 61 27 20 4c 49  e.  Thus  'a' LI
40d0: 4b 45 20 27 41 27 20 77 6f 75 6c 64 20 62 65 20  KE 'A' would be 
40e0: 74 72 75 65 2e 20 2a 2f 0a 73 74 61 74 69 63 20  true. */.static 
40f0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d  const struct com
4100: 70 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66  pareInfo likeInf
4110: 6f 4e 6f 72 6d 20 3d 20 7b 20 27 25 27 2c 20 27  oNorm = { '%', '
4120: 5f 27 2c 20 20 20 30 2c 20 31 20 7d 3b 0a 2f 2a  _',   0, 1 };./*
4130: 20 49 66 20 53 51 4c 49 54 45 5f 43 41 53 45 5f   If SQLITE_CASE_
4140: 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 20 69  SENSITIVE_LIKE i
4150: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  s defined, then 
4160: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
4170: 72 0a 2a 2a 20 69 73 20 63 61 73 65 20 73 65 6e  r.** is case sen
4180: 73 69 74 69 76 65 20 63 61 75 73 69 6e 67 20 27  sitive causing '
4190: 61 27 20 4c 49 4b 45 20 27 41 27 20 74 6f 20 62  a' LIKE 'A' to b
41a0: 65 20 66 61 6c 73 65 20 2a 2f 0a 73 74 61 74 69  e false */.stati
41b0: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63  c const struct c
41c0: 6f 6d 70 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49  ompareInfo likeI
41d0: 6e 66 6f 41 6c 74 20 3d 20 7b 20 27 25 27 2c 20  nfoAlt = { '%', 
41e0: 27 5f 27 2c 20 20 20 30 2c 20 30 20 7d 3b 0a 0a  '_',   0, 0 };..
41f0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
4200: 6f 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73 20  o UTF-8 strings 
4210: 66 6f 72 20 65 71 75 61 6c 69 74 79 20 77 68 65  for equality whe
4220: 72 65 20 74 68 65 20 66 69 72 73 74 20 73 74 72  re the first str
4230: 69 6e 67 20 63 61 6e 0a 2a 2a 20 70 6f 74 65 6e  ing can.** poten
4240: 74 69 61 6c 6c 79 20 62 65 20 61 20 22 67 6c 6f  tially be a "glo
4250: 62 22 20 6f 72 20 22 6c 69 6b 65 22 20 65 78 70  b" or "like" exp
4260: 72 65 73 73 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ression.  Return
4270: 20 74 72 75 65 20 28 31 29 20 69 66 20 74 68 65   true (1) if the
4280: 79 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  y.** are the sam
4290: 65 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29 20  e and false (0) 
42a0: 69 66 20 74 68 65 79 20 61 72 65 20 64 69 66 66  if they are diff
42b0: 65 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f  erent..**.** Glo
42c0: 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a  bbing rules:.**.
42d0: 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20  **      '*'     
42e0: 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65    Matches any se
42f0: 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f  quence of zero o
4300: 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72  r more character
4310: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f  s..**.**      '?
4320: 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  '       Matches 
4330: 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72  exactly one char
4340: 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  acter..**.**    
4350: 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63   [...]      Matc
4360: 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65  hes one characte
4370: 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f  r from the enclo
4380: 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20  sed list of.**  
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
43a0: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
43b0: 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d      [^...]     M
43c0: 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
43d0: 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20  cter not in the 
43e0: 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a  enclosed list..*
43f0: 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 5b 2e  *.** With the [.
4400: 2e 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d  ..] and [^...] m
4410: 61 74 63 68 69 6e 67 2c 20 61 20 27 5d 27 20 63  atching, a ']' c
4420: 68 61 72 61 63 74 65 72 20 63 61 6e 20 62 65 20  haracter can be 
4430: 69 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74  included.** in t
4440: 68 65 20 6c 69 73 74 20 62 79 20 6d 61 6b 69 6e  he list by makin
4450: 67 20 69 74 20 74 68 65 20 66 69 72 73 74 20 63  g it the first c
4460: 68 61 72 61 63 74 65 72 20 61 66 74 65 72 20 27  haracter after '
4470: 5b 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a 2a 2a  [' or '^'.  A.**
4480: 20 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61 63   range of charac
4490: 74 65 72 73 20 63 61 6e 20 62 65 20 73 70 65 63  ters can be spec
44a0: 69 66 69 65 64 20 75 73 69 6e 67 20 27 2d 27 2e  ified using '-'.
44b0: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 5b    Example:.** "[
44c0: 61 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20 61 6e  a-z]" matches an
44d0: 79 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72 2d 63  y single lower-c
44e0: 61 73 65 20 6c 65 74 74 65 72 2e 20 20 54 6f 20  ase letter.  To 
44f0: 6d 61 74 63 68 20 61 20 27 2d 27 2c 20 6d 61 6b  match a '-', mak
4500: 65 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61 73 74  e.** it the last
4510: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
4520: 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 4c 69  e list..**.** Li
4530: 6b 65 20 6d 61 74 63 68 69 6e 67 20 72 75 6c 65  ke matching rule
4540: 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 27  s:.** .**      '
4550: 25 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  %'       Matches
4560: 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
4570: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68   zero or more ch
4580: 61 72 61 63 74 65 72 73 0a 2a 2a 0a 2a 2a 2a 20  aracters.**.*** 
4590: 20 20 20 20 27 5f 27 20 20 20 20 20 20 20 4d 61      '_'       Ma
45a0: 74 63 68 65 73 20 61 6e 79 20 6f 6e 65 20 63 68  tches any one ch
45b0: 61 72 61 63 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  aracter.**.**   
45c0: 20 20 20 45 63 20 20 20 20 20 20 20 20 57 68 65     Ec        Whe
45d0: 72 65 20 45 20 69 73 20 74 68 65 20 22 65 73 63  re E is the "esc
45e0: 22 20 63 68 61 72 61 63 74 65 72 20 61 6e 64 20  " character and 
45f0: 63 20 69 73 20 61 6e 79 20 6f 74 68 65 72 0a 2a  c is any other.*
4600: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
4610: 20 63 68 61 72 61 63 74 65 72 2c 20 69 6e 63 6c   character, incl
4620: 75 64 69 6e 67 20 27 25 27 2c 20 27 5f 27 2c 20  uding '%', '_', 
4630: 61 6e 64 20 65 73 63 2c 20 6d 61 74 63 68 20 65  and esc, match e
4640: 78 61 63 74 6c 79 20 63 2e 0a 2a 2a 0a 2a 2a 20  xactly c..**.** 
4650: 54 68 65 20 63 6f 6d 6d 65 6e 74 73 20 77 69 74  The comments wit
4660: 68 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hin this routine
4670: 20 75 73 75 61 6c 6c 79 20 61 73 73 75 6d 65 20   usually assume 
4680: 67 6c 6f 62 20 6d 61 74 63 68 69 6e 67 2e 0a 2a  glob matching..*
4690: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
46a0: 65 20 69 73 20 75 73 75 61 6c 6c 79 20 71 75 69  e is usually qui
46b0: 63 6b 2c 20 62 75 74 20 63 61 6e 20 62 65 20 4e  ck, but can be N
46c0: 2a 2a 32 20 69 6e 20 74 68 65 20 77 6f 72 73 74  **2 in the worst
46d0: 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
46e0: 20 69 6e 74 20 70 61 74 74 65 72 6e 43 6f 6d 70   int patternComp
46f0: 61 72 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20  are(.  const u8 
4700: 2a 7a 50 61 74 74 65 72 6e 2c 20 20 20 20 20 20  *zPattern,      
4710: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67          /* The g
4720: 6c 6f 62 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20  lob pattern */. 
4730: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 53 74 72 69   const u8 *zStri
4740: 6e 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ng,             
4750: 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 20    /* The string 
4760: 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
4770: 73 74 20 74 68 65 20 67 6c 6f 62 20 2a 2f 0a 20  st the glob */. 
4780: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f   const struct co
4790: 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f  mpareInfo *pInfo
47a0: 2c 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  , /* Information
47b0: 20 61 62 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f   about how to do
47c0: 20 74 68 65 20 63 6f 6d 70 61 72 65 20 2a 2f 0a   the compare */.
47d0: 20 20 75 33 32 20 6d 61 74 63 68 4f 74 68 65 72    u32 matchOther
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65     /* The escape
4800: 20 63 68 61 72 20 28 4c 49 4b 45 29 20 6f 72 20   char (LIKE) or 
4810: 27 5b 27 20 28 47 4c 4f 42 29 20 2a 2f 0a 29 7b  '[' (GLOB) */.){
4820: 0a 20 20 75 33 32 20 63 2c 20 63 32 3b 20 20 20  .  u32 c, c2;   
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 20 20 20 20 2f 2a 20 4e 65 78 74 20 70 61 74 74      /* Next patt
4850: 65 72 6e 20 61 6e 64 20 69 6e 70 75 74 20 73 74  ern and input st
4860: 72 69 6e 67 20 63 68 61 72 73 20 2a 2f 0a 20 20  ring chars */.  
4870: 75 33 32 20 6d 61 74 63 68 4f 6e 65 20 3d 20 70  u32 matchOne = p
4880: 49 6e 66 6f 2d 3e 6d 61 74 63 68 4f 6e 65 3b 20  Info->matchOne; 
4890: 20 2f 2a 20 22 3f 22 20 6f 72 20 22 5f 22 20 2a   /* "?" or "_" *
48a0: 2f 0a 20 20 75 33 32 20 6d 61 74 63 68 41 6c 6c  /.  u32 matchAll
48b0: 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 41   = pInfo->matchA
48c0: 6c 6c 3b 20 20 2f 2a 20 22 2a 22 20 6f 72 20 22  ll;  /* "*" or "
48d0: 25 22 20 2a 2f 0a 20 20 75 38 20 6e 6f 43 61 73  %" */.  u8 noCas
48e0: 65 20 3d 20 70 49 6e 66 6f 2d 3e 6e 6f 43 61 73  e = pInfo->noCas
48f0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e;       /* True
4900: 20 69 66 20 75 70 70 65 72 63 61 73 65 3d 3d 6c   if uppercase==l
4910: 6f 77 65 72 63 61 73 65 20 2a 2f 0a 20 20 63 6f  owercase */.  co
4920: 6e 73 74 20 75 38 20 2a 7a 45 73 63 61 70 65 64  nst u8 *zEscaped
4930: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
4940: 2a 20 4f 6e 65 20 70 61 73 74 20 74 68 65 20 6c  * One past the l
4950: 61 73 74 20 65 73 63 61 70 65 64 20 69 6e 70 75  ast escaped inpu
4960: 74 20 63 68 61 72 20 2a 2f 0a 20 20 0a 20 20 77  t char */.  .  w
4970: 68 69 6c 65 28 20 28 63 20 3d 20 55 74 66 38 52  hile( (c = Utf8R
4980: 65 61 64 28 7a 50 61 74 74 65 72 6e 29 29 21 3d  ead(zPattern))!=
4990: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  0 ){.    if( c==
49a0: 6d 61 74 63 68 41 6c 6c 20 29 7b 20 20 2f 2a 20  matchAll ){  /* 
49b0: 4d 61 74 63 68 20 22 2a 22 20 2a 2f 0a 20 20 20  Match "*" */.   
49c0: 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20     /* Skip over 
49d0: 6d 75 6c 74 69 70 6c 65 20 22 2a 22 20 63 68 61  multiple "*" cha
49e0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 70  racters in the p
49f0: 61 74 74 65 72 6e 2e 20 20 49 66 20 74 68 65 72  attern.  If ther
4a00: 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20 61  e.      ** are a
4a10: 6c 73 6f 20 22 3f 22 20 63 68 61 72 61 63 74 65  lso "?" characte
4a20: 72 73 2c 20 73 6b 69 70 20 74 68 6f 73 65 20 61  rs, skip those a
4a30: 73 20 77 65 6c 6c 2c 20 62 75 74 20 63 6f 6e 73  s well, but cons
4a40: 75 6d 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  ume a.      ** s
4a50: 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 20  ingle character 
4a60: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  of the input str
4a70: 69 6e 67 20 66 6f 72 20 65 61 63 68 20 22 3f 22  ing for each "?"
4a80: 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20   skipped */.    
4a90: 20 20 77 68 69 6c 65 28 20 28 63 3d 55 74 66 38    while( (c=Utf8
4aa0: 52 65 61 64 28 7a 50 61 74 74 65 72 6e 29 29 20  Read(zPattern)) 
4ab0: 3d 3d 20 6d 61 74 63 68 41 6c 6c 20 7c 7c 20 63  == matchAll || c
4ac0: 20 3d 3d 20 6d 61 74 63 68 4f 6e 65 20 29 7b 0a   == matchOne ){.
4ad0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 6d          if( c==m
4ae0: 61 74 63 68 4f 6e 65 20 26 26 20 73 71 6c 69 74  atchOne && sqlit
4af0: 65 33 55 74 66 38 52 65 61 64 28 26 7a 53 74 72  e3Utf8Read(&zStr
4b00: 69 6e 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ing)==0 ){.     
4b10: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
4b20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4b30: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
4b40: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4b50: 6e 20 31 3b 20 20 20 2f 2a 20 22 2a 22 20 61 74  n 1;   /* "*" at
4b60: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
4b70: 70 61 74 74 65 72 6e 20 6d 61 74 63 68 65 73 20  pattern matches 
4b80: 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  */.      }else i
4b90: 66 28 20 63 3d 3d 6d 61 74 63 68 4f 74 68 65 72  f( c==matchOther
4ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
4bb0: 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65 74 3d  pInfo->matchSet=
4bc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4bd0: 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  c = sqlite3Utf8R
4be0: 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a  ead(&zPattern);.
4bf0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
4c00: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4c10: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
4c20: 20 20 20 20 20 20 20 20 2f 2a 20 22 5b 2e 2e 2e          /* "[...
4c30: 5d 22 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ]" immediately f
4c40: 6f 6c 6c 6f 77 73 20 74 68 65 20 22 2a 22 2e 20  ollows the "*". 
4c50: 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 61   We have to do a
4c60: 20 73 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 20   slow.          
4c70: 2a 2a 20 72 65 63 75 72 73 69 76 65 20 73 65 61  ** recursive sea
4c80: 72 63 68 20 69 6e 20 74 68 69 73 20 63 61 73 65  rch in this case
4c90: 2c 20 62 75 74 20 69 74 20 69 73 20 61 6e 20 75  , but it is an u
4ca0: 6e 75 73 75 61 6c 20 63 61 73 65 2e 20 2a 2f 0a  nusual case. */.
4cb0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
4cc0: 28 20 6d 61 74 63 68 4f 74 68 65 72 3c 30 78 38  ( matchOther<0x8
4cd0: 30 20 29 3b 20 20 2f 2a 20 27 5b 27 20 69 73 20  0 );  /* '[' is 
4ce0: 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 63 68  a single-byte ch
4cf0: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 20 20 20  aracter */.     
4d00: 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 53 74       while( *zSt
4d10: 72 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20  ring.           
4d20: 20 20 20 20 20 20 26 26 20 70 61 74 74 65 72 6e        && pattern
4d30: 43 6f 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72  Compare(&zPatter
4d40: 6e 5b 2d 31 5d 2c 7a 53 74 72 69 6e 67 2c 70 49  n[-1],zString,pI
4d50: 6e 66 6f 2c 6d 61 74 63 68 4f 74 68 65 72 29 3d  nfo,matchOther)=
4d60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4d70: 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54    SQLITE_SKIP_UT
4d80: 46 38 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  F8(zString);.   
4d90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4da0: 20 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69     return *zStri
4db0: 6e 67 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 7d  ng!=0;.        }
4dc0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4dd0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
4de0: 20 76 61 72 69 61 62 6c 65 20 63 20 63 6f 6e 74   variable c cont
4df0: 61 69 6e 73 20 74 68 65 20 66 69 72 73 74 20 63  ains the first c
4e00: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a  haracter of the.
4e10: 20 20 20 20 20 20 2a 2a 20 70 61 74 74 65 72 6e        ** pattern
4e20: 20 73 74 72 69 6e 67 20 70 61 73 74 20 74 68 65   string past the
4e30: 20 22 2a 22 2e 20 20 53 65 61 72 63 68 20 69 6e   "*".  Search in
4e40: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
4e50: 67 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20  g for the.      
4e60: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
4e70: 67 20 63 68 61 72 61 63 74 65 72 20 61 6e 64 20  g character and 
4e80: 72 65 63 75 72 73 69 76 65 6c 79 20 63 6f 6e 74  recursively cont
4e90: 69 6e 65 20 74 68 65 20 6d 61 74 63 68 20 66 72  ine the match fr
4ea0: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  om.      ** that
4eb0: 20 70 6f 69 6e 74 2e 0a 20 20 20 20 20 20 2a 2a   point..      **
4ec0: 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
4ed0: 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
4ee0: 20 73 65 61 72 63 68 2c 20 73 65 74 20 76 61 72   search, set var
4ef0: 69 61 62 6c 65 20 63 78 20 74 6f 20 62 65 20 74  iable cx to be t
4f00: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 20 20 20  he same as.     
4f10: 20 2a 2a 20 63 20 62 75 74 20 69 6e 20 74 68 65   ** c but in the
4f20: 20 6f 74 68 65 72 20 63 61 73 65 20 61 6e 64 20   other case and 
4f30: 73 65 61 72 63 68 20 74 68 65 20 69 6e 70 75 74  search the input
4f40: 20 73 74 72 69 6e 67 20 66 6f 72 20 65 69 74 68   string for eith
4f50: 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 20 6f 72  er.      ** c or
4f60: 20 63 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   cx..      */.  
4f70: 20 20 20 20 69 66 28 20 63 3c 3d 30 78 38 30 20      if( c<=0x80 
4f80: 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  ){.        u32 c
4f90: 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  x;.        if( n
4fa0: 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  oCase ){.       
4fb0: 20 20 20 63 78 20 3d 20 73 71 6c 69 74 65 33 54     cx = sqlite3T
4fc0: 6f 75 70 70 65 72 28 63 29 3b 0a 20 20 20 20 20  oupper(c);.     
4fd0: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
4fe0: 54 6f 6c 6f 77 65 72 28 63 29 3b 0a 20 20 20 20  Tolower(c);.    
4ff0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5000: 20 20 20 20 20 63 78 20 3d 20 63 3b 0a 20 20 20       cx = c;.   
5010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77       }.        w
5020: 68 69 6c 65 28 20 28 63 32 20 3d 20 2a 28 7a 53  hile( (c2 = *(zS
5030: 74 72 69 6e 67 2b 2b 29 29 21 3d 30 20 29 7b 0a  tring++))!=0 ){.
5040: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 32            if( c2
5050: 21 3d 63 20 26 26 20 63 32 21 3d 63 78 20 29 20  !=c && c2!=cx ) 
5060: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5070: 20 20 20 20 69 66 28 20 70 61 74 74 65 72 6e 43      if( patternC
5080: 6f 6d 70 61 72 65 28 7a 50 61 74 74 65 72 6e 2c  ompare(zPattern,
5090: 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 6d 61  zString,pInfo,ma
50a0: 74 63 68 4f 74 68 65 72 29 20 29 20 72 65 74 75  tchOther) ) retu
50b0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
50c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
50d0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 32 20       while( (c2 
50e0: 3d 20 55 74 66 38 52 65 61 64 28 7a 53 74 72 69  = Utf8Read(zStri
50f0: 6e 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ng))!=0 ){.     
5100: 20 20 20 20 20 69 66 28 20 63 32 21 3d 63 20 29       if( c2!=c )
5110: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5120: 20 20 20 20 20 69 66 28 20 70 61 74 74 65 72 6e       if( pattern
5130: 43 6f 6d 70 61 72 65 28 7a 50 61 74 74 65 72 6e  Compare(zPattern
5140: 2c 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 6d  ,zString,pInfo,m
5150: 61 74 63 68 4f 74 68 65 72 29 20 29 20 72 65 74  atchOther) ) ret
5160: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
5170: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
5180: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
5190: 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f     if( c==matchO
51a0: 74 68 65 72 20 29 7b 0a 20 20 20 20 20 20 69 66  ther ){.      if
51b0: 28 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53 65  ( pInfo->matchSe
51c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
51d0: 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  c = sqlite3Utf8R
51e0: 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a  ead(&zPattern);.
51f0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
5200: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
5210: 20 20 20 20 20 7a 45 73 63 61 70 65 64 20 3d 20       zEscaped = 
5220: 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20  zPattern;.      
5230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
5240: 33 32 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a  32 prior_c = 0;.
5250: 20 20 20 20 20 20 20 20 69 6e 74 20 73 65 65 6e          int seen
5260: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
5270: 74 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20  t invert = 0;.  
5280: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
5290: 33 55 74 66 38 52 65 61 64 28 26 7a 53 74 72 69  3Utf8Read(&zStri
52a0: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ng);.        if(
52b0: 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   c==0 ) return 0
52c0: 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 73  ;.        c2 = s
52d0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
52e0: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
52f0: 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20 29     if( c2=='^' )
5300: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76 65  {.          inve
5310: 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
5320: 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74    c2 = sqlite3Ut
5330: 66 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e  f8Read(&zPattern
5340: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
5350: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27       if( c2==']'
5360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
5370: 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20  ( c==']' ) seen 
5380: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63  = 1;.          c
5390: 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  2 = sqlite3Utf8R
53a0: 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a  ead(&zPattern);.
53b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
53c0: 20 20 77 68 69 6c 65 28 20 63 32 20 26 26 20 63    while( c2 && c
53d0: 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20  2!=']' ){.      
53e0: 20 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20      if( c2=='-' 
53f0: 26 26 20 7a 50 61 74 74 65 72 6e 5b 30 5d 21 3d  && zPattern[0]!=
5400: 27 5d 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b  ']' && zPattern[
5410: 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63  0]!=0 && prior_c
5420: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
5430: 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74    c2 = sqlite3Ut
5440: 66 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e  f8Read(&zPattern
5450: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
5460: 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26  f( c>=prior_c &&
5470: 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20   c<=c2 ) seen = 
5480: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  1;.            p
5490: 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20  rior_c = 0;.    
54a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
54b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
54c0: 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c2 ){.          
54d0: 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20      seen = 1;.  
54e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
54f0: 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20          prior_c 
5500: 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = c2;.          
5510: 7d 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d  }.          c2 =
5520: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
5530: 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20  (&zPattern);.   
5540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5550: 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65  f( c2==0 || (see
5560: 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20 29  n ^ invert)==0 )
5570: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
5580: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
5590: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
55a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
55b0: 20 20 20 20 63 32 20 3d 20 55 74 66 38 52 65 61      c2 = Utf8Rea
55c0: 64 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20  d(zString);.    
55d0: 69 66 28 20 63 3d 3d 63 32 20 29 20 63 6f 6e 74  if( c==c2 ) cont
55e0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6e 6f  inue;.    if( no
55f0: 43 61 73 65 20 26 26 20 63 3c 30 78 38 30 20 26  Case && c<0x80 &
5600: 26 20 63 32 3c 30 78 38 30 20 26 26 20 73 71 6c  & c2<0x80 && sql
5610: 69 74 65 33 54 6f 6c 6f 77 65 72 28 63 29 3d 3d  ite3Tolower(c)==
5620: 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 63  sqlite3Tolower(c
5630: 32 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  2) ){.      cont
5640: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
5650: 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20  if( c==matchOne 
5660: 26 26 20 7a 50 61 74 74 65 72 6e 21 3d 7a 45 73  && zPattern!=zEs
5670: 63 61 70 65 64 20 26 26 20 63 32 21 3d 30 20 29  caped && c2!=0 )
5680: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72   continue;.    r
5690: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
56a0: 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d  eturn *zString==
56b0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
56c0: 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
56d0: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  ) interface..*/.
56e0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 72 67  int sqlite3_strg
56f0: 6c 6f 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  lob(const char *
5700: 7a 47 6c 6f 62 50 61 74 74 65 72 6e 2c 20 63 6f  zGlobPattern, co
5710: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 69 6e  nst char *zStrin
5720: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 74  g){.  return pat
5730: 74 65 72 6e 43 6f 6d 70 61 72 65 28 28 75 38 2a  ternCompare((u8*
5740: 29 7a 47 6c 6f 62 50 61 74 74 65 72 6e 2c 20 28  )zGlobPattern, (
5750: 75 38 2a 29 7a 53 74 72 69 6e 67 2c 20 26 67 6c  u8*)zString, &gl
5760: 6f 62 49 6e 66 6f 2c 20 27 5b 27 29 3d 3d 30 3b  obInfo, '[')==0;
5770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  .}../*.** The sq
5780: 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 29 20  lite3_strlike() 
5790: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e  interface..*/.in
57a0: 74 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  t sqlite3_strlik
57b0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  e(const char *zP
57c0: 61 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 63 68  attern, const ch
57d0: 61 72 20 2a 7a 53 74 72 2c 20 75 6e 73 69 67 6e  ar *zStr, unsign
57e0: 65 64 20 69 6e 74 20 65 73 63 29 7b 0a 20 20 72  ed int esc){.  r
57f0: 65 74 75 72 6e 20 70 61 74 74 65 72 6e 43 6f 6d  eturn patternCom
5800: 70 61 72 65 28 28 75 38 2a 29 7a 50 61 74 74 65  pare((u8*)zPatte
5810: 72 6e 2c 20 28 75 38 2a 29 7a 53 74 72 2c 20 26  rn, (u8*)zStr, &
5820: 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 65 73  likeInfoNorm, es
5830: 63 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c)==0;.}../*.** 
5840: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
5850: 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 74   of times that t
5860: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
5870: 20 28 6f 72 20 47 4c 4f 42 20 77 68 69 63 68 20   (or GLOB which 
5880: 69 73 0a 2a 2a 20 6a 75 73 74 20 61 20 76 61 72  is.** just a var
5890: 69 61 74 69 6f 6e 20 6f 66 20 4c 49 4b 45 29 20  iation of LIKE) 
58a0: 67 65 74 73 20 63 61 6c 6c 65 64 2e 20 20 54 68  gets called.  Th
58b0: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
58c0: 65 73 74 69 6e 67 0a 2a 2a 20 6f 6e 6c 79 2e 0a  esting.** only..
58d0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
58e0: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
58f0: 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 3d 20 30  3_like_count = 0
5900: 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ;.#endif.../*.**
5910: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5920: 6f 66 20 74 68 65 20 6c 69 6b 65 28 29 20 53 51  of the like() SQ
5930: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  L function.  Thi
5940: 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  s function imple
5950: 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 62 75 69  ments.** the bui
5960: 6c 64 2d 69 6e 20 4c 49 4b 45 20 6f 70 65 72 61  ld-in LIKE opera
5970: 74 6f 72 2e 20 20 54 68 65 20 66 69 72 73 74 20  tor.  The first 
5980: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
5990: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 0a  function is the.
59a0: 2a 2a 20 70 61 74 74 65 72 6e 20 61 6e 64 20 74  ** pattern and t
59b0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
59c0: 6e 74 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  nt is the string
59d0: 2e 20 20 53 6f 2c 20 74 68 65 20 53 51 4c 20 73  .  So, the SQL s
59e0: 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a  tatements:.**.**
59f0: 20 20 20 20 20 20 20 41 20 4c 49 4b 45 20 42 0a         A LIKE B.
5a00: 2a 2a 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65  **.** is impleme
5a10: 6e 74 65 64 20 61 73 20 6c 69 6b 65 28 42 2c 41  nted as like(B,A
5a20: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 61  )..**.** This sa
5a30: 6d 65 20 66 75 6e 63 74 69 6f 6e 20 28 77 69 74  me function (wit
5a40: 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6f  h a different co
5a50: 6d 70 61 72 65 49 6e 66 6f 20 73 74 72 75 63 74  mpareInfo struct
5a60: 75 72 65 29 20 63 6f 6d 70 75 74 65 73 0a 2a 2a  ure) computes.**
5a70: 20 74 68 65 20 47 4c 4f 42 20 6f 70 65 72 61 74   the GLOB operat
5a80: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
5a90: 69 64 20 6c 69 6b 65 46 75 6e 63 28 0a 20 20 73  id likeFunc(.  s
5aa0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5ab0: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
5ac0: 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  argc, .  sqlite3
5ad0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
5ae0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
5af0: 64 20 63 68 61 72 20 2a 7a 41 2c 20 2a 7a 42 3b  d char *zA, *zB;
5b00: 0a 20 20 75 33 32 20 65 73 63 61 70 65 3b 0a 20  .  u32 escape;. 
5b10: 20 69 6e 74 20 6e 50 61 74 3b 0a 20 20 73 71 6c   int nPat;.  sql
5b20: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
5b30: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
5b40: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
5b50: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
5b60: 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 73 71 6c  nfo *pInfo = sql
5b70: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
5b80: 6f 6e 74 65 78 74 29 3b 0a 0a 23 69 66 64 65 66  ontext);..#ifdef
5b90: 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45   SQLITE_LIKE_DOE
5ba0: 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a  SNT_MATCH_BLOBS.
5bb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
5bc0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
5bd0: 29 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 0a 20  )==SQLITE_BLOB. 
5be0: 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c    || sqlite3_val
5bf0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29  ue_type(argv[1])
5c00: 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 0a 20 20  ==SQLITE_BLOB.  
5c10: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
5c20: 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65  _TEST.    sqlite
5c30: 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_like_count++;.
5c40: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
5c50: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
5c60: 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20 72  ntext, 0);.    r
5c70: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
5c80: 66 0a 20 20 7a 42 20 3d 20 73 71 6c 69 74 65 33  f.  zB = sqlite3
5c90: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
5ca0: 5b 30 5d 29 3b 0a 20 20 7a 41 20 3d 20 73 71 6c  [0]);.  zA = sql
5cb0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5cc0: 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  argv[1]);..  /* 
5cd0: 4c 69 6d 69 74 20 74 68 65 20 6c 65 6e 67 74 68  Limit the length
5ce0: 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20   of the LIKE or 
5cf0: 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 20  GLOB pattern to 
5d00: 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20  avoid problems. 
5d10: 20 2a 2a 20 6f 66 20 64 65 65 70 20 72 65 63 75   ** of deep recu
5d20: 72 73 69 6f 6e 20 61 6e 64 20 4e 2a 4e 20 62 65  rsion and N*N be
5d30: 68 61 76 69 6f 72 20 69 6e 20 70 61 74 74 65 72  havior in patter
5d40: 6e 43 6f 6d 70 61 72 65 28 29 2e 0a 20 20 2a 2f  nCompare()..  */
5d50: 0a 20 20 6e 50 61 74 20 3d 20 73 71 6c 69 74 65  .  nPat = sqlite
5d60: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
5d70: 67 76 5b 30 5d 29 3b 0a 20 20 74 65 73 74 63 61  gv[0]);.  testca
5d80: 73 65 28 20 6e 50 61 74 3d 3d 64 62 2d 3e 61 4c  se( nPat==db->aL
5d90: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5da0: 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  T_LIKE_PATTERN_L
5db0: 45 4e 47 54 48 5d 20 29 3b 0a 20 20 74 65 73 74  ENGTH] );.  test
5dc0: 63 61 73 65 28 20 6e 50 61 74 3d 3d 64 62 2d 3e  case( nPat==db->
5dd0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
5de0: 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
5df0: 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20 20  _LENGTH]+1 );.  
5e00: 69 66 28 20 6e 50 61 74 20 3e 20 64 62 2d 3e 61  if( nPat > db->a
5e10: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5e20: 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
5e30: 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 73  LENGTH] ){.    s
5e40: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5e50: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 4c 49  ror(context, "LI
5e60: 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61 74 74 65  KE or GLOB patte
5e70: 72 6e 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 22 2c  rn too complex",
5e80: 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
5e90: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5ea0: 7a 42 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  zB==sqlite3_valu
5eb0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20  e_text(argv[0]) 
5ec0: 29 3b 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20  );  /* Encoding 
5ed0: 64 69 64 20 6e 6f 74 20 63 68 61 6e 67 65 20 2a  did not change *
5ee0: 2f 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 33  /..  if( argc==3
5ef0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
5f00: 73 63 61 70 65 20 63 68 61 72 61 63 74 65 72 20  scape character 
5f10: 73 74 72 69 6e 67 20 6d 75 73 74 20 63 6f 6e 73  string must cons
5f20: 69 73 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ist of a single 
5f30: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 2e  UTF-8 character.
5f40: 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
5f50: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
5f60: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  or..    */.    c
5f70: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5f80: 61 72 20 2a 7a 45 73 63 20 3d 20 73 71 6c 69 74  ar *zEsc = sqlit
5f90: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5fa0: 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[2]);.    if( 
5fb0: 7a 45 73 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  zEsc==0 ) return
5fc0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
5fd0: 33 55 74 66 38 43 68 61 72 4c 65 6e 28 28 63 68  3Utf8CharLen((ch
5fe0: 61 72 2a 29 7a 45 73 63 2c 20 2d 31 29 21 3d 31  ar*)zEsc, -1)!=1
5ff0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6000: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
6010: 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20  ontext, .       
6020: 20 20 20 22 45 53 43 41 50 45 20 65 78 70 72 65     "ESCAPE expre
6030: 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 20  ssion must be a 
6040: 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72  single character
6050: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 72 65  ", -1);.      re
6060: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
6070: 65 73 63 61 70 65 20 3d 20 73 71 6c 69 74 65 33  escape = sqlite3
6080: 55 74 66 38 52 65 61 64 28 26 7a 45 73 63 29 3b  Utf8Read(&zEsc);
6090: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 73  .  }else{.    es
60a0: 63 61 70 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61  cape = pInfo->ma
60b0: 74 63 68 53 65 74 3b 0a 20 20 7d 0a 20 20 69 66  tchSet;.  }.  if
60c0: 28 20 7a 41 20 26 26 20 7a 42 20 29 7b 0a 23 69  ( zA && zB ){.#i
60d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
60e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b  .    sqlite3_lik
60f0: 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  e_count++;.#endi
6100: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  f.    sqlite3_re
6110: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
6120: 2c 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  , patternCompare
6130: 28 7a 42 2c 20 7a 41 2c 20 70 49 6e 66 6f 2c 20  (zB, zA, pInfo, 
6140: 65 73 63 61 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a  escape));.  }.}.
6150: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
6160: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4e 55 4c  ation of the NUL
6170: 4c 49 46 28 78 2c 79 29 20 66 75 6e 63 74 69 6f  LIF(x,y) functio
6180: 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69  n.  The result i
6190: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
61a0: 72 67 75 6d 65 6e 74 20 69 66 20 74 68 65 20 61  rgument if the a
61b0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 64 69 66  rguments are dif
61c0: 66 65 72 65 6e 74 2e 20 20 54 68 65 20 72 65 73  ferent.  The res
61d0: 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74  ult is NULL if t
61e0: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  he.** arguments 
61f0: 61 72 65 20 65 71 75 61 6c 20 74 6f 20 65 61 63  are equal to eac
6200: 68 20 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74  h other..*/.stat
6210: 69 63 20 76 6f 69 64 20 6e 75 6c 6c 69 66 46 75  ic void nullifFu
6220: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
6230: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
6240: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
6250: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6260: 2a 61 72 67 76 0a 29 7b 0a 20 20 43 6f 6c 6c 53  *argv.){.  CollS
6270: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
6280: 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65  te3GetFuncCollSe
6290: 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e  q(context);.  UN
62a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
62b0: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 73  otUsed);.  if( s
62c0: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
62d0: 28 61 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31  (argv[0], argv[1
62e0: 5d 2c 20 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a  ], pColl)!=0 ){.
62f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6300: 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74  lt_value(context
6310: 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a  , argv[0]);.  }.
6320: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
6330: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
6340: 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 28 29 20  qlite_version() 
6350: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72  function.  The r
6360: 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 65 72  esult is the ver
6370: 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 53  sion.** of the S
6380: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 74 68  QLite library th
6390: 61 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a  at is running..*
63a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 65  /.static void ve
63b0: 72 73 69 6f 6e 46 75 6e 63 28 0a 20 20 73 71 6c  rsionFunc(.  sql
63c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
63d0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74  ntext,.  int Not
63e0: 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f  Used,.  sqlite3_
63f0: 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32  value **NotUsed2
6400: 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
6410: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
6420: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a   NotUsed2);.  /*
6430: 20 49 4d 50 3a 20 52 2d 34 38 36 39 39 2d 34 38   IMP: R-48699-48
6440: 36 31 37 20 54 68 69 73 20 66 75 6e 63 74 69 6f  617 This functio
6450: 6e 20 69 73 20 61 6e 20 53 51 4c 20 77 72 61 70  n is an SQL wrap
6460: 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 0a 20  per around the. 
6470: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 69 62 76   ** sqlite3_libv
6480: 65 72 73 69 6f 6e 28 29 20 43 2d 69 6e 74 65 72  ersion() C-inter
6490: 66 61 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  face. */.  sqlit
64a0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
64b0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
64c0: 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 2d 31  libversion(), -1
64d0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
64e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
64f0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
6500: 20 73 71 6c 69 74 65 5f 73 6f 75 72 63 65 5f 69   sqlite_source_i
6510: 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  d() function. Th
6520: 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73 74  e result is a st
6530: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 69 64 65  ring.** that ide
6540: 6e 74 69 66 69 65 73 20 74 68 65 20 70 61 72 74  ntifies the part
6550: 69 63 75 6c 61 72 20 76 65 72 73 69 6f 6e 20 6f  icular version o
6560: 66 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64  f the source cod
6570: 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 0a  e used to build.
6580: 2a 2a 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74  ** SQLite..*/.st
6590: 61 74 69 63 20 76 6f 69 64 20 73 6f 75 72 63 65  atic void source
65a0: 69 64 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  idFunc(.  sqlite
65b0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
65c0: 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  xt,.  int NotUse
65d0: 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  d,.  sqlite3_val
65e0: 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b  ue **NotUsed2.){
65f0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
6600: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
6610: 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d  tUsed2);.  /* IM
6620: 50 3a 20 52 2d 32 34 34 37 30 2d 33 31 31 33 36  P: R-24470-31136
6630: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6640: 73 20 61 6e 20 53 51 4c 20 77 72 61 70 70 65 72  s an SQL wrapper
6650: 20 61 72 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a   around the.  **
6660: 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69   sqlite3_sourcei
6670: 64 28 29 20 43 20 69 6e 74 65 72 66 61 63 65 2e  d() C interface.
6680: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   */.  sqlite3_re
6690: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
66a0: 74 2c 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  t, sqlite3_sourc
66b0: 65 69 64 28 29 2c 20 2d 31 2c 20 53 51 4c 49 54  eid(), -1, SQLIT
66c0: 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a  E_STATIC);.}../*
66d0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
66e0: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
66f0: 5f 6c 6f 67 28 29 20 66 75 6e 63 74 69 6f 6e 2e  _log() function.
6700: 20 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70    This is a wrap
6710: 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a 20 73 71  per around.** sq
6720: 6c 69 74 65 33 5f 6c 6f 67 28 29 2e 20 20 54 68  lite3_log().  Th
6730: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
6740: 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20 66 75 6e  s NULL.  The fun
6750: 63 74 69 6f 6e 20 65 78 69 73 74 73 20 70 75 72  ction exists pur
6760: 65 6c 79 20 66 6f 72 0a 2a 2a 20 69 74 73 20 73  ely for.** its s
6770: 69 64 65 2d 65 66 66 65 63 74 73 2e 0a 2a 2f 0a  ide-effects..*/.
6780: 73 74 61 74 69 63 20 76 6f 69 64 20 65 72 72 6c  static void errl
6790: 6f 67 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  ogFunc(.  sqlite
67a0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
67b0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
67c0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
67d0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 55 4e 55 53  **argv.){.  UNUS
67e0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
67f0: 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
6800: 41 4d 45 54 45 52 28 63 6f 6e 74 65 78 74 29 3b  AMETER(context);
6810: 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 73  .  sqlite3_log(s
6820: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
6830: 28 61 72 67 76 5b 30 5d 29 2c 20 22 25 73 22 2c  (argv[0]), "%s",
6840: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6850: 65 78 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a 7d  ext(argv[1]));.}
6860: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
6870: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  tation of the sq
6880: 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  lite_compileopti
6890: 6f 6e 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69  on_used() functi
68a0: 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  on..** The resul
68b0: 74 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  t is an integer 
68c0: 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 73 20  that identifies 
68d0: 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  if the compiler 
68e0: 6f 70 74 69 6f 6e 0a 2a 2a 20 77 61 73 20 75 73  option.** was us
68f0: 65 64 20 74 6f 20 62 75 69 6c 64 20 53 51 4c 69  ed to build SQLi
6900: 74 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  te..*/.#ifndef S
6910: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49  QLITE_OMIT_COMPI
6920: 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 73  LEOPTION_DIAGS.s
6930: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 69  tatic void compi
6940: 6c 65 6f 70 74 69 6f 6e 75 73 65 64 46 75 6e 63  leoptionusedFunc
6950: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6960: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
6970: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
6980: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
6990: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
69a0: 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20 61 73   *zOptName;.  as
69b0: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
69c0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
69d0: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 2f 2a 20  TER(argc);.  /* 
69e0: 49 4d 50 3a 20 52 2d 33 39 35 36 34 2d 33 36 33  IMP: R-39564-363
69f0: 30 35 20 54 68 65 20 73 71 6c 69 74 65 5f 63 6f  05 The sqlite_co
6a00: 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64  mpileoption_used
6a10: 28 29 20 53 51 4c 0a 20 20 2a 2a 20 66 75 6e 63  () SQL.  ** func
6a20: 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65  tion is a wrappe
6a30: 72 20 61 72 6f 75 6e 64 20 74 68 65 20 73 71 6c  r around the sql
6a40: 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  ite3_compileopti
6a50: 6f 6e 5f 75 73 65 64 28 29 20 43 2f 43 2b 2b 0a  on_used() C/C++.
6a60: 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
6a70: 20 2a 2f 0a 20 20 69 66 28 20 28 7a 4f 70 74 4e   */.  if( (zOptN
6a80: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
6a90: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
6aa0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29 21  _text(argv[0]))!
6ab0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6ac0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
6ad0: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f  text, sqlite3_co
6ae0: 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64  mpileoption_used
6af0: 28 7a 4f 70 74 4e 61 6d 65 29 29 3b 0a 20 20 7d  (zOptName));.  }
6b00: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
6b10: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45  ITE_OMIT_COMPILE
6b20: 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a  OPTION_DIAGS */.
6b30: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
6b40: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c  ation of the sql
6b50: 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  ite_compileoptio
6b60: 6e 5f 67 65 74 28 29 20 66 75 6e 63 74 69 6f 6e  n_get() function
6b70: 2e 20 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  . .** The result
6b80: 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68 61   is a string tha
6b90: 74 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  t identifies the
6ba0: 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e   compiler option
6bb0: 73 20 0a 2a 2a 20 75 73 65 64 20 74 6f 20 62 75  s .** used to bu
6bc0: 69 6c 64 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23  ild SQLite..*/.#
6bd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6be0: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
6bf0: 5f 44 49 41 47 53 0a 73 74 61 74 69 63 20 76 6f  _DIAGS.static vo
6c00: 69 64 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  id compileoption
6c10: 67 65 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  getFunc(.  sqlit
6c20: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
6c30: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
6c40: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
6c50: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
6c60: 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72   n;.  assert( ar
6c70: 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45  gc==1 );.  UNUSE
6c80: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
6c90: 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30  );.  /* IMP: R-0
6ca0: 34 39 32 32 2d 32 34 30 37 36 20 54 68 65 20 73  4922-24076 The s
6cb0: 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74  qlite_compileopt
6cc0: 69 6f 6e 5f 67 65 74 28 29 20 53 51 4c 20 66 75  ion_get() SQL fu
6cd0: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
6ce0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
6cf0: 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70  the sqlite3_comp
6d00: 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 29 20  ileoption_get() 
6d10: 43 2f 43 2b 2b 20 66 75 6e 63 74 69 6f 6e 2e 0a  C/C++ function..
6d20: 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74    */.  n = sqlit
6d30: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
6d40: 76 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  v[0]);.  sqlite3
6d50: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
6d60: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f  text, sqlite3_co
6d70: 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28  mpileoption_get(
6d80: 6e 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  n), -1, SQLITE_S
6d90: 54 41 54 49 43 29 3b 0a 7d 0a 23 65 6e 64 69 66  TATIC);.}.#endif
6da0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6db0: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
6dc0: 41 47 53 20 2a 2f 0a 0a 2f 2a 20 41 72 72 61 79  AGS */../* Array
6dd0: 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
6de0: 66 72 6f 6d 20 68 61 6c 66 2d 62 79 74 65 73 20  from half-bytes 
6df0: 28 6e 79 62 62 6c 65 73 29 20 69 6e 74 6f 20 41  (nybbles) into A
6e00: 53 43 49 49 20 68 65 78 0a 2a 2a 20 64 69 67 69  SCII hex.** digi
6e10: 74 73 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ts. */.static co
6e20: 6e 73 74 20 63 68 61 72 20 68 65 78 64 69 67 69  nst char hexdigi
6e30: 74 73 5b 5d 20 3d 20 7b 0a 20 20 27 30 27 2c 20  ts[] = {.  '0', 
6e40: 27 31 27 2c 20 27 32 27 2c 20 27 33 27 2c 20 27  '1', '2', '3', '
6e50: 34 27 2c 20 27 35 27 2c 20 27 36 27 2c 20 27 37  4', '5', '6', '7
6e60: 27 2c 0a 20 20 27 38 27 2c 20 27 39 27 2c 20 27  ',.  '8', '9', '
6e70: 41 27 2c 20 27 42 27 2c 20 27 43 27 2c 20 27 44  A', 'B', 'C', 'D
6e80: 27 2c 20 27 45 27 2c 20 27 46 27 20 0a 7d 3b 0a  ', 'E', 'F' .};.
6e90: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
6ea0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 51 55 4f  ation of the QUO
6eb0: 54 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  TE() function.  
6ec0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61  This function ta
6ed0: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  kes a single.** 
6ee0: 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20 74 68  argument.  If th
6ef0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 75  e argument is nu
6f00: 6d 65 72 69 63 2c 20 74 68 65 20 72 65 74 75 72  meric, the retur
6f10: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  n value is the s
6f20: 61 6d 65 20 61 73 0a 2a 2a 20 74 68 65 20 61 72  ame as.** the ar
6f30: 67 75 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20  gument.  If the 
6f40: 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c  argument is NULL
6f50: 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  , the return val
6f60: 75 65 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  ue is the string
6f70: 0a 2a 2a 20 22 4e 55 4c 4c 22 2e 20 20 4f 74 68  .** "NULL".  Oth
6f80: 65 72 77 69 73 65 2c 20 74 68 65 20 61 72 67 75  erwise, the argu
6f90: 6d 65 6e 74 20 69 73 20 65 6e 63 6c 6f 73 65 64  ment is enclosed
6fa0: 20 69 6e 20 73 69 6e 67 6c 65 20 71 75 6f 74 65   in single quote
6fb0: 73 20 77 69 74 68 0a 2a 2a 20 73 69 6e 67 6c 65  s with.** single
6fc0: 2d 71 75 6f 74 65 20 65 73 63 61 70 65 73 2e 0a  -quote escapes..
6fd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 71  */.static void q
6fe0: 75 6f 74 65 46 75 6e 63 28 73 71 6c 69 74 65 33  uoteFunc(sqlite3
6ff0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
7000: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
7010: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
7020: 76 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 72  v){.  assert( ar
7030: 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45  gc==1 );.  UNUSE
7040: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
7050: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c  );.  switch( sql
7060: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
7070: 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20  argv[0]) ){.    
7080: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
7090: 54 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  T: {.      doubl
70a0: 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 20 20  e r1, r2;.      
70b0: 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
70c0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
70d0: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
70e0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73  rgv[0]);.      s
70f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7100: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
7110: 75 66 2c 20 22 25 21 2e 31 35 67 22 2c 20 72 31  uf, "%!.15g", r1
7120: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7130: 41 74 6f 46 28 7a 42 75 66 2c 20 26 72 32 2c 20  AtoF(zBuf, &r2, 
7140: 32 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  20, SQLITE_UTF8)
7150: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 31 21 3d  ;.      if( r1!=
7160: 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r2 ){.        sq
7170: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
7180: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
7190: 66 2c 20 22 25 21 2e 32 30 65 22 2c 20 72 31 29  f, "%!.20e", r1)
71a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
71b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
71c0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75  ext(context, zBu
71d0: 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
71e0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
71f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7200: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
7210: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  EGER: {.      sq
7220: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
7230: 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  ue(context, argv
7240: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  [0]);.      brea
7250: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7260: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
7270: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 65  .      char *zTe
7280: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  xt = 0;.      ch
7290: 61 72 20 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20  ar const *zBlob 
72a0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
72b0: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
72c0: 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d       int nBlob =
72d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
72e0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
72f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 42 6c       assert( zBl
7300: 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  ob==sqlite3_valu
7310: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20  e_blob(argv[0]) 
7320: 29 3b 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e  ); /* No encodin
7330: 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20  g change */.    
7340: 20 20 7a 54 65 78 74 20 3d 20 28 63 68 61 72 20    zText = (char 
7350: 2a 29 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28  *)contextMalloc(
7360: 63 6f 6e 74 65 78 74 2c 20 28 32 2a 28 69 36 34  context, (2*(i64
7370: 29 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a 20 20 20  )nBlob)+4); .   
7380: 20 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a     if( zText ){.
7390: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
73a0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
73b0: 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20  i<nBlob; i++){. 
73c0: 20 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28           zText[(
73d0: 69 2a 32 29 2b 32 5d 20 3d 20 68 65 78 64 69 67  i*2)+2] = hexdig
73e0: 69 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34  its[(zBlob[i]>>4
73f0: 29 26 30 78 30 46 5d 3b 0a 20 20 20 20 20 20 20  )&0x0F];.       
7400: 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29 2b 33     zText[(i*2)+3
7410: 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28 7a  ] = hexdigits[(z
7420: 42 6c 6f 62 5b 69 5d 29 26 30 78 30 46 5d 3b 0a  Blob[i])&0x0F];.
7430: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7440: 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32    zText[(nBlob*2
7450: 29 2b 32 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20  )+2] = '\'';.   
7460: 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f       zText[(nBlo
7470: 62 2a 32 29 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a  b*2)+3] = '\0';.
7480: 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 30 5d          zText[0]
7490: 20 3d 20 27 58 27 3b 0a 20 20 20 20 20 20 20 20   = 'X';.        
74a0: 7a 54 65 78 74 5b 31 5d 20 3d 20 27 5c 27 27 3b  zText[1] = '\'';
74b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
74c0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
74d0: 74 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  text, zText, -1,
74e0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
74f0: 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  T);.        sqli
7500: 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74 29 3b  te3_free(zText);
7510: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7520: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7530: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
7540: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c  : {.      int i,
7550: 6a 3b 0a 20 20 20 20 20 20 75 36 34 20 6e 3b 0a  j;.      u64 n;.
7560: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
7570: 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 72 67 20  gned char *zArg 
7580: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
7590: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
75a0: 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20       char *z;.. 
75b0: 20 20 20 20 20 69 66 28 20 7a 41 72 67 3d 3d 30       if( zArg==0
75c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
75d0: 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a   for(i=0, n=0; z
75e0: 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66  Arg[i]; i++){ if
75f0: 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20  ( zArg[i]=='\'' 
7600: 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7a  ) n++; }.      z
7610: 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   = contextMalloc
7620: 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29  (context, ((i64)
7630: 69 29 2b 28 28 69 36 34 29 6e 29 2b 33 29 3b 0a  i)+((i64)n)+3);.
7640: 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20        if( z ){. 
7650: 20 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c         z[0] = '\
7660: 27 27 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  '';.        for(
7670: 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b 69  i=0, j=1; zArg[i
7680: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
7690: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67     z[j++] = zArg
76a0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
76b0: 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27  f( zArg[i]=='\''
76c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
76d0: 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[j++] = '\'';. 
76e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
76f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a     }.        z[j
7700: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  ++] = '\'';.    
7710: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
7720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7730: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
7740: 74 2c 20 7a 2c 20 6a 2c 20 73 71 6c 69 74 65 33  t, z, j, sqlite3
7750: 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a  _free);.      }.
7760: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7770: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
7780: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7790: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
77a0: 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c  pe(argv[0])==SQL
77b0: 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ITE_NULL );.    
77c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
77d0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 22  _text(context, "
77e0: 4e 55 4c 4c 22 2c 20 34 2c 20 53 51 4c 49 54 45  NULL", 4, SQLITE
77f0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
7800: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
7810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e  .}../*.** The un
7820: 69 63 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e  icode() function
7830: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
7840: 74 65 67 65 72 20 75 6e 69 63 6f 64 65 20 63 6f  teger unicode co
7850: 64 65 2d 70 6f 69 6e 74 20 76 61 6c 75 65 0a 2a  de-point value.*
7860: 2a 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  * for the first 
7870: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
7880: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 20 0a   input string. .
7890: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
78a0: 6e 69 63 6f 64 65 46 75 6e 63 28 0a 20 20 73 71  nicodeFunc(.  sq
78b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
78c0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
78d0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
78e0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
78f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
7900: 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
7910: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
7920: 5b 30 5d 29 3b 0a 20 20 28 76 6f 69 64 29 61 72  [0]);.  (void)ar
7930: 67 63 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 7a  gc;.  if( z && z
7940: 5b 30 5d 20 29 20 73 71 6c 69 74 65 33 5f 72 65  [0] ) sqlite3_re
7950: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
7960: 2c 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  , sqlite3Utf8Rea
7970: 64 28 26 7a 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  d(&z));.}../*.**
7980: 20 54 68 65 20 63 68 61 72 28 29 20 66 75 6e 63   The char() func
7990: 74 69 6f 6e 20 74 61 6b 65 73 20 7a 65 72 6f 20  tion takes zero 
79a0: 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74  or more argument
79b0: 73 2c 20 65 61 63 68 20 6f 66 20 77 68 69 63 68  s, each of which
79c0: 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65   is.** an intege
79d0: 72 2e 20 20 49 74 20 63 6f 6e 73 74 72 75 63 74  r.  It construct
79e0: 73 20 61 20 73 74 72 69 6e 67 20 77 68 65 72 65  s a string where
79f0: 20 65 61 63 68 20 63 68 61 72 61 63 74 65 72 20   each character 
7a00: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  of the string.**
7a10: 20 69 73 20 74 68 65 20 75 6e 69 63 6f 64 65 20   is the unicode 
7a20: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 74 68  character for th
7a30: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
7a40: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
7a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7a60: 20 63 68 61 72 46 75 6e 63 28 0a 20 20 73 71 6c   charFunc(.  sql
7a70: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
7a80: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
7a90: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
7aa0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 75  ue **argv.){.  u
7ab0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c  nsigned char *z,
7ac0: 20 2a 7a 4f 75 74 3b 0a 20 20 69 6e 74 20 69 3b   *zOut;.  int i;
7ad0: 0a 20 20 7a 4f 75 74 20 3d 20 7a 20 3d 20 73 71  .  zOut = z = sq
7ae0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
7af0: 61 72 67 63 2a 34 2b 31 20 29 3b 0a 20 20 69 66  argc*4+1 );.  if
7b00: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( z==0 ){.    sq
7b10: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
7b20: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
7b30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7b40: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
7b50: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
7b60: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b  sqlite3_int64 x;
7b70: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 3b  .    unsigned c;
7b80: 0a 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33  .    x = sqlite3
7b90: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
7ba0: 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 78  v[i]);.    if( x
7bb0: 3c 30 20 7c 7c 20 78 3e 30 78 31 30 66 66 66 66  <0 || x>0x10ffff
7bc0: 20 29 20 78 20 3d 20 30 78 66 66 66 64 3b 0a 20   ) x = 0xfffd;. 
7bd0: 20 20 20 63 20 3d 20 28 75 6e 73 69 67 6e 65 64     c = (unsigned
7be0: 29 28 78 20 26 20 30 78 31 66 66 66 66 66 29 3b  )(x & 0x1fffff);
7bf0: 0a 20 20 20 20 69 66 28 20 63 3c 30 78 30 30 30  .    if( c<0x000
7c00: 38 30 20 29 7b 0a 20 20 20 20 20 20 2a 7a 4f 75  80 ){.      *zOu
7c10: 74 2b 2b 20 3d 20 28 75 38 29 28 63 26 30 78 46  t++ = (u8)(c&0xF
7c20: 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  F);.    }else if
7c30: 28 20 63 3c 30 78 30 30 38 30 30 20 29 7b 0a 20  ( c<0x00800 ){. 
7c40: 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30       *zOut++ = 0
7c50: 78 43 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 36  xC0 + (u8)((c>>6
7c60: 29 26 30 78 31 46 29 3b 0a 20 20 20 20 20 20 2a  )&0x1F);.      *
7c70: 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20  zOut++ = 0x80 + 
7c80: 28 75 38 29 28 63 20 26 20 30 78 33 46 29 3b 0a  (u8)(c & 0x3F);.
7c90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c      }else if( c<
7ca0: 30 78 31 30 30 30 30 20 29 7b 0a 20 20 20 20 20  0x10000 ){.     
7cb0: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 45 30 20   *zOut++ = 0xE0 
7cc0: 2b 20 28 75 38 29 28 28 63 3e 3e 31 32 29 26 30  + (u8)((c>>12)&0
7cd0: 78 30 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75  x0F);.      *zOu
7ce0: 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38  t++ = 0x80 + (u8
7cf0: 29 28 28 63 3e 3e 36 29 20 26 20 30 78 33 46 29  )((c>>6) & 0x3F)
7d00: 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20  ;.      *zOut++ 
7d10: 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 63 20  = 0x80 + (u8)(c 
7d20: 26 20 30 78 33 46 29 3b 0a 20 20 20 20 7d 65 6c  & 0x3F);.    }el
7d30: 73 65 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b  se{.      *zOut+
7d40: 2b 20 3d 20 30 78 46 30 20 2b 20 28 75 38 29 28  + = 0xF0 + (u8)(
7d50: 28 63 3e 3e 31 38 29 20 26 20 30 78 30 37 29 3b  (c>>18) & 0x07);
7d60: 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d  .      *zOut++ =
7d70: 20 30 78 38 30 20 2b 20 28 75 38 29 28 28 63 3e   0x80 + (u8)((c>
7d80: 3e 31 32 29 20 26 20 30 78 33 46 29 3b 0a 20 20  >12) & 0x3F);.  
7d90: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
7da0: 38 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 36 29  80 + (u8)((c>>6)
7db0: 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 20 20   & 0x3F);.      
7dc0: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b  *zOut++ = 0x80 +
7dd0: 20 28 75 38 29 28 63 20 26 20 30 78 33 46 29 3b   (u8)(c & 0x3F);
7de0: 0a 20 20 20 20 7d 20 20 20 20 20 20 20 20 20 20  .    }          
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e10: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
7e20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7e30: 5f 74 65 78 74 36 34 28 63 6f 6e 74 65 78 74 2c  _text64(context,
7e40: 20 28 63 68 61 72 2a 29 7a 2c 20 7a 4f 75 74 2d   (char*)z, zOut-
7e50: 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c  z, sqlite3_free,
7e60: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 7d   SQLITE_UTF8);.}
7e70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 78 28  ../*.** The hex(
7e80: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 6e 74  ) function.  Int
7e90: 65 72 70 72 65 74 20 74 68 65 20 61 72 67 75 6d  erpret the argum
7ea0: 65 6e 74 20 61 73 20 61 20 62 6c 6f 62 2e 20 20  ent as a blob.  
7eb0: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 68 65 78 61  Return.** a hexa
7ec0: 64 65 63 69 6d 61 6c 20 72 65 6e 64 65 72 69 6e  decimal renderin
7ed0: 67 20 61 73 20 74 65 78 74 2e 0a 2a 2f 0a 73 74  g as text..*/.st
7ee0: 61 74 69 63 20 76 6f 69 64 20 68 65 78 46 75 6e  atic void hexFun
7ef0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
7f00: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
7f10: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
7f20: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
7f30: 76 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  v.){.  int i, n;
7f40: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
7f50: 64 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 0a 20  d char *pBlob;. 
7f60: 20 63 68 61 72 20 2a 7a 48 65 78 2c 20 2a 7a 3b   char *zHex, *z;
7f70: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
7f80: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
7f90: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
7fa0: 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    pBlob = sqlite
7fb0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
7fc0: 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  v[0]);.  n = sql
7fd0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
7fe0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73  (argv[0]);.  ass
7ff0: 65 72 74 28 20 70 42 6c 6f 62 3d 3d 73 71 6c 69  ert( pBlob==sqli
8000: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
8010: 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e  rgv[0]) );  /* N
8020: 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67  o encoding chang
8030: 65 20 2a 2f 0a 20 20 7a 20 3d 20 7a 48 65 78 20  e */.  z = zHex 
8040: 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28  = contextMalloc(
8050: 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29 6e  context, ((i64)n
8060: 29 2a 32 20 2b 20 31 29 3b 0a 20 20 69 66 28 20  )*2 + 1);.  if( 
8070: 7a 48 65 78 20 29 7b 0a 20 20 20 20 66 6f 72 28  zHex ){.    for(
8080: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
8090: 42 6c 6f 62 2b 2b 29 7b 0a 20 20 20 20 20 20 75  Blob++){.      u
80a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d  nsigned char c =
80b0: 20 2a 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 2a   *pBlob;.      *
80c0: 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69 67 69 74  (z++) = hexdigit
80d0: 73 5b 28 63 3e 3e 34 29 26 30 78 66 5d 3b 0a 20  s[(c>>4)&0xf];. 
80e0: 20 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65       *(z++) = he
80f0: 78 64 69 67 69 74 73 5b 63 26 30 78 66 5d 3b 0a  xdigits[c&0xf];.
8100: 20 20 20 20 7d 0a 20 20 20 20 2a 7a 20 3d 20 30      }.    *z = 0
8110: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
8120: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
8130: 74 2c 20 7a 48 65 78 2c 20 6e 2a 32 2c 20 73 71  t, zHex, n*2, sq
8140: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
8150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 7a 65  .}../*.** The ze
8160: 72 6f 62 6c 6f 62 28 4e 29 20 66 75 6e 63 74 69  roblob(N) functi
8170: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 7a 65 72  on returns a zer
8180: 6f 2d 66 69 6c 6c 65 64 20 62 6c 6f 62 20 6f 66  o-filled blob of
8190: 20 73 69 7a 65 20 4e 20 62 79 74 65 73 2e 0a 2a   size N bytes..*
81a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
81b0: 72 6f 62 6c 6f 62 46 75 6e 63 28 0a 20 20 73 71  roblobFunc(.  sq
81c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
81d0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
81e0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
81f0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
8200: 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b  i64 n;.  int rc;
8210: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
8220: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
8230: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
8240: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
8250: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
8260: 5d 29 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 20  ]);.  if( n<0 ) 
8270: 6e 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  n = 0;.  rc = sq
8280: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72  lite3_result_zer
8290: 6f 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c  oblob64(context,
82a0: 20 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 30   n); /* IMP: R-0
82b0: 30 32 39 33 2d 36 34 39 39 34 20 2a 2f 0a 20 20  0293-64994 */.  
82c0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
82d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
82e0: 6f 72 5f 63 6f 64 65 28 63 6f 6e 74 65 78 74 2c  or_code(context,
82f0: 20 72 63 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   rc);.  }.}../*.
8300: 2a 2a 20 54 68 65 20 72 65 70 6c 61 63 65 28 29  ** The replace()
8310: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 72 65   function.  Thre
8320: 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  e arguments are 
8330: 61 6c 6c 20 73 74 72 69 6e 67 73 3a 20 63 61 6c  all strings: cal
8340: 6c 0a 2a 2a 20 74 68 65 6d 20 41 2c 20 42 2c 20  l.** them A, B, 
8350: 61 6e 64 20 43 2e 20 54 68 65 20 72 65 73 75 6c  and C. The resul
8360: 74 20 69 73 20 61 6c 73 6f 20 61 20 73 74 72 69  t is also a stri
8370: 6e 67 20 77 68 69 63 68 20 69 73 20 64 65 72 69  ng which is deri
8380: 76 65 64 0a 2a 2a 20 66 72 6f 6d 20 41 20 62 79  ved.** from A by
8390: 20 72 65 70 6c 61 63 69 6e 67 20 65 76 65 72 79   replacing every
83a0: 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20 42   occurrence of B
83b0: 20 77 69 74 68 20 43 2e 20 20 54 68 65 20 6d 61   with C.  The ma
83c0: 74 63 68 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  tch.** must be e
83d0: 78 61 63 74 2e 20 20 43 6f 6c 6c 61 74 69 6e 67  xact.  Collating
83e0: 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 6e   sequences are n
83f0: 6f 74 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  ot used..*/.stat
8400: 69 63 20 76 6f 69 64 20 72 65 70 6c 61 63 65 46  ic void replaceF
8410: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
8420: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
8430: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
8440: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
8450: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgv.){.  const u
8460: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53  nsigned char *zS
8470: 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  tr;        /* Th
8480: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 41  e input string A
8490: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   */.  const unsi
84a0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 50 61 74 74  gned char *zPatt
84b0: 65 72 6e 3b 20 20 20 20 2f 2a 20 54 68 65 20 70  ern;    /* The p
84c0: 61 74 74 65 72 6e 20 73 74 72 69 6e 67 20 42 20  attern string B 
84d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  */.  const unsig
84e0: 6e 65 64 20 63 68 61 72 20 2a 7a 52 65 70 3b 20  ned char *zRep; 
84f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
8500: 70 6c 61 63 65 6d 65 6e 74 20 73 74 72 69 6e 67  placement string
8510: 20 43 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64   C */.  unsigned
8520: 20 63 68 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20   char *zOut;    
8530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
8540: 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
8550: 20 6e 53 74 72 3b 20 20 20 20 20 20 20 20 20 20   nStr;          
8560: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
8570: 20 7a 53 74 72 20 2a 2f 0a 20 20 69 6e 74 20 6e   zStr */.  int n
8580: 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20  Pattern;        
8590: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
85a0: 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74  Pattern */.  int
85b0: 20 6e 52 65 70 3b 20 20 20 20 20 20 20 20 20 20   nRep;          
85c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
85d0: 20 7a 52 65 70 20 2a 2f 0a 20 20 69 36 34 20 6e   zRep */.  i64 n
85e0: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
85f0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 73      /* Maximum s
8600: 69 7a 65 20 6f 66 20 7a 4f 75 74 20 2a 2f 0a 20  ize of zOut */. 
8610: 20 69 6e 74 20 6c 6f 6f 70 4c 69 6d 69 74 3b 20   int loopLimit; 
8620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
8630: 74 20 7a 53 74 72 5b 5d 20 74 68 61 74 20 6d 69  t zStr[] that mi
8640: 67 68 74 20 6d 61 74 63 68 20 7a 50 61 74 74 65  ght match zPatte
8650: 72 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  rn[] */.  int i,
8660: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
8670: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8680: 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ers */..  assert
8690: 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20 55  ( argc==3 );.  U
86a0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
86b0: 61 72 67 63 29 3b 0a 20 20 7a 53 74 72 20 3d 20  argc);.  zStr = 
86c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
86d0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
86e0: 66 28 20 7a 53 74 72 3d 3d 30 20 29 20 72 65 74  f( zStr==0 ) ret
86f0: 75 72 6e 3b 0a 20 20 6e 53 74 72 20 3d 20 73 71  urn;.  nStr = sq
8700: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8710: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73  s(argv[0]);.  as
8720: 73 65 72 74 28 20 7a 53 74 72 3d 3d 73 71 6c 69  sert( zStr==sqli
8730: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
8740: 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e  rgv[0]) );  /* N
8750: 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67  o encoding chang
8760: 65 20 2a 2f 0a 20 20 7a 50 61 74 74 65 72 6e 20  e */.  zPattern 
8770: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8780: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  text(argv[1]);. 
8790: 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30   if( zPattern==0
87a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
87b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
87c0: 70 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c  pe(argv[1])==SQL
87d0: 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 20 20 20 20  ITE_NULL.       
87e0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
87f0: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
8800: 65 28 63 6f 6e 74 65 78 74 29 2d 3e 6d 61 6c 6c  e(context)->mall
8810: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8820: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
8830: 28 20 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 30  ( zPattern[0]==0
8840: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8850: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8860: 70 65 28 61 72 67 76 5b 31 5d 29 21 3d 53 51 4c  pe(argv[1])!=SQL
8870: 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ITE_NULL );.    
8880: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
8890: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
88a0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74 75  gv[0]);.    retu
88b0: 72 6e 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 74 65  rn;.  }.  nPatte
88c0: 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  rn = sqlite3_val
88d0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d  ue_bytes(argv[1]
88e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 50 61  );.  assert( zPa
88f0: 74 74 65 72 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  ttern==sqlite3_v
8900: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
8910: 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63  ]) );  /* No enc
8920: 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a  oding change */.
8930: 20 20 7a 52 65 70 20 3d 20 73 71 6c 69 74 65 33    zRep = sqlite3
8940: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8950: 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 52 65 70  [2]);.  if( zRep
8960: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8970: 6e 52 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76  nRep = sqlite3_v
8980: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
8990: 32 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  2]);.  assert( z
89a0: 52 65 70 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  Rep==sqlite3_val
89b0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29  ue_text(argv[2])
89c0: 20 29 3b 0a 20 20 6e 4f 75 74 20 3d 20 6e 53 74   );.  nOut = nSt
89d0: 72 20 2b 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r + 1;.  assert(
89e0: 20 6e 4f 75 74 3c 53 51 4c 49 54 45 5f 4d 41 58   nOut<SQLITE_MAX
89f0: 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 7a 4f 75  _LENGTH );.  zOu
8a00: 74 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  t = contextMallo
8a10: 63 28 63 6f 6e 74 65 78 74 2c 20 28 69 36 34 29  c(context, (i64)
8a20: 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 7a 4f 75  nOut);.  if( zOu
8a30: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
8a40: 72 6e 3b 0a 20 20 7d 0a 20 20 6c 6f 6f 70 4c 69  rn;.  }.  loopLi
8a50: 6d 69 74 20 3d 20 6e 53 74 72 20 2d 20 6e 50 61  mit = nStr - nPa
8a60: 74 74 65 72 6e 3b 20 20 0a 20 20 66 6f 72 28 69  ttern;  .  for(i
8a70: 3d 6a 3d 30 3b 20 69 3c 3d 6c 6f 6f 70 4c 69 6d  =j=0; i<=loopLim
8a80: 69 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  it; i++){.    if
8a90: 28 20 7a 53 74 72 5b 69 5d 21 3d 7a 50 61 74 74  ( zStr[i]!=zPatt
8aa0: 65 72 6e 5b 30 5d 20 7c 7c 20 6d 65 6d 63 6d 70  ern[0] || memcmp
8ab0: 28 26 7a 53 74 72 5b 69 5d 2c 20 7a 50 61 74 74  (&zStr[i], zPatt
8ac0: 65 72 6e 2c 20 6e 50 61 74 74 65 72 6e 29 20 29  ern, nPattern) )
8ad0: 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b  {.      zOut[j++
8ae0: 5d 20 3d 20 7a 53 74 72 5b 69 5d 3b 0a 20 20 20  ] = zStr[i];.   
8af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
8b00: 20 2a 7a 4f 6c 64 3b 0a 20 20 20 20 20 20 73 71   *zOld;.      sq
8b10: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
8b20: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
8b30: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
8b40: 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 6e 52        nOut += nR
8b50: 65 70 20 2d 20 6e 50 61 74 74 65 72 6e 3b 0a 20  ep - nPattern;. 
8b60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
8b70: 4f 75 74 2d 31 3d 3d 64 62 2d 3e 61 4c 69 6d 69  Out-1==db->aLimi
8b80: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
8b90: 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20 20 20 20  ENGTH] );.      
8ba0: 74 65 73 74 63 61 73 65 28 20 6e 4f 75 74 2d 32  testcase( nOut-2
8bb0: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
8bc0: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
8bd0: 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ] );.      if( n
8be0: 4f 75 74 2d 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  Out-1>db->aLimit
8bf0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
8c00: 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 20  NGTH] ){.       
8c10: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8c20: 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e  error_toobig(con
8c30: 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73  text);.        s
8c40: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
8c50: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
8c60: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
8c70: 20 7a 4f 6c 64 20 3d 20 7a 4f 75 74 3b 0a 20 20   zOld = zOut;.  
8c80: 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
8c90: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 7a 4f 75  e3_realloc64(zOu
8ca0: 74 2c 20 28 69 6e 74 29 6e 4f 75 74 29 3b 0a 20  t, (int)nOut);. 
8cb0: 20 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30       if( zOut==0
8cc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8cd0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8ce0: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
8cf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8d00: 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 20  _free(zOld);.   
8d10: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
8d20: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
8d30: 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a 52 65 70  y(&zOut[j], zRep
8d40: 2c 20 6e 52 65 70 29 3b 0a 20 20 20 20 20 20 6a  , nRep);.      j
8d50: 20 2b 3d 20 6e 52 65 70 3b 0a 20 20 20 20 20 20   += nRep;.      
8d60: 69 20 2b 3d 20 6e 50 61 74 74 65 72 6e 2d 31 3b  i += nPattern-1;
8d70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
8d80: 65 72 74 28 20 6a 2b 6e 53 74 72 2d 69 2b 31 3d  ert( j+nStr-i+1=
8d90: 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d 65 6d 63 70  =nOut );.  memcp
8da0: 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26 7a 53 74  y(&zOut[j], &zSt
8db0: 72 5b 69 5d 2c 20 6e 53 74 72 2d 69 29 3b 0a 20  r[i], nStr-i);. 
8dc0: 20 6a 20 2b 3d 20 6e 53 74 72 20 2d 20 69 3b 0a   j += nStr - i;.
8dd0: 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 6e 4f 75    assert( j<=nOu
8de0: 74 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d  t );.  zOut[j] =
8df0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
8e00: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
8e10: 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20  t, (char*)zOut, 
8e20: 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  j, sqlite3_free)
8e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
8e40: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
8e50: 20 54 52 49 4d 28 29 2c 20 4c 54 52 49 4d 28 29   TRIM(), LTRIM()
8e60: 2c 20 61 6e 64 20 52 54 52 49 4d 28 29 20 66 75  , and RTRIM() fu
8e70: 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20  nctions..** The 
8e80: 75 73 65 72 64 61 74 61 20 69 73 20 30 78 31 20  userdata is 0x1 
8e90: 66 6f 72 20 6c 65 66 74 20 74 72 69 6d 2c 20 30  for left trim, 0
8ea0: 78 32 20 66 6f 72 20 72 69 67 68 74 20 74 72 69  x2 for right tri
8eb0: 6d 2c 20 30 78 33 20 66 6f 72 20 62 6f 74 68 2e  m, 0x3 for both.
8ec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8ed0: 74 72 69 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69  trimFunc(.  sqli
8ee0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
8ef0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
8f00: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
8f10: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
8f20: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
8f30: 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20 20 20 20  r *zIn;         
8f40: 2f 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67 20  /* Input string 
8f50: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  */.  const unsig
8f60: 6e 65 64 20 63 68 61 72 20 2a 7a 43 68 61 72 53  ned char *zCharS
8f70: 65 74 3b 20 20 20 20 2f 2a 20 53 65 74 20 6f 66  et;    /* Set of
8f80: 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 74   characters to t
8f90: 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  rim */.  int nIn
8fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8fc0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
8fd0: 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20   input */.  int 
8fe0: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9000: 20 31 3a 20 74 72 69 6d 6c 65 66 74 20 20 32 3a   1: trimleft  2:
9010: 20 74 72 69 6d 72 69 67 68 74 20 20 33 3a 20 74   trimright  3: t
9020: 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  rim */.  int i; 
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9050: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
9060: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
9070: 4c 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Len = 0;        
9080: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 65    /* Length of e
9090: 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e  ach character in
90a0: 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20 75   zCharSet */.  u
90b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 61  nsigned char **a
90c0: 7a 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20  zChar = 0;      
90d0: 20 2f 2a 20 49 6e 64 69 76 69 64 75 61 6c 20 63   /* Individual c
90e0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43 68  haracters in zCh
90f0: 61 72 53 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  arSet */.  int n
9100: 43 68 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  Char;           
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9120: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
9130: 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65 74  ters in zCharSet
9140: 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   */..  if( sqlit
9150: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
9160: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
9170: 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
9180: 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20 3d 20 73  n;.  }.  zIn = s
9190: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
91a0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
91b0: 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72  ( zIn==0 ) retur
91c0: 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74  n;.  nIn = sqlit
91d0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
91e0: 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72  rgv[0]);.  asser
91f0: 74 28 20 7a 49 6e 3d 3d 73 71 6c 69 74 65 33 5f  t( zIn==sqlite3_
9200: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
9210: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 61 72 67  0]) );.  if( arg
9220: 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 74 61 74  c==1 ){.    stat
9230: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
9240: 64 20 63 68 61 72 20 6c 65 6e 4f 6e 65 5b 5d 20  d char lenOne[] 
9250: 3d 20 7b 20 31 20 7d 3b 0a 20 20 20 20 73 74 61  = { 1 };.    sta
9260: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61  tic unsigned cha
9270: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4f 6e 65 5b  r * const azOne[
9280: 5d 20 3d 20 7b 20 28 75 38 2a 29 22 20 22 20 7d  ] = { (u8*)" " }
9290: 3b 0a 20 20 20 20 6e 43 68 61 72 20 3d 20 31 3b  ;.    nChar = 1;
92a0: 0a 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 38 2a  .    aLen = (u8*
92b0: 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20 61 7a 43  )lenOne;.    azC
92c0: 68 61 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  har = (unsigned 
92d0: 63 68 61 72 20 2a 2a 29 61 7a 4f 6e 65 3b 0a 20  char **)azOne;. 
92e0: 20 20 20 7a 43 68 61 72 53 65 74 20 3d 20 30 3b     zCharSet = 0;
92f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 43  .  }else if( (zC
9300: 68 61 72 53 65 74 20 3d 20 73 71 6c 69 74 65 33  harSet = sqlite3
9310: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9320: 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  [1]))==0 ){.    
9330: 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b  return;.  }else{
9340: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
9350: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  ned char *z;.   
9360: 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74 2c   for(z=zCharSet,
9370: 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43   nChar=0; *z; nC
9380: 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 53 51  har++){.      SQ
9390: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
93a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
93b0: 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20 20   nChar>0 ){.    
93c0: 20 20 61 7a 43 68 61 72 20 3d 20 63 6f 6e 74 65    azChar = conte
93d0: 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74  xtMalloc(context
93e0: 2c 20 28 28 69 36 34 29 6e 43 68 61 72 29 2a 28  , ((i64)nChar)*(
93f0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 31 29  sizeof(char*)+1)
9400: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 43  );.      if( azC
9410: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  har==0 ){.      
9420: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
9430: 7d 0a 20 20 20 20 20 20 61 4c 65 6e 20 3d 20 28  }.      aLen = (
9440: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
9450: 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 3b 0a 20  azChar[nChar];. 
9460: 20 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72       for(z=zChar
9470: 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a  Set, nChar=0; *z
9480: 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20  ; nChar++){.    
9490: 20 20 20 20 61 7a 43 68 61 72 5b 6e 43 68 61 72      azChar[nChar
94a0: 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ] = (unsigned ch
94b0: 61 72 20 2a 29 7a 3b 0a 20 20 20 20 20 20 20 20  ar *)z;.        
94c0: 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38  SQLITE_SKIP_UTF8
94d0: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 4c 65  (z);.        aLe
94e0: 6e 5b 6e 43 68 61 72 5d 20 3d 20 28 75 38 29 28  n[nChar] = (u8)(
94f0: 7a 20 2d 20 61 7a 43 68 61 72 5b 6e 43 68 61 72  z - azChar[nChar
9500: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
9510: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 68 61  }.  }.  if( nCha
9520: 72 3e 30 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  r>0 ){.    flags
9530: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
9540: 5f 49 4e 54 28 73 71 6c 69 74 65 33 5f 75 73 65  _INT(sqlite3_use
9550: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 29  r_data(context))
9560: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  ;.    if( flags 
9570: 26 20 31 20 29 7b 0a 20 20 20 20 20 20 77 68 69  & 1 ){.      whi
9580: 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  le( nIn>0 ){.   
9590: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30       int len = 0
95a0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
95b0: 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29  0; i<nChar; i++)
95c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20  {.          len 
95d0: 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20 20  = aLen[i];.     
95e0: 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e 49       if( len<=nI
95f0: 6e 20 26 26 20 6d 65 6d 63 6d 70 28 7a 49 6e 2c  n && memcmp(zIn,
9600: 20 61 7a 43 68 61 72 5b 69 5d 2c 20 6c 65 6e 29   azChar[i], len)
9610: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
9620: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
9630: 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62 72  f( i>=nChar ) br
9640: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 49 6e  eak;.        zIn
9650: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20   += len;.       
9660: 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20   nIn -= len;.   
9670: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
9680: 66 28 20 66 6c 61 67 73 20 26 20 32 20 29 7b 0a  f( flags & 2 ){.
9690: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49 6e        while( nIn
96a0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  >0 ){.        in
96b0: 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  t len = 0;.     
96c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
96d0: 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  har; i++){.     
96e0: 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b       len = aLen[
96f0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
9700: 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d 65  ( len<=nIn && me
9710: 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d 6c 65  mcmp(&zIn[nIn-le
9720: 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c 65 6e  n],azChar[i],len
9730: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
9740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9750: 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62  if( i>=nChar ) b
9760: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e 49  reak;.        nI
9770: 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  n -= len;.      
9780: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9790: 7a 43 68 61 72 53 65 74 20 29 7b 0a 20 20 20 20  zCharSet ){.    
97a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
97b0: 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  zChar);.    }.  
97c0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
97d0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
97e0: 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e 49 6e   (char*)zIn, nIn
97f0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
9800: 4e 54 29 3b 0a 7d 0a 0a 0a 2f 2a 20 49 4d 50 3a  NT);.}.../* IMP:
9810: 20 52 2d 32 35 33 36 31 2d 31 36 31 35 30 20 54   R-25361-16150 T
9820: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
9830: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 53 51 4c  omitted from SQL
9840: 69 74 65 20 62 79 20 64 65 66 61 75 6c 74 2e 20  ite by default. 
9850: 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 76  It.** is only av
9860: 61 69 6c 61 62 6c 65 20 69 66 20 74 68 65 20 53  ailable if the S
9870: 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 20 63 6f  QLITE_SOUNDEX co
9880: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
9890: 6e 20 69 73 20 75 73 65 64 0a 2a 2a 20 77 68 65  n is used.** whe
98a0: 6e 20 53 51 4c 69 74 65 20 69 73 20 62 75 69 6c  n SQLite is buil
98b0: 74 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  t..*/.#ifdef SQL
98c0: 49 54 45 5f 53 4f 55 4e 44 45 58 0a 2f 2a 0a 2a  ITE_SOUNDEX./*.*
98d0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 6f  * Compute the so
98e0: 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f  undex encoding o
98f0: 66 20 61 20 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  f a word..**.** 
9900: 49 4d 50 3a 20 52 2d 35 39 37 38 32 2d 30 30 30  IMP: R-59782-000
9910: 37 32 20 54 68 65 20 73 6f 75 6e 64 65 78 28 58  72 The soundex(X
9920: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
9930: 6e 73 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  ns a string that
9940: 20 69 73 20 74 68 65 0a 2a 2a 20 73 6f 75 6e 64   is the.** sound
9950: 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  ex encoding of t
9960: 68 65 20 73 74 72 69 6e 67 20 58 2e 20 0a 2a 2f  he string X. .*/
9970: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75  .static void sou
9980: 6e 64 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69  ndexFunc(.  sqli
9990: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
99a0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
99b0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
99c0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68  e **argv.){.  ch
99d0: 61 72 20 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20  ar zResult[8];. 
99e0: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a   const u8 *zIn;.
99f0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74    int i, j;.  st
9a00: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
9a10: 6e 65 64 20 63 68 61 72 20 69 43 6f 64 65 5b 5d  ned char iCode[]
9a20: 20 3d 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30   = {.    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 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9a50: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20  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 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9a80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
9a90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9aa0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9ab0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9ac0: 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
9ad0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9ae0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9af0: 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31  , 0,.    0, 0, 1
9b00: 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c  , 2, 3, 0, 1, 2,
9b10: 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20   0, 0, 2, 2, 4, 
9b20: 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20  5, 5, 0,.    1, 
9b30: 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31  2, 6, 2, 3, 0, 1
9b40: 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c  , 0, 2, 0, 2, 0,
9b50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
9b60: 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20   0, 0, 1, 2, 3, 
9b70: 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32  0, 1, 2, 0, 0, 2
9b80: 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c  , 2, 4, 5, 5, 0,
9b90: 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c  .    1, 2, 6, 2,
9ba0: 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20   3, 0, 1, 0, 2, 
9bb0: 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 2, 0, 0, 0, 0
9bc0: 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65  , 0,.  };.  asse
9bd0: 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20  rt( argc==1 );. 
9be0: 20 7a 49 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69   zIn = (u8*)sqli
9bf0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
9c00: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[0]);.  if( z
9c10: 49 6e 3d 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75  In==0 ) zIn = (u
9c20: 38 2a 29 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30  8*)"";.  for(i=0
9c30: 3b 20 7a 49 6e 5b 69 5d 20 26 26 20 21 73 71 6c  ; zIn[i] && !sql
9c40: 69 74 65 33 49 73 61 6c 70 68 61 28 7a 49 6e 5b  ite3Isalpha(zIn[
9c50: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66  i]); i++){}.  if
9c60: 28 20 7a 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20  ( zIn[i] ){.    
9c70: 75 38 20 70 72 65 76 63 6f 64 65 20 3d 20 69 43  u8 prevcode = iC
9c80: 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d  ode[zIn[i]&0x7f]
9c90: 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 30 5d  ;.    zResult[0]
9ca0: 20 3d 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65   = sqlite3Touppe
9cb0: 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66  r(zIn[i]);.    f
9cc0: 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a  or(j=1; j<4 && z
9cd0: 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  In[i]; i++){.   
9ce0: 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 69 43     int code = iC
9cf0: 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d  ode[zIn[i]&0x7f]
9d00: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 64 65  ;.      if( code
9d10: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  >0 ){.        if
9d20: 28 20 63 6f 64 65 21 3d 70 72 65 76 63 6f 64 65  ( code!=prevcode
9d30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72   ){.          pr
9d40: 65 76 63 6f 64 65 20 3d 20 63 6f 64 65 3b 0a 20  evcode = code;. 
9d50: 20 20 20 20 20 20 20 20 20 7a 52 65 73 75 6c 74           zResult
9d60: 5b 6a 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27  [j++] = code + '
9d70: 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0';.        }.  
9d80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9d90: 20 20 20 70 72 65 76 63 6f 64 65 20 3d 20 30 3b     prevcode = 0;
9da0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9db0: 20 20 20 77 68 69 6c 65 28 20 6a 3c 34 20 29 7b     while( j<4 ){
9dc0: 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a  .      zResult[j
9dd0: 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 7d  ++] = '0';.    }
9de0: 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 5d 20  .    zResult[j] 
9df0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
9e00: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
9e10: 74 65 78 74 2c 20 7a 52 65 73 75 6c 74 2c 20 34  text, zResult, 4
9e20: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
9e30: 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NT);.  }else{.  
9e40: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 34 38 39    /* IMP: R-6489
9e50: 34 2d 35 30 33 32 31 20 54 68 65 20 73 74 72 69  4-50321 The stri
9e60: 6e 67 20 22 3f 30 30 30 22 20 69 73 20 72 65 74  ng "?000" is ret
9e70: 75 72 6e 65 64 20 69 66 20 74 68 65 20 61 72 67  urned if the arg
9e80: 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20  ument.    ** is 
9e90: 4e 55 4c 4c 20 6f 72 20 63 6f 6e 74 61 69 6e 73  NULL or contains
9ea0: 20 6e 6f 20 41 53 43 49 49 20 61 6c 70 68 61 62   no ASCII alphab
9eb0: 65 74 69 63 20 63 68 61 72 61 63 74 65 72 73 2e  etic characters.
9ec0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
9ed0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
9ee0: 65 78 74 2c 20 22 3f 30 30 30 22 2c 20 34 2c 20  ext, "?000", 4, 
9ef0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
9f00: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
9f10: 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 20 2a  SQLITE_SOUNDEX *
9f20: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
9f30: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
9f40: 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 20 66 75  NSION./*.** A fu
9f50: 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64  nction that load
9f60: 73 20 61 20 73 68 61 72 65 64 2d 6c 69 62 72 61  s a shared-libra
9f70: 72 79 20 65 78 74 65 6e 73 69 6f 6e 20 74 68 65  ry extension the
9f80: 6e 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  n returns NULL..
9f90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
9fa0: 6f 61 64 45 78 74 28 73 71 6c 69 74 65 33 5f 63  oadExt(sqlite3_c
9fb0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
9fc0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
9fd0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
9fe0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
9ff0: 7a 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63  zFile = (const c
a000: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
a010: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
a020: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
a030: 2a 7a 50 72 6f 63 3b 0a 20 20 73 71 6c 69 74 65  *zProc;.  sqlite
a040: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
a050: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
a060: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 68  e(context);.  ch
a070: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
a080: 0a 0a 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20  ..  /* Disallow 
a090: 74 68 65 20 6c 6f 61 64 5f 65 78 74 65 6e 73 69  the load_extensi
a0a0: 6f 6e 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  on() SQL functio
a0b0: 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 53 51 4c  n unless the SQL
a0c0: 49 54 45 5f 4c 6f 61 64 45 78 74 46 75 6e 63 0a  ITE_LoadExtFunc.
a0d0: 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
a0e0: 2e 20 20 53 65 65 20 74 68 65 20 73 71 6c 69 74  .  See the sqlit
a0f0: 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  e3_enable_load_e
a100: 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a  xtension() API..
a110: 20 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e    */.  if( (db->
a120: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
a130: 6f 61 64 45 78 74 46 75 6e 63 29 3d 3d 30 20 29  oadExtFunc)==0 )
a140: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
a150: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
a160: 78 74 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69  xt, "not authori
a170: 7a 65 64 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72  zed", -1);.    r
a180: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
a190: 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20  ( argc==2 ){.   
a1a0: 20 7a 50 72 6f 63 20 3d 20 28 63 6f 6e 73 74 20   zProc = (const 
a1b0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
a1c0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
a1d0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
a1e0: 20 7a 50 72 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a   zProc = 0;.  }.
a1f0: 20 20 69 66 28 20 7a 46 69 6c 65 20 26 26 20 73    if( zFile && s
a200: 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
a210: 6e 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c  nsion(db, zFile,
a220: 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67   zProc, &zErrMsg
a230: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
a240: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
a250: 6e 74 65 78 74 2c 20 7a 45 72 72 4d 73 67 2c 20  ntext, zErrMsg, 
a260: 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
a270: 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
a280: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
a290: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
a2a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
a2b0: 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64  g structure hold
a2c0: 73 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  s the context of
a2d0: 20 61 0a 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61   a.** sum() or a
a2e0: 76 67 28 29 20 61 67 67 72 65 67 61 74 65 20 63  vg() aggregate c
a2f0: 6f 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74  omputation..*/.t
a300: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75  ypedef struct Su
a310: 6d 43 74 78 20 53 75 6d 43 74 78 3b 0a 73 74 72  mCtx SumCtx;.str
a320: 75 63 74 20 53 75 6d 43 74 78 20 7b 0a 20 20 64  uct SumCtx {.  d
a330: 6f 75 62 6c 65 20 72 53 75 6d 3b 20 20 20 20 20  ouble rSum;     
a340: 20 2f 2a 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69   /* Floating poi
a350: 6e 74 20 73 75 6d 20 2a 2f 0a 20 20 69 36 34 20  nt sum */.  i64 
a360: 69 53 75 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  iSum;         /*
a370: 20 49 6e 74 65 67 65 72 20 73 75 6d 20 2a 2f 20   Integer sum */ 
a380: 20 20 0a 20 20 69 36 34 20 63 6e 74 3b 20 20 20    .  i64 cnt;   
a390: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a3a0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d   of elements sum
a3b0: 6d 65 64 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72  med */.  u8 over
a3c0: 66 6c 6f 77 3b 20 20 20 20 20 20 2f 2a 20 54 72  flow;      /* Tr
a3d0: 75 65 20 69 66 20 69 6e 74 65 67 65 72 20 6f 76  ue if integer ov
a3e0: 65 72 66 6c 6f 77 20 73 65 65 6e 20 2a 2f 0a 20  erflow seen */. 
a3f0: 20 75 38 20 61 70 70 72 6f 78 3b 20 20 20 20 20   u8 approx;     
a400: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f     /* True if no
a410: 6e 2d 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  n-integer value 
a420: 77 61 73 20 69 6e 70 75 74 20 74 6f 20 74 68 65  was input to the
a430: 20 73 75 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   sum */.};../*.*
a440: 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20  * Routines used 
a450: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73  to compute the s
a460: 75 6d 2c 20 61 76 65 72 61 67 65 2c 20 61 6e 64  um, average, and
a470: 20 74 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68   total..**.** Th
a480: 65 20 53 55 4d 28 29 20 66 75 6e 63 74 69 6f 6e  e SUM() function
a490: 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 28 62 72   follows the (br
a4a0: 6f 6b 65 6e 29 20 53 51 4c 20 73 74 61 6e 64 61  oken) SQL standa
a4b0: 72 64 20 77 68 69 63 68 20 6d 65 61 6e 73 0a 2a  rd which means.*
a4c0: 2a 20 74 68 61 74 20 69 74 20 72 65 74 75 72 6e  * that it return
a4d0: 73 20 4e 55 4c 4c 20 69 66 20 69 74 20 73 75 6d  s NULL if it sum
a4e0: 73 20 6f 76 65 72 20 6e 6f 20 69 6e 70 75 74 73  s over no inputs
a4f0: 2e 20 20 54 4f 54 41 4c 20 72 65 74 75 72 6e 73  .  TOTAL returns
a500: 0a 2a 2a 20 30 2e 30 20 69 6e 20 74 68 61 74 20  .** 0.0 in that 
a510: 63 61 73 65 2e 20 20 49 6e 20 61 64 64 69 74 69  case.  In additi
a520: 6f 6e 2c 20 54 4f 54 41 4c 20 61 6c 77 61 79 73  on, TOTAL always
a530: 20 72 65 74 75 72 6e 73 20 61 20 66 6c 6f 61 74   returns a float
a540: 20 77 68 65 72 65 0a 2a 2a 20 53 55 4d 20 6d 69   where.** SUM mi
a550: 67 68 74 20 72 65 74 75 72 6e 20 61 6e 20 69 6e  ght return an in
a560: 74 65 67 65 72 20 69 66 20 69 74 20 6e 65 76 65  teger if it neve
a570: 72 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 20 66  r encounters a f
a580: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
a590: 20 76 61 6c 75 65 2e 20 20 54 4f 54 41 4c 20 6e   value.  TOTAL n
a5a0: 65 76 65 72 20 66 61 69 6c 73 2c 20 62 75 74 20  ever fails, but 
a5b0: 53 55 4d 20 6d 69 67 68 74 20 74 68 72 6f 75 67  SUM might throug
a5c0: 68 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  h an exception i
a5d0: 66 0a 2a 2a 20 69 74 20 6f 76 65 72 66 6c 6f 77  f.** it overflow
a5e0: 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  s an integer..*/
a5f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d  .static void sum
a600: 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Step(sqlite3_con
a610: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
a620: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
a630: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
a640: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69    SumCtx *p;.  i
a650: 6e 74 20 74 79 70 65 3b 0a 20 20 61 73 73 65 72  nt type;.  asser
a660: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
a670: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
a680: 28 61 72 67 63 29 3b 0a 20 20 70 20 3d 20 73 71  (argc);.  p = sq
a690: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
a6a0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
a6b0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
a6c0: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  type = sqlite3_v
a6d0: 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70  alue_numeric_typ
a6e0: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  e(argv[0]);.  if
a6f0: 28 20 70 20 26 26 20 74 79 70 65 21 3d 53 51 4c  ( p && type!=SQL
a700: 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
a710: 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66  p->cnt++;.    if
a720: 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49  ( type==SQLITE_I
a730: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
a740: 69 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f  i64 v = sqlite3_
a750: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
a760: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72  [0]);.      p->r
a770: 53 75 6d 20 2b 3d 20 76 3b 0a 20 20 20 20 20 20  Sum += v;.      
a780: 69 66 28 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70  if( (p->approx|p
a790: 2d 3e 6f 76 65 72 66 6c 6f 77 29 3d 3d 30 20 26  ->overflow)==0 &
a7a0: 26 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36  & sqlite3AddInt6
a7b0: 34 28 26 70 2d 3e 69 53 75 6d 2c 20 76 29 20 29  4(&p->iSum, v) )
a7c0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 76 65  {.        p->ove
a7d0: 72 66 6c 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20  rflow = 1;.     
a7e0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
a7f0: 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 73      p->rSum += s
a800: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
a810: 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
a820: 20 20 20 20 70 2d 3e 61 70 70 72 6f 78 20 3d 20      p->approx = 
a830: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  1;.    }.  }.}.s
a840: 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 46 69  tatic void sumFi
a850: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
a860: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
a870: 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20  {.  SumCtx *p;. 
a880: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
a890: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
a8a0: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66  ontext, 0);.  if
a8b0: 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20  ( p && p->cnt>0 
a8c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 76  ){.    if( p->ov
a8d0: 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
a8e0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
a8f0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 69 6e  rror(context,"in
a900: 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c  teger overflow",
a910: 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  -1);.    }else i
a920: 66 28 20 70 2d 3e 61 70 70 72 6f 78 20 29 7b 0a  f( p->approx ){.
a930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
a940: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
a950: 65 78 74 2c 20 70 2d 3e 72 53 75 6d 29 3b 0a 20  ext, p->rSum);. 
a960: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a970: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
a980: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d  nt64(context, p-
a990: 3e 69 53 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  >iSum);.    }.  
a9a0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
a9b0: 61 76 67 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  avgFinalize(sqli
a9c0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
a9d0: 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20  text){.  SumCtx 
a9e0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
a9f0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
aa00: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
aa10: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 63  .  if( p && p->c
aa20: 6e 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  nt>0 ){.    sqli
aa30: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
aa40: 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53  e(context, p->rS
aa50: 75 6d 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e  um/(double)p->cn
aa60: 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
aa70: 20 76 6f 69 64 20 74 6f 74 61 6c 46 69 6e 61 6c   void totalFinal
aa80: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
aa90: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
aaa0: 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20   SumCtx *p;.  p 
aab0: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
aac0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
aad0: 65 78 74 2c 20 30 29 3b 0a 20 20 2f 2a 20 28 64  ext, 0);.  /* (d
aae0: 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20  ouble)0 In case 
aaf0: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  of SQLITE_OMIT_F
ab00: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e  LOATING_POINT...
ab10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   */.  sqlite3_re
ab20: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
ab30: 65 78 74 2c 20 70 20 3f 20 70 2d 3e 72 53 75 6d  ext, p ? p->rSum
ab40: 20 3a 20 28 64 6f 75 62 6c 65 29 30 29 3b 0a 7d   : (double)0);.}
ab50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
ab60: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
ab70: 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 73  keeps track of s
ab80: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
ab90: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75 6e   for the.** coun
aba0: 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75  t() aggregate fu
abb0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  nction..*/.typed
abc0: 65 66 20 73 74 72 75 63 74 20 43 6f 75 6e 74 43  ef struct CountC
abd0: 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72  tx CountCtx;.str
abe0: 75 63 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20  uct CountCtx {. 
abf0: 20 69 36 34 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a   i64 n;.};../*.*
ac00: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d  * Routines to im
ac10: 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  plement the coun
ac20: 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75  t() aggregate fu
ac30: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
ac40: 63 20 76 6f 69 64 20 63 6f 75 6e 74 53 74 65 70  c void countStep
ac50: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
ac60: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
ac70: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
ac80: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f  ue **argv){.  Co
ac90: 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  untCtx *p;.  p =
aca0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
acb0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
acc0: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  xt, sizeof(*p));
acd0: 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20  .  if( (argc==0 
ace0: 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d  || SQLITE_NULL!=
acf0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
ad00: 70 65 28 61 72 67 76 5b 30 5d 29 29 20 26 26 20  pe(argv[0])) && 
ad10: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b  p ){.    p->n++;
ad20: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
ad30: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
ad40: 41 54 45 44 0a 20 20 2f 2a 20 54 68 65 20 73 71  ATED.  /* The sq
ad50: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
ad60: 63 6f 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  count() function
ad70: 20 69 73 20 64 65 70 72 65 63 61 74 65 64 2e 20   is deprecated. 
ad80: 20 42 75 74 20 6a 75 73 74 20 74 6f 20 6d 61 6b   But just to mak
ad90: 65 0a 20 20 2a 2a 20 73 75 72 65 20 69 74 20 73  e.  ** sure it s
ada0: 74 69 6c 6c 20 6f 70 65 72 61 74 65 73 20 63 6f  till operates co
adb0: 72 72 65 63 74 6c 79 2c 20 76 65 72 69 66 79 20  rrectly, verify 
adc0: 74 68 61 74 20 69 74 73 20 63 6f 75 6e 74 20 61  that its count a
add0: 67 72 65 65 73 20 77 69 74 68 20 6f 75 72 20 0a  grees with our .
ade0: 20 20 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 63 6f    ** internal co
adf0: 75 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20 63  unt when using c
ae00: 6f 75 6e 74 28 2a 29 20 61 6e 64 20 77 68 65 6e  ount(*) and when
ae10: 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74   the total count
ae20: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 65 78 70   can be.  ** exp
ae30: 72 65 73 73 65 64 20 61 73 20 61 20 33 32 2d 62  ressed as a 32-b
ae40: 69 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  it integer. */. 
ae50: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
ae60: 20 7c 7c 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e   || p==0 || p->n
ae70: 3e 30 78 37 66 66 66 66 66 66 66 0a 20 20 20 20  >0x7fffffff.    
ae80: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6e 3d 3d 73        || p->n==s
ae90: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
aea0: 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 20  _count(context) 
aeb0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 20 20 20 0a 73  );.#endif.}   .s
aec0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74  tatic void count
aed0: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
aee0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
aef0: 74 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a  t){.  CountCtx *
af00: 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  p;.  p = sqlite3
af10: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
af20: 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  xt(context, 0);.
af30: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
af40: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
af50: 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d  p ? p->n : 0);.}
af60: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
af70: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69   to implement mi
af80: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67  n() and max() ag
af90: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
afa0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
afb0: 64 20 6d 69 6e 6d 61 78 53 74 65 70 28 0a 20 20  d minmaxStep(.  
afc0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
afd0: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
afe0: 20 4e 6f 74 55 73 65 64 2c 20 0a 20 20 73 71 6c   NotUsed, .  sql
aff0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
b000: 76 0a 29 7b 0a 20 20 4d 65 6d 20 2a 70 41 72 67  v.){.  Mem *pArg
b010: 20 20 3d 20 28 4d 65 6d 20 2a 29 61 72 67 76 5b    = (Mem *)argv[
b020: 30 5d 3b 0a 20 20 4d 65 6d 20 2a 70 42 65 73 74  0];.  Mem *pBest
b030: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
b040: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 0a  ETER(NotUsed);..
b050: 20 20 70 42 65 73 74 20 3d 20 28 4d 65 6d 20 2a    pBest = (Mem *
b060: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
b070: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
b080: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42 65 73  xt, sizeof(*pBes
b090: 74 29 29 3b 0a 20 20 69 66 28 20 21 70 42 65 73  t));.  if( !pBes
b0a0: 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  t ) return;..  i
b0b0: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
b0c0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
b0d0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
b0e0: 20 20 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c     if( pBest->fl
b0f0: 61 67 73 20 29 20 73 71 6c 69 74 65 33 53 6b 69  ags ) sqlite3Ski
b100: 70 41 63 63 75 6d 75 6c 61 74 6f 72 4c 6f 61 64  pAccumulatorLoad
b110: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c  (context);.  }el
b120: 73 65 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c  se if( pBest->fl
b130: 61 67 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  ags ){.    int m
b140: 61 78 3b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b  ax;.    int cmp;
b150: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
b160: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
b170: 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74  FuncCollSeq(cont
b180: 65 78 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69  ext);.    /* Thi
b190: 73 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20  s step function 
b1a0: 69 73 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68  is used for both
b1b0: 20 74 68 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d   the min() and m
b1c0: 61 78 28 29 20 61 67 67 72 65 67 61 74 65 73 2c  ax() aggregates,
b1d0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79  .    ** the only
b1e0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
b1f0: 65 65 6e 20 74 68 65 20 74 77 6f 20 62 65 69 6e  een the two bein
b200: 67 20 74 68 61 74 20 74 68 65 20 73 65 6e 73 65  g that the sense
b210: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
b220: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 69 6e 76  omparison is inv
b230: 65 72 74 65 64 2e 20 46 6f 72 20 74 68 65 20 6d  erted. For the m
b240: 61 78 28 29 20 61 67 67 72 65 67 61 74 65 2c 20  ax() aggregate, 
b250: 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  the.    ** sqlit
b260: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 29 20 66  e3_user_data() f
b270: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
b280: 28 76 6f 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20  (void *)-1. For 
b290: 6d 69 6e 28 29 20 69 74 0a 20 20 20 20 2a 2a 20  min() it.    ** 
b2a0: 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29  returns (void *)
b2b0: 64 62 2c 20 77 68 65 72 65 20 64 62 20 69 73 20  db, where db is 
b2c0: 74 68 65 20 73 71 6c 69 74 65 33 2a 20 64 61 74  the sqlite3* dat
b2d0: 61 62 61 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20  abase pointer.. 
b2e0: 20 20 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20     ** Therefore 
b2f0: 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65  the next stateme
b300: 6e 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  nt sets variable
b310: 20 27 6d 61 78 27 20 74 6f 20 31 20 66 6f 72 20   'max' to 1 for 
b320: 74 68 65 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a  the max().    **
b330: 20 61 67 67 72 65 67 61 74 65 2c 20 6f 72 20 30   aggregate, or 0
b340: 20 66 6f 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20   for min()..    
b350: 2a 2f 0a 20 20 20 20 6d 61 78 20 3d 20 73 71 6c  */.    max = sql
b360: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
b370: 6f 6e 74 65 78 74 29 21 3d 30 3b 0a 20 20 20 20  ontext)!=0;.    
b380: 63 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  cmp = sqlite3Mem
b390: 43 6f 6d 70 61 72 65 28 70 42 65 73 74 2c 20 70  Compare(pBest, p
b3a0: 41 72 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  Arg, pColl);.   
b3b0: 20 69 66 28 20 28 6d 61 78 20 26 26 20 63 6d 70   if( (max && cmp
b3c0: 3c 30 29 20 7c 7c 20 28 21 6d 61 78 20 26 26 20  <0) || (!max && 
b3d0: 63 6d 70 3e 30 29 20 29 7b 0a 20 20 20 20 20 20  cmp>0) ){.      
b3e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
b3f0: 70 79 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b  py(pBest, pArg);
b400: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b410: 20 20 73 71 6c 69 74 65 33 53 6b 69 70 41 63 63    sqlite3SkipAcc
b420: 75 6d 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e  umulatorLoad(con
b430: 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  text);.    }.  }
b440: 65 6c 73 65 7b 0a 20 20 20 20 70 42 65 73 74 2d  else{.    pBest-
b450: 3e 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  >db = sqlite3_co
b460: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
b470: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 73 71  context);.    sq
b480: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
b490: 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20  (pBest, pArg);. 
b4a0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
b4b0: 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 28   minMaxFinalize(
b4c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
b4d0: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c  *context){.  sql
b4e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 73  ite3_value *pRes
b4f0: 3b 0a 20 20 70 52 65 73 20 3d 20 28 73 71 6c 69  ;.  pRes = (sqli
b500: 74 65 33 5f 76 61 6c 75 65 20 2a 29 73 71 6c 69  te3_value *)sqli
b510: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
b520: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
b530: 29 3b 0a 20 20 69 66 28 20 70 52 65 73 20 29 7b  );.  if( pRes ){
b540: 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 66  .    if( pRes->f
b550: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 73 71  lags ){.      sq
b560: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
b570: 75 65 28 63 6f 6e 74 65 78 74 2c 20 70 52 65 73  ue(context, pRes
b580: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
b590: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
b5a0: 73 65 28 70 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a  se(pRes);.  }.}.
b5b0: 0a 2f 2a 0a 2a 2a 20 67 72 6f 75 70 5f 63 6f 6e  ./*.** group_con
b5c0: 63 61 74 28 45 58 50 52 2c 20 3f 53 45 50 41 52  cat(EXPR, ?SEPAR
b5d0: 41 54 4f 52 3f 29 0a 2a 2f 0a 73 74 61 74 69 63  ATOR?).*/.static
b5e0: 20 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63 61   void groupConca
b5f0: 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  tStep(.  sqlite3
b600: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
b610: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
b620: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b630: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
b640: 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 53   char *zVal;.  S
b650: 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b  trAccum *pAccum;
b660: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b670: 53 65 70 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 2c  Sep;.  int nVal,
b680: 20 6e 53 65 70 3b 0a 20 20 61 73 73 65 72 74 28   nSep;.  assert(
b690: 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63   argc==1 || argc
b6a0: 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==2 );.  if( sql
b6b0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
b6c0: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
b6d0: 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a  _NULL ) return;.
b6e0: 20 20 70 41 63 63 75 6d 20 3d 20 28 53 74 72 41    pAccum = (StrA
b6f0: 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f 61 67  ccum*)sqlite3_ag
b700: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
b710: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
b720: 2a 70 41 63 63 75 6d 29 29 3b 0a 0a 20 20 69 66  *pAccum));..  if
b730: 28 20 70 41 63 63 75 6d 20 29 7b 0a 20 20 20 20  ( pAccum ){.    
b740: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
b750: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
b760: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
b770: 3b 0a 20 20 20 20 69 6e 74 20 66 69 72 73 74 54  ;.    int firstT
b780: 65 72 6d 20 3d 20 70 41 63 63 75 6d 2d 3e 6d 78  erm = pAccum->mx
b790: 41 6c 6c 6f 63 3d 3d 30 3b 0a 20 20 20 20 70 41  Alloc==0;.    pA
b7a0: 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 20 3d 20  ccum->mxAlloc = 
b7b0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
b7c0: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b  E_LIMIT_LENGTH];
b7d0: 0a 20 20 20 20 69 66 28 20 21 66 69 72 73 74 54  .    if( !firstT
b7e0: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  erm ){.      if(
b7f0: 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20   argc==2 ){.    
b800: 20 20 20 20 7a 53 65 70 20 3d 20 28 63 68 61 72      zSep = (char
b810: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
b820: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  text(argv[1]);. 
b830: 20 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73 71         nSep = sq
b840: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
b850: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  s(argv[1]);.    
b860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b870: 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20   zSep = ",";.   
b880: 20 20 20 20 20 6e 53 65 70 20 3d 20 31 3b 0a 20       nSep = 1;. 
b890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b8a0: 20 6e 53 65 70 20 29 20 73 71 6c 69 74 65 33 53   nSep ) sqlite3S
b8b0: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 41  trAccumAppend(pA
b8c0: 63 63 75 6d 2c 20 7a 53 65 70 2c 20 6e 53 65 70  ccum, zSep, nSep
b8d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 56 61  );.    }.    zVa
b8e0: 6c 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  l = (char*)sqlit
b8f0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
b900: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 56 61 6c  gv[0]);.    nVal
b910: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
b920: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
b930: 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 20 29 20  .    if( zVal ) 
b940: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
b950: 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a 56  ppend(pAccum, zV
b960: 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 7d 0a 7d  al, nVal);.  }.}
b970: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 72 6f  .static void gro
b980: 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65  upConcatFinalize
b990: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
b9a0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 74   *context){.  St
b9b0: 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a  rAccum *pAccum;.
b9c0: 20 20 70 41 63 63 75 6d 20 3d 20 73 71 6c 69 74    pAccum = sqlit
b9d0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
b9e0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
b9f0: 3b 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20 29  ;.  if( pAccum )
ba00: 7b 0a 20 20 20 20 69 66 28 20 70 41 63 63 75 6d  {.    if( pAccum
ba10: 2d 3e 61 63 63 45 72 72 6f 72 3d 3d 53 54 52 41  ->accError==STRA
ba20: 43 43 55 4d 5f 54 4f 4f 42 49 47 20 29 7b 0a 20  CCUM_TOOBIG ){. 
ba30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
ba40: 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67  ult_error_toobig
ba50: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  (context);.    }
ba60: 65 6c 73 65 20 69 66 28 20 70 41 63 63 75 6d 2d  else if( pAccum-
ba70: 3e 61 63 63 45 72 72 6f 72 3d 3d 53 54 52 41 43  >accError==STRAC
ba80: 43 55 4d 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  CUM_NOMEM ){.   
ba90: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
baa0: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
bab0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73  ntext);.    }els
bac0: 65 7b 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c  e{    .      sql
bad0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
bae0: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
baf0: 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
bb00: 70 41 63 63 75 6d 29 2c 20 2d 31 2c 20 0a 20 20  pAccum), -1, .  
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
bb30: 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  free);.    }.  }
bb40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
bb50: 6f 75 74 69 6e 65 20 64 6f 65 73 20 70 65 72 2d  outine does per-
bb60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 75 6e 63 74  connection funct
bb70: 69 6f 6e 20 72 65 67 69 73 74 72 61 74 69 6f 6e  ion registration
bb80: 2e 20 20 4d 6f 73 74 0a 2a 2a 20 6f 66 20 74 68  .  Most.** of th
bb90: 65 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  e built-in funct
bba0: 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 70  ions above are p
bbb0: 61 72 74 20 6f 66 20 74 68 65 20 67 6c 6f 62 61  art of the globa
bbc0: 6c 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 2e 0a  l function set..
bbd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bbe0: 6f 6e 6c 79 20 64 65 61 6c 73 20 77 69 74 68 20  only deals with 
bbf0: 74 68 6f 73 65 20 74 68 61 74 20 61 72 65 20 6e  those that are n
bc00: 6f 74 20 67 6c 6f 62 61 6c 2e 0a 2a 2f 0a 76 6f  ot global..*/.vo
bc10: 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  id sqlite3Regist
bc20: 65 72 50 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42  erPerConnectionB
bc30: 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
bc40: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
bc50: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
bc60: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
bc70: 6f 6e 28 64 62 2c 20 22 4d 41 54 43 48 22 2c 20  on(db, "MATCH", 
bc80: 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  2);.  assert( rc
bc90: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
bca0: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
bcb0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
bcc0: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
bcd0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
bce0: 28 64 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  (db);.  }.}../*.
bcf0: 2a 2a 20 53 65 74 20 74 68 65 20 4c 49 4b 45 4f  ** Set the LIKEO
bd00: 50 54 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 32  PT flag on the 2
bd10: 2d 61 72 67 75 6d 65 6e 74 20 66 75 6e 63 74 69  -argument functi
bd20: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
bd30: 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  n name..*/.stati
bd40: 63 20 76 6f 69 64 20 73 65 74 4c 69 6b 65 4f 70  c void setLikeOp
bd50: 74 46 6c 61 67 28 73 71 6c 69 74 65 33 20 2a 64  tFlag(sqlite3 *d
bd60: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
bd70: 4e 61 6d 65 2c 20 75 38 20 66 6c 61 67 56 61 6c  Name, u8 flagVal
bd80: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44  ){.  FuncDef *pD
bd90: 65 66 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c  ef;.  pDef = sql
bda0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
bdb0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 32 2c 20 53  (db, zName, 2, S
bdc0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a  QLITE_UTF8, 0);.
bdd0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44 65    if( ALWAYS(pDe
bde0: 66 29 20 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e  f) ){.    pDef->
bdf0: 66 75 6e 63 46 6c 61 67 73 20 7c 3d 20 66 6c 61  funcFlags |= fla
be00: 67 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  gVal;.  }.}../*.
be10: 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
be20: 62 75 69 6c 74 2d 69 6e 20 4c 49 4b 45 20 61 6e  built-in LIKE an
be30: 64 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73  d GLOB functions
be40: 2e 20 20 54 68 65 20 63 61 73 65 53 65 6e 73 69  .  The caseSensi
be50: 74 69 76 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  tive.** paramete
be60: 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  r determines whe
be70: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
be80: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73  LIKE operator is
be90: 20 63 61 73 65 0a 2a 2a 20 73 65 6e 73 69 74 69   case.** sensiti
bea0: 76 65 2e 20 20 47 4c 4f 42 20 69 73 20 61 6c 77  ve.  GLOB is alw
beb0: 61 79 73 20 63 61 73 65 20 73 65 6e 73 69 74 69  ays case sensiti
bec0: 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ve..*/.void sqli
bed0: 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46  te3RegisterLikeF
bee0: 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33  unctions(sqlite3
bef0: 20 2a 64 62 2c 20 69 6e 74 20 63 61 73 65 53 65   *db, int caseSe
bf00: 6e 73 69 74 69 76 65 29 7b 0a 20 20 73 74 72 75  nsitive){.  stru
bf10: 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a  ct compareInfo *
bf20: 70 49 6e 66 6f 3b 0a 20 20 69 66 28 20 63 61 73  pInfo;.  if( cas
bf30: 65 53 65 6e 73 69 74 69 76 65 20 29 7b 0a 20 20  eSensitive ){.  
bf40: 20 20 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63    pInfo = (struc
bf50: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26  t compareInfo*)&
bf60: 6c 69 6b 65 49 6e 66 6f 41 6c 74 3b 0a 20 20 7d  likeInfoAlt;.  }
bf70: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 20  else{.    pInfo 
bf80: 3d 20 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72  = (struct compar
bf90: 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f  eInfo*)&likeInfo
bfa0: 4e 6f 72 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Norm;.  }.  sqli
bfb0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
bfc0: 2c 20 22 6c 69 6b 65 22 2c 20 32 2c 20 53 51 4c  , "like", 2, SQL
bfd0: 49 54 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c  ITE_UTF8, pInfo,
bfe0: 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c   likeFunc, 0, 0,
bff0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 72   0);.  sqlite3Cr
c000: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22 6c 69  eateFunc(db, "li
c010: 6b 65 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55  ke", 3, SQLITE_U
c020: 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65  TF8, pInfo, like
c030: 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Func, 0, 0, 0);.
c040: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46    sqlite3CreateF
c050: 75 6e 63 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20  unc(db, "glob", 
c060: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
c070: 0a 20 20 20 20 20 20 28 73 74 72 75 63 74 20 63  .      (struct c
c080: 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c 6f  ompareInfo*)&glo
c090: 62 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c  bInfo, likeFunc,
c0a0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 65 74   0, 0, 0);.  set
c0b0: 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20  LikeOptFlag(db, 
c0c0: 22 67 6c 6f 62 22 2c 20 53 51 4c 49 54 45 5f 46  "glob", SQLITE_F
c0d0: 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54  UNC_LIKE | SQLIT
c0e0: 45 5f 46 55 4e 43 5f 43 41 53 45 29 3b 0a 20 20  E_FUNC_CASE);.  
c0f0: 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64  setLikeOptFlag(d
c100: 62 2c 20 22 6c 69 6b 65 22 2c 20 0a 20 20 20 20  b, "like", .    
c110: 20 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 20    caseSensitive 
c120: 3f 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  ? (SQLITE_FUNC_L
c130: 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e  IKE | SQLITE_FUN
c140: 43 5f 43 41 53 45 29 20 3a 20 53 51 4c 49 54 45  C_CASE) : SQLITE
c150: 5f 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a  _FUNC_LIKE);.}..
c160: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f 69 6e  /*.** pExpr poin
c170: 74 73 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  ts to an express
c180: 69 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c 65 6d  ion which implem
c190: 65 6e 74 73 20 61 20 66 75 6e 63 74 69 6f 6e 2e  ents a function.
c1a0: 20 20 49 66 0a 2a 2a 20 69 74 20 69 73 20 61 70    If.** it is ap
c1b0: 70 72 6f 70 72 69 61 74 65 20 74 6f 20 61 70 70  propriate to app
c1c0: 6c 79 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69  ly the LIKE opti
c1d0: 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68 61 74  mization to that
c1e0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 65   function.** the
c1f0: 6e 20 73 65 74 20 61 57 63 5b 30 5d 20 74 68 72  n set aWc[0] thr
c200: 6f 75 67 68 20 61 57 63 5b 32 5d 20 74 6f 20 74  ough aWc[2] to t
c210: 68 65 20 77 69 6c 64 63 61 72 64 20 63 68 61 72  he wildcard char
c220: 61 63 74 65 72 73 20 61 6e 64 0a 2a 2a 20 72 65  acters and.** re
c230: 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 74  turn TRUE.  If t
c240: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  he function is n
c250: 6f 74 20 61 20 4c 49 4b 45 2d 73 74 79 6c 65 20  ot a LIKE-style 
c260: 66 75 6e 63 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a  function then.**
c270: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a   return FALSE..*
c280: 2a 0a 2a 2a 20 2a 70 49 73 4e 6f 63 61 73 65 20  *.** *pIsNocase 
c290: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
c2a0: 66 20 75 70 70 65 72 63 61 73 65 20 61 6e 64 20  f uppercase and 
c2b0: 6c 6f 77 65 72 63 61 73 65 20 61 72 65 20 65 71  lowercase are eq
c2c0: 75 69 76 61 6c 65 6e 74 20 66 6f 72 0a 2a 2a 20  uivalent for.** 
c2d0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 28 64 65  the function (de
c2e0: 66 61 75 6c 74 20 66 6f 72 20 4c 49 4b 45 29 2e  fault for LIKE).
c2f0: 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f    If the functio
c300: 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 69 73 74  n makes the dist
c310: 69 6e 63 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65  inction.** betwe
c320: 65 6e 20 75 70 70 65 72 63 61 73 65 20 61 6e 64  en uppercase and
c330: 20 6c 6f 77 65 72 63 61 73 65 20 28 61 73 20 64   lowercase (as d
c340: 6f 65 73 20 47 4c 4f 42 29 20 74 68 65 6e 20 2a  oes GLOB) then *
c350: 70 49 73 4e 6f 63 61 73 65 20 69 73 20 73 65 74  pIsNocase is set
c360: 20 74 6f 0a 2a 2a 20 66 61 6c 73 65 2e 0a 2a 2f   to.** false..*/
c370: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 4c 69  .int sqlite3IsLi
c380: 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74  keFunction(sqlit
c390: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 45  e3 *db, Expr *pE
c3a0: 78 70 72 2c 20 69 6e 74 20 2a 70 49 73 4e 6f 63  xpr, int *pIsNoc
c3b0: 61 73 65 2c 20 63 68 61 72 20 2a 61 57 63 29 7b  ase, char *aWc){
c3c0: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66  .  FuncDef *pDef
c3d0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
c3e0: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 0a  p!=TK_FUNCTION .
c3f0: 20 20 20 7c 7c 20 21 70 45 78 70 72 2d 3e 78 2e     || !pExpr->x.
c400: 70 4c 69 73 74 20 0a 20 20 20 7c 7c 20 70 45 78  pList .   || pEx
c410: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
c420: 70 72 21 3d 32 0a 20 20 29 7b 0a 20 20 20 20 72  pr!=2.  ){.    r
c430: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
c440: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
c450: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
c460: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
c470: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
c480: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
c490: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
c4a0: 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
c4b0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  , 0);.  if( NEVE
c4c0: 52 28 70 44 65 66 3d 3d 30 29 20 7c 7c 20 28 70  R(pDef==0) || (p
c4d0: 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
c4e0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
c4f0: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  E)==0 ){.    ret
c500: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
c510: 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 73 74   The memcpy() st
c520: 61 74 65 6d 65 6e 74 20 61 73 73 75 6d 65 73 20  atement assumes 
c530: 74 68 61 74 20 74 68 65 20 77 69 6c 64 63 61 72  that the wildcar
c540: 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65  d characters are
c550: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
c560: 74 68 72 65 65 20 73 74 61 74 65 6d 65 6e 74 73  three statements
c570: 20 69 6e 20 74 68 65 20 63 6f 6d 70 61 72 65 49   in the compareI
c580: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
c590: 54 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 73  The.  ** asserts
c5a0: 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 76  () that follow v
c5b0: 65 72 69 66 79 20 74 68 61 74 20 61 73 73 75 6d  erify that assum
c5c0: 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ption.  */.  mem
c5d0: 63 70 79 28 61 57 63 2c 20 70 44 65 66 2d 3e 70  cpy(aWc, pDef->p
c5e0: 55 73 65 72 44 61 74 61 2c 20 33 29 3b 0a 20 20  UserData, 3);.  
c5f0: 61 73 73 65 72 74 28 20 28 63 68 61 72 2a 29 26  assert( (char*)&
c600: 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20 28  likeInfoAlt == (
c610: 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41  char*)&likeInfoA
c620: 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a 20  lt.matchAll );. 
c630: 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61 72   assert( &((char
c640: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b  *)&likeInfoAlt)[
c650: 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69  1] == (char*)&li
c660: 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 4f  keInfoAlt.matchO
c670: 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
c680: 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  &((char*)&likeIn
c690: 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63 68  foAlt)[2] == (ch
c6a0: 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74  ar*)&likeInfoAlt
c6b0: 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a 20 20 2a  .matchSet );.  *
c6c0: 70 49 73 4e 6f 63 61 73 65 20 3d 20 28 70 44 65  pIsNocase = (pDe
c6d0: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
c6e0: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29  QLITE_FUNC_CASE)
c6f0: 3d 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ==0;.  return 1;
c700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  .}../*.** All of
c710: 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74 72   the FuncDef str
c720: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 61  uctures in the a
c730: 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 61 72  BuiltinFunc[] ar
c740: 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20  ray above.** to 
c750: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
c760: 69 6f 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 20  ion hash table. 
c770: 20 54 68 69 73 20 6f 63 63 75 72 73 20 61 74 20   This occurs at 
c780: 73 74 61 72 74 2d 74 69 6d 65 20 28 61 73 0a 2a  start-time (as.*
c790: 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  * a consequence 
c7a0: 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  of calling sqlit
c7b0: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 29  e3_initialize())
c7c0: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
c7d0: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 0a  is routine runs.
c7e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
c7f0: 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
c800: 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  nctions(void){. 
c810: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c   /*.  ** The fol
c820: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
c830: 64 73 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ds FuncDef struc
c840: 74 75 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66  tures for all of
c850: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20   the functions. 
c860: 20 2a 2a 20 64 65 66 69 6e 65 64 20 69 6e 20 74   ** defined in t
c870: 68 69 73 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20  his file..  **. 
c880: 20 2a 2a 20 54 68 65 20 61 72 72 61 79 20 63 61   ** The array ca
c890: 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  nnot be constant
c8a0: 20 73 69 6e 63 65 20 63 68 61 6e 67 65 73 20 61   since changes a
c8b0: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 0a 20  re made to the. 
c8c0: 20 2a 2a 20 46 75 6e 63 44 65 66 2e 70 48 61 73   ** FuncDef.pHas
c8d0: 68 20 65 6c 65 6d 65 6e 74 73 20 61 74 20 73 74  h elements at st
c8e0: 61 72 74 2d 74 69 6d 65 2e 20 20 54 68 65 20 65  art-time.  The e
c8f0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 69 73 20  lements of this 
c900: 61 72 72 61 79 0a 20 20 2a 2a 20 61 72 65 20 72  array.  ** are r
c910: 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 69  ead-only after i
c920: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69 73  nitialization is
c930: 20 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a 2a 0a   complete..  **.
c940: 20 20 2a 2a 20 46 6f 72 20 70 65 61 6b 20 65 66    ** For peak ef
c950: 66 69 63 69 65 6e 63 79 2c 20 70 75 74 20 74 68  ficiency, put th
c960: 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74 6c  e most frequentl
c970: 79 20 75 73 65 64 20 66 75 6e 63 74 69 6f 6e 20  y used function 
c980: 6c 61 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61  last..  */.  sta
c990: 74 69 63 20 46 75 6e 63 44 65 66 20 61 42 75 69  tic FuncDef aBui
c9a0: 6c 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a 23  ltinFunc[] = {.#
c9b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55  ifdef SQLITE_SOU
c9c0: 4e 44 45 58 0a 20 20 20 20 46 55 4e 43 54 49 4f  NDEX.    FUNCTIO
c9d0: 4e 28 73 6f 75 6e 64 65 78 2c 20 20 20 20 20 20  N(soundex,      
c9e0: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73        1, 0, 0, s
c9f0: 6f 75 6e 64 65 78 46 75 6e 63 20 20 20 20 20 20  oundexFunc      
ca00: 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  ),.#endif.#ifnde
ca10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
ca20: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
ca30: 20 56 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f   VFUNCTION(load_
ca40: 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 31 2c  extension,    1,
ca50: 20 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20   0, 0, loadExt  
ca60: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 56          ),.    V
ca70: 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78  FUNCTION(load_ex
ca80: 74 65 6e 73 69 6f 6e 2c 20 20 20 20 32 2c 20 30  tension,    2, 0
ca90: 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20 20  , 0, loadExt    
caa0: 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a        ),.#endif.
cab0: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
cac0: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
cad0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69     FUNCTION(sqli
cae0: 74 65 5f 63 72 79 70 74 2c 20 20 20 20 20 20 20  te_crypt,       
caf0: 32 2c 20 30 2c 20 30 2c 20 73 71 6c 69 74 65 33  2, 0, 0, sqlite3
cb00: 43 72 79 70 74 46 75 6e 63 20 29 2c 0a 23 65 6e  CryptFunc ),.#en
cb10: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
cb20: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
cb30: 50 54 49 4f 4e 5f 44 49 41 47 53 0a 20 20 20 20  PTION_DIAGS.    
cb40: 44 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65  DFUNCTION(sqlite
cb50: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75  _compileoption_u
cb60: 73 65 64 2c 31 2c 20 30 2c 20 30 2c 20 63 6f 6d  sed,1, 0, 0, com
cb70: 70 69 6c 65 6f 70 74 69 6f 6e 75 73 65 64 46 75  pileoptionusedFu
cb80: 6e 63 20 20 29 2c 0a 20 20 20 20 44 46 55 4e 43  nc  ),.    DFUNC
cb90: 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63 6f 6d 70  TION(sqlite_comp
cba0: 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 2c 20 31  ileoption_get, 1
cbb0: 2c 20 30 2c 20 30 2c 20 63 6f 6d 70 69 6c 65 6f  , 0, 0, compileo
cbc0: 70 74 69 6f 6e 67 65 74 46 75 6e 63 20 20 29 2c  ptiongetFunc  ),
cbd0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
cbe0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
cbf0: 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 20 20  TION_DIAGS */.  
cc00: 20 20 46 55 4e 43 54 49 4f 4e 32 28 75 6e 6c 69    FUNCTION2(unli
cc10: 6b 65 6c 79 2c 20 20 20 20 20 20 20 20 20 20 31  kely,          1
cc20: 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63  , 0, 0, noopFunc
cc30: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55  ,  SQLITE_FUNC_U
cc40: 4e 4c 49 4b 45 4c 59 29 2c 0a 20 20 20 20 46 55  NLIKELY),.    FU
cc50: 4e 43 54 49 4f 4e 32 28 6c 69 6b 65 6c 69 68 6f  NCTION2(likeliho
cc60: 6f 64 2c 20 20 20 20 20 20 20 20 32 2c 20 30 2c  od,        2, 0,
cc70: 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53   0, noopFunc,  S
cc80: 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b  QLITE_FUNC_UNLIK
cc90: 45 4c 59 29 2c 0a 20 20 20 20 46 55 4e 43 54 49  ELY),.    FUNCTI
cca0: 4f 4e 32 28 6c 69 6b 65 6c 79 2c 20 20 20 20 20  ON2(likely,     
ccb0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
ccc0: 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54  noopFunc,  SQLIT
ccd0: 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29  E_FUNC_UNLIKELY)
cce0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c  ,.    FUNCTION(l
ccf0: 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20  trim,           
cd00: 20 20 20 31 2c 20 31 2c 20 30 2c 20 74 72 69 6d     1, 1, 0, trim
cd10: 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a  Func         ),.
cd20: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72      FUNCTION(ltr
cd30: 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  im,             
cd40: 20 32 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75   2, 1, 0, trimFu
cd50: 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  nc         ),.  
cd60: 20 20 46 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d    FUNCTION(rtrim
cd70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
cd80: 2c 20 32 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 2, 0, trimFunc
cd90: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
cda0: 46 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20  FUNCTION(rtrim, 
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
cdc0: 32 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20  2, 0, trimFunc  
cdd0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
cde0: 4e 43 54 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20  NCTION(trim,    
cdf0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 33 2c             1, 3,
ce00: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
ce10: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
ce20: 54 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20  TION(trim,      
ce30: 20 20 20 20 20 20 20 20 20 32 2c 20 33 2c 20 30           2, 3, 0
ce40: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
ce50: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
ce60: 4f 4e 28 6d 69 6e 2c 20 20 20 20 20 20 20 20 20  ON(min,         
ce70: 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 31 2c 20        -1, 0, 1, 
ce80: 6d 69 6e 6d 61 78 46 75 6e 63 20 20 20 20 20 20  minmaxFunc      
ce90: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
cea0: 28 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  (min,           
ceb0: 20 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 30 20       0, 0, 1, 0 
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
ced0: 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 32  ,.    AGGREGATE2
cee0: 28 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  (min,           
cef0: 20 20 20 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d     1, 0, 1, minm
cf00: 61 78 53 74 65 70 2c 20 20 20 20 20 20 6d 69 6e  axStep,      min
cf10: 4d 61 78 46 69 6e 61 6c 69 7a 65 2c 0a 20 20 20  MaxFinalize,.   
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55         SQLITE_FU
cf50: 4e 43 5f 4d 49 4e 4d 41 58 20 29 2c 0a 20 20 20  NC_MINMAX ),.   
cf60: 20 46 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20   FUNCTION(max,  
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
cf80: 20 31 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e   1, 1, minmaxFun
cf90: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  c       ),.    F
cfa0: 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20  UNCTION(max,    
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 31              0, 1
cfc0: 2c 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20  , 1, 0          
cfd0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47        ),.    AGG
cfe0: 52 45 47 41 54 45 32 28 6d 61 78 2c 20 20 20 20  REGATE2(max,    
cff0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20            1, 1, 
d000: 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20  1, minmaxStep,  
d010: 20 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69      minMaxFinali
d020: 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
d050: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
d060: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
d070: 32 28 74 79 70 65 6f 66 2c 20 20 20 20 20 20 20  2(typeof,       
d080: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 74 79       1, 0, 0, ty
d090: 70 65 6f 66 46 75 6e 63 2c 20 20 53 51 4c 49 54  peofFunc,  SQLIT
d0a0: 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 2c 0a  E_FUNC_TYPEOF),.
d0b0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 6c 65      FUNCTION2(le
d0c0: 6e 67 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  ngth,           
d0d0: 20 31 2c 20 30 2c 20 30 2c 20 6c 65 6e 67 74 68   1, 0, 0, length
d0e0: 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55  Func,  SQLITE_FU
d0f0: 4e 43 5f 4c 45 4e 47 54 48 29 2c 0a 20 20 20 20  NC_LENGTH),.    
d100: 46 55 4e 43 54 49 4f 4e 28 69 6e 73 74 72 2c 20  FUNCTION(instr, 
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
d120: 30 2c 20 30 2c 20 69 6e 73 74 72 46 75 6e 63 20  0, 0, instrFunc 
d130: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
d140: 4e 43 54 49 4f 4e 28 70 72 69 6e 74 66 2c 20 20  NCTION(printf,  
d150: 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c            -1, 0,
d160: 20 30 2c 20 70 72 69 6e 74 66 46 75 6e 63 20 20   0, printfFunc  
d170: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
d180: 54 49 4f 4e 28 75 6e 69 63 6f 64 65 2c 20 20 20  TION(unicode,   
d190: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
d1a0: 2c 20 75 6e 69 63 6f 64 65 46 75 6e 63 20 20 20  , unicodeFunc   
d1b0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
d1c0: 4f 4e 28 63 68 61 72 2c 20 20 20 20 20 20 20 20  ON(char,        
d1d0: 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20        -1, 0, 0, 
d1e0: 63 68 61 72 46 75 6e 63 20 20 20 20 20 20 20 20  charFunc        
d1f0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
d200: 28 61 62 73 2c 20 20 20 20 20 20 20 20 20 20 20  (abs,           
d210: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 61 62       1, 0, 0, ab
d220: 73 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 29  sFunc          )
d230: 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
d240: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
d250: 4f 49 4e 54 0a 20 20 20 20 46 55 4e 43 54 49 4f  OINT.    FUNCTIO
d260: 4e 28 72 6f 75 6e 64 2c 20 20 20 20 20 20 20 20  N(round,        
d270: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 72        1, 0, 0, r
d280: 6f 75 6e 64 46 75 6e 63 20 20 20 20 20 20 20 20  oundFunc        
d290: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
d2a0: 72 6f 75 6e 64 2c 20 20 20 20 20 20 20 20 20 20  round,          
d2b0: 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 72 6f 75      2, 0, 0, rou
d2c0: 6e 64 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c  ndFunc        ),
d2d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 46 55 4e 43  .#endif.    FUNC
d2e0: 54 49 4f 4e 28 75 70 70 65 72 2c 20 20 20 20 20  TION(upper,     
d2f0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
d300: 2c 20 75 70 70 65 72 46 75 6e 63 20 20 20 20 20  , upperFunc     
d310: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
d320: 4f 4e 28 6c 6f 77 65 72 2c 20 20 20 20 20 20 20  ON(lower,       
d330: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
d340: 6c 6f 77 65 72 46 75 6e 63 20 20 20 20 20 20 20  lowerFunc       
d350: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
d360: 28 68 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  (hex,           
d370: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 68 65       1, 0, 0, he
d380: 78 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 29  xFunc          )
d390: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28  ,.    FUNCTION2(
d3a0: 69 66 6e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20  ifnull,         
d3b0: 20 20 20 32 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70     2, 0, 0, noop
d3c0: 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55  Func,  SQLITE_FU
d3d0: 4e 43 5f 43 4f 41 4c 45 53 43 45 29 2c 0a 20 20  NC_COALESCE),.  
d3e0: 20 20 56 46 55 4e 43 54 49 4f 4e 28 72 61 6e 64    VFUNCTION(rand
d3f0: 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  om,            0
d400: 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d 46 75  , 0, 0, randomFu
d410: 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  nc       ),.    
d420: 56 46 55 4e 43 54 49 4f 4e 28 72 61 6e 64 6f 6d  VFUNCTION(random
d430: 62 6c 6f 62 2c 20 20 20 20 20 20 20 20 31 2c 20  blob,        1, 
d440: 30 2c 20 30 2c 20 72 61 6e 64 6f 6d 42 6c 6f 62  0, 0, randomBlob
d450: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
d460: 4e 43 54 49 4f 4e 28 6e 75 6c 6c 69 66 2c 20 20  NCTION(nullif,  
d470: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
d480: 20 31 2c 20 6e 75 6c 6c 69 66 46 75 6e 63 20 20   1, nullifFunc  
d490: 20 20 20 20 20 29 2c 0a 20 20 20 20 44 46 55 4e       ),.    DFUN
d4a0: 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 76 65 72  CTION(sqlite_ver
d4b0: 73 69 6f 6e 2c 20 20 20 20 30 2c 20 30 2c 20 30  sion,    0, 0, 0
d4c0: 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63 20 20 20  , versionFunc   
d4d0: 20 20 20 29 2c 0a 20 20 20 20 44 46 55 4e 43 54     ),.    DFUNCT
d4e0: 49 4f 4e 28 73 71 6c 69 74 65 5f 73 6f 75 72 63  ION(sqlite_sourc
d4f0: 65 5f 69 64 2c 20 20 30 2c 20 30 2c 20 30 2c 20  e_id,  0, 0, 0, 
d500: 73 6f 75 72 63 65 69 64 46 75 6e 63 20 20 20 20  sourceidFunc    
d510: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
d520: 28 73 71 6c 69 74 65 5f 6c 6f 67 2c 20 20 20 20  (sqlite_log,    
d530: 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 65 72       2, 0, 0, er
d540: 72 6c 6f 67 46 75 6e 63 20 20 20 20 20 20 20 29  rlogFunc       )
d550: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 71  ,.    FUNCTION(q
d560: 75 6f 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  uote,           
d570: 20 20 20 31 2c 20 30 2c 20 30 2c 20 71 75 6f 74     1, 0, 0, quot
d580: 65 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a  eFunc        ),.
d590: 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 6c 61      VFUNCTION(la
d5a0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 2c  st_insert_rowid,
d5b0: 20 30 2c 20 30 2c 20 30 2c 20 6c 61 73 74 5f 69   0, 0, 0, last_i
d5c0: 6e 73 65 72 74 5f 72 6f 77 69 64 29 2c 0a 20 20  nsert_rowid),.  
d5d0: 20 20 56 46 55 4e 43 54 49 4f 4e 28 63 68 61 6e    VFUNCTION(chan
d5e0: 67 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 30  ges,           0
d5f0: 2c 20 30 2c 20 30 2c 20 63 68 61 6e 67 65 73 20  , 0, 0, changes 
d600: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
d610: 56 46 55 4e 43 54 49 4f 4e 28 74 6f 74 61 6c 5f  VFUNCTION(total_
d620: 63 68 61 6e 67 65 73 2c 20 20 20 20 20 30 2c 20  changes,     0, 
d630: 30 2c 20 30 2c 20 74 6f 74 61 6c 5f 63 68 61 6e  0, 0, total_chan
d640: 67 65 73 20 20 20 20 29 2c 0a 20 20 20 20 46 55  ges    ),.    FU
d650: 4e 43 54 49 4f 4e 28 72 65 70 6c 61 63 65 2c 20  NCTION(replace, 
d660: 20 20 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c             3, 0,
d670: 20 30 2c 20 72 65 70 6c 61 63 65 46 75 6e 63 20   0, replaceFunc 
d680: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
d690: 54 49 4f 4e 28 7a 65 72 6f 62 6c 6f 62 2c 20 20  TION(zeroblob,  
d6a0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
d6b0: 2c 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63 20 20  , zeroblobFunc  
d6c0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
d6d0: 4f 4e 28 73 75 62 73 74 72 2c 20 20 20 20 20 20  ON(substr,      
d6e0: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20         2, 0, 0, 
d6f0: 73 75 62 73 74 72 46 75 6e 63 20 20 20 20 20 20  substrFunc      
d700: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
d710: 28 73 75 62 73 74 72 2c 20 20 20 20 20 20 20 20  (substr,        
d720: 20 20 20 20 20 33 2c 20 30 2c 20 30 2c 20 73 75       3, 0, 0, su
d730: 62 73 74 72 46 75 6e 63 20 20 20 20 20 20 20 29  bstrFunc       )
d740: 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28  ,.    AGGREGATE(
d750: 73 75 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  sum,            
d760: 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53     1, 0, 0, sumS
d770: 74 65 70 2c 20 20 20 20 20 20 20 20 20 73 75 6d  tep,         sum
d780: 46 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20  Finalize    ),. 
d790: 20 20 20 41 47 47 52 45 47 41 54 45 28 74 6f 74     AGGREGATE(tot
d7a0: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  al,             
d7b0: 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70  1, 0, 0, sumStep
d7c0: 2c 20 20 20 20 20 20 20 20 20 74 6f 74 61 6c 46  ,         totalF
d7d0: 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20  inalize    ),.  
d7e0: 20 20 41 47 47 52 45 47 41 54 45 28 61 76 67 2c    AGGREGATE(avg,
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
d800: 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c  , 0, 0, sumStep,
d810: 20 20 20 20 20 20 20 20 20 61 76 67 46 69 6e 61           avgFina
d820: 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20 20 20 41  lize    ),.    A
d830: 47 47 52 45 47 41 54 45 32 28 63 6f 75 6e 74 2c  GGREGATE2(count,
d840: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
d850: 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20  , 0, countStep, 
d860: 20 20 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c        countFinal
d870: 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
d880: 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f      SQLITE_FUNC_
d890: 43 4f 55 4e 54 20 20 29 2c 0a 20 20 20 20 41 47  COUNT  ),.    AG
d8a0: 47 52 45 47 41 54 45 28 63 6f 75 6e 74 2c 20 20  GREGATE(count,  
d8b0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
d8c0: 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20   0, countStep,  
d8d0: 20 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69       countFinali
d8e0: 7a 65 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45  ze  ),.    AGGRE
d8f0: 47 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61  GATE(group_conca
d900: 74 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c  t,      1, 0, 0,
d910: 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70   groupConcatStep
d920: 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e  , groupConcatFin
d930: 61 6c 69 7a 65 29 2c 0a 20 20 20 20 41 47 47 52  alize),.    AGGR
d940: 45 47 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63  EGATE(group_conc
d950: 61 74 2c 20 20 20 20 20 20 32 2c 20 30 2c 20 30  at,      2, 0, 0
d960: 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65  , groupConcatSte
d970: 70 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69  p, groupConcatFi
d980: 6e 61 6c 69 7a 65 29 2c 0a 20 20 0a 20 20 20 20  nalize),.  .    
d990: 4c 49 4b 45 46 55 4e 43 28 67 6c 6f 62 2c 20 32  LIKEFUNC(glob, 2
d9a0: 2c 20 26 67 6c 6f 62 49 6e 66 6f 2c 20 53 51 4c  , &globInfo, SQL
d9b0: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51  ITE_FUNC_LIKE|SQ
d9c0: 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c  LITE_FUNC_CASE),
d9d0: 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
d9e0: 5f 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f  _CASE_SENSITIVE_
d9f0: 4c 49 4b 45 0a 20 20 20 20 4c 49 4b 45 46 55 4e  LIKE.    LIKEFUN
da00: 43 28 6c 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65  C(like, 2, &like
da10: 49 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f  InfoAlt, SQLITE_
da20: 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45  FUNC_LIKE|SQLITE
da30: 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20 20  _FUNC_CASE),.   
da40: 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20   LIKEFUNC(like, 
da50: 33 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c  3, &likeInfoAlt,
da60: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
da70: 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  E|SQLITE_FUNC_CA
da80: 53 45 29 2c 0a 20 20 23 65 6c 73 65 0a 20 20 20  SE),.  #else.   
da90: 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20   LIKEFUNC(like, 
daa0: 32 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d  2, &likeInfoNorm
dab0: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  , SQLITE_FUNC_LI
dac0: 4b 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e  KE),.    LIKEFUN
dad0: 43 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65  C(like, 3, &like
dae0: 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45  InfoNorm, SQLITE
daf0: 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20 23  _FUNC_LIKE),.  #
db00: 65 6e 64 69 66 0a 20 20 20 20 46 55 4e 43 54 49  endif.    FUNCTI
db10: 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20  ON(coalesce,    
db20: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
db30: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
db40: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
db50: 28 63 6f 61 6c 65 73 63 65 2c 20 20 20 20 20 20  (coalesce,      
db60: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 20       0, 0, 0, 0 
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
db80: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28  ,.    FUNCTION2(
db90: 63 6f 61 6c 65 73 63 65 2c 20 20 20 20 20 20 20  coalesce,       
dba0: 20 20 2d 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70    -1, 0, 0, noop
dbb0: 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55  Func,  SQLITE_FU
dbc0: 4e 43 5f 43 4f 41 4c 45 53 43 45 29 2c 0a 20 20  NC_COALESCE),.  
dbd0: 7d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  };.#ifndef SQLIT
dbe0: 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
dbf0: 45 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72  E.  sqlite3Alter
dc00: 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 65 6e  Functions();.#en
dc10: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
dc20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
dc30: 41 54 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  AT3) || defined(
dc40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
dc50: 41 54 34 29 0a 20 20 73 71 6c 69 74 65 33 41 6e  AT4).  sqlite3An
dc60: 61 6c 79 7a 65 46 75 6e 63 74 69 6f 6e 73 28 29  alyzeFunctions()
dc70: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
dc80: 65 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69  e3RegisterDateTi
dc90: 6d 65 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20  meFunctions();. 
dca0: 20 73 71 6c 69 74 65 33 49 6e 73 65 72 74 42 75   sqlite3InsertBu
dcb0: 69 6c 74 69 6e 46 75 6e 63 73 28 61 42 75 69 6c  iltinFuncs(aBuil
dcc0: 74 69 6e 46 75 6e 63 2c 20 41 72 72 61 79 53 69  tinFunc, ArraySi
dcd0: 7a 65 28 61 42 75 69 6c 74 69 6e 46 75 6e 63 29  ze(aBuiltinFunc)
dce0: 29 3b 0a 0a 23 69 66 20 30 20 20 2f 2a 20 45 6e  );..#if 0  /* En
dcf0: 61 62 6c 65 20 74 6f 20 70 72 69 6e 74 20 6f 75  able to print ou
dd00: 74 20 68 6f 77 20 74 68 65 20 62 75 69 6c 74 2d  t how the built-
dd10: 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  in functions are
dd20: 20 68 61 73 68 65 64 20 2a 2f 0a 20 20 7b 0a 20   hashed */.  {. 
dd30: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 75     int i;.    Fu
dd40: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 20 20 66 6f  ncDef *p;.    fo
dd50: 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f  r(i=0; i<SQLITE_
dd60: 46 55 4e 43 5f 48 41 53 48 5f 53 5a 3b 20 69 2b  FUNC_HASH_SZ; i+
dd70: 2b 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66  +){.      printf
dd80: 28 22 46 55 4e 43 2d 48 41 53 48 20 25 30 32 64  ("FUNC-HASH %02d
dd90: 3a 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 66 6f  :", i);.      fo
dda0: 72 28 70 3d 73 71 6c 69 74 65 33 42 75 69 6c 74  r(p=sqlite3Built
ddb0: 69 6e 46 75 6e 63 74 69 6f 6e 73 2e 61 5b 69 5d  inFunctions.a[i]
ddc0: 3b 20 70 3b 20 70 3d 70 2d 3e 75 2e 70 48 61 73  ; p; p=p->u.pHas
ddd0: 68 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  h){.        int 
dde0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
ddf0: 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  n30(p->zName);. 
de00: 20 20 20 20 20 20 20 69 6e 74 20 68 20 3d 20 70         int h = p
de10: 2d 3e 7a 4e 61 6d 65 5b 30 5d 20 2b 20 6e 3b 0a  ->zName[0] + n;.
de20: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
de30: 20 25 73 28 25 64 29 22 2c 20 70 2d 3e 7a 4e 61   %s(%d)", p->zNa
de40: 6d 65 2c 20 68 29 3b 0a 20 20 20 20 20 20 7d 0a  me, h);.      }.
de50: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e        printf("\n
de60: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ");.    }.  }.#e
de70: 6e 64 69 66 0a 7d 0a                             ndif.}.