/ Hex Artifact Content
Login

Artifact 8147799b048065a1590805be464d05b4913e652c:


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 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  C functions that
01a0: 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
01b0: 75 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74 69  us SQL.** functi
01c0: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 20 20  ons of SQLite.  
01d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
01e0: 6f 6e 6c 79 20 6f 6e 65 20 65 78 70 6f 72 74 65  only one exporte
01f0: 64 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73  d symbol in this
0200: 20 66 69 6c 65 20 2d 20 74 68 65 20 66 75 6e 63   file - the func
0210: 74 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65 52 65  tion.** sqliteRe
0220: 67 69 73 74 65 72 42 75 69 6c 64 69 6e 46 75 6e  gisterBuildinFun
0230: 63 74 69 6f 6e 73 28 29 20 66 6f 75 6e 64 20 61  ctions() found a
0240: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  t the bottom of 
0250: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 41 6c 6c  the file..** All
0260: 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20   other code has 
0270: 66 69 6c 65 20 73 63 6f 70 65 2e 0a 2a 2f 0a 23  file scope..*/.#
0280: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0290: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
02a0: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
02b0: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
02c0: 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e  nclude "vdbeInt.
02d0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  h"../*.** Return
02e0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
02f0: 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  unction associat
0300: 65 64 20 77 69 74 68 20 61 20 66 75 6e 63 74 69  ed with a functi
0310: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  on..*/.static Co
0320: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 47 65  llSeq *sqlite3Ge
0330: 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 73 71 6c  tFuncCollSeq(sql
0340: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
0350: 6e 74 65 78 74 29 7b 0a 20 20 72 65 74 75 72 6e  ntext){.  return
0360: 20 63 6f 6e 74 65 78 74 2d 3e 70 43 6f 6c 6c 3b   context->pColl;
0370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
0380: 74 65 20 74 68 61 74 20 74 68 65 20 61 63 63 75  te that the accu
0390: 6d 75 6c 61 74 6f 72 20 6c 6f 61 64 20 73 68 6f  mulator load sho
03a0: 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20 6f  uld be skipped o
03b0: 6e 20 74 68 69 73 0a 2a 2a 20 69 74 65 72 61 74  n this.** iterat
03c0: 69 6f 6e 20 6f 66 20 74 68 65 20 61 67 67 72 65  ion of the aggre
03d0: 67 61 74 65 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74  gate loop..*/.st
03e0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
03f0: 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74 6f 72  3SkipAccumulator
0400: 4c 6f 61 64 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Load(sqlite3_con
0410: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
0420: 20 20 63 6f 6e 74 65 78 74 2d 3e 73 6b 69 70 46    context->skipF
0430: 6c 61 67 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  lag = 1;.}../*.*
0440: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
0450: 20 6f 66 20 74 68 65 20 6e 6f 6e 2d 61 67 67 72   of the non-aggr
0460: 65 67 61 74 65 20 6d 69 6e 28 29 20 61 6e 64 20  egate min() and 
0470: 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 0a  max() functions.
0480: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
0490: 69 6e 6d 61 78 46 75 6e 63 28 0a 20 20 73 71 6c  inmaxFunc(.  sql
04a0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
04b0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
04c0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
04d0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
04e0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  nt i;.  int mask
04f0: 3b 20 20 20 20 2f 2a 20 30 20 66 6f 72 20 6d 69  ;    /* 0 for mi
0500: 6e 28 29 20 6f 72 20 30 78 66 66 66 66 66 66 66  n() or 0xfffffff
0510: 66 20 66 6f 72 20 6d 61 78 28 29 20 2a 2f 0a 20  f for max() */. 
0520: 20 69 6e 74 20 69 42 65 73 74 3b 0a 20 20 43 6f   int iBest;.  Co
0530: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
0540: 20 61 73 73 65 72 74 28 20 61 72 67 63 3e 31 20   assert( argc>1 
0550: 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 73 71 6c 69  );.  mask = sqli
0560: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
0570: 6e 74 65 78 74 29 3d 3d 30 20 3f 20 30 20 3a 20  ntext)==0 ? 0 : 
0580: 2d 31 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  -1;.  pColl = sq
0590: 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c  lite3GetFuncColl
05a0: 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  Seq(context);.  
05b0: 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 20 29 3b  assert( pColl );
05c0: 0a 20 20 61 73 73 65 72 74 28 20 6d 61 73 6b 3d  .  assert( mask=
05d0: 3d 2d 31 20 7c 7c 20 6d 61 73 6b 3d 3d 30 20 29  =-1 || mask==0 )
05e0: 3b 0a 20 20 69 42 65 73 74 20 3d 20 30 3b 0a 20  ;.  iBest = 0;. 
05f0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
0600: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
0610: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
0620: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
0630: 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
0640: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0650: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
0660: 5b 69 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [i])==SQLITE_NUL
0670: 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  L ) return;.    
0680: 69 66 28 20 28 73 71 6c 69 74 65 33 4d 65 6d 43  if( (sqlite3MemC
0690: 6f 6d 70 61 72 65 28 61 72 67 76 5b 69 42 65 73  ompare(argv[iBes
06a0: 74 5d 2c 20 61 72 67 76 5b 69 5d 2c 20 70 43 6f  t], argv[i], pCo
06b0: 6c 6c 29 5e 6d 61 73 6b 29 3e 3d 30 20 29 7b 0a  ll)^mask)>=0 ){.
06c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
06d0: 6d 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  mask==0 );.     
06e0: 20 69 42 65 73 74 20 3d 20 69 3b 0a 20 20 20 20   iBest = i;.    
06f0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
0700: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
0710: 74 65 78 74 2c 20 61 72 67 76 5b 69 42 65 73 74  text, argv[iBest
0720: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ]);.}../*.** Ret
0730: 75 72 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20  urn the type of 
0740: 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
0750: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 79 70  .static void typ
0760: 65 6f 66 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  eofFunc(.  sqlit
0770: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
0780: 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73  ext,.  int NotUs
0790: 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ed,.  sqlite3_va
07a0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
07b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
07c0: 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
07d0: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
07e0: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
07f0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
0800: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
0810: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
0820: 3a 20 7a 20 3d 20 22 69 6e 74 65 67 65 72 22 3b  : z = "integer";
0830: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0840: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 20 20   SQLITE_TEXT:   
0850: 20 7a 20 3d 20 22 74 65 78 74 22 3b 20 20 20 20   z = "text";    
0860: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0870: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 20 20  SQLITE_FLOAT:   
0880: 7a 20 3d 20 22 72 65 61 6c 22 3b 20 20 20 20 62  z = "real";    b
0890: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
08a0: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 20 20 20 7a  QLITE_BLOB:    z
08b0: 20 3d 20 22 62 6c 6f 62 22 3b 20 20 20 20 62 72   = "blob";    br
08c0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
08d0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  :             z 
08e0: 3d 20 22 6e 75 6c 6c 22 3b 20 20 20 20 62 72 65  = "null";    bre
08f0: 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ak;.  }.  sqlite
0900: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
0910: 6e 74 65 78 74 2c 20 7a 2c 20 2d 31 2c 20 53 51  ntext, z, -1, SQ
0920: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a  LITE_STATIC);.}.
0930: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
0940: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 65  tation of the le
0950: 6e 67 74 68 28 29 20 66 75 6e 63 74 69 6f 6e 0a  ngth() function.
0960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
0970: 65 6e 67 74 68 46 75 6e 63 28 0a 20 20 73 71 6c  engthFunc(.  sql
0980: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
0990: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
09a0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
09b0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
09c0: 6e 74 20 6c 65 6e 3b 0a 0a 20 20 61 73 73 65 72  nt len;..  asser
09d0: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
09e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
09f0: 28 61 72 67 63 29 3b 0a 20 20 73 77 69 74 63 68  (argc);.  switch
0a00: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
0a10: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b  type(argv[0]) ){
0a20: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0a30: 5f 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20  _BLOB:.    case 
0a40: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a  SQLITE_INTEGER:.
0a50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0a60: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73  FLOAT: {.      s
0a70: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
0a80: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
0a90: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
0aa0: 72 67 76 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[0]));.      
0ab0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
0ac0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
0ad0: 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  T: {.      const
0ae0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0af0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
0b00: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
0b10: 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  .      if( z==0 
0b20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
0b30: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  len = 0;.      w
0b40: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
0b50: 20 20 20 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 20      len++;.     
0b60: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
0b70: 54 46 38 28 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  TF8(z);.      }.
0b80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
0b90: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
0ba0: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  , len);.      br
0bb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
0bc0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
0bd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
0be0: 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ull(context);.  
0bf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0c00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  .  }.}../*.** Im
0c10: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
0c20: 74 68 65 20 61 62 73 28 29 20 66 75 6e 63 74 69  the abs() functi
0c30: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52  on..**.** IMP: R
0c40: 2d 32 33 39 37 39 2d 32 36 38 35 35 20 54 68 65  -23979-26855 The
0c50: 20 61 62 73 28 58 29 20 66 75 6e 63 74 69 6f 6e   abs(X) function
0c60: 20 72 65 74 75 72 6e 73 20 74 68 65 20 61 62 73   returns the abs
0c70: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 0a 2a  olute value of.*
0c80: 2a 20 74 68 65 20 6e 75 6d 65 72 69 63 20 61 72  * the numeric ar
0c90: 67 75 6d 65 6e 74 20 58 2e 20 0a 2a 2f 0a 73 74  gument X. .*/.st
0ca0: 61 74 69 63 20 76 6f 69 64 20 61 62 73 46 75 6e  atic void absFun
0cb0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
0cc0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
0cd0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
0ce0: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 61  lue **argv){.  a
0cf0: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
0d00: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
0d10: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 73 77  ETER(argc);.  sw
0d20: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
0d30: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
0d40: 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  ) ){.    case SQ
0d50: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
0d60: 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 20 3d        i64 iVal =
0d70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
0d80: 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
0d90: 20 20 20 20 20 69 66 28 20 69 56 61 6c 3c 30 20       if( iVal<0 
0da0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
0db0: 69 56 61 6c 3c 3c 31 29 3d 3d 30 20 29 7b 0a 20  iVal<<1)==0 ){. 
0dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
0dd0: 20 52 2d 33 35 34 36 30 2d 31 35 30 38 34 20 49   R-35460-15084 I
0de0: 66 20 58 20 69 73 20 74 68 65 20 69 6e 74 65 67  f X is the integ
0df0: 65 72 20 2d 39 32 32 33 33 37 32 30 33 36 38 35  er -922337203685
0e00: 34 37 37 35 38 30 37 20 74 68 65 6e 0a 20 20 20  4775807 then.   
0e10: 20 20 20 20 20 20 20 2a 2a 20 61 62 73 28 58 29         ** abs(X)
0e20: 20 74 68 72 6f 77 73 20 61 6e 20 69 6e 74 65 67   throws an integ
0e30: 65 72 20 6f 76 65 72 66 6c 6f 77 20 65 72 72 6f  er overflow erro
0e40: 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
0e50: 20 6e 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   no.          **
0e60: 20 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 73 69   equivalent posi
0e70: 74 69 76 65 20 36 34 2d 62 69 74 20 74 77 6f 20  tive 64-bit two 
0e80: 63 6f 6d 70 6c 65 6d 65 6e 74 20 76 61 6c 75 65  complement value
0e90: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
0ea0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
0eb0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 69 6e  ror(context, "in
0ec0: 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c  teger overflow",
0ed0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   -1);.          
0ee0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
0ef0: 7d 0a 20 20 20 20 20 20 20 20 69 56 61 6c 20 3d  }.        iVal =
0f00: 20 2d 69 56 61 6c 3b 0a 20 20 20 20 20 20 7d 20   -iVal;.      } 
0f10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
0f20: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
0f30: 65 78 74 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20  ext, iVal);.    
0f40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0f50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
0f60: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ULL: {.      /* 
0f70: 49 4d 50 3a 20 52 2d 33 37 34 33 34 2d 31 39 39  IMP: R-37434-199
0f80: 32 39 20 41 62 73 28 58 29 20 72 65 74 75 72 6e  29 Abs(X) return
0f90: 73 20 4e 55 4c 4c 20 69 66 20 58 20 69 73 20 4e  s NULL if X is N
0fa0: 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ULL. */.      sq
0fb0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
0fc0: 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  l(context);.    
0fd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0fe0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
0ff0: 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 73      /* Because s
1000: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
1010: 62 6c 65 28 29 20 72 65 74 75 72 6e 73 20 30 2e  ble() returns 0.
1020: 30 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  0 if the argumen
1030: 74 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  t is not.      *
1040: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  * something that
1050: 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65   can be converte
1060: 64 20 69 6e 74 6f 20 61 20 6e 75 6d 62 65 72 2c  d into a number,
1070: 20 77 65 20 68 61 76 65 3a 0a 20 20 20 20 20 20   we have:.      
1080: 2a 2a 20 49 4d 50 3a 20 52 2d 35 37 33 32 36 2d  ** IMP: R-57326-
1090: 33 31 35 34 31 20 41 62 73 28 58 29 20 72 65 74  31541 Abs(X) ret
10a0: 75 72 6e 20 30 2e 30 20 69 66 20 58 20 69 73 20  urn 0.0 if X is 
10b0: 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  a string or blob
10c0: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
10d0: 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74  annot be convert
10e0: 65 64 20 74 6f 20 61 20 6e 75 6d 65 72 69 63 20  ed to a numeric 
10f0: 76 61 6c 75 65 2e 20 0a 20 20 20 20 20 20 2a 2f  value. .      */
1100: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 56  .      double rV
1110: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
1120: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30  ue_double(argv[0
1130: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 56  ]);.      if( rV
1140: 61 6c 3c 30 20 29 20 72 56 61 6c 20 3d 20 2d 72  al<0 ) rVal = -r
1150: 56 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Val;.      sqlit
1160: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
1170: 28 63 6f 6e 74 65 78 74 2c 20 72 56 61 6c 29 3b  (context, rVal);
1180: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1190: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
11a0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
11b0: 6f 66 20 74 68 65 20 69 6e 73 74 72 28 29 20 66  of the instr() f
11c0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69  unction..**.** i
11d0: 6e 73 74 72 28 68 61 79 73 74 61 63 6b 2c 6e 65  nstr(haystack,ne
11e0: 65 64 6c 65 29 20 66 69 6e 64 73 20 74 68 65 20  edle) finds the 
11f0: 66 69 72 73 74 20 6f 63 63 75 72 72 65 6e 63 65  first occurrence
1200: 20 6f 66 20 6e 65 65 64 6c 65 0a 2a 2a 20 69 6e   of needle.** in
1210: 20 68 61 79 73 74 61 63 6b 20 61 6e 64 20 72 65   haystack and re
1220: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
1230: 20 6f 66 20 70 72 65 76 69 6f 75 73 20 63 68 61   of previous cha
1240: 72 61 63 74 65 72 73 20 70 6c 75 73 20 31 2c 0a  racters plus 1,.
1250: 2a 2a 20 6f 72 20 30 20 69 66 20 6e 65 65 64 6c  ** or 0 if needl
1260: 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1270: 20 77 69 74 68 69 6e 20 68 61 79 73 74 61 63 6b   within haystack
1280: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20  ..**.** If both 
1290: 68 61 79 73 74 61 63 6b 20 61 6e 64 20 6e 65 65  haystack and nee
12a0: 64 6c 65 20 61 72 65 20 42 4c 4f 42 73 2c 20 74  dle are BLOBs, t
12b0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
12c0: 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  s one more than.
12d0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
12e0: 20 62 79 74 65 73 20 69 6e 20 68 61 79 73 74 61   bytes in haysta
12f0: 63 6b 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ck prior to the 
1300: 66 69 72 73 74 20 6f 63 63 75 72 72 65 6e 63 65  first occurrence
1310: 20 6f 66 20 6e 65 65 64 6c 65 2c 0a 2a 2a 20 6f   of needle,.** o
1320: 72 20 30 20 69 66 20 6e 65 65 64 6c 65 20 6e 65  r 0 if needle ne
1330: 76 65 72 20 6f 63 63 75 72 73 20 69 6e 20 68 61  ver occurs in ha
1340: 79 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  ystack..*/.stati
1350: 63 20 76 6f 69 64 20 69 6e 73 74 72 46 75 6e 63  c void instrFunc
1360: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1370: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
1380: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
1390: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
13a0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
13b0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 48 61 79 73  gned char *zHays
13c0: 74 61 63 6b 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  tack;.  const un
13d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e 65  signed char *zNe
13e0: 65 64 6c 65 3b 0a 20 20 69 6e 74 20 6e 48 61 79  edle;.  int nHay
13f0: 73 74 61 63 6b 3b 0a 20 20 69 6e 74 20 6e 4e 65  stack;.  int nNe
1400: 65 64 6c 65 3b 0a 20 20 69 6e 74 20 74 79 70 65  edle;.  int type
1410: 48 61 79 73 74 61 63 6b 2c 20 74 79 70 65 4e 65  Haystack, typeNe
1420: 65 64 6c 65 3b 0a 20 20 69 6e 74 20 4e 20 3d 20  edle;.  int N = 
1430: 31 3b 0a 20 20 69 6e 74 20 69 73 54 65 78 74 3b  1;.  int isText;
1440: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
1450: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 74 79  ETER(argc);.  ty
1460: 70 65 48 61 79 73 74 61 63 6b 20 3d 20 73 71 6c  peHaystack = sql
1470: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
1480: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 74 79 70 65  argv[0]);.  type
1490: 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69 74 65 33  Needle = sqlite3
14a0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
14b0: 5b 31 5d 29 3b 0a 20 20 69 66 28 20 74 79 70 65  [1]);.  if( type
14c0: 48 61 79 73 74 61 63 6b 3d 3d 53 51 4c 49 54 45  Haystack==SQLITE
14d0: 5f 4e 55 4c 4c 20 7c 7c 20 74 79 70 65 4e 65 65  _NULL || typeNee
14e0: 64 6c 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  dle==SQLITE_NULL
14f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 48 61   ) return;.  nHa
1500: 79 73 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  ystack = sqlite3
1510: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
1520: 76 5b 30 5d 29 3b 0a 20 20 6e 4e 65 65 64 6c 65  v[0]);.  nNeedle
1530: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1540: 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b  _bytes(argv[1]);
1550: 0a 20 20 69 66 28 20 74 79 70 65 48 61 79 73 74  .  if( typeHayst
1560: 61 63 6b 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ack==SQLITE_BLOB
1570: 20 26 26 20 74 79 70 65 4e 65 65 64 6c 65 3d 3d   && typeNeedle==
1580: 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20  SQLITE_BLOB ){. 
1590: 20 20 20 7a 48 61 79 73 74 61 63 6b 20 3d 20 73     zHaystack = s
15a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
15b0: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  b(argv[0]);.    
15c0: 7a 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69 74 65  zNeedle = sqlite
15d0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
15e0: 76 5b 31 5d 29 3b 0a 20 20 20 20 69 73 54 65 78  v[1]);.    isTex
15f0: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
1600: 20 20 20 20 7a 48 61 79 73 74 61 63 6b 20 3d 20      zHaystack = 
1610: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1620: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  xt(argv[0]);.   
1630: 20 7a 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69 74   zNeedle = sqlit
1640: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
1650: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 73 54 65  gv[1]);.    isTe
1660: 78 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 77 68  xt = 1;.  }.  wh
1670: 69 6c 65 28 20 6e 4e 65 65 64 6c 65 3c 3d 6e 48  ile( nNeedle<=nH
1680: 61 79 73 74 61 63 6b 20 26 26 20 6d 65 6d 63 6d  aystack && memcm
1690: 70 28 7a 48 61 79 73 74 61 63 6b 2c 20 7a 4e 65  p(zHaystack, zNe
16a0: 65 64 6c 65 2c 20 6e 4e 65 65 64 6c 65 29 21 3d  edle, nNeedle)!=
16b0: 30 20 29 7b 0a 20 20 20 20 4e 2b 2b 3b 0a 20 20  0 ){.    N++;.  
16c0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 48 61 79    do{.      nHay
16d0: 73 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 7a  stack--;.      z
16e0: 48 61 79 73 74 61 63 6b 2b 2b 3b 0a 20 20 20 20  Haystack++;.    
16f0: 7d 77 68 69 6c 65 28 20 69 73 54 65 78 74 20 26  }while( isText &
1700: 26 20 28 7a 48 61 79 73 74 61 63 6b 5b 30 5d 26  & (zHaystack[0]&
1710: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b 0a 20  0xc0)==0x80 );. 
1720: 20 7d 0a 20 20 69 66 28 20 6e 4e 65 65 64 6c 65   }.  if( nNeedle
1730: 3e 6e 48 61 79 73 74 61 63 6b 20 29 20 4e 20 3d  >nHaystack ) N =
1740: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
1750: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
1760: 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , N);.}../*.** I
1770: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1780: 20 74 68 65 20 73 75 62 73 74 72 28 29 20 66 75   the substr() fu
1790: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 73 75  nction..**.** su
17a0: 62 73 74 72 28 78 2c 70 31 2c 70 32 29 20 20 72  bstr(x,p1,p2)  r
17b0: 65 74 75 72 6e 73 20 70 32 20 63 68 61 72 61 63  eturns p2 charac
17c0: 74 65 72 73 20 6f 66 20 78 5b 5d 20 62 65 67 69  ters of x[] begi
17d0: 6e 6e 69 6e 67 20 77 69 74 68 20 70 31 2e 0a 2a  nning with p1..*
17e0: 2a 20 70 31 20 69 73 20 31 2d 69 6e 64 65 78 65  * p1 is 1-indexe
17f0: 64 2e 20 20 53 6f 20 73 75 62 73 74 72 28 78 2c  d.  So substr(x,
1800: 31 2c 31 29 20 72 65 74 75 72 6e 73 20 74 68 65  1,1) returns the
1810: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
1820: 0a 2a 2a 20 6f 66 20 78 2e 20 20 49 66 20 78 20  .** of x.  If x 
1830: 69 73 20 74 65 78 74 2c 20 74 68 65 6e 20 77 65  is text, then we
1840: 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 20   actually count 
1850: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 73  UTF-8 characters
1860: 2e 0a 2a 2a 20 49 66 20 78 20 69 73 20 61 20 62  ..** If x is a b
1870: 6c 6f 62 2c 20 74 68 65 6e 20 77 65 20 63 6f 75  lob, then we cou
1880: 6e 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt bytes..**.** 
1890: 49 66 20 70 31 20 69 73 20 6e 65 67 61 74 69 76  If p1 is negativ
18a0: 65 2c 20 74 68 65 6e 20 77 65 20 62 65 67 69 6e  e, then we begin
18b0: 20 61 62 73 28 70 31 29 20 66 72 6f 6d 20 74 68   abs(p1) from th
18c0: 65 20 65 6e 64 20 6f 66 20 78 5b 5d 2e 0a 2a 2a  e end of x[]..**
18d0: 0a 2a 2a 20 49 66 20 70 32 20 69 73 20 6e 65 67  .** If p2 is neg
18e0: 61 74 69 76 65 2c 20 72 65 74 75 72 6e 20 74 68  ative, return th
18f0: 65 20 70 32 20 63 68 61 72 61 63 74 65 72 73 20  e p2 characters 
1900: 70 72 65 63 65 65 64 69 6e 67 20 70 31 2e 0a 2a  preceeding p1..*
1910: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
1920: 62 73 74 72 46 75 6e 63 28 0a 20 20 73 71 6c 69  bstrFunc(.  sqli
1930: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
1940: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
1950: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
1960: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
1970: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1980: 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  r *z;.  const un
1990: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 32 3b  signed char *z2;
19a0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e  .  int len;.  in
19b0: 74 20 70 30 74 79 70 65 3b 0a 20 20 69 36 34 20  t p0type;.  i64 
19c0: 70 31 2c 20 70 32 3b 0a 20 20 69 6e 74 20 6e 65  p1, p2;.  int ne
19d0: 67 50 32 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  gP2 = 0;..  asse
19e0: 72 74 28 20 61 72 67 63 3d 3d 33 20 7c 7c 20 61  rt( argc==3 || a
19f0: 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20  rgc==2 );.  if( 
1a00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
1a10: 70 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c  pe(argv[1])==SQL
1a20: 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 7c 7c 20 28  ITE_NULL.   || (
1a30: 61 72 67 63 3d 3d 33 20 26 26 20 73 71 6c 69 74  argc==3 && sqlit
1a40: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
1a50: 67 76 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[2])==SQLITE_N
1a60: 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  ULL).  ){.    re
1a70: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 30 74 79  turn;.  }.  p0ty
1a80: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
1a90: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
1aa0: 3b 0a 20 20 70 31 20 3d 20 73 71 6c 69 74 65 33  ;.  p1 = sqlite3
1ab0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
1ac0: 31 5d 29 3b 0a 20 20 69 66 28 20 70 30 74 79 70  1]);.  if( p0typ
1ad0: 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
1ae0: 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69  {.    len = sqli
1af0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
1b00: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 7a 20  argv[0]);.    z 
1b10: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1b20: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
1b30: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65     if( z==0 ) re
1b40: 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  turn;.    assert
1b50: 28 20 6c 65 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  ( len==sqlite3_v
1b60: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
1b70: 30 5d 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0]) );.  }else{.
1b80: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
1b90: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
1ba0: 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  0]);.    if( z==
1bb0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
1bc0: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  len = 0;.    if(
1bd0: 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 66   p1<0 ){.      f
1be0: 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32 3b 20 6c 65  or(z2=z; *z2; le
1bf0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 51  n++){.        SQ
1c00: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
1c10: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
1c20: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63  }.  }.  if( argc
1c30: 3d 3d 33 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  ==3 ){.    p2 = 
1c40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
1c50: 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20  t(argv[2]);.    
1c60: 69 66 28 20 70 32 3c 30 20 29 7b 0a 20 20 20 20  if( p2<0 ){.    
1c70: 20 20 70 32 20 3d 20 2d 70 32 3b 0a 20 20 20 20    p2 = -p2;.    
1c80: 20 20 6e 65 67 50 32 20 3d 20 31 3b 0a 20 20 20    negP2 = 1;.   
1c90: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1ca0: 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p2 = sqlite3_con
1cb0: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
1cc0: 6f 6e 74 65 78 74 29 2d 3e 61 4c 69 6d 69 74 5b  ontext)->aLimit[
1cd0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
1ce0: 47 54 48 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  GTH];.  }.  if( 
1cf0: 70 31 3c 30 20 29 7b 0a 20 20 20 20 70 31 20 2b  p1<0 ){.    p1 +
1d00: 3d 20 6c 65 6e 3b 0a 20 20 20 20 69 66 28 20 70  = len;.    if( p
1d10: 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32 20  1<0 ){.      p2 
1d20: 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20 69 66 28  += p1;.      if(
1d30: 20 70 32 3c 30 20 29 20 70 32 20 3d 20 30 3b 0a   p2<0 ) p2 = 0;.
1d40: 20 20 20 20 20 20 70 31 20 3d 20 30 3b 0a 20 20        p1 = 0;.  
1d50: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1d60: 70 31 3e 30 20 29 7b 0a 20 20 20 20 70 31 2d 2d  p1>0 ){.    p1--
1d70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32  ;.  }else if( p2
1d80: 3e 30 20 29 7b 0a 20 20 20 20 70 32 2d 2d 3b 0a  >0 ){.    p2--;.
1d90: 20 20 7d 0a 20 20 69 66 28 20 6e 65 67 50 32 20    }.  if( negP2 
1da0: 29 7b 0a 20 20 20 20 70 31 20 2d 3d 20 70 32 3b  ){.    p1 -= p2;
1db0: 0a 20 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b  .    if( p1<0 ){
1dc0: 0a 20 20 20 20 20 20 70 32 20 2b 3d 20 70 31 3b  .      p2 += p1;
1dd0: 0a 20 20 20 20 20 20 70 31 20 3d 20 30 3b 0a 20  .      p1 = 0;. 
1de0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
1df0: 74 28 20 70 31 3e 3d 30 20 26 26 20 70 32 3e 3d  t( p1>=0 && p2>=
1e00: 30 20 29 3b 0a 20 20 69 66 28 20 70 30 74 79 70  0 );.  if( p0typ
1e10: 65 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e!=SQLITE_BLOB )
1e20: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20  {.    while( *z 
1e30: 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 53  && p1 ){.      S
1e40: 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28  QLITE_SKIP_UTF8(
1e50: 7a 29 3b 0a 20 20 20 20 20 20 70 31 2d 2d 3b 0a  z);.      p1--;.
1e60: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 7a 32      }.    for(z2
1e70: 3d 7a 3b 20 2a 7a 32 20 26 26 20 70 32 3b 20 70  =z; *z2 && p2; p
1e80: 32 2d 2d 29 7b 0a 20 20 20 20 20 20 53 51 4c 49  2--){.      SQLI
1e90: 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 32 29  TE_SKIP_UTF8(z2)
1ea0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1eb0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1ec0: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
1ed0: 7a 2c 20 28 69 6e 74 29 28 7a 32 2d 7a 29 2c 20  z, (int)(z2-z), 
1ee0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
1ef0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f00: 69 66 28 20 70 31 2b 70 32 3e 6c 65 6e 20 29 7b  if( p1+p2>len ){
1f10: 0a 20 20 20 20 20 20 70 32 20 3d 20 6c 65 6e 2d  .      p2 = len-
1f20: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32  p1;.      if( p2
1f30: 3c 30 20 29 20 70 32 20 3d 20 30 3b 0a 20 20 20  <0 ) p2 = 0;.   
1f40: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72   }.    sqlite3_r
1f50: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
1f60: 78 74 2c 20 28 63 68 61 72 2a 29 26 7a 5b 70 31  xt, (char*)&z[p1
1f70: 5d 2c 20 28 69 6e 74 29 70 32 2c 20 53 51 4c 49  ], (int)p2, SQLI
1f80: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
1f90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
1fa0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1fb0: 65 20 72 6f 75 6e 64 28 29 20 66 75 6e 63 74 69  e round() functi
1fc0: 6f 6e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  on.*/.#ifndef SQ
1fd0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1fe0: 4e 47 5f 50 4f 49 4e 54 0a 73 74 61 74 69 63 20  NG_POINT.static 
1ff0: 76 6f 69 64 20 72 6f 75 6e 64 46 75 6e 63 28 73  void roundFunc(s
2000: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2010: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
2020: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
2030: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20   **argv){.  int 
2040: 6e 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20  n = 0;.  double 
2050: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  r;.  char *zBuf;
2060: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
2070: 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =1 || argc==2 );
2080: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29  .  if( argc==2 )
2090: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
20a0: 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76  _NULL==sqlite3_v
20b0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31  alue_type(argv[1
20c0: 5d 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ]) ) return;.   
20d0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
20e0: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b  ue_int(argv[1]);
20f0: 0a 20 20 20 20 69 66 28 20 6e 3e 33 30 20 29 20  .    if( n>30 ) 
2100: 6e 20 3d 20 33 30 3b 0a 20 20 20 20 69 66 28 20  n = 30;.    if( 
2110: 6e 3c 30 20 29 20 6e 20 3d 20 30 3b 0a 20 20 7d  n<0 ) n = 0;.  }
2120: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
2130: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
2140: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
2150: 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 20 3d 20  ) return;.  r = 
2160: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
2170: 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  uble(argv[0]);. 
2180: 20 2f 2a 20 49 66 20 59 3d 3d 30 20 61 6e 64 20   /* If Y==0 and 
2190: 58 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20  X will fit in a 
21a0: 36 34 2d 62 69 74 20 69 6e 74 2c 0a 20 20 2a 2a  64-bit int,.  **
21b0: 20 68 61 6e 64 6c 65 20 74 68 65 20 72 6f 75 6e   handle the roun
21c0: 64 69 6e 67 20 64 69 72 65 63 74 6c 79 2c 0a 20  ding directly,. 
21d0: 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 75 73   ** otherwise us
21e0: 65 20 70 72 69 6e 74 66 2e 0a 20 20 2a 2f 0a 20  e printf..  */. 
21f0: 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 72 3e 3d   if( n==0 && r>=
2200: 30 20 26 26 20 72 3c 4c 41 52 47 45 53 54 5f 49  0 && r<LARGEST_I
2210: 4e 54 36 34 2d 31 20 29 7b 0a 20 20 20 20 72 20  NT64-1 ){.    r 
2220: 3d 20 28 64 6f 75 62 6c 65 29 28 28 73 71 6c 69  = (double)((sqli
2230: 74 65 5f 69 6e 74 36 34 29 28 72 2b 30 2e 35 29  te_int64)(r+0.5)
2240: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
2250: 3d 3d 30 20 26 26 20 72 3c 30 20 26 26 20 28 2d  ==0 && r<0 && (-
2260: 72 29 3c 4c 41 52 47 45 53 54 5f 49 4e 54 36 34  r)<LARGEST_INT64
2270: 2d 31 20 29 7b 0a 20 20 20 20 72 20 3d 20 2d 28  -1 ){.    r = -(
2280: 64 6f 75 62 6c 65 29 28 28 73 71 6c 69 74 65 5f  double)((sqlite_
2290: 69 6e 74 36 34 29 28 28 2d 72 29 2b 30 2e 35 29  int64)((-r)+0.5)
22a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22b0: 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zBuf = sqlite3_m
22c0: 70 72 69 6e 74 66 28 22 25 2e 2a 66 22 2c 6e 2c  printf("%.*f",n,
22d0: 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66  r);.    if( zBuf
22e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
22f0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2300: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
2310: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
2320: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2330: 33 41 74 6f 46 28 7a 42 75 66 2c 20 26 72 2c 20  3AtoF(zBuf, &r, 
2340: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2350: 7a 42 75 66 29 2c 20 53 51 4c 49 54 45 5f 55 54  zBuf), SQLITE_UT
2360: 46 38 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  F8);.    sqlite3
2370: 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 7d  _free(zBuf);.  }
2380: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
2390: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
23a0: 2c 20 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  , r);.}.#endif..
23b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
23c0: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
23d0: 61 63 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ace using sqlite
23e0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 74  3_malloc(). If t
23f0: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
2400: 20 66 61 69 6c 73 2c 20 63 61 6c 6c 20 73 71 6c   fails, call sql
2410: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2420: 72 5f 6e 6f 6d 65 6d 28 29 20 74 6f 20 6e 6f 74  r_nomem() to not
2430: 69 66 79 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ify.** the datab
2440: 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
2450: 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 66 61 69  malloc() has fai
2460: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  led and return N
2470: 55 4c 4c 2e 0a 2a 2a 20 49 66 20 6e 42 79 74 65  ULL..** If nByte
2480: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
2490: 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 72 69  the maximum stri
24a0: 6e 67 20 6f 72 20 62 6c 6f 62 20 6c 65 6e 67 74  ng or blob lengt
24b0: 68 2c 20 74 68 65 6e 0a 2a 2a 20 72 61 69 73 65  h, then.** raise
24c0: 20 61 6e 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49   an SQLITE_TOOBI
24d0: 47 20 65 78 63 65 70 74 69 6f 6e 20 61 6e 64 20  G exception and 
24e0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
24f0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e  static void *con
2500: 74 65 78 74 4d 61 6c 6c 6f 63 28 73 71 6c 69 74  textMalloc(sqlit
2510: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
2520: 65 78 74 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  ext, i64 nByte){
2530: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 71  .  char *z;.  sq
2540: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
2550: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
2560: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
2570: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
2580: 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
2590: 20 6e 42 79 74 65 3d 3d 64 62 2d 3e 61 4c 69 6d   nByte==db->aLim
25a0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
25b0: 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 74 65 73  LENGTH] );.  tes
25c0: 74 63 61 73 65 28 20 6e 42 79 74 65 3d 3d 64 62  tcase( nByte==db
25d0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
25e0: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 2b 31 20  LIMIT_LENGTH]+1 
25f0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 64  );.  if( nByte>d
2600: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
2610: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
2620: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
2630: 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69  sult_error_toobi
2640: 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  g(context);.    
2650: 7a 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  z = 0;.  }else{.
2660: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4d      z = sqlite3M
2670: 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 42 79 74 65  alloc((int)nByte
2680: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 20 29 7b  );.    if( !z ){
2690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
26a0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
26b0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
26c0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
26d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
26e0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
26f0: 20 75 70 70 65 72 28 29 20 61 6e 64 20 6c 6f 77   upper() and low
2700: 65 72 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  er() SQL functio
2710: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
2720: 69 64 20 75 70 70 65 72 46 75 6e 63 28 73 71 6c  id upperFunc(sql
2730: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
2740: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
2750: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2760: 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a  *argv){.  char *
2770: 7a 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  z1;.  const char
2780: 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6e   *z2;.  int i, n
2790: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
27a0: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 7a 32  ETER(argc);.  z2
27b0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
27c0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
27d0: 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  v[0]);.  n = sql
27e0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
27f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20  (argv[0]);.  /* 
2800: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
2810: 63 61 6c 6c 20 74 6f 20 5f 62 79 74 65 73 28 29  call to _bytes()
2820: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61 6c 69   does not invali
2830: 64 61 74 65 20 74 68 65 20 5f 74 65 78 74 28 29  date the _text()
2840: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 61 73   pointer */.  as
2850: 73 65 72 74 28 20 7a 32 3d 3d 28 63 68 61 72 2a  sert( z2==(char*
2860: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
2870: 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a  ext(argv[0]) );.
2880: 20 20 69 66 28 20 7a 32 20 29 7b 0a 20 20 20 20    if( z2 ){.    
2890: 7a 31 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c  z1 = contextMall
28a0: 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36  oc(context, ((i6
28b0: 34 29 6e 29 2b 31 29 3b 0a 20 20 20 20 69 66 28  4)n)+1);.    if(
28c0: 20 7a 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72   z1 ){.      for
28d0: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
28e0: 0a 20 20 20 20 20 20 20 20 7a 31 5b 69 5d 20 3d  .        z1[i] =
28f0: 20 28 63 68 61 72 29 73 71 6c 69 74 65 33 54 6f   (char)sqlite3To
2900: 75 70 70 65 72 28 7a 32 5b 69 5d 29 3b 0a 20 20  upper(z2[i]);.  
2910: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2920: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
2930: 63 6f 6e 74 65 78 74 2c 20 7a 31 2c 20 6e 2c 20  context, z1, n, 
2940: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
2950: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2960: 63 20 76 6f 69 64 20 6c 6f 77 65 72 46 75 6e 63  c void lowerFunc
2970: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
2980: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
2990: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
29a0: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68  ue **argv){.  ch
29b0: 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73 74 20  ar *z1;.  const 
29c0: 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20  char *z2;.  int 
29d0: 69 2c 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50  i, n;.  UNUSED_P
29e0: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
29f0: 20 20 7a 32 20 3d 20 28 63 68 61 72 2a 29 73 71    z2 = (char*)sq
2a00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
2a10: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d  (argv[0]);.  n =
2a20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
2a30: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
2a40: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
2a50: 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f 62 79 74  the call to _byt
2a60: 65 73 28 29 20 64 6f 65 73 20 6e 6f 74 20 69 6e  es() does not in
2a70: 76 61 6c 69 64 61 74 65 20 74 68 65 20 5f 74 65  validate the _te
2a80: 78 74 28 29 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  xt() pointer */.
2a90: 20 20 61 73 73 65 72 74 28 20 7a 32 3d 3d 28 63    assert( z2==(c
2aa0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
2ab0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
2ac0: 20 29 3b 0a 20 20 69 66 28 20 7a 32 20 29 7b 0a   );.  if( z2 ){.
2ad0: 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74 65 78 74      z1 = context
2ae0: 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20  Malloc(context, 
2af0: 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a 20 20 20  ((i64)n)+1);.   
2b00: 20 69 66 28 20 7a 31 20 29 7b 0a 20 20 20 20 20   if( z1 ){.     
2b10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
2b20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 31 5b  ++){.        z1[
2b30: 69 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f  i] = sqlite3Tolo
2b40: 77 65 72 28 7a 32 5b 69 5d 29 3b 0a 20 20 20 20  wer(z2[i]);.    
2b50: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2b60: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
2b70: 6e 74 65 78 74 2c 20 7a 31 2c 20 6e 2c 20 73 71  ntext, z1, n, sq
2b80: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
2b90: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2ba0: 54 68 65 20 43 4f 41 4c 45 53 43 45 28 29 20 61  The COALESCE() a
2bb0: 6e 64 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63  nd IFNULL() func
2bc0: 74 69 6f 6e 73 20 61 72 65 20 69 6d 70 6c 65 6d  tions are implem
2bd0: 65 6e 74 65 64 20 61 73 20 56 44 42 45 20 63 6f  ented as VDBE co
2be0: 64 65 20 73 6f 0a 2a 2a 20 74 68 61 74 20 75 6e  de so.** that un
2bf0: 75 73 65 64 20 61 72 67 75 6d 65 6e 74 20 76 61  used argument va
2c00: 6c 75 65 73 20 64 6f 20 6e 6f 74 20 68 61 76 65  lues do not have
2c10: 20 74 6f 20 62 65 20 63 6f 6d 70 75 74 65 64 2e   to be computed.
2c20: 20 20 48 6f 77 65 76 65 72 2c 20 77 65 0a 2a 2a    However, we.**
2c30: 20 73 74 69 6c 6c 20 6e 65 65 64 20 73 6f 6d 65   still need some
2c40: 20 6b 69 6e 64 20 6f 66 20 66 75 6e 63 74 69 6f   kind of functio
2c50: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
2c60: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
2c70: 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 66 75 6e  es in.** the fun
2c80: 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54 68  ction table.  Th
2c90: 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  at function impl
2ca0: 65 6d 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 20  ementation will 
2cb0: 6e 65 76 65 72 20 62 65 20 63 61 6c 6c 65 64 0a  never be called.
2cc0: 2a 2a 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  ** so it doesn't
2cd0: 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65   matter what the
2ce0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2cf0: 69 73 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73  is.  We might as
2d00: 20 77 65 6c 6c 20 75 73 65 0a 2a 2a 20 74 68 65   well use.** the
2d10: 20 22 76 65 72 73 69 6f 6e 28 29 22 20 66 75 6e   "version()" fun
2d20: 63 74 69 6f 6e 20 61 73 20 61 20 73 75 62 73 74  ction as a subst
2d30: 69 74 75 74 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  itute..*/.#defin
2d40: 65 20 69 66 6e 75 6c 6c 46 75 6e 63 20 76 65 72  e ifnullFunc ver
2d50: 73 69 6f 6e 46 75 6e 63 20 20 20 2f 2a 20 53 75  sionFunc   /* Su
2d60: 62 73 74 69 74 75 74 65 20 66 75 6e 63 74 69 6f  bstitute functio
2d70: 6e 20 2d 20 6e 65 76 65 72 20 63 61 6c 6c 65 64  n - never called
2d80: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65   */../*.** Imple
2d90: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e  mentation of ran
2da0: 64 6f 6d 28 29 2e 20 20 52 65 74 75 72 6e 20 61  dom().  Return a
2db0: 20 72 61 6e 64 6f 6d 20 69 6e 74 65 67 65 72 2e   random integer.
2dc0: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69    .*/.static voi
2dd0: 64 20 72 61 6e 64 6f 6d 46 75 6e 63 28 0a 20 20  d randomFunc(.  
2de0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2df0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
2e00: 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74  NotUsed,.  sqlit
2e10: 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73  e3_value **NotUs
2e20: 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 5f  ed2.){.  sqlite_
2e30: 69 6e 74 36 34 20 72 3b 0a 20 20 55 4e 55 53 45  int64 r;.  UNUSE
2e40: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
2e50: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
2e60: 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
2e70: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c  mness(sizeof(r),
2e80: 20 26 72 29 3b 0a 20 20 69 66 28 20 72 3c 30 20   &r);.  if( r<0 
2e90: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 6e 65 65  ){.    /* We nee
2ea0: 64 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72  d to prevent a r
2eb0: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 6f 66 20  andom number of 
2ec0: 30 78 38 30 30 30 30 30 30 30 30 30 30 30 30 30  0x80000000000000
2ed0: 30 30 20 0a 20 20 20 20 2a 2a 20 28 6f 72 20 2d  00 .    ** (or -
2ee0: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
2ef0: 38 30 38 29 20 73 69 6e 63 65 20 77 68 65 6e 20  808) since when 
2f00: 79 6f 75 20 64 6f 20 61 62 73 28 29 20 6f 66 20  you do abs() of 
2f10: 74 68 61 74 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  that.    ** numb
2f20: 65 72 20 6f 66 20 79 6f 75 20 67 65 74 20 74 68  er of you get th
2f30: 65 20 73 61 6d 65 20 76 61 6c 75 65 20 62 61 63  e same value bac
2f40: 6b 20 61 67 61 69 6e 2e 20 20 54 6f 20 64 6f 20  k again.  To do 
2f50: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 20 61  this.    ** in a
2f60: 20 77 61 79 20 74 68 61 74 20 69 73 20 74 65 73   way that is tes
2f70: 74 61 62 6c 65 2c 20 6d 61 73 6b 20 74 68 65 20  table, mask the 
2f80: 73 69 67 6e 20 62 69 74 20 6f 66 66 20 6f 66 20  sign bit off of 
2f90: 6e 65 67 61 74 69 76 65 0a 20 20 20 20 2a 2a 20  negative.    ** 
2fa0: 76 61 6c 75 65 73 2c 20 72 65 73 75 6c 74 69 6e  values, resultin
2fb0: 67 20 69 6e 20 61 20 70 6f 73 69 74 69 76 65 20  g in a positive 
2fc0: 76 61 6c 75 65 2e 20 20 54 68 65 6e 20 74 61 6b  value.  Then tak
2fd0: 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 32 73  e the .    ** 2s
2fe0: 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74   complement of t
2ff0: 68 61 74 20 70 6f 73 69 74 69 76 65 20 76 61 6c  hat positive val
3000: 75 65 2e 20 20 54 68 65 20 65 6e 64 20 72 65 73  ue.  The end res
3010: 75 6c 74 20 63 61 6e 0a 20 20 20 20 2a 2a 20 74  ult can.    ** t
3020: 68 65 72 65 66 6f 72 65 20 62 65 20 6e 6f 20 6c  herefore be no l
3030: 65 73 73 20 74 68 61 6e 20 2d 39 32 32 33 33 37  ess than -922337
3040: 32 30 33 36 38 35 34 37 37 35 38 30 37 2e 0a 20  2036854775807.. 
3050: 20 20 20 2a 2f 0a 20 20 20 20 72 20 3d 20 2d 28     */.    r = -(
3060: 72 20 26 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  r & LARGEST_INT6
3070: 34 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  4);.  }.  sqlite
3080: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
3090: 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 7d 0a 0a 2f  ontext, r);.}../
30a0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
30b0: 69 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d 62 6c 6f  ion of randomblo
30c0: 62 28 4e 29 2e 20 20 52 65 74 75 72 6e 20 61 20  b(N).  Return a 
30d0: 72 61 6e 64 6f 6d 20 62 6c 6f 62 0a 2a 2a 20 74  random blob.** t
30e0: 68 61 74 20 69 73 20 4e 20 62 79 74 65 73 20 6c  hat is N bytes l
30f0: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ong..*/.static v
3100: 6f 69 64 20 72 61 6e 64 6f 6d 42 6c 6f 62 28 0a  oid randomBlob(.
3110: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
3120: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
3130: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
3140: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
3150: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 75 6e 73  {.  int n;.  uns
3160: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20  igned char *p;. 
3170: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
3180: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
3190: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
31a0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
31b0: 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a  e_int(argv[0]);.
31c0: 20 20 69 66 28 20 6e 3c 31 20 29 7b 0a 20 20 20    if( n<1 ){.   
31d0: 20 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 20   n = 1;.  }.  p 
31e0: 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28  = contextMalloc(
31f0: 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20 69  context, n);.  i
3200: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
3210: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 6e  te3_randomness(n
3220: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
3230: 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f  3_result_blob(co
3240: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 70 2c  ntext, (char*)p,
3250: 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   n, sqlite3_free
3260: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3270: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
3280: 66 20 74 68 65 20 6c 61 73 74 5f 69 6e 73 65 72  f the last_inser
3290: 74 5f 72 6f 77 69 64 28 29 20 53 51 4c 20 66 75  t_rowid() SQL fu
32a0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74  nction.  The ret
32b0: 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  urn.** value is 
32c0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
32d0: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
32e0: 65 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20  ert_rowid() API 
32f0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
3300: 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 69 6e  tic void last_in
3310: 73 65 72 74 5f 72 6f 77 69 64 28 0a 20 20 73 71  sert_rowid(.  sq
3320: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3330: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 4e  ontext, .  int N
3340: 6f 74 55 73 65 64 2c 20 0a 20 20 73 71 6c 69 74  otUsed, .  sqlit
3350: 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73  e3_value **NotUs
3360: 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  ed2.){.  sqlite3
3370: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
3380: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
3390: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55  (context);.  UNU
33a0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
33b0: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
33c0: 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  );.  /* IMP: R-5
33d0: 31 35 31 33 2d 31 32 30 32 36 20 54 68 65 20 6c  1513-12026 The l
33e0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
33f0: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
3400: 69 73 20 61 0a 20 20 2a 2a 20 77 72 61 70 70 65  is a.  ** wrappe
3410: 72 20 61 72 6f 75 6e 64 20 74 68 65 20 73 71 6c  r around the sql
3420: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
3430: 5f 72 6f 77 69 64 28 29 20 43 2f 43 2b 2b 20 69  _rowid() C/C++ i
3440: 6e 74 65 72 66 61 63 65 0a 20 20 2a 2a 20 66 75  nterface.  ** fu
3450: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c  nction. */.  sql
3460: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
3470: 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  4(context, sqlit
3480: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
3490: 6f 77 69 64 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a  owid(db));.}../*
34a0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
34b0: 6f 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  on of the change
34c0: 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  s() SQL function
34d0: 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52 2d 36  ..**.** IMP: R-6
34e0: 32 30 37 33 2d 31 31 32 30 39 20 54 68 65 20 63  2073-11209 The c
34f0: 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75 6e  hanges() SQL fun
3500: 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
3510: 65 72 0a 2a 2a 20 61 72 6f 75 6e 64 20 74 68 65  er.** around the
3520: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
3530: 28 29 20 43 2f 43 2b 2b 20 66 75 6e 63 74 69 6f  () C/C++ functio
3540: 6e 20 61 6e 64 20 68 65 6e 63 65 20 66 6f 6c 6c  n and hence foll
3550: 6f 77 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  ows the same.** 
3560: 72 75 6c 65 73 20 66 6f 72 20 63 6f 75 6e 74 69  rules for counti
3570: 6e 67 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 73  ng changes..*/.s
3580: 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67  tatic void chang
3590: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  es(.  sqlite3_co
35a0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
35b0: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
35c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
35d0: 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73  *NotUsed2.){.  s
35e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
35f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
3600: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
3610: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
3620: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
3630: 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74  tUsed2);.  sqlit
3640: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
3650: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63  ntext, sqlite3_c
3660: 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a  hanges(db));.}..
3670: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
3680: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 6f 74 61  tion of the tota
3690: 6c 5f 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20  l_changes() SQL 
36a0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72  function.  The r
36b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 0a 2a  eturn value is.*
36c0: 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  * the same as th
36d0: 65 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  e sqlite3_total_
36e0: 63 68 61 6e 67 65 73 28 29 20 41 50 49 20 66 75  changes() API fu
36f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
3700: 63 20 76 6f 69 64 20 74 6f 74 61 6c 5f 63 68 61  c void total_cha
3710: 6e 67 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  nges(.  sqlite3_
3720: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
3730: 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c  ,.  int NotUsed,
3740: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3750: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
3760: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
3770: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
3780: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
3790: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
37a0: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
37b0: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20  NotUsed2);.  /* 
37c0: 49 4d 50 3a 20 52 2d 35 32 37 35 36 2d 34 31 39  IMP: R-52756-419
37d0: 39 33 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  93 This function
37e0: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
37f0: 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71  ound the.  ** sq
3800: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
3810: 67 65 73 28 29 20 43 2f 43 2b 2b 20 69 6e 74 65  ges() C/C++ inte
3820: 72 66 61 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  rface. */.  sqli
3830: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
3840: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
3850: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 64 62  total_changes(db
3860: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  ));.}../*.** A s
3870: 74 72 75 63 74 75 72 65 20 64 65 66 69 6e 69 6e  tructure definin
3880: 67 20 68 6f 77 20 74 6f 20 64 6f 20 47 4c 4f 42  g how to do GLOB
3890: 2d 73 74 79 6c 65 20 63 6f 6d 70 61 72 69 73 6f  -style compariso
38a0: 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ns..*/.struct co
38b0: 6d 70 61 72 65 49 6e 66 6f 20 7b 0a 20 20 75 38  mpareInfo {.  u8
38c0: 20 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20   matchAll;.  u8 
38d0: 6d 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d  matchOne;.  u8 m
38e0: 61 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f  atchSet;.  u8 no
38f0: 43 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  Case;.};../*.** 
3900: 46 6f 72 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f  For LIKE and GLO
3910: 42 20 6d 61 74 63 68 69 6e 67 20 6f 6e 20 45 42  B matching on EB
3920: 43 44 49 43 20 6d 61 63 68 69 6e 65 73 2c 20 61  CDIC machines, a
3930: 73 73 75 6d 65 20 74 68 61 74 20 65 76 65 72 79  ssume that every
3940: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 69 73  .** character is
3950: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 62 79 74   exactly one byt
3960: 65 20 69 6e 20 73 69 7a 65 2e 20 20 41 6c 73 6f  e in size.  Also
3970: 2c 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73  , all characters
3980: 20 61 72 65 0a 2a 2a 20 61 62 6c 65 20 74 6f 20   are.** able to 
3990: 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 75  participate in u
39a0: 70 70 65 72 2d 63 61 73 65 2d 74 6f 2d 6c 6f 77  pper-case-to-low
39b0: 65 72 2d 63 61 73 65 20 6d 61 70 70 69 6e 67 73  er-case mappings
39c0: 20 69 6e 20 45 42 43 44 49 43 0a 2a 2a 20 77 68   in EBCDIC.** wh
39d0: 65 72 65 61 73 20 6f 6e 6c 79 20 63 68 61 72 61  ereas only chara
39e0: 63 74 65 72 73 20 6c 65 73 73 20 74 68 61 6e 20  cters less than 
39f0: 30 78 38 30 20 64 6f 20 69 6e 20 41 53 43 49 49  0x80 do in ASCII
3a00: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
3a10: 28 53 51 4c 49 54 45 5f 45 42 43 44 49 43 29 0a  (SQLITE_EBCDIC).
3a20: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  # define sqlite3
3a30: 55 74 66 38 52 65 61 64 28 41 29 20 20 20 20 28  Utf8Read(A)    (
3a40: 2a 28 28 2a 41 29 2b 2b 29 29 0a 23 20 64 65 66  *((*A)++)).# def
3a50: 69 6e 65 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c  ine GlogUpperToL
3a60: 6f 77 65 72 28 41 29 20 20 20 41 20 3d 20 73 71  ower(A)   A = sq
3a70: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
3a80: 72 5b 41 5d 0a 23 65 6c 73 65 0a 23 20 64 65 66  r[A].#else.# def
3a90: 69 6e 65 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c  ine GlogUpperToL
3aa0: 6f 77 65 72 28 41 29 20 20 20 69 66 28 20 21 28  ower(A)   if( !(
3ab0: 28 41 29 26 7e 30 78 37 66 29 20 29 7b 20 41 20  (A)&~0x7f) ){ A 
3ac0: 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  = sqlite3UpperTo
3ad0: 4c 6f 77 65 72 5b 41 5d 3b 20 7d 0a 23 65 6e 64  Lower[A]; }.#end
3ae0: 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  if..static const
3af0: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
3b00: 6e 66 6f 20 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b  nfo globInfo = {
3b10: 20 27 2a 27 2c 20 27 3f 27 2c 20 27 5b 27 2c 20   '*', '?', '[', 
3b20: 30 20 7d 3b 0a 2f 2a 20 54 68 65 20 63 6f 72 72  0 };./* The corr
3b30: 65 63 74 20 53 51 4c 2d 39 32 20 62 65 68 61 76  ect SQL-92 behav
3b40: 69 6f 72 20 69 73 20 66 6f 72 20 74 68 65 20 4c  ior is for the L
3b50: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  IKE operator to 
3b60: 69 67 6e 6f 72 65 0a 2a 2a 20 63 61 73 65 2e 20  ignore.** case. 
3b70: 20 54 68 75 73 20 20 27 61 27 20 4c 49 4b 45 20   Thus  'a' LIKE 
3b80: 27 41 27 20 77 6f 75 6c 64 20 62 65 20 74 72 75  'A' would be tru
3b90: 65 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e. */.static con
3ba0: 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72  st struct compar
3bb0: 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f  eInfo likeInfoNo
3bc0: 72 6d 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c  rm = { '%', '_',
3bd0: 20 20 20 30 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66     0, 1 };./* If
3be0: 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e   SQLITE_CASE_SEN
3bf0: 53 49 54 49 56 45 5f 4c 49 4b 45 20 69 73 20 64  SITIVE_LIKE is d
3c00: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  efined, then the
3c10: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 0a 2a   LIKE operator.*
3c20: 2a 20 69 73 20 63 61 73 65 20 73 65 6e 73 69 74  * is case sensit
3c30: 69 76 65 20 63 61 75 73 69 6e 67 20 27 61 27 20  ive causing 'a' 
3c40: 4c 49 4b 45 20 27 41 27 20 74 6f 20 62 65 20 66  LIKE 'A' to be f
3c50: 61 6c 73 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  alse */.static c
3c60: 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70  onst struct comp
3c70: 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f  areInfo likeInfo
3c80: 41 6c 74 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27  Alt = { '%', '_'
3c90: 2c 20 20 20 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a  ,   0, 0 };../*.
3ca0: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 55  ** Compare two U
3cb0: 54 46 2d 38 20 73 74 72 69 6e 67 73 20 66 6f 72  TF-8 strings for
3cc0: 20 65 71 75 61 6c 69 74 79 20 77 68 65 72 65 20   equality where 
3cd0: 74 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67  the first string
3ce0: 20 63 61 6e 0a 2a 2a 20 70 6f 74 65 6e 74 69 61   can.** potentia
3cf0: 6c 6c 79 20 62 65 20 61 20 22 67 6c 6f 62 22 20  lly be a "glob" 
3d00: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 52 65 74  expression.  Ret
3d10: 75 72 6e 20 74 72 75 65 20 28 31 29 20 69 66 20  urn true (1) if 
3d20: 74 68 65 79 0a 2a 2a 20 61 72 65 20 74 68 65 20  they.** are the 
3d30: 73 61 6d 65 20 61 6e 64 20 66 61 6c 73 65 20 28  same and false (
3d40: 30 29 20 69 66 20 74 68 65 79 20 61 72 65 20 64  0) if they are d
3d50: 69 66 66 65 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ifferent..**.** 
3d60: 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a  Globbing rules:.
3d70: 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20  **.**      '*'  
3d80: 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
3d90: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72   sequence of zer
3da0: 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63  o or more charac
3db0: 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
3dc0: 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68   '?'       Match
3dd0: 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  es exactly one c
3de0: 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  haracter..**.** 
3df0: 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d      [...]      M
3e00: 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
3e10: 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e  cter from the en
3e20: 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a  closed list of.*
3e30: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
3e40: 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
3e50: 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20  **     [^...]   
3e60: 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68    Matches one ch
3e70: 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74  aracter not in t
3e80: 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74  he enclosed list
3e90: 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65  ..**.** With the
3ea0: 20 5b 2e 2e 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e   [...] and [^...
3eb0: 5d 20 6d 61 74 63 68 69 6e 67 2c 20 61 20 27 5d  ] matching, a ']
3ec0: 27 20 63 68 61 72 61 63 74 65 72 20 63 61 6e 20  ' character can 
3ed0: 62 65 20 69 6e 63 6c 75 64 65 64 0a 2a 2a 20 69  be included.** i
3ee0: 6e 20 74 68 65 20 6c 69 73 74 20 62 79 20 6d 61  n the list by ma
3ef0: 6b 69 6e 67 20 69 74 20 74 68 65 20 66 69 72 73  king it the firs
3f00: 74 20 63 68 61 72 61 63 74 65 72 20 61 66 74 65  t character afte
3f10: 72 20 27 5b 27 20 6f 72 20 27 5e 27 2e 20 20 41  r '[' or '^'.  A
3f20: 0a 2a 2a 20 72 61 6e 67 65 20 6f 66 20 63 68 61  .** range of cha
3f30: 72 61 63 74 65 72 73 20 63 61 6e 20 62 65 20 73  racters can be s
3f40: 70 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 27  pecified using '
3f50: 2d 27 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  -'.  Example:.**
3f60: 20 22 5b 61 2d 7a 5d 22 20 6d 61 74 63 68 65 73   "[a-z]" matches
3f70: 20 61 6e 79 20 73 69 6e 67 6c 65 20 6c 6f 77 65   any single lowe
3f80: 72 2d 63 61 73 65 20 6c 65 74 74 65 72 2e 20 20  r-case letter.  
3f90: 54 6f 20 6d 61 74 63 68 20 61 20 27 2d 27 2c 20  To match a '-', 
3fa0: 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 6c  make.** it the l
3fb0: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  ast character in
3fc0: 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   the list..**.**
3fd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3fe0: 20 75 73 75 61 6c 6c 79 20 71 75 69 63 6b 2c 20   usually quick, 
3ff0: 62 75 74 20 63 61 6e 20 62 65 20 4e 2a 2a 32 20  but can be N**2 
4000: 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73  in the worst cas
4010: 65 2e 0a 2a 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20  e..**.** Hints: 
4020: 74 6f 20 6d 61 74 63 68 20 27 2a 27 20 6f 72 20  to match '*' or 
4030: 27 3f 27 2c 20 70 75 74 20 74 68 65 6d 20 69 6e  '?', put them in
4040: 20 22 5b 5d 22 2e 20 20 4c 69 6b 65 20 74 68 69   "[]".  Like thi
4050: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
4060: 20 61 62 63 5b 2a 5d 78 79 7a 20 20 20 20 20 20   abc[*]xyz      
4070: 20 20 4d 61 74 63 68 65 73 20 22 61 62 63 2a 78    Matches "abc*x
4080: 79 7a 22 20 6f 6e 6c 79 0a 2a 2f 0a 73 74 61 74  yz" only.*/.stat
4090: 69 63 20 69 6e 74 20 70 61 74 74 65 72 6e 43 6f  ic int patternCo
40a0: 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74 20 75  mpare(.  const u
40b0: 38 20 2a 7a 50 61 74 74 65 72 6e 2c 20 20 20 20  8 *zPattern,    
40c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
40d0: 20 67 6c 6f 62 20 70 61 74 74 65 72 6e 20 2a 2f   glob pattern */
40e0: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 53 74  .  const u8 *zSt
40f0: 72 69 6e 67 2c 20 20 20 20 20 20 20 20 20 20 20  ring,           
4100: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e      /* The strin
4110: 67 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  g to compare aga
4120: 69 6e 73 74 20 74 68 65 20 67 6c 6f 62 20 2a 2f  inst the glob */
4130: 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
4140: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e  compareInfo *pIn
4150: 66 6f 2c 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  fo, /* Informati
4160: 6f 6e 20 61 62 6f 75 74 20 68 6f 77 20 74 6f 20  on about how to 
4170: 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 65 20 2a  do the compare *
4180: 2f 0a 20 20 75 33 32 20 65 73 63 20 20 20 20 20  /.  u32 esc     
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 73 63 61       /* The esca
41b0: 70 65 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a  pe character */.
41c0: 29 7b 0a 20 20 75 33 32 20 63 2c 20 63 32 3b 0a  ){.  u32 c, c2;.
41d0: 20 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20    int invert;.  
41e0: 69 6e 74 20 73 65 65 6e 3b 0a 20 20 75 38 20 6d  int seen;.  u8 m
41f0: 61 74 63 68 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d  atchOne = pInfo-
4200: 3e 6d 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20  >matchOne;.  u8 
4210: 6d 61 74 63 68 41 6c 6c 20 3d 20 70 49 6e 66 6f  matchAll = pInfo
4220: 2d 3e 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38  ->matchAll;.  u8
4230: 20 6d 61 74 63 68 53 65 74 20 3d 20 70 49 6e 66   matchSet = pInf
4240: 6f 2d 3e 6d 61 74 63 68 53 65 74 3b 0a 20 20 75  o->matchSet;.  u
4250: 38 20 6e 6f 43 61 73 65 20 3d 20 70 49 6e 66 6f  8 noCase = pInfo
4260: 2d 3e 6e 6f 43 61 73 65 3b 20 0a 20 20 69 6e 74  ->noCase; .  int
4270: 20 70 72 65 76 45 73 63 61 70 65 20 3d 20 30 3b   prevEscape = 0;
4280: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
4290: 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 68 61  the previous cha
42a0: 72 61 63 74 65 72 20 77 61 73 20 27 65 73 63 61  racter was 'esca
42b0: 70 65 27 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28  pe' */..  while(
42c0: 20 28 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66   (c = sqlite3Utf
42d0: 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29  8Read(&zPattern)
42e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
42f0: 63 3d 3d 6d 61 74 63 68 41 6c 6c 20 26 26 20 21  c==matchAll && !
4300: 70 72 65 76 45 73 63 61 70 65 20 29 7b 0a 20 20  prevEscape ){.  
4310: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 73 71      while( (c=sq
4320: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
4330: 50 61 74 74 65 72 6e 29 29 20 3d 3d 20 6d 61 74  Pattern)) == mat
4340: 63 68 41 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  chAll.          
4350: 20 20 20 20 20 7c 7c 20 63 20 3d 3d 20 6d 61 74       || c == mat
4360: 63 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  chOne ){.       
4370: 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65   if( c==matchOne
4380: 20 26 26 20 73 71 6c 69 74 65 33 55 74 66 38 52   && sqlite3Utf8R
4390: 65 61 64 28 26 7a 53 74 72 69 6e 67 29 3d 3d 30  ead(&zString)==0
43a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
43b0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
43c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
43d0: 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
43e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
43f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
4400: 3d 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20  =esc ){.        
4410: 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  c = sqlite3Utf8R
4420: 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a  ead(&zPattern);.
4430: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
4440: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
4450: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
4460: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
4470: 28 20 63 3d 3d 6d 61 74 63 68 53 65 74 20 29 7b  ( c==matchSet ){
4480: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
4490: 20 65 73 63 3d 3d 30 20 29 3b 20 20 20 20 20 20   esc==0 );      
44a0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 47 4c     /* This is GL
44b0: 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45 20 2a 2f 0a  OB, not LIKE */.
44c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
44d0: 6d 61 74 63 68 53 65 74 3c 30 78 38 30 20 29 3b  matchSet<0x80 );
44e0: 20 20 2f 2a 20 27 5b 27 20 69 73 20 61 20 73 69    /* '[' is a si
44f0: 6e 67 6c 65 2d 62 79 74 65 20 63 68 61 72 61 63  ngle-byte charac
4500: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 77  ter */.        w
4510: 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20 26  hile( *zString &
4520: 26 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  & patternCompare
4530: 28 26 7a 50 61 74 74 65 72 6e 5b 2d 31 5d 2c 7a  (&zPattern[-1],z
4540: 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63  String,pInfo,esc
4550: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4560: 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54    SQLITE_SKIP_UT
4570: 46 38 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  F8(zString);.   
4580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
4590: 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 21 3d  eturn *zString!=
45a0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
45b0: 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 73 71   while( (c2 = sq
45c0: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
45d0: 53 74 72 69 6e 67 29 29 21 3d 30 20 29 7b 0a 20  String))!=0 ){. 
45e0: 20 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73         if( noCas
45f0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 47  e ){.          G
4600: 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72 28  logUpperToLower(
4610: 63 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 47  c2);.          G
4620: 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72 28  logUpperToLower(
4630: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  c);.          wh
4640: 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26 20  ile( c2 != 0 && 
4650: 63 32 20 21 3d 20 63 20 29 7b 0a 20 20 20 20 20  c2 != c ){.     
4660: 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69         c2 = sqli
4670: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 53 74  te3Utf8Read(&zSt
4680: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20  ring);.         
4690: 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f     GlogUpperToLo
46a0: 77 65 72 28 63 32 29 3b 0a 20 20 20 20 20 20 20  wer(c2);.       
46b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
46c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
46d0: 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26 20  ile( c2 != 0 && 
46e0: 63 32 20 21 3d 20 63 20 29 7b 0a 20 20 20 20 20  c2 != c ){.     
46f0: 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69         c2 = sqli
4700: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 53 74  te3Utf8Read(&zSt
4710: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20  ring);.         
4720: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
4730: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29       if( c2==0 )
4740: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
4750: 20 20 20 69 66 28 20 70 61 74 74 65 72 6e 43 6f     if( patternCo
4760: 6d 70 61 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a  mpare(zPattern,z
4770: 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63  String,pInfo,esc
4780: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
4790: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
47a0: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 0;.    }else 
47b0: 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20  if( c==matchOne 
47c0: 26 26 20 21 70 72 65 76 45 73 63 61 70 65 20 29  && !prevEscape )
47d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
47e0: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 53 74  te3Utf8Read(&zSt
47f0: 72 69 6e 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ring)==0 ){.    
4800: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4810: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
4820: 69 66 28 20 63 3d 3d 6d 61 74 63 68 53 65 74 20  if( c==matchSet 
4830: 29 7b 0a 20 20 20 20 20 20 75 33 32 20 70 72 69  ){.      u32 pri
4840: 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  or_c = 0;.      
4850: 61 73 73 65 72 74 28 20 65 73 63 3d 3d 30 20 29  assert( esc==0 )
4860: 3b 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c  ;    /* This onl
4870: 79 20 6f 63 63 75 72 73 20 66 6f 72 20 47 4c 4f  y occurs for GLO
4880: 42 2c 20 6e 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20  B, not LIKE */. 
4890: 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20       seen = 0;. 
48a0: 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b       invert = 0;
48b0: 0a 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74  .      c = sqlit
48c0: 65 33 55 74 66 38 52 65 61 64 28 26 7a 53 74 72  e3Utf8Read(&zStr
48d0: 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ing);.      if( 
48e0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
48f0: 0a 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69  .      c2 = sqli
4900: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61  te3Utf8Read(&zPa
4910: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 69 66  ttern);.      if
4920: 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20  ( c2=='^' ){.   
4930: 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b       invert = 1;
4940: 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71  .        c2 = sq
4950: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
4960: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
4970: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d  }.      if( c2==
4980: 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ']' ){.        i
4990: 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e  f( c==']' ) seen
49a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32   = 1;.        c2
49b0: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
49c0: 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  ad(&zPattern);. 
49d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
49e0: 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d  le( c2 && c2!=']
49f0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
4a00: 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 50 61 74   c2=='-' && zPat
4a10: 74 65 72 6e 5b 30 5d 21 3d 27 5d 27 20 26 26 20  tern[0]!=']' && 
4a20: 7a 50 61 74 74 65 72 6e 5b 30 5d 21 3d 30 20 26  zPattern[0]!=0 &
4a30: 26 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20  & prior_c>0 ){. 
4a40: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
4a50: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
4a60: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
4a70: 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72      if( c>=prior
4a80: 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65  _c && c<=c2 ) se
4a90: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
4aa0: 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20    prior_c = 0;. 
4ab0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
4ac0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63          if( c==c
4ad0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
4ae0: 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
4af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4b00: 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20   prior_c = c2;. 
4b10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4b20: 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66   c2 = sqlite3Utf
4b30: 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29  8Read(&zPattern)
4b40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4b50: 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65  if( c2==0 || (se
4b60: 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20  en ^ invert)==0 
4b70: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4b80: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
4b90: 20 7d 65 6c 73 65 20 69 66 28 20 65 73 63 3d 3d   }else if( esc==
4ba0: 63 20 26 26 20 21 70 72 65 76 45 73 63 61 70 65  c && !prevEscape
4bb0: 20 29 7b 0a 20 20 20 20 20 20 70 72 65 76 45 73   ){.      prevEs
4bc0: 63 61 70 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65  cape = 1;.    }e
4bd0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 32 20 3d 20  lse{.      c2 = 
4be0: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
4bf0: 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20  &zString);.     
4c00: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
4c10: 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70 65 72         GlogUpper
4c20: 54 6f 4c 6f 77 65 72 28 63 29 3b 0a 20 20 20 20  ToLower(c);.    
4c30: 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c      GlogUpperToL
4c40: 6f 77 65 72 28 63 32 29 3b 0a 20 20 20 20 20 20  ower(c2);.      
4c50: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d 63  }.      if( c!=c
4c60: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  2 ){.        ret
4c70: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
4c80: 20 20 20 20 20 70 72 65 76 45 73 63 61 70 65 20       prevEscape 
4c90: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
4ca0: 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67   return *zString
4cb0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ==0;.}../*.** Co
4cc0: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
4cd0: 66 20 74 69 6d 65 73 20 74 68 61 74 20 74 68 65  f times that the
4ce0: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 28   LIKE operator (
4cf0: 6f 72 20 47 4c 4f 42 20 77 68 69 63 68 20 69 73  or GLOB which is
4d00: 0a 2a 2a 20 6a 75 73 74 20 61 20 76 61 72 69 61  .** just a varia
4d10: 74 69 6f 6e 20 6f 66 20 4c 49 4b 45 29 20 67 65  tion of LIKE) ge
4d20: 74 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  ts called.  This
4d30: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
4d40: 74 69 6e 67 0a 2a 2a 20 6f 6e 6c 79 2e 0a 2a 2f  ting.** only..*/
4d50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4d60: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
4d70: 6c 69 6b 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  like_count = 0;.
4d80: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49  #endif.../*.** I
4d90: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
4da0: 20 74 68 65 20 6c 69 6b 65 28 29 20 53 51 4c 20   the like() SQL 
4db0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
4dc0: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
4dd0: 6e 74 73 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64  nts.** the build
4de0: 2d 69 6e 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  -in LIKE operato
4df0: 72 2e 20 20 54 68 65 20 66 69 72 73 74 20 61 72  r.  The first ar
4e00: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
4e10: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 0a 2a 2a  nction is the.**
4e20: 20 70 61 74 74 65 72 6e 20 61 6e 64 20 74 68 65   pattern and the
4e30: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
4e40: 20 69 73 20 74 68 65 20 73 74 72 69 6e 67 2e 20   is the string. 
4e50: 20 53 6f 2c 20 74 68 65 20 53 51 4c 20 73 74 61   So, the SQL sta
4e60: 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  tements:.**.**  
4e70: 20 20 20 20 20 41 20 4c 49 4b 45 20 42 0a 2a 2a       A LIKE B.**
4e80: 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  .** is implement
4e90: 65 64 20 61 73 20 6c 69 6b 65 28 42 2c 41 29 2e  ed as like(B,A).
4ea0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 61 6d 65  .**.** This same
4eb0: 20 66 75 6e 63 74 69 6f 6e 20 28 77 69 74 68 20   function (with 
4ec0: 61 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6d 70  a different comp
4ed0: 61 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  areInfo structur
4ee0: 65 29 20 63 6f 6d 70 75 74 65 73 0a 2a 2a 20 74  e) computes.** t
4ef0: 68 65 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  he GLOB operator
4f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4f10: 20 6c 69 6b 65 46 75 6e 63 28 0a 20 20 73 71 6c   likeFunc(.  sql
4f20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
4f30: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
4f40: 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  gc, .  sqlite3_v
4f50: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
4f60: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4f70: 63 68 61 72 20 2a 7a 41 2c 20 2a 7a 42 3b 0a 20  char *zA, *zB;. 
4f80: 20 75 33 32 20 65 73 63 61 70 65 20 3d 20 30 3b   u32 escape = 0;
4f90: 0a 20 20 69 6e 74 20 6e 50 61 74 3b 0a 20 20 73  .  int nPat;.  s
4fa0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
4fb0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
4fc0: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
4fd0: 0a 0a 20 20 7a 42 20 3d 20 73 71 6c 69 74 65 33  ..  zB = sqlite3
4fe0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
4ff0: 5b 30 5d 29 3b 0a 20 20 7a 41 20 3d 20 73 71 6c  [0]);.  zA = sql
5000: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5010: 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  argv[1]);..  /* 
5020: 4c 69 6d 69 74 20 74 68 65 20 6c 65 6e 67 74 68  Limit the length
5030: 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20   of the LIKE or 
5040: 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 20  GLOB pattern to 
5050: 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20  avoid problems. 
5060: 20 2a 2a 20 6f 66 20 64 65 65 70 20 72 65 63 75   ** of deep recu
5070: 72 73 69 6f 6e 20 61 6e 64 20 4e 2a 4e 20 62 65  rsion and N*N be
5080: 68 61 76 69 6f 72 20 69 6e 20 70 61 74 74 65 72  havior in patter
5090: 6e 43 6f 6d 70 61 72 65 28 29 2e 0a 20 20 2a 2f  nCompare()..  */
50a0: 0a 20 20 6e 50 61 74 20 3d 20 73 71 6c 69 74 65  .  nPat = sqlite
50b0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
50c0: 67 76 5b 30 5d 29 3b 0a 20 20 74 65 73 74 63 61  gv[0]);.  testca
50d0: 73 65 28 20 6e 50 61 74 3d 3d 64 62 2d 3e 61 4c  se( nPat==db->aL
50e0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
50f0: 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  T_LIKE_PATTERN_L
5100: 45 4e 47 54 48 5d 20 29 3b 0a 20 20 74 65 73 74  ENGTH] );.  test
5110: 63 61 73 65 28 20 6e 50 61 74 3d 3d 64 62 2d 3e  case( nPat==db->
5120: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
5130: 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
5140: 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20 20  _LENGTH]+1 );.  
5150: 69 66 28 20 6e 50 61 74 20 3e 20 64 62 2d 3e 61  if( nPat > db->a
5160: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5170: 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
5180: 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 73  LENGTH] ){.    s
5190: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
51a0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 4c 49  ror(context, "LI
51b0: 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61 74 74 65  KE or GLOB patte
51c0: 72 6e 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 22 2c  rn too complex",
51d0: 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
51e0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
51f0: 7a 42 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  zB==sqlite3_valu
5200: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20  e_text(argv[0]) 
5210: 29 3b 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20  );  /* Encoding 
5220: 64 69 64 20 6e 6f 74 20 63 68 61 6e 67 65 20 2a  did not change *
5230: 2f 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 33  /..  if( argc==3
5240: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
5250: 73 63 61 70 65 20 63 68 61 72 61 63 74 65 72 20  scape character 
5260: 73 74 72 69 6e 67 20 6d 75 73 74 20 63 6f 6e 73  string must cons
5270: 69 73 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ist of a single 
5280: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 2e  UTF-8 character.
5290: 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
52a0: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
52b0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  or..    */.    c
52c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
52d0: 61 72 20 2a 7a 45 73 63 20 3d 20 73 71 6c 69 74  ar *zEsc = sqlit
52e0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
52f0: 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[2]);.    if( 
5300: 7a 45 73 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  zEsc==0 ) return
5310: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
5320: 33 55 74 66 38 43 68 61 72 4c 65 6e 28 28 63 68  3Utf8CharLen((ch
5330: 61 72 2a 29 7a 45 73 63 2c 20 2d 31 29 21 3d 31  ar*)zEsc, -1)!=1
5340: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5350: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
5360: 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20  ontext, .       
5370: 20 20 20 22 45 53 43 41 50 45 20 65 78 70 72 65     "ESCAPE expre
5380: 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 20  ssion must be a 
5390: 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72  single character
53a0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 72 65  ", -1);.      re
53b0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
53c0: 65 73 63 61 70 65 20 3d 20 73 71 6c 69 74 65 33  escape = sqlite3
53d0: 55 74 66 38 52 65 61 64 28 26 7a 45 73 63 29 3b  Utf8Read(&zEsc);
53e0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 20 26 26  .  }.  if( zA &&
53f0: 20 7a 42 20 29 7b 0a 20 20 20 20 73 74 72 75 63   zB ){.    struc
5400: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70  t compareInfo *p
5410: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 75  Info = sqlite3_u
5420: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
5430: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
5440: 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65  _TEST.    sqlite
5450: 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_like_count++;.
5460: 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20  #endif.    .    
5470: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
5480: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 61 74 74  nt(context, patt
5490: 65 72 6e 43 6f 6d 70 61 72 65 28 7a 42 2c 20 7a  ernCompare(zB, z
54a0: 41 2c 20 70 49 6e 66 6f 2c 20 65 73 63 61 70 65  A, pInfo, escape
54b0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
54c0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
54d0: 6f 66 20 74 68 65 20 4e 55 4c 4c 49 46 28 78 2c  of the NULLIF(x,
54e0: 79 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  y) function.  Th
54f0: 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20  e result is the 
5500: 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
5510: 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  t if the argumen
5520: 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
5530: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
5540: 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a 2a 2a 20   NULL if the.** 
5550: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 65 71  arguments are eq
5560: 75 61 6c 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ual to each othe
5570: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
5580: 64 20 6e 75 6c 6c 69 66 46 75 6e 63 28 0a 20 20  d nullifFunc(.  
5590: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
55a0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
55b0: 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74  NotUsed,.  sqlit
55c0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
55d0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
55e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
55f0: 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74  FuncCollSeq(cont
5600: 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ext);.  UNUSED_P
5610: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
5620: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
5630: 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72 67 76 5b  MemCompare(argv[
5640: 30 5d 2c 20 61 72 67 76 5b 31 5d 2c 20 70 43 6f  0], argv[1], pCo
5650: 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  ll)!=0 ){.    sq
5660: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
5670: 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  ue(context, argv
5680: 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  [0]);.  }.}../*.
5690: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
56a0: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
56b0: 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69  version() functi
56c0: 6f 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  on.  The result 
56d0: 69 73 20 74 68 65 20 76 65 72 73 69 6f 6e 0a 2a  is the version.*
56e0: 2a 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20  * of the SQLite 
56f0: 6c 69 62 72 61 72 79 20 74 68 61 74 20 69 73 20  library that is 
5700: 72 75 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  running..*/.stat
5710: 69 63 20 76 6f 69 64 20 76 65 72 73 69 6f 6e 46  ic void versionF
5720: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
5730: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5740: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
5750: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
5760: 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20  **NotUsed2.){.  
5770: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5780: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
5790: 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20  ed2);.  /* IMP: 
57a0: 52 2d 34 38 36 39 39 2d 34 38 36 31 37 20 54 68  R-48699-48617 Th
57b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
57c0: 6e 20 53 51 4c 20 77 72 61 70 70 65 72 20 61 72  n SQL wrapper ar
57d0: 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71  ound the.  ** sq
57e0: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
57f0: 28 29 20 43 2d 69 6e 74 65 72 66 61 63 65 2e 20  () C-interface. 
5800: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  */.  sqlite3_res
5810: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
5820: 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  , sqlite3_libver
5830: 73 69 6f 6e 28 29 2c 20 2d 31 2c 20 53 51 4c 49  sion(), -1, SQLI
5840: 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f  TE_STATIC);.}../
5850: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
5860: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
5870: 65 5f 73 6f 75 72 63 65 5f 69 64 28 29 20 66 75  e_source_id() fu
5880: 6e 63 74 69 6f 6e 2e 20 54 68 65 20 72 65 73 75  nction. The resu
5890: 6c 74 20 69 73 20 61 20 73 74 72 69 6e 67 0a 2a  lt is a string.*
58a0: 2a 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65  * that identifie
58b0: 73 20 74 68 65 20 70 61 72 74 69 63 75 6c 61 72  s the particular
58c0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
58d0: 73 6f 75 72 63 65 20 63 6f 64 65 20 75 73 65 64  source code used
58e0: 20 74 6f 20 62 75 69 6c 64 0a 2a 2a 20 53 51 4c   to build.** SQL
58f0: 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ite..*/.static v
5900: 6f 69 64 20 73 6f 75 72 63 65 69 64 46 75 6e 63  oid sourceidFunc
5910: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
5920: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
5930: 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73  int NotUsed,.  s
5940: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e  qlite3_value **N
5950: 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 55 4e 55  otUsed2.){.  UNU
5960: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
5970: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
5980: 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  );.  /* IMP: R-2
5990: 34 34 37 30 2d 33 31 31 33 36 20 54 68 69 73 20  4470-31136 This 
59a0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 53  function is an S
59b0: 51 4c 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  QL wrapper aroun
59c0: 64 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  d the.  ** sqlit
59d0: 65 33 5f 73 6f 75 72 63 65 69 64 28 29 20 43 20  e3_sourceid() C 
59e0: 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f 0a 20 20  interface. */.  
59f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5a00: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  ext(context, sql
5a10: 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c  ite3_sourceid(),
5a20: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
5a30: 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  IC);.}../*.** Im
5a40: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
5a50: 74 68 65 20 73 71 6c 69 74 65 5f 6c 6f 67 28 29  the sqlite_log()
5a60: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
5a70: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
5a80: 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ound.** sqlite3_
5a90: 6c 6f 67 28 29 2e 20 20 54 68 65 20 72 65 74 75  log().  The retu
5aa0: 72 6e 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  rn value is NULL
5ab0: 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  .  The function 
5ac0: 65 78 69 73 74 73 20 70 75 72 65 6c 79 20 66 6f  exists purely fo
5ad0: 72 0a 2a 2a 20 69 74 73 20 73 69 64 65 2d 65 66  r.** its side-ef
5ae0: 66 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fects..*/.static
5af0: 20 76 6f 69 64 20 65 72 72 6c 6f 67 46 75 6e 63   void errlogFunc
5b00: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
5b10: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
5b20: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
5b30: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5b40: 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
5b50: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
5b60: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5b70: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c  (context);.  sql
5b80: 69 74 65 33 5f 6c 6f 67 28 73 71 6c 69 74 65 33  ite3_log(sqlite3
5b90: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
5ba0: 30 5d 29 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  0]), "%s", sqlit
5bb0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5bc0: 67 76 5b 31 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gv[1]));.}../*.*
5bd0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
5be0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 63   of the sqlite_c
5bf0: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65  ompileoption_use
5c00: 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  d() function..**
5c10: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   The result is a
5c20: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  n integer that i
5c30: 64 65 6e 74 69 66 69 65 73 20 69 66 20 74 68 65  dentifies if the
5c40: 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e   compiler option
5c50: 0a 2a 2a 20 77 61 73 20 75 73 65 64 20 74 6f 20  .** was used to 
5c60: 62 75 69 6c 64 20 53 51 4c 69 74 65 2e 0a 2a 2f  build SQLite..*/
5c70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5c80: 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
5c90: 4f 4e 5f 44 49 41 47 53 0a 73 74 61 74 69 63 20  ON_DIAGS.static 
5ca0: 76 6f 69 64 20 63 6f 6d 70 69 6c 65 6f 70 74 69  void compileopti
5cb0: 6f 6e 75 73 65 64 46 75 6e 63 28 0a 20 20 73 71  onusedFunc(.  sq
5cc0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5cd0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
5ce0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
5cf0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5d00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74  const char *zOpt
5d10: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
5d20: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55  argc==1 );.  UNU
5d30: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
5d40: 67 63 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52  gc);.  /* IMP: R
5d50: 2d 33 39 35 36 34 2d 33 36 33 30 35 20 54 68 65  -39564-36305 The
5d60: 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f   sqlite_compileo
5d70: 70 74 69 6f 6e 5f 75 73 65 64 28 29 20 53 51 4c  ption_used() SQL
5d80: 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  .  ** function i
5d90: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
5da0: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  nd the sqlite3_c
5db0: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65  ompileoption_use
5dc0: 64 28 29 20 43 2f 43 2b 2b 0a 20 20 2a 2a 20 66  d() C/C++.  ** f
5dd0: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
5de0: 69 66 28 20 28 7a 4f 70 74 4e 61 6d 65 20 3d 20  if( (zOptName = 
5df0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
5e00: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5e10: 61 72 67 76 5b 30 5d 29 29 21 3d 30 20 29 7b 0a  argv[0]))!=0 ){.
5e20: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5e30: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
5e40: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f  sqlite3_compileo
5e50: 70 74 69 6f 6e 5f 75 73 65 64 28 7a 4f 70 74 4e  ption_used(zOptN
5e60: 61 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ame));.  }.}.#en
5e70: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
5e80: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
5e90: 5f 44 49 41 47 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DIAGS */../*.**
5ea0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5eb0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 63 6f  of the sqlite_co
5ec0: 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28  mpileoption_get(
5ed0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20  ) function. .** 
5ee0: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  The result is a 
5ef0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 64 65 6e  string that iden
5f00: 74 69 66 69 65 73 20 74 68 65 20 63 6f 6d 70 69  tifies the compi
5f10: 6c 65 72 20 6f 70 74 69 6f 6e 73 20 0a 2a 2a 20  ler options .** 
5f20: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 53 51  used to build SQ
5f30: 4c 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  Lite..*/.#ifndef
5f40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
5f50: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
5f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
5f70: 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74 46 75 6e  pileoptiongetFun
5f80: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5f90: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
5fa0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
5fb0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5fc0: 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  v.){.  int n;.  
5fd0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
5fe0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
5ff0: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 2f  METER(argc);.  /
6000: 2a 20 49 4d 50 3a 20 52 2d 30 34 39 32 32 2d 32  * IMP: R-04922-2
6010: 34 30 37 36 20 54 68 65 20 73 71 6c 69 74 65 5f  4076 The sqlite_
6020: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65  compileoption_ge
6030: 74 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  t() SQL function
6040: 0a 20 20 2a 2a 20 69 73 20 61 20 77 72 61 70 70  .  ** is a wrapp
6050: 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 73 71  er around the sq
6060: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
6070: 69 6f 6e 5f 67 65 74 28 29 20 43 2f 43 2b 2b 20  ion_get() C/C++ 
6080: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
6090: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
60a0: 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b  ue_int(argv[0]);
60b0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
60c0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
60d0: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f  sqlite3_compileo
60e0: 70 74 69 6f 6e 5f 67 65 74 28 6e 29 2c 20 2d 31  ption_get(n), -1
60f0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
6100: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6110: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
6120: 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f  EOPTION_DIAGS */
6130: 0a 0a 2f 2a 20 41 72 72 61 79 20 66 6f 72 20 63  ../* Array for c
6140: 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d 20 68  onverting from h
6150: 61 6c 66 2d 62 79 74 65 73 20 28 6e 79 62 62 6c  alf-bytes (nybbl
6160: 65 73 29 20 69 6e 74 6f 20 41 53 43 49 49 20 68  es) into ASCII h
6170: 65 78 0a 2a 2a 20 64 69 67 69 74 73 2e 20 2a 2f  ex.** digits. */
6180: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6190: 61 72 20 68 65 78 64 69 67 69 74 73 5b 5d 20 3d  ar hexdigits[] =
61a0: 20 7b 0a 20 20 27 30 27 2c 20 27 31 27 2c 20 27   {.  '0', '1', '
61b0: 32 27 2c 20 27 33 27 2c 20 27 34 27 2c 20 27 35  2', '3', '4', '5
61c0: 27 2c 20 27 36 27 2c 20 27 37 27 2c 0a 20 20 27  ', '6', '7',.  '
61d0: 38 27 2c 20 27 39 27 2c 20 27 41 27 2c 20 27 42  8', '9', 'A', 'B
61e0: 27 2c 20 27 43 27 2c 20 27 44 27 2c 20 27 45 27  ', 'C', 'D', 'E'
61f0: 2c 20 27 46 27 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  , 'F' .};../*.**
6200: 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 2d 20   EXPERIMENTAL - 
6210: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20 6f  This is not an o
6220: 66 66 69 63 69 61 6c 20 66 75 6e 63 74 69 6f 6e  fficial function
6230: 2e 20 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  .  The interface
6240: 20 6d 61 79 0a 2a 2a 20 63 68 61 6e 67 65 2e 20   may.** change. 
6250: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
6260: 61 79 20 64 69 73 61 70 70 65 61 72 2e 20 20 44  ay disappear.  D
6270: 6f 20 6e 6f 74 20 77 72 69 74 65 20 63 6f 64 65  o not write code
6280: 20 74 68 61 74 20 64 65 70 65 6e 64 73 0a 2a 2a   that depends.**
6290: 20 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f   on this functio
62a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  n..**.** Impleme
62b0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 51  ntation of the Q
62c0: 55 4f 54 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e  UOTE() function.
62d0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
62e0: 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  takes a single.*
62f0: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20  * argument.  If 
6300: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
6310: 6e 75 6d 65 72 69 63 2c 20 74 68 65 20 72 65 74  numeric, the ret
6320: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
6330: 20 73 61 6d 65 20 61 73 0a 2a 2a 20 74 68 65 20   same as.** the 
6340: 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20 74 68  argument.  If th
6350: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  e argument is NU
6360: 4c 4c 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  LL, the return v
6370: 61 6c 75 65 20 69 73 20 74 68 65 20 73 74 72 69  alue is the stri
6380: 6e 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e 20 20 4f  ng.** "NULL".  O
6390: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 72  therwise, the ar
63a0: 67 75 6d 65 6e 74 20 69 73 20 65 6e 63 6c 6f 73  gument is enclos
63b0: 65 64 20 69 6e 20 73 69 6e 67 6c 65 20 71 75 6f  ed in single quo
63c0: 74 65 73 20 77 69 74 68 0a 2a 2a 20 73 69 6e 67  tes with.** sing
63d0: 6c 65 2d 71 75 6f 74 65 20 65 73 63 61 70 65 73  le-quote escapes
63e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
63f0: 20 71 75 6f 74 65 46 75 6e 63 28 73 71 6c 69 74   quoteFunc(sqlit
6400: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
6410: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
6420: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6430: 72 67 76 29 7b 0a 20 20 61 73 73 65 72 74 28 20  rgv){.  assert( 
6440: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55  argc==1 );.  UNU
6450: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
6460: 67 63 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  gc);.  switch( s
6470: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
6480: 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20  e(argv[0]) ){.  
6490: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
64a0: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75  OAT: {.      dou
64b0: 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20  ble r1, r2;.    
64c0: 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
64d0: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
64e0: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
64f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
6500: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6510: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
6520: 7a 42 75 66 2c 20 22 25 21 2e 31 35 67 22 2c 20  zBuf, "%!.15g", 
6530: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
6540: 65 33 41 74 6f 46 28 7a 42 75 66 2c 20 26 72 32  e3AtoF(zBuf, &r2
6550: 2c 20 32 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  , 20, SQLITE_UTF
6560: 38 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 31  8);.      if( r1
6570: 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20  !=r2 ){.        
6580: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6590: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
65a0: 42 75 66 2c 20 22 25 21 2e 32 30 65 22 2c 20 72  Buf, "%!.20e", r
65b0: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
65c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
65d0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
65e0: 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
65f0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
6600: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6610: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
6620: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
6630: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
6640: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
6650: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 62 72  gv[0]);.      br
6660: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6670: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
6680: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
6690: 54 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Text = 0;.      
66a0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 42 6c 6f  char const *zBlo
66b0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  b = sqlite3_valu
66c0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
66d0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62  .      int nBlob
66e0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
66f0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
6700: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
6710: 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76 61  Blob==sqlite3_va
6720: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
6730: 29 20 29 3b 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64  ) ); /* No encod
6740: 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ing change */.  
6750: 20 20 20 20 7a 54 65 78 74 20 3d 20 28 63 68 61      zText = (cha
6760: 72 20 2a 29 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  r *)contextMallo
6770: 63 28 63 6f 6e 74 65 78 74 2c 20 28 32 2a 28 69  c(context, (2*(i
6780: 36 34 29 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a 20  64)nBlob)+4); . 
6790: 20 20 20 20 20 69 66 28 20 7a 54 65 78 74 20 29       if( zText )
67a0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
67b0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
67c0: 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b  ; i<nBlob; i++){
67d0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 78 74  .          zText
67e0: 5b 28 69 2a 32 29 2b 32 5d 20 3d 20 68 65 78 64  [(i*2)+2] = hexd
67f0: 69 67 69 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 3e  igits[(zBlob[i]>
6800: 3e 34 29 26 30 78 30 46 5d 3b 0a 20 20 20 20 20  >4)&0x0F];.     
6810: 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29       zText[(i*2)
6820: 2b 33 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b  +3] = hexdigits[
6830: 28 7a 42 6c 6f 62 5b 69 5d 29 26 30 78 30 46 5d  (zBlob[i])&0x0F]
6840: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6850: 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62      zText[(nBlob
6860: 2a 32 29 2b 32 5d 20 3d 20 27 5c 27 27 3b 0a 20  *2)+2] = '\'';. 
6870: 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42         zText[(nB
6880: 6c 6f 62 2a 32 29 2b 33 5d 20 3d 20 27 5c 30 27  lob*2)+3] = '\0'
6890: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b  ;.        zText[
68a0: 30 5d 20 3d 20 27 58 27 3b 0a 20 20 20 20 20 20  0] = 'X';.      
68b0: 20 20 7a 54 65 78 74 5b 31 5d 20 3d 20 27 5c 27    zText[1] = '\'
68c0: 27 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ';.        sqlit
68d0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
68e0: 6f 6e 74 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d  ontext, zText, -
68f0: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
6900: 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ENT);.        sq
6910: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74  lite3_free(zText
6920: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6940: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
6950: 58 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  XT: {.      int 
6960: 69 2c 6a 3b 0a 20 20 20 20 20 20 75 36 34 20 6e  i,j;.      u64 n
6970: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e  ;.      const un
6980: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 72  signed char *zAr
6990: 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  g = sqlite3_valu
69a0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
69b0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  .      char *z;.
69c0: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 72 67 3d  .      if( zArg=
69d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
69e0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 30 3b     for(i=0, n=0;
69f0: 20 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 20   zArg[i]; i++){ 
6a00: 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27  if( zArg[i]=='\'
6a10: 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20  ' ) n++; }.     
6a20: 20 7a 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c   z = contextMall
6a30: 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36  oc(context, ((i6
6a40: 34 29 69 29 2b 28 28 69 36 34 29 6e 29 2b 33 29  4)i)+((i64)n)+3)
6a50: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b  ;.      if( z ){
6a60: 0a 20 20 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20  .        z[0] = 
6a70: 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 66 6f  '\'';.        fo
6a80: 72 28 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41 72 67  r(i=0, j=1; zArg
6a90: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
6aa0: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41       z[j++] = zA
6ab0: 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  rg[i];.         
6ac0: 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c   if( zArg[i]=='\
6ad0: 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  '' ){.          
6ae0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b    z[j++] = '\'';
6af0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6b00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
6b10: 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [j++] = '\'';.  
6b20: 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a        z[j] = 0;.
6b30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6b40: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
6b50: 65 78 74 2c 20 7a 2c 20 6a 2c 20 73 71 6c 69 74  ext, z, j, sqlit
6b60: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20  e3_free);.      
6b70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6b80: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
6b90: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
6ba0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
6bb0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53  type(argv[0])==S
6bc0: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20  QLITE_NULL );.  
6bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6be0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
6bf0: 20 22 4e 55 4c 4c 22 2c 20 34 2c 20 53 51 4c 49   "NULL", 4, SQLI
6c00: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
6c10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6c20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
6c30: 68 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  hex() function. 
6c40: 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 61   Interpret the a
6c50: 72 67 75 6d 65 6e 74 20 61 73 20 61 20 62 6c 6f  rgument as a blo
6c60: 62 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  b.  Return.** a 
6c70: 68 65 78 61 64 65 63 69 6d 61 6c 20 72 65 6e 64  hexadecimal rend
6c80: 65 72 69 6e 67 20 61 73 20 74 65 78 74 2e 0a 2a  ering as text..*
6c90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
6ca0: 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  xFunc(.  sqlite3
6cb0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6cc0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
6cd0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6ce0: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69  *argv.){.  int i
6cf0: 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  , n;.  const uns
6d00: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 6c 6f  igned char *pBlo
6d10: 62 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 78 2c  b;.  char *zHex,
6d20: 20 2a 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 61   *z;.  assert( a
6d30: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
6d40: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
6d50: 63 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71  c);.  pBlob = sq
6d60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
6d70: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d  (argv[0]);.  n =
6d80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
6d90: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
6da0: 20 61 73 73 65 72 74 28 20 70 42 6c 6f 62 3d 3d   assert( pBlob==
6db0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
6dc0: 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 20  ob(argv[0]) );  
6dd0: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
6de0: 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 20 3d 20 7a  hange */.  z = z
6df0: 48 65 78 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c  Hex = contextMal
6e00: 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69  loc(context, ((i
6e10: 36 34 29 6e 29 2a 32 20 2b 20 31 29 3b 0a 20 20  64)n)*2 + 1);.  
6e20: 69 66 28 20 7a 48 65 78 20 29 7b 0a 20 20 20 20  if( zHex ){.    
6e30: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
6e40: 2b 2c 20 70 42 6c 6f 62 2b 2b 29 7b 0a 20 20 20  +, pBlob++){.   
6e50: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
6e60: 20 63 20 3d 20 2a 70 42 6c 6f 62 3b 0a 20 20 20   c = *pBlob;.   
6e70: 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64     *(z++) = hexd
6e80: 69 67 69 74 73 5b 28 63 3e 3e 34 29 26 30 78 66  igits[(c>>4)&0xf
6e90: 5d 3b 0a 20 20 20 20 20 20 2a 28 7a 2b 2b 29 20  ];.      *(z++) 
6ea0: 3d 20 68 65 78 64 69 67 69 74 73 5b 63 26 30 78  = hexdigits[c&0x
6eb0: 66 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  f];.    }.    *z
6ec0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
6ed0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
6ee0: 6e 74 65 78 74 2c 20 7a 48 65 78 2c 20 6e 2a 32  ntext, zHex, n*2
6ef0: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
6f00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
6f10: 65 20 7a 65 72 6f 62 6c 6f 62 28 4e 29 20 66 75  e zeroblob(N) fu
6f20: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
6f30: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 62 6c 6f   zero-filled blo
6f40: 62 20 6f 66 20 73 69 7a 65 20 4e 20 62 79 74 65  b of size N byte
6f50: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
6f60: 64 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63 28 0a  d zeroblobFunc(.
6f70: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6f80: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
6f90: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
6fa0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
6fb0: 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 73 71 6c  {.  i64 n;.  sql
6fc0: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
6fd0: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
6fe0: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
6ff0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
7000: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
7010: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
7020: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
7030: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29  e_int64(argv[0])
7040: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
7050: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
7060: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
7070: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
7080: 6e 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  n==db->aLimit[SQ
7090: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
70a0: 48 5d 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e  H]+1 );.  if( n>
70b0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
70c0: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
70d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
70e0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62  esult_error_toob
70f0: 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ig(context);.  }
7100: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
7110: 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62 6c 6f  3_result_zeroblo
7120: 62 28 63 6f 6e 74 65 78 74 2c 20 28 69 6e 74 29  b(context, (int)
7130: 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 30  n); /* IMP: R-00
7140: 32 39 33 2d 36 34 39 39 34 20 2a 2f 0a 20 20 7d  293-64994 */.  }
7150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65  .}../*.** The re
7160: 70 6c 61 63 65 28 29 20 66 75 6e 63 74 69 6f 6e  place() function
7170: 2e 20 20 54 68 72 65 65 20 61 72 67 75 6d 65 6e  .  Three argumen
7180: 74 73 20 61 72 65 20 61 6c 6c 20 73 74 72 69 6e  ts are all strin
7190: 67 73 3a 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 6d  gs: call.** them
71a0: 20 41 2c 20 42 2c 20 61 6e 64 20 43 2e 20 54 68   A, B, and C. Th
71b0: 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 73 6f  e result is also
71c0: 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68 20   a string which 
71d0: 69 73 20 64 65 72 69 76 65 64 0a 2a 2a 20 66 72  is derived.** fr
71e0: 6f 6d 20 41 20 62 79 20 72 65 70 6c 61 63 69 6e  om A by replacin
71f0: 67 20 65 76 65 72 79 20 6f 63 63 75 72 61 6e 63  g every occuranc
7200: 65 20 6f 66 20 42 20 77 69 74 68 20 43 2e 20 20  e of B with C.  
7210: 54 68 65 20 6d 61 74 63 68 0a 2a 2a 20 6d 75 73  The match.** mus
7220: 74 20 62 65 20 65 78 61 63 74 2e 20 20 43 6f 6c  t be exact.  Col
7230: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
7240: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 2e 0a 2a   are not used..*
7250: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
7260: 70 6c 61 63 65 46 75 6e 63 28 0a 20 20 73 71 6c  placeFunc(.  sql
7270: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
7280: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
7290: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
72a0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
72b0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
72c0: 61 72 20 2a 7a 53 74 72 3b 20 20 20 20 20 20 20  ar *zStr;       
72d0: 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 73 74   /* The input st
72e0: 72 69 6e 67 20 41 20 2a 2f 0a 20 20 63 6f 6e 73  ring A */.  cons
72f0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
7300: 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20 20 2f 2a  *zPattern;    /*
7310: 20 54 68 65 20 70 61 74 74 65 72 6e 20 73 74 72   The pattern str
7320: 69 6e 67 20 42 20 2a 2f 0a 20 20 63 6f 6e 73 74  ing B */.  const
7330: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7340: 7a 52 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  zRep;        /* 
7350: 54 68 65 20 72 65 70 6c 61 63 65 6d 65 6e 74 20  The replacement 
7360: 73 74 72 69 6e 67 20 43 20 2a 2f 0a 20 20 75 6e  string C */.  un
7370: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75  signed char *zOu
7380: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
7390: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 2a 2f  /* The output */
73a0: 0a 20 20 69 6e 74 20 6e 53 74 72 3b 20 20 20 20  .  int nStr;    
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
73c0: 69 7a 65 20 6f 66 20 7a 53 74 72 20 2a 2f 0a 20  ize of zStr */. 
73d0: 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20 20   int nPattern;  
73e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
73f0: 65 20 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f  e of zPattern */
7400: 0a 20 20 69 6e 74 20 6e 52 65 70 3b 20 20 20 20  .  int nRep;    
7410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7420: 69 7a 65 20 6f 66 20 7a 52 65 70 20 2a 2f 0a 20  ize of zRep */. 
7430: 20 69 36 34 20 6e 4f 75 74 3b 20 20 20 20 20 20   i64 nOut;      
7440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
7450: 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 7a 4f 75  imum size of zOu
7460: 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6f 70 4c  t */.  int loopL
7470: 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
7480: 2f 2a 20 4c 61 73 74 20 7a 53 74 72 5b 5d 20 74  /* Last zStr[] t
7490: 68 61 74 20 6d 69 67 68 74 20 6d 61 74 63 68 20  hat might match 
74a0: 7a 50 61 74 74 65 72 6e 5b 5d 20 2a 2f 0a 20 20  zPattern[] */.  
74b0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
74c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
74d0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 0a 20 20   counters */..  
74e0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20  assert( argc==3 
74f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
7500: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 7a  METER(argc);.  z
7510: 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Str = sqlite3_va
7520: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
7530: 29 3b 0a 20 20 69 66 28 20 7a 53 74 72 3d 3d 30  );.  if( zStr==0
7540: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 53 74   ) return;.  nSt
7550: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
7560: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
7570: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53 74 72  ;.  assert( zStr
7580: 3d 3d 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 20 29 3b  text(argv[0]) );
75a0: 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67    /* No encoding
75b0: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 50 61   change */.  zPa
75c0: 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ttern = sqlite3_
75d0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
75e0: 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 74  1]);.  if( zPatt
75f0: 65 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ern==0 ){.    as
7600: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61  sert( sqlite3_va
7610: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d  lue_type(argv[1]
7620: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20  )==SQLITE_NULL. 
7630: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
7640: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
7650: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
7660: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7670: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
7680: 7d 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e  }.  if( zPattern
7690: 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  [0]==0 ){.    as
76a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61  sert( sqlite3_va
76b0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d  lue_type(argv[1]
76c0: 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )!=SQLITE_NULL )
76d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
76e0: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
76f0: 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt, argv[0]);.  
7700: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7710: 6e 50 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74  nPattern = sqlit
7720: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
7730: 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72  rgv[1]);.  asser
7740: 74 28 20 7a 50 61 74 74 65 72 6e 3d 3d 73 71 6c  t( zPattern==sql
7750: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
7760: 61 72 67 76 5b 31 5d 29 20 29 3b 20 20 2f 2a 20  argv[1]) );  /* 
7770: 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e  No encoding chan
7780: 67 65 20 2a 2f 0a 20 20 7a 52 65 70 20 3d 20 73  ge */.  zRep = s
7790: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
77a0: 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66  t(argv[2]);.  if
77b0: 28 20 7a 52 65 70 3d 3d 30 20 29 20 72 65 74 75  ( zRep==0 ) retu
77c0: 72 6e 3b 0a 20 20 6e 52 65 70 20 3d 20 73 71 6c  rn;.  nRep = sql
77d0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
77e0: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 61 73 73  (argv[2]);.  ass
77f0: 65 72 74 28 20 7a 52 65 70 3d 3d 73 71 6c 69 74  ert( zRep==sqlit
7800: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
7810: 67 76 5b 32 5d 29 20 29 3b 0a 20 20 6e 4f 75 74  gv[2]) );.  nOut
7820: 20 3d 20 6e 53 74 72 20 2b 20 31 3b 0a 20 20 61   = nStr + 1;.  a
7830: 73 73 65 72 74 28 20 6e 4f 75 74 3c 53 51 4c 49  ssert( nOut<SQLI
7840: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b  TE_MAX_LENGTH );
7850: 0a 20 20 7a 4f 75 74 20 3d 20 63 6f 6e 74 65 78  .  zOut = contex
7860: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
7870: 20 28 69 36 34 29 6e 4f 75 74 29 3b 0a 20 20 69   (i64)nOut);.  i
7880: 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  f( zOut==0 ){.  
7890: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
78a0: 6c 6f 6f 70 4c 69 6d 69 74 20 3d 20 6e 53 74 72  loopLimit = nStr
78b0: 20 2d 20 6e 50 61 74 74 65 72 6e 3b 20 20 0a 20   - nPattern;  . 
78c0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 3d 6c   for(i=j=0; i<=l
78d0: 6f 6f 70 4c 69 6d 69 74 3b 20 69 2b 2b 29 7b 0a  oopLimit; i++){.
78e0: 20 20 20 20 69 66 28 20 7a 53 74 72 5b 69 5d 21      if( zStr[i]!
78f0: 3d 7a 50 61 74 74 65 72 6e 5b 30 5d 20 7c 7c 20  =zPattern[0] || 
7900: 6d 65 6d 63 6d 70 28 26 7a 53 74 72 5b 69 5d 2c  memcmp(&zStr[i],
7910: 20 7a 50 61 74 74 65 72 6e 2c 20 6e 50 61 74 74   zPattern, nPatt
7920: 65 72 6e 29 20 29 7b 0a 20 20 20 20 20 20 7a 4f  ern) ){.      zO
7930: 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 53 74 72 5b 69  ut[j++] = zStr[i
7940: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
7950: 20 20 20 20 75 38 20 2a 7a 4f 6c 64 3b 0a 20 20      u8 *zOld;.  
7960: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
7970: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
7980: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
7990: 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74  ext);.      nOut
79a0: 20 2b 3d 20 6e 52 65 70 20 2d 20 6e 50 61 74 74   += nRep - nPatt
79b0: 65 72 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ern;.      testc
79c0: 61 73 65 28 20 6e 4f 75 74 2d 31 3d 3d 64 62 2d  ase( nOut-1==db-
79d0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
79e0: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a  IMIT_LENGTH] );.
79f0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7a00: 6e 4f 75 74 2d 32 3d 3d 64 62 2d 3e 61 4c 69 6d  nOut-2==db->aLim
7a10: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7a20: 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20 20 20  LENGTH] );.     
7a30: 20 69 66 28 20 6e 4f 75 74 2d 31 3e 64 62 2d 3e   if( nOut-1>db->
7a40: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7a50: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
7a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
7a70: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62  esult_error_toob
7a80: 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ig(context);.   
7a90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7aa0: 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  e(zOut);.       
7ab0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
7ac0: 0a 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 7a 4f  .      zOld = zO
7ad0: 75 74 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ut;.      zOut =
7ae0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
7af0: 28 7a 4f 75 74 2c 20 28 69 6e 74 29 6e 4f 75 74  (zOut, (int)nOut
7b00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 75  );.      if( zOu
7b10: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
7b20: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7b30: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
7b40: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  xt);.        sql
7b50: 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b  ite3_free(zOld);
7b60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
7b70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
7b80: 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20  emcpy(&zOut[j], 
7b90: 7a 52 65 70 2c 20 6e 52 65 70 29 3b 0a 20 20 20  zRep, nRep);.   
7ba0: 20 20 20 6a 20 2b 3d 20 6e 52 65 70 3b 0a 20 20     j += nRep;.  
7bb0: 20 20 20 20 69 20 2b 3d 20 6e 50 61 74 74 65 72      i += nPatter
7bc0: 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n-1;.    }.  }. 
7bd0: 20 61 73 73 65 72 74 28 20 6a 2b 6e 53 74 72 2d   assert( j+nStr-
7be0: 69 2b 31 3d 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d  i+1==nOut );.  m
7bf0: 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20  emcpy(&zOut[j], 
7c00: 26 7a 53 74 72 5b 69 5d 2c 20 6e 53 74 72 2d 69  &zStr[i], nStr-i
7c10: 29 3b 0a 20 20 6a 20 2b 3d 20 6e 53 74 72 20 2d  );.  j += nStr -
7c20: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   i;.  assert( j<
7c30: 3d 6e 4f 75 74 20 29 3b 0a 20 20 7a 4f 75 74 5b  =nOut );.  zOut[
7c40: 6a 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  j] = 0;.  sqlite
7c50: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
7c60: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f  ntext, (char*)zO
7c70: 75 74 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66  ut, j, sqlite3_f
7c80: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ree);.}../*.** I
7c90: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
7ca0: 20 74 68 65 20 54 52 49 4d 28 29 2c 20 4c 54 52   the TRIM(), LTR
7cb0: 49 4d 28 29 2c 20 61 6e 64 20 52 54 52 49 4d 28  IM(), and RTRIM(
7cc0: 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20  ) functions..** 
7cd0: 54 68 65 20 75 73 65 72 64 61 74 61 20 69 73 20  The userdata is 
7ce0: 30 78 31 20 66 6f 72 20 6c 65 66 74 20 74 72 69  0x1 for left tri
7cf0: 6d 2c 20 30 78 32 20 66 6f 72 20 72 69 67 68 74  m, 0x2 for right
7d00: 20 74 72 69 6d 2c 20 30 78 33 20 66 6f 72 20 62   trim, 0x3 for b
7d10: 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oth..*/.static v
7d20: 6f 69 64 20 74 72 69 6d 46 75 6e 63 28 0a 20 20  oid trimFunc(.  
7d30: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7d40: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
7d50: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
7d60: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
7d70: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
7d80: 20 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20   char *zIn;     
7d90: 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 73 74 72      /* Input str
7da0: 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ing */.  const u
7db0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 43  nsigned char *zC
7dc0: 68 61 72 53 65 74 3b 20 20 20 20 2f 2a 20 53 65  harSet;    /* Se
7dd0: 74 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  t of characters 
7de0: 74 6f 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74  to trim */.  int
7df0: 20 6e 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20   nIn;           
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7e10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7e20: 73 20 69 6e 20 69 6e 70 75 74 20 2a 2f 0a 20 20  s in input */.  
7e30: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e50: 20 20 2f 2a 20 31 3a 20 74 72 69 6d 6c 65 66 74    /* 1: trimleft
7e60: 20 20 32 3a 20 74 72 69 6d 72 69 67 68 74 20 20    2: trimright  
7e70: 33 3a 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74  3: trim */.  int
7e80: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ea0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
7eb0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
7ec0: 72 20 2a 61 4c 65 6e 20 3d 20 30 3b 20 20 20 20  r *aLen = 0;    
7ed0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
7ee0: 6f 66 20 65 61 63 68 20 63 68 61 72 61 63 74 65  of each characte
7ef0: 72 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f  r in zCharSet */
7f00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
7f10: 20 2a 2a 61 7a 43 68 61 72 20 3d 20 30 3b 20 20   **azChar = 0;  
7f20: 20 20 20 20 20 2f 2a 20 49 6e 64 69 76 69 64 75       /* Individu
7f30: 61 6c 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  al characters in
7f40: 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20 69   zCharSet */.  i
7f50: 6e 74 20 6e 43 68 61 72 3b 20 20 20 20 20 20 20  nt nChar;       
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
7f80: 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43 68 61  aracters in zCha
7f90: 72 53 65 74 20 2a 2f 0a 0a 20 20 69 66 28 20 73  rSet */..  if( s
7fa0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
7fb0: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
7fc0: 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_NULL ){.    r
7fd0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e  eturn;.  }.  zIn
7fe0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7ff0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
8000: 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72    if( zIn==0 ) r
8010: 65 74 75 72 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73  eturn;.  nIn = s
8020: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
8030: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61  es(argv[0]);.  a
8040: 73 73 65 72 74 28 20 7a 49 6e 3d 3d 73 71 6c 69  ssert( zIn==sqli
8050: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
8060: 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  rgv[0]) );.  if(
8070: 20 61 72 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20   argc==1 ){.    
8080: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
8090: 69 67 6e 65 64 20 63 68 61 72 20 6c 65 6e 4f 6e  igned char lenOn
80a0: 65 5b 5d 20 3d 20 7b 20 31 20 7d 3b 0a 20 20 20  e[] = { 1 };.   
80b0: 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64   static unsigned
80c0: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
80d0: 4f 6e 65 5b 5d 20 3d 20 7b 20 28 75 38 2a 29 22  One[] = { (u8*)"
80e0: 20 22 20 7d 3b 0a 20 20 20 20 6e 43 68 61 72 20   " };.    nChar 
80f0: 3d 20 31 3b 0a 20 20 20 20 61 4c 65 6e 20 3d 20  = 1;.    aLen = 
8100: 28 75 38 2a 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20  (u8*)lenOne;.   
8110: 20 61 7a 43 68 61 72 20 3d 20 28 75 6e 73 69 67   azChar = (unsig
8120: 6e 65 64 20 63 68 61 72 20 2a 2a 29 61 7a 4f 6e  ned char **)azOn
8130: 65 3b 0a 20 20 20 20 7a 43 68 61 72 53 65 74 20  e;.    zCharSet 
8140: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
8150: 20 28 7a 43 68 61 72 53 65 74 20 3d 20 73 71 6c   (zCharSet = sql
8160: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8170: 61 72 67 76 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a  argv[1]))==0 ){.
8180: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
8190: 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  lse{.    const u
81a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b  nsigned char *z;
81b0: 0a 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72  .    for(z=zChar
81c0: 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a  Set, nChar=0; *z
81d0: 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20  ; nChar++){.    
81e0: 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54    SQLITE_SKIP_UT
81f0: 46 38 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  F8(z);.    }.   
8200: 20 69 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a   if( nChar>0 ){.
8210: 20 20 20 20 20 20 61 7a 43 68 61 72 20 3d 20 63        azChar = c
8220: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
8230: 74 65 78 74 2c 20 28 28 69 36 34 29 6e 43 68 61  text, ((i64)nCha
8240: 72 29 2a 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  r)*(sizeof(char*
8250: 29 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28  )+1));.      if(
8260: 20 61 7a 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20   azChar==0 ){.  
8270: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8280: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4c 65 6e      }.      aLen
8290: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
82a0: 72 2a 29 26 61 7a 43 68 61 72 5b 6e 43 68 61 72  r*)&azChar[nChar
82b0: 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 7a 3d 7a  ];.      for(z=z
82c0: 43 68 61 72 53 65 74 2c 20 6e 43 68 61 72 3d 30  CharSet, nChar=0
82d0: 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a  ; *z; nChar++){.
82e0: 20 20 20 20 20 20 20 20 61 7a 43 68 61 72 5b 6e          azChar[n
82f0: 43 68 61 72 5d 20 3d 20 28 75 6e 73 69 67 6e 65  Char] = (unsigne
8300: 64 20 63 68 61 72 20 2a 29 7a 3b 0a 20 20 20 20  d char *)z;.    
8310: 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f      SQLITE_SKIP_
8320: 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 20 20 20  UTF8(z);.       
8330: 20 61 4c 65 6e 5b 6e 43 68 61 72 5d 20 3d 20 28   aLen[nChar] = (
8340: 75 38 29 28 7a 20 2d 20 61 7a 43 68 61 72 5b 6e  u8)(z - azChar[n
8350: 43 68 61 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Char]);.      }.
8360: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
8370: 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20 20 66  nChar>0 ){.    f
8380: 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 50 54  lags = SQLITE_PT
8390: 52 5f 54 4f 5f 49 4e 54 28 73 71 6c 69 74 65 33  R_TO_INT(sqlite3
83a0: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
83b0: 78 74 29 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  xt));.    if( fl
83c0: 61 67 73 20 26 20 31 20 29 7b 0a 20 20 20 20 20  ags & 1 ){.     
83d0: 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b   while( nIn>0 ){
83e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  .        int len
83f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
8400: 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20  r(i=0; i<nChar; 
8410: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
8420: 6c 65 6e 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20  len = aLen[i];. 
8430: 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e           if( len
8440: 3c 3d 6e 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28  <=nIn && memcmp(
8450: 7a 49 6e 2c 20 61 7a 43 68 61 72 5b 69 5d 2c 20  zIn, azChar[i], 
8460: 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  len)==0 ) break;
8470: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8480: 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20     if( i>=nChar 
8490: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
84a0: 20 7a 49 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20   zIn += len;.   
84b0: 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b       nIn -= len;
84c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
84d0: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 32     if( flags & 2
84e0: 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
84f0: 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   nIn>0 ){.      
8500: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20    int len = 0;. 
8510: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
8520: 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20  i<nChar; i++){. 
8530: 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 61           len = a
8540: 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Len[i];.        
8550: 20 20 69 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26    if( len<=nIn &
8560: 26 20 6d 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49  & memcmp(&zIn[nI
8570: 6e 2d 6c 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d  n-len],azChar[i]
8580: 2c 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,len)==0 ) break
8590: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
85a0: 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72      if( i>=nChar
85b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
85c0: 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20    nIn -= len;.  
85d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
85e0: 69 66 28 20 7a 43 68 61 72 53 65 74 20 29 7b 0a  if( zCharSet ){.
85f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
8600: 65 65 28 61 7a 43 68 61 72 29 3b 0a 20 20 20 20  ee(azChar);.    
8610: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
8620: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
8630: 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c  ext, (char*)zIn,
8640: 20 6e 49 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41   nIn, SQLITE_TRA
8650: 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 0a 2f 2a 20  NSIENT);.}.../* 
8660: 49 4d 50 3a 20 52 2d 32 35 33 36 31 2d 31 36 31  IMP: R-25361-161
8670: 35 30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  50 This function
8680: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
8690: 20 53 51 4c 69 74 65 20 62 79 20 64 65 66 61 75   SQLite by defau
86a0: 6c 74 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c  lt. It.** is onl
86b0: 79 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20 74  y available if t
86c0: 68 65 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45  he SQLITE_SOUNDE
86d0: 58 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  X compile-time o
86e0: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 0a 2a 2a  ption is used.**
86f0: 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20   when SQLite is 
8700: 62 75 69 6c 74 2e 0a 2a 2f 0a 23 69 66 64 65 66  built..*/.#ifdef
8710: 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a   SQLITE_SOUNDEX.
8720: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
8730: 65 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69  e soundex encodi
8740: 6e 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a 2a  ng of a word..**
8750: 0a 2a 2a 20 49 4d 50 3a 20 52 2d 35 39 37 38 32  .** IMP: R-59782
8760: 2d 30 30 30 37 32 20 54 68 65 20 73 6f 75 6e 64  -00072 The sound
8770: 65 78 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 72  ex(X) function r
8780: 65 74 75 72 6e 73 20 61 20 73 74 72 69 6e 67 20  eturns a string 
8790: 74 68 61 74 20 69 73 20 74 68 65 0a 2a 2a 20 73  that is the.** s
87a0: 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e 67 20  oundex encoding 
87b0: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 58 2e  of the string X.
87c0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
87d0: 20 73 6f 75 6e 64 65 78 46 75 6e 63 28 0a 20 20   soundexFunc(.  
87e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
87f0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
8800: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
8810: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
8820: 20 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b 38    char zResult[8
8830: 5d 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  ];.  const u8 *z
8840: 49 6e 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  In;.  int i, j;.
8850: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
8860: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 43 6f  nsigned char iCo
8870: 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20  de[] = {.    0, 
8880: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8890: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
88a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
88b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
88c0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
88d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
88e0: 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
88f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8900: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8910: 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30  , 0,.    0, 0, 0
8920: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8930: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8940: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20  0, 0, 0,.    0, 
8950: 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31  0, 1, 2, 3, 0, 1
8960: 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c  , 2, 0, 0, 2, 2,
8970: 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20   4, 5, 5, 0,.   
8980: 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20   1, 2, 6, 2, 3, 
8990: 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32  0, 1, 0, 2, 0, 2
89a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
89b0: 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c  .    0, 0, 1, 2,
89c0: 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20   3, 0, 1, 2, 0, 
89d0: 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35  0, 2, 2, 4, 5, 5
89e0: 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36  , 0,.    1, 2, 6
89f0: 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c  , 2, 3, 0, 1, 0,
8a00: 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20   2, 0, 2, 0, 0, 
8a10: 30 2c 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20  0, 0, 0,.  };.  
8a20: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
8a30: 29 3b 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a 29  );.  zIn = (u8*)
8a40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8a50: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
8a60: 66 28 20 7a 49 6e 3d 3d 30 20 29 20 7a 49 6e 20  f( zIn==0 ) zIn 
8a70: 3d 20 28 75 38 2a 29 22 22 3b 0a 20 20 66 6f 72  = (u8*)"";.  for
8a80: 28 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26 26 20  (i=0; zIn[i] && 
8a90: 21 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28  !sqlite3Isalpha(
8aa0: 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  zIn[i]); i++){}.
8ab0: 20 20 69 66 28 20 7a 49 6e 5b 69 5d 20 29 7b 0a    if( zIn[i] ){.
8ac0: 20 20 20 20 75 38 20 70 72 65 76 63 6f 64 65 20      u8 prevcode 
8ad0: 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30  = iCode[zIn[i]&0
8ae0: 78 37 66 5d 3b 0a 20 20 20 20 7a 52 65 73 75 6c  x7f];.    zResul
8af0: 74 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f  t[0] = sqlite3To
8b00: 75 70 70 65 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20  upper(zIn[i]);. 
8b10: 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20     for(j=1; j<4 
8b20: 26 26 20 7a 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b  && zIn[i]; i++){
8b30: 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20  .      int code 
8b40: 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30  = iCode[zIn[i]&0
8b50: 78 37 66 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f];.      if( 
8b60: 63 6f 64 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  code>0 ){.      
8b70: 20 20 69 66 28 20 63 6f 64 65 21 3d 70 72 65 76    if( code!=prev
8b80: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  code ){.        
8b90: 20 20 70 72 65 76 63 6f 64 65 20 3d 20 63 6f 64    prevcode = cod
8ba0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65  e;.          zRe
8bb0: 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63 6f 64 65  sult[j++] = code
8bc0: 20 2b 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   + '0';.        
8bd0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
8be0: 20 20 20 20 20 20 20 70 72 65 76 63 6f 64 65 20         prevcode 
8bf0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
8c00: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c   }.    while( j<
8c10: 34 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 73 75  4 ){.      zResu
8c20: 6c 74 5b 6a 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20  lt[j++] = '0';. 
8c30: 20 20 20 7d 0a 20 20 20 20 7a 52 65 73 75 6c 74     }.    zResult
8c40: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
8c50: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
8c60: 28 63 6f 6e 74 65 78 74 2c 20 7a 52 65 73 75 6c  (context, zResul
8c70: 74 2c 20 34 2c 20 53 51 4c 49 54 45 5f 54 52 41  t, 4, SQLITE_TRA
8c80: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
8c90: 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  {.    /* IMP: R-
8ca0: 36 34 38 39 34 2d 35 30 33 32 31 20 54 68 65 20  64894-50321 The 
8cb0: 73 74 72 69 6e 67 20 22 3f 30 30 30 22 20 69 73  string "?000" is
8cc0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
8cd0: 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a   argument.    **
8ce0: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 74   is NULL or cont
8cf0: 61 69 6e 73 20 6e 6f 20 41 53 43 49 49 20 61 6c  ains no ASCII al
8d00: 70 68 61 62 65 74 69 63 20 63 68 61 72 61 63 74  phabetic charact
8d10: 65 72 73 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ers. */.    sqli
8d20: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
8d30: 63 6f 6e 74 65 78 74 2c 20 22 3f 30 30 30 22 2c  context, "?000",
8d40: 20 34 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   4, SQLITE_STATI
8d50: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
8d60: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44   /* SQLITE_SOUND
8d70: 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EX */..#ifndef S
8d80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
8d90: 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
8da0: 41 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  A function that 
8db0: 6c 6f 61 64 73 20 61 20 73 68 61 72 65 64 2d 6c  loads a shared-l
8dc0: 69 62 72 61 72 79 20 65 78 74 65 6e 73 69 6f 6e  ibrary extension
8dd0: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 4e 55   then returns NU
8de0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
8df0: 69 64 20 6c 6f 61 64 45 78 74 28 73 71 6c 69 74  id loadExt(sqlit
8e00: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
8e10: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
8e20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
8e30: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  rgv){.  const ch
8e40: 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28 63 6f 6e  ar *zFile = (con
8e50: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
8e60: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8e70: 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63  v[0]);.  const c
8e80: 68 61 72 20 2a 7a 50 72 6f 63 3b 0a 20 20 73 71  har *zProc;.  sq
8e90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
8ea0: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
8eb0: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
8ec0: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
8ed0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  = 0;..  if( argc
8ee0: 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63  ==2 ){.    zProc
8ef0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
8f00: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
8f10: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
8f20: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 63  }else{.    zProc
8f30: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
8f40: 7a 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33  zFile && sqlite3
8f50: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
8f60: 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63  db, zFile, zProc
8f70: 2c 20 26 7a 45 72 72 4d 73 67 29 20 29 7b 0a 20  , &zErrMsg) ){. 
8f80: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8f90: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
8fa0: 20 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b 0a 20   zErrMsg, -1);. 
8fb0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8fc0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a  zErrMsg);.  }.}.
8fd0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
8fe0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
8ff0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
9000: 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20  cture holds the 
9010: 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20  context of a.** 
9020: 73 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20 61  sum() or avg() a
9030: 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74 61  ggregate computa
9040: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
9050: 20 73 74 72 75 63 74 20 53 75 6d 43 74 78 20 53   struct SumCtx S
9060: 75 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53 75  umCtx;.struct Su
9070: 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20  mCtx {.  double 
9080: 72 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20 46 6c  rSum;      /* Fl
9090: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 73 75 6d  oating point sum
90a0: 20 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d 3b 20   */.  i64 iSum; 
90b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
90c0: 65 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20 20 69  er sum */   .  i
90d0: 36 34 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  64 cnt;         
90e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
90f0: 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a 2f  ements summed */
9100: 0a 20 20 75 38 20 6f 76 65 72 66 6c 6f 77 3b 20  .  u8 overflow; 
9110: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
9120: 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77  integer overflow
9130: 20 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20 61 70   seen */.  u8 ap
9140: 70 72 6f 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  prox;        /* 
9150: 54 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e 74 65  True if non-inte
9160: 67 65 72 20 76 61 6c 75 65 20 77 61 73 20 69 6e  ger value was in
9170: 70 75 74 20 74 6f 20 74 68 65 20 73 75 6d 20 2a  put to the sum *
9180: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  /.};../*.** Rout
9190: 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ines used to com
91a0: 70 75 74 65 20 74 68 65 20 73 75 6d 2c 20 61 76  pute the sum, av
91b0: 65 72 61 67 65 2c 20 61 6e 64 20 74 6f 74 61 6c  erage, and total
91c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55 4d 28  ..**.** The SUM(
91d0: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c 6c 6f  ) function follo
91e0: 77 73 20 74 68 65 20 28 62 72 6f 6b 65 6e 29 20  ws the (broken) 
91f0: 53 51 4c 20 73 74 61 6e 64 61 72 64 20 77 68 69  SQL standard whi
9200: 63 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ch means.** that
9210: 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c   it returns NULL
9220: 20 69 66 20 69 74 20 73 75 6d 73 20 6f 76 65 72   if it sums over
9230: 20 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54 4f 54   no inputs.  TOT
9240: 41 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30 2e  AL returns.** 0.
9250: 30 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20  0 in that case. 
9260: 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20 54 4f   In addition, TO
9270: 54 41 4c 20 61 6c 77 61 79 73 20 72 65 74 75 72  TAL always retur
9280: 6e 73 20 61 20 66 6c 6f 61 74 20 77 68 65 72 65  ns a float where
9290: 0a 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20 72 65  .** SUM might re
92a0: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
92b0: 69 66 20 69 74 20 6e 65 76 65 72 20 65 6e 63 6f  if it never enco
92c0: 75 6e 74 65 72 73 20 61 20 66 6c 6f 61 74 69 6e  unters a floatin
92d0: 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
92e0: 2e 20 20 54 4f 54 41 4c 20 6e 65 76 65 72 20 66  .  TOTAL never f
92f0: 61 69 6c 73 2c 20 62 75 74 20 53 55 4d 20 6d 69  ails, but SUM mi
9300: 67 68 74 20 74 68 72 6f 75 67 68 20 61 6e 20 65  ght through an e
9310: 78 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a 20 69  xception if.** i
9320: 74 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e 20 69  t overflows an i
9330: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nteger..*/.stati
9340: 63 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28 73  c void sumStep(s
9350: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9360: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
9370: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
9380: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43   **argv){.  SumC
9390: 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79 70  tx *p;.  int typ
93a0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  e;.  assert( arg
93b0: 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==1 );.  UNUSED
93c0: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
93d0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
93e0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
93f0: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
9400: 66 28 2a 70 29 29 3b 0a 20 20 74 79 70 65 20 3d  f(*p));.  type =
9410: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e   sqlite3_value_n
9420: 75 6d 65 72 69 63 5f 74 79 70 65 28 61 72 67 76  umeric_type(argv
9430: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 20 26 26  [0]);.  if( p &&
9440: 20 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e 55   type!=SQLITE_NU
9450: 4c 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6e 74  LL ){.    p->cnt
9460: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 74 79 70 65  ++;.    if( type
9470: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
9480: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 20   ){.      i64 v 
9490: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
94a0: 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a  int64(argv[0]);.
94b0: 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d        p->rSum +=
94c0: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   v;.      if( (p
94d0: 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f 76 65 72  ->approx|p->over
94e0: 66 6c 6f 77 29 3d 3d 30 20 26 26 20 73 71 6c 69  flow)==0 && sqli
94f0: 74 65 33 41 64 64 49 6e 74 36 34 28 26 70 2d 3e  te3AddInt64(&p->
9500: 69 53 75 6d 2c 20 76 29 20 29 7b 0a 20 20 20 20  iSum, v) ){.    
9510: 20 20 20 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20      p->overflow 
9520: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
9530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
9540: 3e 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33  >rSum += sqlite3
9550: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
9560: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d  gv[0]);.      p-
9570: 3e 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20 20 20  >approx = 1;.   
9580: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
9590: 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69 7a 65  void sumFinalize
95a0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
95b0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75   *context){.  Su
95c0: 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  mCtx *p;.  p = s
95d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
95e0: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
95f0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26  , 0);.  if( p &&
9600: 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20   p->cnt>0 ){.   
9610: 20 69 66 28 20 70 2d 3e 6f 76 65 72 66 6c 6f 77   if( p->overflow
9620: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9630: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
9640: 6f 6e 74 65 78 74 2c 22 69 6e 74 65 67 65 72 20  ontext,"integer 
9650: 6f 76 65 72 66 6c 6f 77 22 2c 2d 31 29 3b 0a 20  overflow",-1);. 
9660: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
9670: 61 70 70 72 6f 78 20 29 7b 0a 20 20 20 20 20 20  approx ){.      
9680: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
9690: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70  ouble(context, p
96a0: 2d 3e 72 53 75 6d 29 3b 0a 20 20 20 20 7d 65 6c  ->rSum);.    }el
96b0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
96c0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
96d0: 6f 6e 74 65 78 74 2c 20 70 2d 3e 69 53 75 6d 29  ontext, p->iSum)
96e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
96f0: 61 74 69 63 20 76 6f 69 64 20 61 76 67 46 69 6e  atic void avgFin
9700: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
9710: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
9720: 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20  .  SumCtx *p;.  
9730: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
9740: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
9750: 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28  ntext, 0);.  if(
9760: 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29   p && p->cnt>0 )
9770: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
9780: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
9790: 65 78 74 2c 20 70 2d 3e 72 53 75 6d 2f 28 64 6f  ext, p->rSum/(do
97a0: 75 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20  uble)p->cnt);.  
97b0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
97c0: 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 28 73 71  totalFinalize(sq
97d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
97e0: 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74  ontext){.  SumCt
97f0: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
9800: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
9810: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
9820: 29 3b 0a 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29  );.  /* (double)
9830: 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c  0 In case of SQL
9840: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
9850: 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20  G_POINT... */.  
9860: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
9870: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70  ouble(context, p
9880: 20 3f 20 70 2d 3e 72 53 75 6d 20 3a 20 28 64 6f   ? p->rSum : (do
9890: 75 62 6c 65 29 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  uble)0);.}../*.*
98a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
98b0: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
98c0: 74 72 61 63 6b 20 6f 66 20 73 74 61 74 65 20 69  track of state i
98d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
98e0: 68 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20 61 67  he.** count() ag
98f0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
9900: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
9910: 75 63 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75  uct CountCtx Cou
9920: 6e 74 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f  ntCtx;.struct Co
9930: 75 6e 74 43 74 78 20 7b 0a 20 20 69 36 34 20 6e  untCtx {.  i64 n
9940: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ;.};../*.** Rout
9950: 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ines to implemen
9960: 74 20 74 68 65 20 63 6f 75 6e 74 28 29 20 61 67  t the count() ag
9970: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
9980: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9990: 20 63 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74   countStep(sqlit
99a0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
99b0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
99c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
99d0: 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78  rgv){.  CountCtx
99e0: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
99f0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
9a00: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
9a10: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
9a20: 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c   (argc==0 || SQL
9a30: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
9a40: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
9a50: 76 5b 30 5d 29 29 20 26 26 20 70 20 29 7b 0a 20  v[0])) && p ){. 
9a60: 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 0a     p->n++;.  }..
9a70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9a80: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
9a90: 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f   /* The sqlite3_
9aa0: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
9ab0: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65  ) function is de
9ac0: 70 72 65 63 61 74 65 64 2e 20 20 42 75 74 20 6a  precated.  But j
9ad0: 75 73 74 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  ust to make.  **
9ae0: 20 73 75 72 65 20 69 74 20 73 74 69 6c 6c 20 6f   sure it still o
9af0: 70 65 72 61 74 65 73 20 63 6f 72 72 65 63 74 6c  perates correctl
9b00: 79 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 69  y, verify that i
9b10: 74 73 20 63 6f 75 6e 74 20 61 67 72 65 65 73 20  ts count agrees 
9b20: 77 69 74 68 20 6f 75 72 20 0a 20 20 2a 2a 20 69  with our .  ** i
9b30: 6e 74 65 72 6e 61 6c 20 63 6f 75 6e 74 20 77 68  nternal count wh
9b40: 65 6e 20 75 73 69 6e 67 20 63 6f 75 6e 74 28 2a  en using count(*
9b50: 29 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 74  ) and when the t
9b60: 6f 74 61 6c 20 63 6f 75 6e 74 20 63 61 6e 20 62  otal count can b
9b70: 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 65 64  e.  ** expressed
9b80: 20 61 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74   as a 32-bit int
9b90: 65 67 65 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72  eger. */.  asser
9ba0: 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 70 3d  t( argc==1 || p=
9bb0: 3d 30 20 7c 7c 20 70 2d 3e 6e 3e 30 78 37 66 66  =0 || p->n>0x7ff
9bc0: 66 66 66 66 66 0a 20 20 20 20 20 20 20 20 20 20  fffff.          
9bd0: 7c 7c 20 70 2d 3e 6e 3d 3d 73 71 6c 69 74 65 33  || p->n==sqlite3
9be0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74  _aggregate_count
9bf0: 28 63 6f 6e 74 65 78 74 29 20 29 3b 0a 23 65 6e  (context) );.#en
9c00: 64 69 66 0a 7d 20 20 20 0a 73 74 61 74 69 63 20  dif.}   .static 
9c10: 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69  void countFinali
9c20: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
9c30: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
9c40: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
9c50: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
9c60: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
9c70: 74 65 78 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  text, 0);.  sqli
9c80: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
9c90: 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d  (context, p ? p-
9ca0: 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >n : 0);.}../*.*
9cb0: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d  * Routines to im
9cc0: 70 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e  plement min() an
9cd0: 64 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74  d max() aggregat
9ce0: 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  e functions..*/.
9cf0: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d  static void minm
9d00: 61 78 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  axStep(.  sqlite
9d10: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
9d20: 78 74 2c 20 0a 20 20 69 6e 74 20 4e 6f 74 55 73  xt, .  int NotUs
9d30: 65 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  ed, .  sqlite3_v
9d40: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
9d50: 20 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20 28 4d   Mem *pArg  = (M
9d60: 65 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a 20 20  em *)argv[0];.  
9d70: 4d 65 6d 20 2a 70 42 65 73 74 3b 0a 20 20 55 4e  Mem *pBest;.  UN
9d80: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
9d90: 6f 74 55 73 65 64 29 3b 0a 0a 20 20 70 42 65 73  otUsed);..  pBes
9da0: 74 20 3d 20 28 4d 65 6d 20 2a 29 73 71 6c 69 74  t = (Mem *)sqlit
9db0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
9dc0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
9dd0: 7a 65 6f 66 28 2a 70 42 65 73 74 29 29 3b 0a 20  zeof(*pBest));. 
9de0: 20 69 66 28 20 21 70 42 65 73 74 20 29 20 72 65   if( !pBest ) re
9df0: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c  turn;..  if( sql
9e00: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
9e10: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
9e20: 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _NULL ){.    if(
9e30: 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 20   pBest->flags ) 
9e40: 73 71 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d  sqlite3SkipAccum
9e50: 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65  ulatorLoad(conte
9e60: 78 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  xt);.  }else if(
9e70: 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 7b   pBest->flags ){
9e80: 0a 20 20 20 20 69 6e 74 20 6d 61 78 3b 0a 20 20  .    int max;.  
9e90: 20 20 69 6e 74 20 63 6d 70 3b 0a 20 20 20 20 43    int cmp;.    C
9ea0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
9eb0: 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f  sqlite3GetFuncCo
9ec0: 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a  llSeq(context);.
9ed0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 65 70      /* This step
9ee0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
9ef0: 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 6d  d for both the m
9f00: 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61  in() and max() a
9f10: 67 67 72 65 67 61 74 65 73 2c 0a 20 20 20 20 2a  ggregates,.    *
9f20: 2a 20 74 68 65 20 6f 6e 6c 79 20 64 69 66 66 65  * the only diffe
9f30: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
9f40: 65 20 74 77 6f 20 62 65 69 6e 67 20 74 68 61 74  e two being that
9f50: 20 74 68 65 20 73 65 6e 73 65 20 6f 66 20 74 68   the sense of th
9f60: 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69  e.    ** compari
9f70: 73 6f 6e 20 69 73 20 69 6e 76 65 72 74 65 64 2e  son is inverted.
9f80: 20 46 6f 72 20 74 68 65 20 6d 61 78 28 29 20 61   For the max() a
9f90: 67 67 72 65 67 61 74 65 2c 20 74 68 65 0a 20 20  ggregate, the.  
9fa0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 73 65    ** sqlite3_use
9fb0: 72 5f 64 61 74 61 28 29 20 66 75 6e 63 74 69 6f  r_data() functio
9fc0: 6e 20 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20  n returns (void 
9fd0: 2a 29 2d 31 2e 20 46 6f 72 20 6d 69 6e 28 29 20  *)-1. For min() 
9fe0: 69 74 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  it.    ** return
9ff0: 73 20 28 76 6f 69 64 20 2a 29 64 62 2c 20 77 68  s (void *)db, wh
a000: 65 72 65 20 64 62 20 69 73 20 74 68 65 20 73 71  ere db is the sq
a010: 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73 65 20  lite3* database 
a020: 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20 2a 2a 20  pointer..    ** 
a030: 54 68 65 72 65 66 6f 72 65 20 74 68 65 20 6e 65  Therefore the ne
a040: 78 74 20 73 74 61 74 65 6d 65 6e 74 20 73 65 74  xt statement set
a050: 73 20 76 61 72 69 61 62 6c 65 20 27 6d 61 78 27  s variable 'max'
a060: 20 74 6f 20 31 20 66 6f 72 20 74 68 65 20 6d 61   to 1 for the ma
a070: 78 28 29 0a 20 20 20 20 2a 2a 20 61 67 67 72 65  x().    ** aggre
a080: 67 61 74 65 2c 20 6f 72 20 30 20 66 6f 72 20 6d  gate, or 0 for m
a090: 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  in()..    */.   
a0a0: 20 6d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 75   max = sqlite3_u
a0b0: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
a0c0: 29 21 3d 30 3b 0a 20 20 20 20 63 6d 70 20 3d 20  )!=0;.    cmp = 
a0d0: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
a0e0: 65 28 70 42 65 73 74 2c 20 70 41 72 67 2c 20 70  e(pBest, pArg, p
a0f0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 28  Coll);.    if( (
a100: 6d 61 78 20 26 26 20 63 6d 70 3c 30 29 20 7c 7c  max && cmp<0) ||
a110: 20 28 21 6d 61 78 20 26 26 20 63 6d 70 3e 30 29   (!max && cmp>0)
a120: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a130: 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65  3VdbeMemCopy(pBe
a140: 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d  st, pArg);.    }
a150: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
a160: 74 65 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74  te3SkipAccumulat
a170: 6f 72 4c 6f 61 64 28 63 6f 6e 74 65 78 74 29 3b  orLoad(context);
a180: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
a190: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
a1a0: 65 6d 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41  emCopy(pBest, pA
a1b0: 72 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  rg);.  }.}.stati
a1c0: 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78 46 69 6e  c void minMaxFin
a1d0: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
a1e0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
a1f0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
a200: 20 2a 70 52 65 73 3b 0a 20 20 70 52 65 73 20 3d   *pRes;.  pRes =
a210: 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20   (sqlite3_value 
a220: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
a230: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
a240: 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ext, 0);.  if( p
a250: 52 65 73 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Res ){.    if( p
a260: 52 65 73 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20  Res->flags ){.  
a270: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
a280: 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74  lt_value(context
a290: 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20  , pRes);.    }. 
a2a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
a2b0: 6d 52 65 6c 65 61 73 65 28 70 52 65 73 29 3b 0a  mRelease(pRes);.
a2c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67 72 6f    }.}../*.** gro
a2d0: 75 70 5f 63 6f 6e 63 61 74 28 45 58 50 52 2c 20  up_concat(EXPR, 
a2e0: 3f 53 45 50 41 52 41 54 4f 52 3f 29 0a 2a 2f 0a  ?SEPARATOR?).*/.
a2f0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 72 6f 75  static void grou
a300: 70 43 6f 6e 63 61 74 53 74 65 70 28 0a 20 20 73  pConcatStep(.  s
a310: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
a320: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
a330: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
a340: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
a350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
a360: 6c 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70  l;.  StrAccum *p
a370: 41 63 63 75 6d 3b 0a 20 20 63 6f 6e 73 74 20 63  Accum;.  const c
a380: 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 69 6e 74  har *zSep;.  int
a390: 20 6e 56 61 6c 2c 20 6e 53 65 70 3b 0a 20 20 61   nVal, nSep;.  a
a3a0: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c  ssert( argc==1 |
a3b0: 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69  | argc==2 );.  i
a3c0: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
a3d0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
a3e0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65  SQLITE_NULL ) re
a3f0: 74 75 72 6e 3b 0a 20 20 70 41 63 63 75 6d 20 3d  turn;.  pAccum =
a400: 20 28 53 74 72 41 63 63 75 6d 2a 29 73 71 6c 69   (StrAccum*)sqli
a410: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
a420: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
a430: 69 7a 65 6f 66 28 2a 70 41 63 63 75 6d 29 29 3b  izeof(*pAccum));
a440: 0a 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20 29  ..  if( pAccum )
a450: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
a460: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
a470: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
a480: 6e 74 65 78 74 29 3b 0a 20 20 20 20 69 6e 74 20  ntext);.    int 
a490: 66 69 72 73 74 54 65 72 6d 20 3d 20 70 41 63 63  firstTerm = pAcc
a4a0: 75 6d 2d 3e 75 73 65 4d 61 6c 6c 6f 63 3d 3d 30  um->useMalloc==0
a4b0: 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e 75 73  ;.    pAccum->us
a4c0: 65 4d 61 6c 6c 6f 63 20 3d 20 32 3b 0a 20 20 20  eMalloc = 2;.   
a4d0: 20 70 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63   pAccum->mxAlloc
a4e0: 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   = db->aLimit[SQ
a4f0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
a500: 48 5d 3b 0a 20 20 20 20 69 66 28 20 21 66 69 72  H];.    if( !fir
a510: 73 74 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  stTerm ){.      
a520: 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20  if( argc==2 ){. 
a530: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 28 63         zSep = (c
a540: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
a550: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
a560: 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 70 20 3d  ;.        nSep =
a570: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
a580: 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ytes(argv[1]);. 
a590: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a5a0: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a      zSep = ",";.
a5b0: 20 20 20 20 20 20 20 20 6e 53 65 70 20 3d 20 31          nSep = 1
a5c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a5d0: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
a5e0: 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a 53  ppend(pAccum, zS
a5f0: 65 70 2c 20 6e 53 65 70 29 3b 0a 20 20 20 20 7d  ep, nSep);.    }
a600: 0a 20 20 20 20 7a 56 61 6c 20 3d 20 28 63 68 61  .    zVal = (cha
a610: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
a620: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
a630: 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74      nVal = sqlit
a640: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
a650: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 73 71 6c  rgv[0]);.    sql
a660: 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
a670: 6e 64 28 70 41 63 63 75 6d 2c 20 7a 56 61 6c 2c  nd(pAccum, zVal,
a680: 20 6e 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74   nVal);.  }.}.st
a690: 61 74 69 63 20 76 6f 69 64 20 67 72 6f 75 70 43  atic void groupC
a6a0: 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 28 73 71  oncatFinalize(sq
a6b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
a6c0: 6f 6e 74 65 78 74 29 7b 0a 20 20 53 74 72 41 63  ontext){.  StrAc
a6d0: 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 70  cum *pAccum;.  p
a6e0: 41 63 63 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f  Accum = sqlite3_
a6f0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
a700: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
a710: 20 69 66 28 20 70 41 63 63 75 6d 20 29 7b 0a 20   if( pAccum ){. 
a720: 20 20 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 74     if( pAccum->t
a730: 6f 6f 42 69 67 20 29 7b 0a 20 20 20 20 20 20 73  ooBig ){.      s
a740: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
a750: 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65  ror_toobig(conte
a760: 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  xt);.    }else i
a770: 66 28 20 70 41 63 63 75 6d 2d 3e 6d 61 6c 6c 6f  f( pAccum->mallo
a780: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
a790: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a7a0: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
a7b0: 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ext);.    }else{
a7c0: 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74      .      sqlit
a7d0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
a7e0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 53  ontext, sqlite3S
a7f0: 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 70 41  trAccumFinish(pA
a800: 63 63 75 6d 29 2c 20 2d 31 2c 20 0a 20 20 20 20  ccum), -1, .    
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
a830: 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ee);.    }.  }.}
a840: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
a850: 74 69 6e 65 20 64 6f 65 73 20 70 65 72 2d 63 6f  tine does per-co
a860: 6e 6e 65 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f  nnection functio
a870: 6e 20 72 65 67 69 73 74 72 61 74 69 6f 6e 2e 20  n registration. 
a880: 20 4d 6f 73 74 0a 2a 2a 20 6f 66 20 74 68 65 20   Most.** of the 
a890: 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
a8a0: 6e 73 20 61 62 6f 76 65 20 61 72 65 20 70 61 72  ns above are par
a8b0: 74 20 6f 66 20 74 68 65 20 67 6c 6f 62 61 6c 20  t of the global 
a8c0: 66 75 6e 63 74 69 6f 6e 20 73 65 74 2e 0a 2a 2a  function set..**
a8d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   This routine on
a8e0: 6c 79 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  ly deals with th
a8f0: 6f 73 65 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ose that are not
a900: 20 67 6c 6f 62 61 6c 2e 0a 2a 2f 0a 76 6f 69 64   global..*/.void
a910: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
a920: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
a930: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
a940: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
a950: 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
a960: 69 6f 6e 28 64 62 2c 20 22 4d 41 54 43 48 22 2c  ion(db, "MATCH",
a970: 20 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   2);.  assert( r
a980: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
a990: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
a9a0: 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
a9b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
a9c0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
a9d0: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
a9e0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 4c 49 4b  *.** Set the LIK
a9f0: 45 4f 50 54 20 66 6c 61 67 20 6f 6e 20 74 68 65  EOPT flag on the
aa00: 20 32 2d 61 72 67 75 6d 65 6e 74 20 66 75 6e 63   2-argument func
aa10: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69  tion with the gi
aa20: 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ven name..*/.sta
aa30: 74 69 63 20 76 6f 69 64 20 73 65 74 4c 69 6b 65  tic void setLike
aa40: 4f 70 74 46 6c 61 67 28 73 71 6c 69 74 65 33 20  OptFlag(sqlite3 
aa50: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
aa60: 2a 7a 4e 61 6d 65 2c 20 75 38 20 66 6c 61 67 56  *zName, u8 flagV
aa70: 61 6c 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  al){.  FuncDef *
aa80: 70 44 65 66 3b 0a 20 20 70 44 65 66 20 3d 20 73  pDef;.  pDef = s
aa90: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
aaa0: 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 73 71  on(db, zName, sq
aab0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
aac0: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46     2, SQLITE_UTF
aaf0: 38 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57  8, 0);.  if( ALW
ab00: 41 59 53 28 70 44 65 66 29 20 29 7b 0a 20 20 20  AYS(pDef) ){.   
ab10: 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 3d 20 66   pDef->flags = f
ab20: 6c 61 67 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  lagVal;.  }.}../
ab30: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
ab40: 65 20 62 75 69 6c 74 2d 69 6e 20 4c 49 4b 45 20  e built-in LIKE 
ab50: 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f  and GLOB functio
ab60: 6e 73 2e 20 20 54 68 65 20 63 61 73 65 53 65 6e  ns.  The caseSen
ab70: 73 69 74 69 76 65 0a 2a 2a 20 70 61 72 61 6d 65  sitive.** parame
ab80: 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
ab90: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
aba0: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
abb0: 69 73 20 63 61 73 65 0a 2a 2a 20 73 65 6e 73 69  is case.** sensi
abc0: 74 69 76 65 2e 20 20 47 4c 4f 42 20 69 73 20 61  tive.  GLOB is a
abd0: 6c 77 61 79 73 20 63 61 73 65 20 73 65 6e 73 69  lways case sensi
abe0: 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tive..*/.void sq
abf0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b  lite3RegisterLik
ac00: 65 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74  eFunctions(sqlit
ac10: 65 33 20 2a 64 62 2c 20 69 6e 74 20 63 61 73 65  e3 *db, int case
ac20: 53 65 6e 73 69 74 69 76 65 29 7b 0a 20 20 73 74  Sensitive){.  st
ac30: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
ac40: 20 2a 70 49 6e 66 6f 3b 0a 20 20 69 66 28 20 63   *pInfo;.  if( c
ac50: 61 73 65 53 65 6e 73 69 74 69 76 65 20 29 7b 0a  aseSensitive ){.
ac60: 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73 74 72      pInfo = (str
ac70: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a  uct compareInfo*
ac80: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 3b 0a 20  )&likeInfoAlt;. 
ac90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
aca0: 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6d 70  o = (struct comp
acb0: 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e  areInfo*)&likeIn
acc0: 66 6f 4e 6f 72 6d 3b 0a 20 20 7d 0a 20 20 73 71  foNorm;.  }.  sq
acd0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
ace0: 64 62 2c 20 22 6c 69 6b 65 22 2c 20 32 2c 20 53  db, "like", 2, S
acf0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 49 6e 66  QLITE_UTF8, pInf
ad00: 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20  o, likeFunc, 0, 
ad10: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
ad20: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22  CreateFunc(db, "
ad30: 6c 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49 54 45  like", 3, SQLITE
ad40: 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69  _UTF8, pInfo, li
ad50: 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29  keFunc, 0, 0, 0)
ad60: 3b 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74  ;.  sqlite3Creat
ad70: 65 46 75 6e 63 28 64 62 2c 20 22 67 6c 6f 62 22  eFunc(db, "glob"
ad80: 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
ad90: 2c 20 0a 20 20 20 20 20 20 28 73 74 72 75 63 74  , .      (struct
ada0: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 67   compareInfo*)&g
adb0: 6c 6f 62 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e  lobInfo, likeFun
adc0: 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73  c, 0, 0, 0);.  s
add0: 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62  etLikeOptFlag(db
ade0: 2c 20 22 67 6c 6f 62 22 2c 20 53 51 4c 49 54 45  , "glob", SQLITE
adf0: 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c  _FUNC_LIKE | SQL
ae00: 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3b 0a  ITE_FUNC_CASE);.
ae10: 20 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67    setLikeOptFlag
ae20: 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 0a 20 20  (db, "like", .  
ae30: 20 20 20 20 63 61 73 65 53 65 6e 73 69 74 69 76      caseSensitiv
ae40: 65 20 3f 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  e ? (SQLITE_FUNC
ae50: 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46  _LIKE | SQLITE_F
ae60: 55 4e 43 5f 43 41 53 45 29 20 3a 20 53 51 4c 49  UNC_CASE) : SQLI
ae70: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d  TE_FUNC_LIKE);.}
ae80: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f  ../*.** pExpr po
ae90: 69 6e 74 73 20 74 6f 20 61 6e 20 65 78 70 72 65  ints to an expre
aea0: 73 73 69 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c  ssion which impl
aeb0: 65 6d 65 6e 74 73 20 61 20 66 75 6e 63 74 69 6f  ements a functio
aec0: 6e 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69 73 20  n.  If.** it is 
aed0: 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 61  appropriate to a
aee0: 70 70 6c 79 20 74 68 65 20 4c 49 4b 45 20 6f 70  pply the LIKE op
aef0: 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68  timization to th
af00: 61 74 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74  at function.** t
af10: 68 65 6e 20 73 65 74 20 61 57 63 5b 30 5d 20 74  hen set aWc[0] t
af20: 68 72 6f 75 67 68 20 61 57 63 5b 32 5d 20 74 6f  hrough aWc[2] to
af30: 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68   the wildcard ch
af40: 61 72 61 63 74 65 72 73 20 61 6e 64 0a 2a 2a 20  aracters and.** 
af50: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
af60: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
af70: 20 6e 6f 74 20 61 20 4c 49 4b 45 2d 73 74 79 6c   not a LIKE-styl
af80: 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 65 6e 0a  e function then.
af90: 2a 2a 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  ** return FALSE.
afa0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
afb0: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71  sLikeFunction(sq
afc0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
afd0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 49 73  *pExpr, int *pIs
afe0: 4e 6f 63 61 73 65 2c 20 63 68 61 72 20 2a 61 57  Nocase, char *aW
aff0: 63 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70  c){.  FuncDef *p
b000: 44 65 66 3b 0a 20 20 69 66 28 20 70 45 78 70 72  Def;.  if( pExpr
b010: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
b020: 4e 20 0a 20 20 20 7c 7c 20 21 70 45 78 70 72 2d  N .   || !pExpr-
b030: 3e 78 2e 70 4c 69 73 74 20 0a 20 20 20 7c 7c 20  >x.pList .   || 
b040: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
b050: 6e 45 78 70 72 21 3d 32 0a 20 20 29 7b 0a 20 20  nExpr!=2.  ){.  
b060: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b070: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
b080: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
b090: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
b0a0: 29 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69  );.  pDef = sqli
b0b0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
b0c0: 64 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  db, pExpr->u.zTo
b0d0: 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ken, .          
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e     sqlite3Strlen
b100: 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
b110: 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  en),.           
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b130: 20 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38    2, SQLITE_UTF8
b140: 2c 20 30 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  , 0);.  if( NEVE
b150: 52 28 70 44 65 66 3d 3d 30 29 20 7c 7c 20 28 70  R(pDef==0) || (p
b160: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
b170: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3d 3d  ITE_FUNC_LIKE)==
b180: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
b190: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
b1a0: 20 6d 65 6d 63 70 79 28 29 20 73 74 61 74 65 6d   memcpy() statem
b1b0: 65 6e 74 20 61 73 73 75 6d 65 73 20 74 68 61 74  ent assumes that
b1c0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68   the wildcard ch
b1d0: 61 72 61 63 74 65 72 73 20 61 72 65 0a 20 20 2a  aracters are.  *
b1e0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  * the first thre
b1f0: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  e statements in 
b200: 74 68 65 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  the compareInfo 
b210: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 0a  structure.  The.
b220: 20 20 2a 2a 20 61 73 73 65 72 74 73 28 29 20 74    ** asserts() t
b230: 68 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72 69 66  hat follow verif
b240: 79 20 74 68 61 74 20 61 73 73 75 6d 70 74 69 6f  y that assumptio
b250: 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  n.  */.  memcpy(
b260: 61 57 63 2c 20 70 44 65 66 2d 3e 70 55 73 65 72  aWc, pDef->pUser
b270: 44 61 74 61 2c 20 33 29 3b 0a 20 20 61 73 73 65  Data, 3);.  asse
b280: 72 74 28 20 28 63 68 61 72 2a 29 26 6c 69 6b 65  rt( (char*)&like
b290: 49 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68 61 72  InfoAlt == (char
b2a0: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d  *)&likeInfoAlt.m
b2b0: 61 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61 73 73  atchAll );.  ass
b2c0: 65 72 74 28 20 26 28 28 63 68 61 72 2a 29 26 6c  ert( &((char*)&l
b2d0: 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d 20 3d  ikeInfoAlt)[1] =
b2e0: 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  = (char*)&likeIn
b2f0: 66 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65 20 29  foAlt.matchOne )
b300: 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28 28 63  ;.  assert( &((c
b310: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
b320: 74 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72 2a 29  t)[2] == (char*)
b330: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74  &likeInfoAlt.mat
b340: 63 68 53 65 74 20 29 3b 0a 20 20 2a 70 49 73 4e  chSet );.  *pIsN
b350: 6f 63 61 73 65 20 3d 20 28 70 44 65 66 2d 3e 66  ocase = (pDef->f
b360: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
b370: 4e 43 5f 43 41 53 45 29 3d 3d 30 3b 0a 20 20 72  NC_CASE)==0;.  r
b380: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
b390: 2a 20 41 6c 6c 20 61 6c 6c 20 6f 66 20 74 68 65  * All all of the
b3a0: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
b3b0: 72 65 73 20 69 6e 20 74 68 65 20 61 42 75 69 6c  res in the aBuil
b3c0: 74 69 6e 46 75 6e 63 5b 5d 20 61 72 72 61 79 20  tinFunc[] array 
b3d0: 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 74 68 65 20  above.** to the 
b3e0: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
b3f0: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 54 68 69  hash table.  Thi
b400: 73 20 6f 63 63 75 72 73 20 61 74 20 73 74 61 72  s occurs at star
b410: 74 2d 74 69 6d 65 20 28 61 73 0a 2a 2a 20 61 20  t-time (as.** a 
b420: 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66 20 63  consequence of c
b430: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 69  alling sqlite3_i
b440: 6e 69 74 69 61 6c 69 7a 65 28 29 29 2e 0a 2a 2a  nitialize())..**
b450: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
b460: 6f 75 74 69 6e 65 20 72 75 6e 73 0a 2a 2f 0a 76  outine runs.*/.v
b470: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73  oid sqlite3Regis
b480: 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  terGlobalFunctio
b490: 6e 73 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 0a 20  ns(void){.  /*. 
b4a0: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
b4b0: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 46 75  g array holds Fu
b4c0: 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65 73  ncDef structures
b4d0: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20   for all of the 
b4e0: 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 64  functions.  ** d
b4f0: 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66  efined in this f
b500: 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ile..  **.  ** T
b510: 68 65 20 61 72 72 61 79 20 63 61 6e 6e 6f 74 20  he array cannot 
b520: 62 65 20 63 6f 6e 73 74 61 6e 74 20 73 69 6e 63  be constant sinc
b530: 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  e changes are ma
b540: 64 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46  de to the.  ** F
b550: 75 6e 63 44 65 66 2e 70 48 61 73 68 20 65 6c 65  uncDef.pHash ele
b560: 6d 65 6e 74 73 20 61 74 20 73 74 61 72 74 2d 74  ments at start-t
b570: 69 6d 65 2e 20 20 54 68 65 20 65 6c 65 6d 65 6e  ime.  The elemen
b580: 74 73 20 6f 66 20 74 68 69 73 20 61 72 72 61 79  ts of this array
b590: 0a 20 20 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  .  ** are read-o
b5a0: 6e 6c 79 20 61 66 74 65 72 20 69 6e 69 74 69 61  nly after initia
b5b0: 6c 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  lization is comp
b5c0: 6c 65 74 65 2e 0a 20 20 2a 2f 0a 20 20 73 74 61  lete..  */.  sta
b5d0: 74 69 63 20 53 51 4c 49 54 45 5f 57 53 44 20 46  tic SQLITE_WSD F
b5e0: 75 6e 63 44 65 66 20 61 42 75 69 6c 74 69 6e 46  uncDef aBuiltinF
b5f0: 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 46 55  unc[] = {.    FU
b600: 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20  NCTION(ltrim,   
b610: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c             1, 1,
b620: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
b630: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
b640: 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20 20  TION(ltrim,     
b650: 20 20 20 20 20 20 20 20 20 32 2c 20 31 2c 20 30           2, 1, 0
b660: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
b670: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
b680: 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20 20 20 20  ON(rtrim,       
b690: 20 20 20 20 20 20 20 31 2c 20 32 2c 20 30 2c 20         1, 2, 0, 
b6a0: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
b6b0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
b6c0: 28 72 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20  (rtrim,         
b6d0: 20 20 20 20 20 32 2c 20 32 2c 20 30 2c 20 74 72       2, 2, 0, tr
b6e0: 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29  imFunc         )
b6f0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 74  ,.    FUNCTION(t
b700: 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rim,            
b710: 20 20 20 31 2c 20 33 2c 20 30 2c 20 74 72 69 6d     1, 3, 0, trim
b720: 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a  Func         ),.
b730: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 72 69      FUNCTION(tri
b740: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
b750: 20 32 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46 75   2, 3, 0, trimFu
b760: 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  nc         ),.  
b770: 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20    FUNCTION(min, 
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31                -1
b790: 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75  , 0, 1, minmaxFu
b7a0: 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  nc       ),.    
b7b0: 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20 20  FUNCTION(min,   
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
b7d0: 30 2c 20 31 2c 20 30 20 20 20 20 20 20 20 20 20  0, 1, 0         
b7e0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 41 47         ),.    AG
b7f0: 47 52 45 47 41 54 45 28 6d 69 6e 2c 20 20 20 20  GREGATE(min,    
b800: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
b810: 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20   1, minmaxStep, 
b820: 20 20 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c       minMaxFinal
b830: 69 7a 65 20 29 2c 0a 20 20 20 20 46 55 4e 43 54  ize ),.    FUNCT
b840: 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20 20 20  ION(max,        
b850: 20 20 20 20 20 20 20 2d 31 2c 20 31 2c 20 31 2c         -1, 1, 1,
b860: 20 6d 69 6e 6d 61 78 46 75 6e 63 20 20 20 20 20   minmaxFunc     
b870: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
b880: 4e 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20 20  N(max,          
b890: 20 20 20 20 20 20 30 2c 20 31 2c 20 31 2c 20 30        0, 1, 1, 0
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54 45  ),.    AGGREGATE
b8c0: 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20 20 20  (max,           
b8d0: 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 6d 69 6e      1, 1, 1, min
b8e0: 6d 61 78 53 74 65 70 2c 20 20 20 20 20 20 6d 69  maxStep,      mi
b8f0: 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 20 29 2c 0a  nMaxFinalize ),.
b900: 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 74 79      FUNCTION2(ty
b910: 70 65 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  peof,           
b920: 20 31 2c 20 30 2c 20 30 2c 20 74 79 70 65 6f 66   1, 0, 0, typeof
b930: 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55  Func,  SQLITE_FU
b940: 4e 43 5f 54 59 50 45 4f 46 29 2c 0a 20 20 20 20  NC_TYPEOF),.    
b950: 46 55 4e 43 54 49 4f 4e 32 28 6c 65 6e 67 74 68  FUNCTION2(length
b960: 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ,            1, 
b970: 30 2c 20 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63  0, 0, lengthFunc
b980: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  ,  SQLITE_FUNC_L
b990: 45 4e 47 54 48 29 2c 0a 20 20 20 20 46 55 4e 43  ENGTH),.    FUNC
b9a0: 54 49 4f 4e 28 69 6e 73 74 72 2c 20 20 20 20 20  TION(instr,     
b9b0: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30           2, 0, 0
b9c0: 2c 20 69 6e 73 74 72 46 75 6e 63 20 20 20 20 20  , instrFunc     
b9d0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
b9e0: 4f 4e 28 73 75 62 73 74 72 2c 20 20 20 20 20 20  ON(substr,      
b9f0: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20         2, 0, 0, 
ba00: 73 75 62 73 74 72 46 75 6e 63 20 20 20 20 20 20  substrFunc      
ba10: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
ba20: 28 73 75 62 73 74 72 2c 20 20 20 20 20 20 20 20  (substr,        
ba30: 20 20 20 20 20 33 2c 20 30 2c 20 30 2c 20 73 75       3, 0, 0, su
ba40: 62 73 74 72 46 75 6e 63 20 20 20 20 20 20 20 29  bstrFunc       )
ba50: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 61  ,.    FUNCTION(a
ba60: 62 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  bs,             
ba70: 20 20 20 31 2c 20 30 2c 20 30 2c 20 61 62 73 46     1, 0, 0, absF
ba80: 75 6e 63 20 20 20 20 20 20 20 20 20 20 29 2c 0a  unc          ),.
ba90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
baa0: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
bab0: 4e 54 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  NT.    FUNCTION(
bac0: 72 6f 75 6e 64 2c 20 20 20 20 20 20 20 20 20 20  round,          
bad0: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 72 6f 75      1, 0, 0, rou
bae0: 6e 64 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c  ndFunc        ),
baf0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f  .    FUNCTION(ro
bb00: 75 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  und,            
bb10: 20 20 32 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64    2, 0, 0, round
bb20: 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 23  Func        ),.#
bb30: 65 6e 64 69 66 0a 20 20 20 20 46 55 4e 43 54 49  endif.    FUNCTI
bb40: 4f 4e 28 75 70 70 65 72 2c 20 20 20 20 20 20 20  ON(upper,       
bb50: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
bb60: 75 70 70 65 72 46 75 6e 63 20 20 20 20 20 20 20  upperFunc       
bb70: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
bb80: 28 6c 6f 77 65 72 2c 20 20 20 20 20 20 20 20 20  (lower,         
bb90: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 6f       1, 0, 0, lo
bba0: 77 65 72 46 75 6e 63 20 20 20 20 20 20 20 20 29  werFunc        )
bbb0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63  ,.    FUNCTION(c
bbc0: 6f 61 6c 65 73 63 65 2c 20 20 20 20 20 20 20 20  oalesce,        
bbd0: 20 20 20 31 2c 20 30 2c 20 30 2c 20 30 20 20 20     1, 0, 0, 0   
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a               ),.
bbf0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61      FUNCTION(coa
bc00: 6c 65 73 63 65 2c 20 20 20 20 20 20 20 20 20 20  lesce,          
bc10: 20 30 2c 20 30 2c 20 30 2c 20 30 20 20 20 20 20   0, 0, 0, 0     
bc20: 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20             ),.  
bc30: 20 20 46 55 4e 43 54 49 4f 4e 32 28 63 6f 61 6c    FUNCTION2(coal
bc40: 65 73 63 65 2c 20 20 20 20 20 20 20 20 20 2d 31  esce,         -1
bc50: 2c 20 30 2c 20 30 2c 20 69 66 6e 75 6c 6c 46 75  , 0, 0, ifnullFu
bc60: 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43  nc,  SQLITE_FUNC
bc70: 5f 43 4f 41 4c 45 53 43 45 29 2c 0a 20 20 20 20  _COALESCE),.    
bc80: 46 55 4e 43 54 49 4f 4e 28 68 65 78 2c 20 20 20  FUNCTION(hex,   
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
bca0: 30 2c 20 30 2c 20 68 65 78 46 75 6e 63 20 20 20  0, 0, hexFunc   
bcb0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
bcc0: 4e 43 54 49 4f 4e 32 28 69 66 6e 75 6c 6c 2c 20  NCTION2(ifnull, 
bcd0: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
bce0: 20 30 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 2c 20   0, ifnullFunc, 
bcf0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41   SQLITE_FUNC_COA
bd00: 4c 45 53 43 45 29 2c 0a 20 20 20 20 46 55 4e 43  LESCE),.    FUNC
bd10: 54 49 4f 4e 28 72 61 6e 64 6f 6d 2c 20 20 20 20  TION(random,    
bd20: 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30           0, 0, 0
bd30: 2c 20 72 61 6e 64 6f 6d 46 75 6e 63 20 20 20 20  , randomFunc    
bd40: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
bd50: 4f 4e 28 72 61 6e 64 6f 6d 62 6c 6f 62 2c 20 20  ON(randomblob,  
bd60: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
bd70: 72 61 6e 64 6f 6d 42 6c 6f 62 20 20 20 20 20 20  randomBlob      
bd80: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
bd90: 28 6e 75 6c 6c 69 66 2c 20 20 20 20 20 20 20 20  (nullif,        
bda0: 20 20 20 20 20 32 2c 20 30 2c 20 31 2c 20 6e 75       2, 0, 1, nu
bdb0: 6c 6c 69 66 46 75 6e 63 20 20 20 20 20 20 20 29  llifFunc       )
bdc0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73  ,.    FUNCTION(s
bdd0: 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 2c 20 20  qlite_version,  
bde0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 76 65 72 73     0, 0, 0, vers
bdf0: 69 6f 6e 46 75 6e 63 20 20 20 20 20 20 29 2c 0a  ionFunc      ),.
be00: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c      FUNCTION(sql
be10: 69 74 65 5f 73 6f 75 72 63 65 5f 69 64 2c 20 20  ite_source_id,  
be20: 20 30 2c 20 30 2c 20 30 2c 20 73 6f 75 72 63 65   0, 0, 0, source
be30: 69 64 46 75 6e 63 20 20 20 20 20 29 2c 0a 20 20  idFunc     ),.  
be40: 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74    FUNCTION(sqlit
be50: 65 5f 6c 6f 67 2c 20 20 20 20 20 20 20 20 20 32  e_log,         2
be60: 2c 20 30 2c 20 30 2c 20 65 72 72 6c 6f 67 46 75  , 0, 0, errlogFu
be70: 6e 63 20 20 20 20 20 20 20 29 2c 0a 23 69 66 6e  nc       ),.#ifn
be80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
be90: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
bea0: 41 47 53 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e  AGS.    FUNCTION
beb0: 28 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f  (sqlite_compileo
bec0: 70 74 69 6f 6e 5f 75 73 65 64 2c 31 2c 20 30 2c  ption_used,1, 0,
bed0: 20 30 2c 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f   0, compileoptio
bee0: 6e 75 73 65 64 46 75 6e 63 20 20 29 2c 0a 20 20  nusedFunc  ),.  
bef0: 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74    FUNCTION(sqlit
bf00: 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  e_compileoption_
bf10: 67 65 74 2c 20 31 2c 20 30 2c 20 30 2c 20 63 6f  get, 1, 0, 0, co
bf20: 6d 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74 46 75  mpileoptiongetFu
bf30: 6e 63 20 20 29 2c 0a 23 65 6e 64 69 66 20 2f 2a  nc  ),.#endif /*
bf40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
bf50: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
bf60: 20 2a 2f 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   */.    FUNCTION
bf70: 28 71 75 6f 74 65 2c 20 20 20 20 20 20 20 20 20  (quote,         
bf80: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 71 75       1, 0, 0, qu
bf90: 6f 74 65 46 75 6e 63 20 20 20 20 20 20 20 20 29  oteFunc        )
bfa0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c  ,.    FUNCTION(l
bfb0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
bfc0: 2c 20 20 30 2c 20 30 2c 20 30 2c 20 6c 61 73 74  ,  0, 0, 0, last
bfd0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 29 2c 0a  _insert_rowid),.
bfe0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 68 61      FUNCTION(cha
bff0: 6e 67 65 73 2c 20 20 20 20 20 20 20 20 20 20 20  nges,           
c000: 20 30 2c 20 30 2c 20 30 2c 20 63 68 61 6e 67 65   0, 0, 0, change
c010: 73 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  s          ),.  
c020: 20 20 46 55 4e 43 54 49 4f 4e 28 74 6f 74 61 6c    FUNCTION(total
c030: 5f 63 68 61 6e 67 65 73 2c 20 20 20 20 20 20 30  _changes,      0
c040: 2c 20 30 2c 20 30 2c 20 74 6f 74 61 6c 5f 63 68  , 0, 0, total_ch
c050: 61 6e 67 65 73 20 20 20 20 29 2c 0a 20 20 20 20  anges    ),.    
c060: 46 55 4e 43 54 49 4f 4e 28 72 65 70 6c 61 63 65  FUNCTION(replace
c070: 2c 20 20 20 20 20 20 20 20 20 20 20 20 33 2c 20  ,            3, 
c080: 30 2c 20 30 2c 20 72 65 70 6c 61 63 65 46 75 6e  0, 0, replaceFun
c090: 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55  c      ),.    FU
c0a0: 4e 43 54 49 4f 4e 28 7a 65 72 6f 62 6c 6f 62 2c  NCTION(zeroblob,
c0b0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
c0c0: 20 30 2c 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63   0, zeroblobFunc
c0d0: 20 20 20 20 20 29 2c 0a 20 20 23 69 66 64 65 66       ),.  #ifdef
c0e0: 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a   SQLITE_SOUNDEX.
c0f0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 6f 75      FUNCTION(sou
c100: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
c110: 20 31 2c 20 30 2c 20 30 2c 20 73 6f 75 6e 64 65   1, 0, 0, sounde
c120: 78 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20  xFunc      ),.  
c130: 23 65 6e 64 69 66 0a 20 20 23 69 66 6e 64 65 66  #endif.  #ifndef
c140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
c150: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
c160: 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78  FUNCTION(load_ex
c170: 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 31 2c 20  tension,     1, 
c180: 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20  0, 0, loadExt   
c190: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
c1a0: 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65  NCTION(load_exte
c1b0: 6e 73 69 6f 6e 2c 20 20 20 20 20 32 2c 20 30 2c  nsion,     2, 0,
c1c0: 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20 20 20   0, loadExt     
c1d0: 20 20 20 20 20 29 2c 0a 20 20 23 65 6e 64 69 66       ),.  #endif
c1e0: 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28 73  .    AGGREGATE(s
c1f0: 75 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  um,             
c200: 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74    1, 0, 0, sumSt
c210: 65 70 2c 20 20 20 20 20 20 20 20 20 73 75 6d 46  ep,         sumF
c220: 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20  inalize    ),.  
c230: 20 20 41 47 47 52 45 47 41 54 45 28 74 6f 74 61    AGGREGATE(tota
c240: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31  l,             1
c250: 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c  , 0, 0, sumStep,
c260: 20 20 20 20 20 20 20 20 20 74 6f 74 61 6c 46 69           totalFi
c270: 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20 20  nalize    ),.   
c280: 20 41 47 47 52 45 47 41 54 45 28 61 76 67 2c 20   AGGREGATE(avg, 
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
c2a0: 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20   0, 0, sumStep, 
c2b0: 20 20 20 20 20 20 20 20 61 76 67 46 69 6e 61 6c          avgFinal
c2c0: 69 7a 65 20 20 20 20 29 2c 0a 20 2f 2a 20 41 47  ize    ),. /* AG
c2d0: 47 52 45 47 41 54 45 28 63 6f 75 6e 74 2c 20 20  GREGATE(count,  
c2e0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
c2f0: 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20   0, countStep,  
c300: 20 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69       countFinali
c310: 7a 65 20 20 29 2c 20 2a 2f 0a 20 20 20 20 7b 30  ze  ), */.    {0
c320: 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c  ,SQLITE_UTF8,SQL
c330: 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 2c 30  ITE_FUNC_COUNT,0
c340: 2c 30 2c 30 2c 63 6f 75 6e 74 53 74 65 70 2c 63  ,0,0,countStep,c
c350: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 22 63 6f  ountFinalize,"co
c360: 75 6e 74 22 2c 30 2c 30 7d 2c 0a 20 20 20 20 41  unt",0,0},.    A
c370: 47 47 52 45 47 41 54 45 28 63 6f 75 6e 74 2c 20  GGREGATE(count, 
c380: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
c390: 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20  , 0, countStep, 
c3a0: 20 20 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c        countFinal
c3b0: 69 7a 65 20 20 29 2c 0a 20 20 20 20 41 47 47 52  ize  ),.    AGGR
c3c0: 45 47 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63  EGATE(group_conc
c3d0: 61 74 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 30  at,      1, 0, 0
c3e0: 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65  , groupConcatSte
c3f0: 70 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69  p, groupConcatFi
c400: 6e 61 6c 69 7a 65 29 2c 0a 20 20 20 20 41 47 47  nalize),.    AGG
c410: 52 45 47 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e  REGATE(group_con
c420: 63 61 74 2c 20 20 20 20 20 20 32 2c 20 30 2c 20  cat,      2, 0, 
c430: 30 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74  0, groupConcatSt
c440: 65 70 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 46  ep, groupConcatF
c450: 69 6e 61 6c 69 7a 65 29 2c 0a 20 20 0a 20 20 20  inalize),.  .   
c460: 20 4c 49 4b 45 46 55 4e 43 28 67 6c 6f 62 2c 20   LIKEFUNC(glob, 
c470: 32 2c 20 26 67 6c 6f 62 49 6e 66 6f 2c 20 53 51  2, &globInfo, SQ
c480: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53  LITE_FUNC_LIKE|S
c490: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29  QLITE_FUNC_CASE)
c4a0: 2c 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  ,.  #ifdef SQLIT
c4b0: 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45  E_CASE_SENSITIVE
c4c0: 5f 4c 49 4b 45 0a 20 20 20 20 4c 49 4b 45 46 55  _LIKE.    LIKEFU
c4d0: 4e 43 28 6c 69 6b 65 2c 20 32 2c 20 26 6c 69 6b  NC(like, 2, &lik
c4e0: 65 49 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45  eInfoAlt, SQLITE
c4f0: 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54  _FUNC_LIKE|SQLIT
c500: 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20  E_FUNC_CASE),.  
c510: 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c    LIKEFUNC(like,
c520: 20 33 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74   3, &likeInfoAlt
c530: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  , SQLITE_FUNC_LI
c540: 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  KE|SQLITE_FUNC_C
c550: 41 53 45 29 2c 0a 20 20 23 65 6c 73 65 0a 20 20  ASE),.  #else.  
c560: 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c    LIKEFUNC(like,
c570: 20 32 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72   2, &likeInfoNor
c580: 6d 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  m, SQLITE_FUNC_L
c590: 49 4b 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55  IKE),.    LIKEFU
c5a0: 4e 43 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b  NC(like, 3, &lik
c5b0: 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54  eInfoNorm, SQLIT
c5c0: 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20  E_FUNC_LIKE),.  
c5d0: 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 0a 20 20 69  #endif.  };..  i
c5e0: 6e 74 20 69 3b 0a 20 20 46 75 6e 63 44 65 66 48  nt i;.  FuncDefH
c5f0: 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 47 4c  ash *pHash = &GL
c600: 4f 42 41 4c 28 46 75 6e 63 44 65 66 48 61 73 68  OBAL(FuncDefHash
c610: 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46  , sqlite3GlobalF
c620: 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 46 75 6e  unctions);.  Fun
c630: 63 44 65 66 20 2a 61 46 75 6e 63 20 3d 20 28 46  cDef *aFunc = (F
c640: 75 6e 63 44 65 66 2a 29 26 47 4c 4f 42 41 4c 28  uncDef*)&GLOBAL(
c650: 46 75 6e 63 44 65 66 2c 20 61 42 75 69 6c 74 69  FuncDef, aBuilti
c660: 6e 46 75 6e 63 29 3b 0a 0a 20 20 66 6f 72 28 69  nFunc);..  for(i
c670: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
c680: 61 42 75 69 6c 74 69 6e 46 75 6e 63 29 3b 20 69  aBuiltinFunc); i
c690: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
c6a0: 46 75 6e 63 44 65 66 49 6e 73 65 72 74 28 70 48  FuncDefInsert(pH
c6b0: 61 73 68 2c 20 26 61 46 75 6e 63 5b 69 5d 29 3b  ash, &aFunc[i]);
c6c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
c6d0: 67 69 73 74 65 72 44 61 74 65 54 69 6d 65 46 75  gisterDateTimeFu
c6e0: 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 69 66 6e 64  nctions();.#ifnd
c6f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c700: 4c 54 45 52 54 41 42 4c 45 0a 20 20 73 71 6c 69  LTERTABLE.  sqli
c710: 74 65 33 41 6c 74 65 72 46 75 6e 63 74 69 6f 6e  te3AlterFunction
c720: 73 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a        s();.#endif.}.