/ Hex Artifact Content
Login

Artifact 1db49570e01b31fd3cd00ff2c13da8f2f05e9051:


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 69  ){.        if( i
0db0: 56 61 6c 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  Val==SMALLEST_IN
0dc0: 54 36 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  T64 ){.         
0dd0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 31 36 37 36   /* IMP: R-31676
0de0: 2d 34 35 35 30 39 20 49 66 20 58 20 69 73 20 74  -45509 If X is t
0df0: 68 65 20 69 6e 74 65 67 65 72 20 2d 39 32 32 33  he integer -9223
0e00: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 0a  372036854775808.
0e10: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
0e20: 6e 20 61 62 73 28 58 29 20 74 68 72 6f 77 73 20  n abs(X) throws 
0e30: 61 6e 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  an integer overf
0e40: 6c 6f 77 20 65 72 72 6f 72 20 73 69 6e 63 65 20  low error since 
0e50: 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 20 20  there is no.    
0e60: 20 20 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c        ** equival
0e70: 65 6e 74 20 70 6f 73 69 74 69 76 65 20 36 34 2d  ent positive 64-
0e80: 62 69 74 20 74 77 6f 20 63 6f 6d 70 6c 65 6d 65  bit two compleme
0e90: 6e 74 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  nt value. */.   
0ea0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
0eb0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
0ec0: 65 78 74 2c 20 22 69 6e 74 65 67 65 72 20 6f 76  ext, "integer ov
0ed0: 65 72 66 6c 6f 77 22 2c 20 2d 31 29 3b 0a 20 20  erflow", -1);.  
0ee0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
0ef0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0f00: 20 20 69 56 61 6c 20 3d 20 2d 69 56 61 6c 3b 0a    iVal = -iVal;.
0f10: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 73        } .      s
0f20: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
0f30: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 69 56 61  t64(context, iVa
0f40: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
0f50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
0f60: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
0f70: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33       /* IMP: R-3
0f80: 37 34 33 34 2d 31 39 39 32 39 20 41 62 73 28 58  7434-19929 Abs(X
0f90: 29 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  ) returns NULL i
0fa0: 66 20 58 20 69 73 20 4e 55 4c 4c 2e 20 2a 2f 0a  f X is NULL. */.
0fb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
0fc0: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
0fd0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
0fe0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
0ff0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 42  lt: {.      /* B
1000: 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 76  ecause sqlite3_v
1010: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 29 20 72 65  alue_double() re
1020: 74 75 72 6e 73 20 30 2e 30 20 69 66 20 74 68 65  turns 0.0 if the
1030: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
1040: 0a 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68  .      ** someth
1050: 69 6e 67 20 74 68 61 74 20 63 61 6e 20 62 65 20  ing that can be 
1060: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
1070: 20 6e 75 6d 62 65 72 2c 20 77 65 20 68 61 76 65   number, we have
1080: 3a 0a 20 20 20 20 20 20 2a 2a 20 49 4d 50 3a 20  :.      ** IMP: 
1090: 52 2d 35 37 33 32 36 2d 33 31 35 34 31 20 41 62  R-57326-31541 Ab
10a0: 73 28 58 29 20 72 65 74 75 72 6e 20 30 2e 30 20  s(X) return 0.0 
10b0: 69 66 20 58 20 69 73 20 61 20 73 74 72 69 6e 67  if X is a string
10c0: 20 6f 72 20 62 6c 6f 62 20 74 68 61 74 0a 20 20   or blob that.  
10d0: 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65      ** cannot be
10e0: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20   converted to a 
10f0: 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 2e 20 0a  numeric value. .
1100: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
1110: 6f 75 62 6c 65 20 72 56 61 6c 20 3d 20 73 71 6c  ouble rVal = sql
1120: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
1130: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  e(argv[0]);.    
1140: 20 20 69 66 28 20 72 56 61 6c 3c 30 20 29 20 72    if( rVal<0 ) r
1150: 56 61 6c 20 3d 20 2d 72 56 61 6c 3b 0a 20 20 20  Val = -rVal;.   
1160: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1170: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
1180: 2c 20 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 62  , rVal);.      b
1190: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
11a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
11b0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  ntation of the i
11c0: 6e 73 74 72 28 29 20 66 75 6e 63 74 69 6f 6e 2e  nstr() function.
11d0: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 72 28 68 61 79  .**.** instr(hay
11e0: 73 74 61 63 6b 2c 6e 65 65 64 6c 65 29 20 66 69  stack,needle) fi
11f0: 6e 64 73 20 74 68 65 20 66 69 72 73 74 20 6f 63  nds the first oc
1200: 63 75 72 72 65 6e 63 65 20 6f 66 20 6e 65 65 64  currence of need
1210: 6c 65 0a 2a 2a 20 69 6e 20 68 61 79 73 74 61 63  le.** in haystac
1220: 6b 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68  k and returns th
1230: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65 76  e number of prev
1240: 69 6f 75 73 20 63 68 61 72 61 63 74 65 72 73 20  ious characters 
1250: 70 6c 75 73 20 31 2c 0a 2a 2a 20 6f 72 20 30 20  plus 1,.** or 0 
1260: 69 66 20 6e 65 65 64 6c 65 20 64 6f 65 73 20 6e  if needle does n
1270: 6f 74 20 6f 63 63 75 72 20 77 69 74 68 69 6e 20  ot occur within 
1280: 68 61 79 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  haystack..**.** 
1290: 49 66 20 62 6f 74 68 20 68 61 79 73 74 61 63 6b  If both haystack
12a0: 20 61 6e 64 20 6e 65 65 64 6c 65 20 61 72 65 20   and needle are 
12b0: 42 4c 4f 42 73 2c 20 74 68 65 6e 20 74 68 65 20  BLOBs, then the 
12c0: 72 65 73 75 6c 74 20 69 73 20 6f 6e 65 20 6d 6f  result is one mo
12d0: 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6e  re than.** the n
12e0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
12f0: 6e 20 68 61 79 73 74 61 63 6b 20 70 72 69 6f 72  n haystack prior
1300: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f 63   to the first oc
1310: 63 75 72 72 65 6e 63 65 20 6f 66 20 6e 65 65 64  currence of need
1320: 6c 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 6e  le,.** or 0 if n
1330: 65 65 64 6c 65 20 6e 65 76 65 72 20 6f 63 63 75  eedle never occu
1340: 72 73 20 69 6e 20 68 61 79 73 74 61 63 6b 2e 0a  rs in haystack..
1350: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
1360: 6e 73 74 72 46 75 6e 63 28 0a 20 20 73 71 6c 69  nstrFunc(.  sqli
1370: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
1380: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
1390: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
13a0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
13b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
13c0: 72 20 2a 7a 48 61 79 73 74 61 63 6b 3b 0a 20 20  r *zHaystack;.  
13d0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
13e0: 68 61 72 20 2a 7a 4e 65 65 64 6c 65 3b 0a 20 20  har *zNeedle;.  
13f0: 69 6e 74 20 6e 48 61 79 73 74 61 63 6b 3b 0a 20  int nHaystack;. 
1400: 20 69 6e 74 20 6e 4e 65 65 64 6c 65 3b 0a 20 20   int nNeedle;.  
1410: 69 6e 74 20 74 79 70 65 48 61 79 73 74 61 63 6b  int typeHaystack
1420: 2c 20 74 79 70 65 4e 65 65 64 6c 65 3b 0a 20 20  , typeNeedle;.  
1430: 69 6e 74 20 4e 20 3d 20 31 3b 0a 20 20 69 6e 74  int N = 1;.  int
1440: 20 69 73 54 65 78 74 3b 0a 0a 20 20 55 4e 55 53   isText;..  UNUS
1450: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
1460: 63 29 3b 0a 20 20 74 79 70 65 48 61 79 73 74 61  c);.  typeHaysta
1470: 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ck = sqlite3_val
1480: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
1490: 3b 0a 20 20 74 79 70 65 4e 65 65 64 6c 65 20 3d  ;.  typeNeedle =
14a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
14b0: 79 70 65 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ype(argv[1]);.  
14c0: 69 66 28 20 74 79 70 65 48 61 79 73 74 61 63 6b  if( typeHaystack
14d0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 7c 7c  ==SQLITE_NULL ||
14e0: 20 74 79 70 65 4e 65 65 64 6c 65 3d 3d 53 51 4c   typeNeedle==SQL
14f0: 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72  ITE_NULL ) retur
1500: 6e 3b 0a 20 20 6e 48 61 79 73 74 61 63 6b 20 3d  n;.  nHaystack =
1510: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
1520: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
1530: 20 6e 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69 74   nNeedle = sqlit
1540: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
1550: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 74  rgv[1]);.  if( t
1560: 79 70 65 48 61 79 73 74 61 63 6b 3d 3d 53 51 4c  ypeHaystack==SQL
1570: 49 54 45 5f 42 4c 4f 42 20 26 26 20 74 79 70 65  ITE_BLOB && type
1580: 4e 65 65 64 6c 65 3d 3d 53 51 4c 49 54 45 5f 42  Needle==SQLITE_B
1590: 4c 4f 42 20 29 7b 0a 20 20 20 20 7a 48 61 79 73  LOB ){.    zHays
15a0: 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 76  tack = sqlite3_v
15b0: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
15c0: 5d 29 3b 0a 20 20 20 20 7a 4e 65 65 64 6c 65 20  ]);.    zNeedle 
15d0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
15e0: 62 6c 6f 62 28 61 72 67 76 5b 31 5d 29 3b 0a 20  blob(argv[1]);. 
15f0: 20 20 20 69 73 54 65 78 74 20 3d 20 30 3b 0a 20     isText = 0;. 
1600: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 48 61 79   }else{.    zHay
1610: 73 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  stack = sqlite3_
1620: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
1630: 30 5d 29 3b 0a 20 20 20 20 7a 4e 65 65 64 6c 65  0]);.    zNeedle
1640: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1650: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
1660: 20 20 20 20 69 73 54 65 78 74 20 3d 20 31 3b 0a      isText = 1;.
1670: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 4e 65    }.  while( nNe
1680: 65 64 6c 65 3c 3d 6e 48 61 79 73 74 61 63 6b 20  edle<=nHaystack 
1690: 26 26 20 6d 65 6d 63 6d 70 28 7a 48 61 79 73 74  && memcmp(zHayst
16a0: 61 63 6b 2c 20 7a 4e 65 65 64 6c 65 2c 20 6e 4e  ack, zNeedle, nN
16b0: 65 65 64 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20  eedle)!=0 ){.   
16c0: 20 4e 2b 2b 3b 0a 20 20 20 20 64 6f 7b 0a 20 20   N++;.    do{.  
16d0: 20 20 20 20 6e 48 61 79 73 74 61 63 6b 2d 2d 3b      nHaystack--;
16e0: 0a 20 20 20 20 20 20 7a 48 61 79 73 74 61 63 6b  .      zHaystack
16f0: 2b 2b 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ++;.    }while( 
1700: 69 73 54 65 78 74 20 26 26 20 28 7a 48 61 79 73  isText && (zHays
1710: 74 61 63 6b 5b 30 5d 26 30 78 63 30 29 3d 3d 30  tack[0]&0xc0)==0
1720: 78 38 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  x80 );.  }.  if(
1730: 20 6e 4e 65 65 64 6c 65 3e 6e 48 61 79 73 74 61   nNeedle>nHaysta
1740: 63 6b 20 29 20 4e 20 3d 20 30 3b 0a 20 20 73 71  ck ) N = 0;.  sq
1750: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
1760: 28 63 6f 6e 74 65 78 74 2c 20 4e 29 3b 0a 7d 0a  (context, N);.}.
1770: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1780: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 69  ation of the pri
1790: 6e 74 66 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ntf() function..
17a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
17b0: 72 69 6e 74 66 46 75 6e 63 28 0a 20 20 73 71 6c  rintfFunc(.  sql
17c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
17d0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
17e0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
17f0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50  ue **argv.){.  P
1800: 72 69 6e 74 66 41 72 67 75 6d 65 6e 74 73 20 78  rintfArguments x
1810: 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 73 74 72  ;.  StrAccum str
1820: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1830: 7a 46 6f 72 6d 61 74 3b 0a 20 20 69 6e 74 20 6e  zFormat;.  int n
1840: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 31  ;..  if( argc>=1
1850: 20 26 26 20 28 7a 46 6f 72 6d 61 74 20 3d 20 28   && (zFormat = (
1860: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1870: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1880: 72 67 76 5b 30 5d 29 29 21 3d 30 20 29 7b 0a 20  rgv[0]))!=0 ){. 
1890: 20 20 20 78 2e 6e 41 72 67 20 3d 20 61 72 67 63     x.nArg = argc
18a0: 2d 31 3b 0a 20 20 20 20 78 2e 6e 55 73 65 64 20  -1;.    x.nUsed 
18b0: 3d 20 30 3b 0a 20 20 20 20 78 2e 61 70 41 72 67  = 0;.    x.apArg
18c0: 20 3d 20 61 72 67 76 2b 31 3b 0a 20 20 20 20 73   = argv+1;.    s
18d0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
18e0: 69 74 28 26 73 74 72 2c 20 30 2c 20 30 2c 20 53  it(&str, 0, 0, S
18f0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
1900: 29 3b 0a 20 20 20 20 73 74 72 2e 64 62 20 3d 20  );.    str.db = 
1910: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
1920: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
1930: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 58  t);.    sqlite3X
1940: 50 72 69 6e 74 66 28 26 73 74 72 2c 20 53 51 4c  Printf(&str, SQL
1950: 49 54 45 5f 50 52 49 4e 54 46 5f 53 51 4c 46 55  ITE_PRINTF_SQLFU
1960: 4e 43 2c 20 7a 46 6f 72 6d 61 74 2c 20 26 78 29  NC, zFormat, &x)
1970: 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 2e 6e 43  ;.    n = str.nC
1980: 68 61 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  har;.    sqlite3
1990: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
19a0: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 53 74 72  text, sqlite3Str
19b0: 41 63 63 75 6d 46 69 6e 69 73 68 28 26 73 74 72  AccumFinish(&str
19c0: 29 2c 20 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  ), n,.          
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19e0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
19f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
1a00: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1a10: 65 20 73 75 62 73 74 72 28 29 20 66 75 6e 63 74  e substr() funct
1a20: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 73 74  ion..**.** subst
1a30: 72 28 78 2c 70 31 2c 70 32 29 20 20 72 65 74 75  r(x,p1,p2)  retu
1a40: 72 6e 73 20 70 32 20 63 68 61 72 61 63 74 65 72  rns p2 character
1a50: 73 20 6f 66 20 78 5b 5d 20 62 65 67 69 6e 6e 69  s of x[] beginni
1a60: 6e 67 20 77 69 74 68 20 70 31 2e 0a 2a 2a 20 70  ng with p1..** p
1a70: 31 20 69 73 20 31 2d 69 6e 64 65 78 65 64 2e 20  1 is 1-indexed. 
1a80: 20 53 6f 20 73 75 62 73 74 72 28 78 2c 31 2c 31   So substr(x,1,1
1a90: 29 20 72 65 74 75 72 6e 73 20 74 68 65 20 66 69  ) returns the fi
1aa0: 72 73 74 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  rst character.**
1ab0: 20 6f 66 20 78 2e 20 20 49 66 20 78 20 69 73 20   of x.  If x is 
1ac0: 74 65 78 74 2c 20 74 68 65 6e 20 77 65 20 61 63  text, then we ac
1ad0: 74 75 61 6c 6c 79 20 63 6f 75 6e 74 20 55 54 46  tually count UTF
1ae0: 2d 38 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  -8 characters..*
1af0: 2a 20 49 66 20 78 20 69 73 20 61 20 62 6c 6f 62  * If x is a blob
1b00: 2c 20 74 68 65 6e 20 77 65 20 63 6f 75 6e 74 20  , then we count 
1b10: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  bytes..**.** If 
1b20: 70 31 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  p1 is negative, 
1b30: 74 68 65 6e 20 77 65 20 62 65 67 69 6e 20 61 62  then we begin ab
1b40: 73 28 70 31 29 20 66 72 6f 6d 20 74 68 65 20 65  s(p1) from the e
1b50: 6e 64 20 6f 66 20 78 5b 5d 2e 0a 2a 2a 0a 2a 2a  nd of x[]..**.**
1b60: 20 49 66 20 70 32 20 69 73 20 6e 65 67 61 74 69   If p2 is negati
1b70: 76 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ve, return the p
1b80: 32 20 63 68 61 72 61 63 74 65 72 73 20 70 72 65  2 characters pre
1b90: 63 65 64 69 6e 67 20 70 31 2e 0a 2a 2f 0a 73 74  ceding p1..*/.st
1ba0: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 72  atic void substr
1bb0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1bc0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1bd0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1be0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1bf0: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
1c00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
1c10: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1c20: 65 64 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69  ed char *z2;.  i
1c30: 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 70 30  nt len;.  int p0
1c40: 74 79 70 65 3b 0a 20 20 69 36 34 20 70 31 2c 20  type;.  i64 p1, 
1c50: 70 32 3b 0a 20 20 69 6e 74 20 6e 65 67 50 32 20  p2;.  int negP2 
1c60: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1c70: 61 72 67 63 3d 3d 33 20 7c 7c 20 61 72 67 63 3d  argc==3 || argc=
1c80: 3d 32 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =2 );.  if( sqli
1c90: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
1ca0: 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[1])==SQLITE_
1cb0: 4e 55 4c 4c 0a 20 20 20 7c 7c 20 28 61 72 67 63  NULL.   || (argc
1cc0: 3d 3d 33 20 26 26 20 73 71 6c 69 74 65 33 5f 76  ==3 && sqlite3_v
1cd0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 32  alue_type(argv[2
1ce0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  ])==SQLITE_NULL)
1cf0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
1d00: 3b 0a 20 20 7d 0a 20 20 70 30 74 79 70 65 20 3d  ;.  }.  p0type =
1d10: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
1d20: 79 70 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ype(argv[0]);.  
1d30: 70 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  p1 = sqlite3_val
1d40: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b  ue_int(argv[1]);
1d50: 0a 20 20 69 66 28 20 70 30 74 79 70 65 3d 3d 53  .  if( p0type==S
1d60: 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20  QLITE_BLOB ){.  
1d70: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f    len = sqlite3_
1d80: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
1d90: 5b 30 5d 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71  [0]);.    z = sq
1da0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
1db0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
1dc0: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
1dd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 65  ;.    assert( le
1de0: 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  n==sqlite3_value
1df0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 20  _bytes(argv[0]) 
1e00: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e10: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
1e20: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
1e30: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
1e40: 72 65 74 75 72 6e 3b 0a 20 20 20 20 6c 65 6e 20  return;.    len 
1e50: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 31 3c  = 0;.    if( p1<
1e60: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 7a  0 ){.      for(z
1e70: 32 3d 7a 3b 20 2a 7a 32 3b 20 6c 65 6e 2b 2b 29  2=z; *z2; len++)
1e80: 7b 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  {.        SQLITE
1e90: 5f 53 4b 49 50 5f 55 54 46 38 28 7a 32 29 3b 0a  _SKIP_UTF8(z2);.
1ea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1eb0: 7d 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20  }.  if( argc==3 
1ec0: 29 7b 0a 20 20 20 20 70 32 20 3d 20 73 71 6c 69  ){.    p2 = sqli
1ed0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
1ee0: 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[2]);.    if( 
1ef0: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32  p2<0 ){.      p2
1f00: 20 3d 20 2d 70 32 3b 0a 20 20 20 20 20 20 6e 65   = -p2;.      ne
1f10: 67 50 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  gP2 = 1;.    }. 
1f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 32 20 3d   }else{.    p2 =
1f30: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1f40: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
1f50: 78 74 29 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  xt)->aLimit[SQLI
1f60: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
1f70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 31 3c 30  ;.  }.  if( p1<0
1f80: 20 29 7b 0a 20 20 20 20 70 31 20 2b 3d 20 6c 65   ){.    p1 += le
1f90: 6e 3b 0a 20 20 20 20 69 66 28 20 70 31 3c 30 20  n;.    if( p1<0 
1fa0: 29 7b 0a 20 20 20 20 20 20 70 32 20 2b 3d 20 70  ){.      p2 += p
1fb0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c  1;.      if( p2<
1fc0: 30 20 29 20 70 32 20 3d 20 30 3b 0a 20 20 20 20  0 ) p2 = 0;.    
1fd0: 20 20 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    p1 = 0;.    }.
1fe0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 31 3e 30    }else if( p1>0
1ff0: 20 29 7b 0a 20 20 20 20 70 31 2d 2d 3b 0a 20 20   ){.    p1--;.  
2000: 7d 65 6c 73 65 20 69 66 28 20 70 32 3e 30 20 29  }else if( p2>0 )
2010: 7b 0a 20 20 20 20 70 32 2d 2d 3b 0a 20 20 7d 0a  {.    p2--;.  }.
2020: 20 20 69 66 28 20 6e 65 67 50 32 20 29 7b 0a 20    if( negP2 ){. 
2030: 20 20 20 70 31 20 2d 3d 20 70 32 3b 0a 20 20 20     p1 -= p2;.   
2040: 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20 20 20   if( p1<0 ){.   
2050: 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a 20 20 20     p2 += p1;.   
2060: 20 20 20 70 31 20 3d 20 30 3b 0a 20 20 20 20 7d     p1 = 0;.    }
2070: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2080: 31 3e 3d 30 20 26 26 20 70 32 3e 3d 30 20 29 3b  1>=0 && p2>=0 );
2090: 0a 20 20 69 66 28 20 70 30 74 79 70 65 21 3d 53  .  if( p0type!=S
20a0: 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20  QLITE_BLOB ){.  
20b0: 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 70    while( *z && p
20c0: 31 20 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54  1 ){.      SQLIT
20d0: 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a  E_SKIP_UTF8(z);.
20e0: 20 20 20 20 20 20 70 31 2d 2d 3b 0a 20 20 20 20        p1--;.    
20f0: 7d 0a 20 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20  }.    for(z2=z; 
2100: 2a 7a 32 20 26 26 20 70 32 3b 20 70 32 2d 2d 29  *z2 && p2; p2--)
2110: 7b 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53  {.      SQLITE_S
2120: 4b 49 50 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20  KIP_UTF8(z2);.  
2130: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2140: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
2150: 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 28  ext, (char*)z, (
2160: 69 6e 74 29 28 7a 32 2d 7a 29 2c 20 53 51 4c 49  int)(z2-z), SQLI
2170: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
2180: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
2190: 70 31 2b 70 32 3e 6c 65 6e 20 29 7b 0a 20 20 20  p1+p2>len ){.   
21a0: 20 20 20 70 32 20 3d 20 6c 65 6e 2d 70 31 3b 0a     p2 = len-p1;.
21b0: 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 29        if( p2<0 )
21c0: 20 70 32 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   p2 = 0;.    }. 
21d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
21e0: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
21f0: 28 63 68 61 72 2a 29 26 7a 5b 70 31 5d 2c 20 28  (char*)&z[p1], (
2200: 69 6e 74 29 70 32 2c 20 53 51 4c 49 54 45 5f 54  int)p2, SQLITE_T
2210: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d  RANSIENT);.  }.}
2220: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2230: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f  tation of the ro
2240: 75 6e 64 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a  und() function.*
2250: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2260: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
2270: 4f 49 4e 54 0a 73 74 61 74 69 63 20 76 6f 69 64  OINT.static void
2280: 20 72 6f 75 6e 64 46 75 6e 63 28 73 71 6c 69 74   roundFunc(sqlit
2290: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
22a0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
22b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
22c0: 72 67 76 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  rgv){.  int n = 
22d0: 30 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  0;.  double r;. 
22e0: 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 61   char *zBuf;.  a
22f0: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c  ssert( argc==1 |
2300: 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69  | argc==2 );.  i
2310: 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20  f( argc==2 ){.  
2320: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
2330: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
2340: 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 20 29  _type(argv[1]) )
2350: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20 3d   return;.    n =
2360: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2370: 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  nt(argv[1]);.   
2380: 20 69 66 28 20 6e 3e 33 30 20 29 20 6e 20 3d 20   if( n>30 ) n = 
2390: 33 30 3b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20  30;.    if( n<0 
23a0: 29 20 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ) n = 0;.  }.  i
23b0: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
23c0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
23d0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65  SQLITE_NULL ) re
23e0: 74 75 72 6e 3b 0a 20 20 72 20 3d 20 73 71 6c 69  turn;.  r = sqli
23f0: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
2400: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20  (argv[0]);.  /* 
2410: 49 66 20 59 3d 3d 30 20 61 6e 64 20 58 20 77 69  If Y==0 and X wi
2420: 6c 6c 20 66 69 74 20 69 6e 20 61 20 36 34 2d 62  ll fit in a 64-b
2430: 69 74 20 69 6e 74 2c 0a 20 20 2a 2a 20 68 61 6e  it int,.  ** han
2440: 64 6c 65 20 74 68 65 20 72 6f 75 6e 64 69 6e 67  dle the rounding
2450: 20 64 69 72 65 63 74 6c 79 2c 0a 20 20 2a 2a 20   directly,.  ** 
2460: 6f 74 68 65 72 77 69 73 65 20 75 73 65 20 70 72  otherwise use pr
2470: 69 6e 74 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  intf..  */.  if(
2480: 20 6e 3d 3d 30 20 26 26 20 72 3e 3d 30 20 26 26   n==0 && r>=0 &&
2490: 20 72 3c 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   r<LARGEST_INT64
24a0: 2d 31 20 29 7b 0a 20 20 20 20 72 20 3d 20 28 64  -1 ){.    r = (d
24b0: 6f 75 62 6c 65 29 28 28 73 71 6c 69 74 65 5f 69  ouble)((sqlite_i
24c0: 6e 74 36 34 29 28 72 2b 30 2e 35 29 29 3b 0a 20  nt64)(r+0.5));. 
24d0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20   }else if( n==0 
24e0: 26 26 20 72 3c 30 20 26 26 20 28 2d 72 29 3c 4c  && r<0 && (-r)<L
24f0: 41 52 47 45 53 54 5f 49 4e 54 36 34 2d 31 20 29  ARGEST_INT64-1 )
2500: 7b 0a 20 20 20 20 72 20 3d 20 2d 28 64 6f 75 62  {.    r = -(doub
2510: 6c 65 29 28 28 73 71 6c 69 74 65 5f 69 6e 74 36  le)((sqlite_int6
2520: 34 29 28 28 2d 72 29 2b 30 2e 35 29 29 3b 0a 20  4)((-r)+0.5));. 
2530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 42 75 66   }else{.    zBuf
2540: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2550: 74 66 28 22 25 2e 2a 66 22 2c 6e 2c 72 29 3b 0a  tf("%.*f",n,r);.
2560: 20 20 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20      if( zBuf==0 
2570: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2580: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
2590: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
25a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
25b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  }.    sqlite3Ato
25c0: 46 28 7a 42 75 66 2c 20 26 72 2c 20 73 71 6c 69  F(zBuf, &r, sqli
25d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
25e0: 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
25f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2600: 65 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 73  e(zBuf);.  }.  s
2610: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
2620: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29  uble(context, r)
2630: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2640: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
2650: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2660: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6d 61  using sqlite3_ma
2670: 6c 6c 6f 63 28 29 2e 20 49 66 20 74 68 65 0a 2a  lloc(). If the.*
2680: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  * allocation fai
2690: 6c 73 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ls, call sqlite3
26a0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
26b0: 6d 65 6d 28 29 20 74 6f 20 6e 6f 74 69 66 79 0a  mem() to notify.
26c0: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
26d0: 68 61 6e 64 6c 65 20 74 68 61 74 20 6d 61 6c 6c  handle that mall
26e0: 6f 63 28 29 20 68 61 73 20 66 61 69 6c 65 64 20  oc() has failed 
26f0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
2700: 0a 2a 2a 20 49 66 20 6e 42 79 74 65 20 69 73 20  .** If nByte is 
2710: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
2720: 6d 61 78 69 6d 75 6d 20 73 74 72 69 6e 67 20 6f  maximum string o
2730: 72 20 62 6c 6f 62 20 6c 65 6e 67 74 68 2c 20 74  r blob length, t
2740: 68 65 6e 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20  hen.** raise an 
2750: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 65 78  SQLITE_TOOBIG ex
2760: 63 65 70 74 69 6f 6e 20 61 6e 64 20 72 65 74 75  ception and retu
2770: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
2780: 69 63 20 76 6f 69 64 20 2a 63 6f 6e 74 65 78 74  ic void *context
2790: 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f 63  Malloc(sqlite3_c
27a0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
27b0: 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 63   i64 nByte){.  c
27c0: 68 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65  har *z;.  sqlite
27d0: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
27e0: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
27f0: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 61 73  e(context);.  as
2800: 73 65 72 74 28 20 6e 42 79 74 65 3e 30 20 29 3b  sert( nByte>0 );
2810: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 42 79  .  testcase( nBy
2820: 74 65 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  te==db->aLimit[S
2830: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
2840: 54 48 5d 20 29 3b 0a 20 20 74 65 73 74 63 61 73  TH] );.  testcas
2850: 65 28 20 6e 42 79 74 65 3d 3d 64 62 2d 3e 61 4c  e( nByte==db->aL
2860: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
2870: 54 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20  T_LENGTH]+1 );. 
2880: 20 69 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61   if( nByte>db->a
2890: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
28a0: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
28b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
28c0: 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f  _error_toobig(co
28d0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 7a 20 3d 20  ntext);.    z = 
28e0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
28f0: 7a 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  z = sqlite3Mallo
2900: 63 28 28 69 6e 74 29 6e 42 79 74 65 29 3b 0a 20  c((int)nByte);. 
2910: 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20     if( !z ){.   
2920: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2930: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
2940: 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ntext);.    }.  
2950: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
2960: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2970: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 70 70  ation of the upp
2980: 65 72 28 29 20 61 6e 64 20 6c 6f 77 65 72 28 29  er() and lower()
2990: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e 0a   SQL functions..
29a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
29b0: 70 70 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33  pperFunc(sqlite3
29c0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
29d0: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
29e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
29f0: 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31 3b 0a  v){.  char *z1;.
2a00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
2a10: 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
2a20: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a30: 28 61 72 67 63 29 3b 0a 20 20 7a 32 20 3d 20 28  (argc);.  z2 = (
2a40: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
2a50: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
2a60: 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
2a70: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
2a80: 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20 56 65 72 69  v[0]);.  /* Veri
2a90: 66 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  fy that the call
2aa0: 20 74 6f 20 5f 62 79 74 65 73 28 29 20 64 6f 65   to _bytes() doe
2ab0: 73 20 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65  s not invalidate
2ac0: 20 74 68 65 20 5f 74 65 78 74 28 29 20 70 6f 69   the _text() poi
2ad0: 6e 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  nter */.  assert
2ae0: 28 20 7a 32 3d 3d 28 63 68 61 72 2a 29 73 71 6c  ( z2==(char*)sql
2af0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
2b00: 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66  argv[0]) );.  if
2b10: 28 20 7a 32 20 29 7b 0a 20 20 20 20 7a 31 20 3d  ( z2 ){.    z1 =
2b20: 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63   contextMalloc(c
2b30: 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29  ontext, ((i64)n)
2b40: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 7a 31 20  +1);.    if( z1 
2b50: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
2b60: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
2b70: 20 20 20 20 20 7a 31 5b 69 5d 20 3d 20 28 63 68       z1[i] = (ch
2b80: 61 72 29 73 71 6c 69 74 65 33 54 6f 75 70 70 65  ar)sqlite3Touppe
2b90: 72 28 7a 32 5b 69 5d 29 3b 0a 20 20 20 20 20 20  r(z2[i]);.      
2ba0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
2bb0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
2bc0: 65 78 74 2c 20 7a 31 2c 20 6e 2c 20 73 71 6c 69  ext, z1, n, sqli
2bd0: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d  te3_free);.    }
2be0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
2bf0: 69 64 20 6c 6f 77 65 72 46 75 6e 63 28 73 71 6c  id lowerFunc(sql
2c00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
2c10: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
2c20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2c30: 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a  *argv){.  char *
2c40: 7a 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  z1;.  const char
2c50: 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6e   *z2;.  int i, n
2c60: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2c70: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 7a 32  ETER(argc);.  z2
2c80: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
2c90: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
2ca0: 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  v[0]);.  n = sql
2cb0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
2cc0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20  (argv[0]);.  /* 
2cd0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
2ce0: 63 61 6c 6c 20 74 6f 20 5f 62 79 74 65 73 28 29  call to _bytes()
2cf0: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61 6c 69   does not invali
2d00: 64 61 74 65 20 74 68 65 20 5f 74 65 78 74 28 29  date the _text()
2d10: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 61 73   pointer */.  as
2d20: 73 65 72 74 28 20 7a 32 3d 3d 28 63 68 61 72 2a  sert( z2==(char*
2d30: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
2d40: 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a  ext(argv[0]) );.
2d50: 20 20 69 66 28 20 7a 32 20 29 7b 0a 20 20 20 20    if( z2 ){.    
2d60: 7a 31 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c  z1 = contextMall
2d70: 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36  oc(context, ((i6
2d80: 34 29 6e 29 2b 31 29 3b 0a 20 20 20 20 69 66 28  4)n)+1);.    if(
2d90: 20 7a 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72   z1 ){.      for
2da0: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
2db0: 0a 20 20 20 20 20 20 20 20 7a 31 5b 69 5d 20 3d  .        z1[i] =
2dc0: 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28   sqlite3Tolower(
2dd0: 7a 32 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  z2[i]);.      }.
2de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
2df0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
2e00: 74 2c 20 7a 31 2c 20 6e 2c 20 73 71 6c 69 74 65  t, z1, n, sqlite
2e10: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  3_free);.    }. 
2e20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65   }.}../*.** Some
2e30: 20 66 75 6e 63 74 69 6f 6e 73 20 6c 69 6b 65 20   functions like 
2e40: 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 20 49  COALESCE() and I
2e50: 46 4e 55 4c 4c 28 29 20 61 6e 64 20 55 4e 4c 49  FNULL() and UNLI
2e60: 4b 45 4c 59 28 29 20 61 72 65 20 69 6d 70 6c 65  KELY() are imple
2e70: 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 56 44 42  mented.** as VDB
2e80: 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 75  E code so that u
2e90: 6e 75 73 65 64 20 61 72 67 75 6d 65 6e 74 20 76  nused argument v
2ea0: 61 6c 75 65 73 20 64 6f 20 6e 6f 74 20 68 61 76  alues do not hav
2eb0: 65 20 74 6f 20 62 65 20 63 6f 6d 70 75 74 65 64  e to be computed
2ec0: 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 77 65  ..** However, we
2ed0: 20 73 74 69 6c 6c 20 6e 65 65 64 20 73 6f 6d 65   still need some
2ee0: 20 6b 69 6e 64 20 6f 66 20 66 75 6e 63 74 69 6f   kind of functio
2ef0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
2f00: 20 66 6f 72 20 74 68 69 73 0a 2a 2a 20 72 6f 75   for this.** rou
2f10: 74 69 6e 65 73 20 69 6e 20 74 68 65 20 66 75 6e  tines in the fun
2f20: 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54 68  ction table.  Th
2f30: 65 20 6e 6f 6f 70 46 75 6e 63 20 6d 61 63 72 6f  e noopFunc macro
2f40: 20 70 72 6f 76 69 64 65 73 20 74 68 69 73 2e 0a   provides this..
2f50: 2a 2a 20 6e 6f 6f 70 46 75 6e 63 20 77 69 6c 6c  ** noopFunc will
2f60: 20 6e 65 76 65 72 20 62 65 20 63 61 6c 6c 65 64   never be called
2f70: 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 6d   so it doesn't m
2f80: 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20 69  atter what the i
2f90: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
2fa0: 20 69 73 2e 20 20 57 65 20 6d 69 67 68 74 20 61   is.  We might a
2fb0: 73 20 77 65 6c 6c 20 75 73 65 20 74 68 65 20 22  s well use the "
2fc0: 76 65 72 73 69 6f 6e 28 29 22 20 66 75 6e 63 74  version()" funct
2fd0: 69 6f 6e 20 61 73 20 61 20 73 75 62 73 74 69 74  ion as a substit
2fe0: 75 74 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ute..*/.#define 
2ff0: 6e 6f 6f 70 46 75 6e 63 20 76 65 72 73 69 6f 6e  noopFunc version
3000: 46 75 6e 63 20 20 20 2f 2a 20 53 75 62 73 74 69  Func   /* Substi
3010: 74 75 74 65 20 66 75 6e 63 74 69 6f 6e 20 2d 20  tute function - 
3020: 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 2a 2f 0a  never called */.
3030: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
3040: 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d 28  ation of random(
3050: 29 2e 20 20 52 65 74 75 72 6e 20 61 20 72 61 6e  ).  Return a ran
3060: 64 6f 6d 20 69 6e 74 65 67 65 72 2e 20 20 0a 2a  dom integer.  .*
3070: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61  /.static void ra
3080: 6e 64 6f 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69  ndomFunc(.  sqli
3090: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
30a0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55  text,.  int NotU
30b0: 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  sed,.  sqlite3_v
30c0: 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a  alue **NotUsed2.
30d0: 29 7b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  ){.  sqlite_int6
30e0: 34 20 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  4 r;.  UNUSED_PA
30f0: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
3100: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 73  , NotUsed2);.  s
3110: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
3120: 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29  s(sizeof(r), &r)
3130: 3b 0a 20 20 69 66 28 20 72 3c 30 20 29 7b 0a 20  ;.  if( r<0 ){. 
3140: 20 20 20 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f     /* We need to
3150: 20 70 72 65 76 65 6e 74 20 61 20 72 61 6e 64 6f   prevent a rando
3160: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 30 78 38 30  m number of 0x80
3170: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 20 0a  00000000000000 .
3180: 20 20 20 20 2a 2a 20 28 6f 72 20 2d 39 32 32 33      ** (or -9223
3190: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 29  372036854775808)
31a0: 20 73 69 6e 63 65 20 77 68 65 6e 20 79 6f 75 20   since when you 
31b0: 64 6f 20 61 62 73 28 29 20 6f 66 20 74 68 61 74  do abs() of that
31c0: 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  .    ** number o
31d0: 66 20 79 6f 75 20 67 65 74 20 74 68 65 20 73 61  f you get the sa
31e0: 6d 65 20 76 61 6c 75 65 20 62 61 63 6b 20 61 67  me value back ag
31f0: 61 69 6e 2e 20 20 54 6f 20 64 6f 20 74 68 69 73  ain.  To do this
3200: 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20 77 61 79  .    ** in a way
3210: 20 74 68 61 74 20 69 73 20 74 65 73 74 61 62 6c   that is testabl
3220: 65 2c 20 6d 61 73 6b 20 74 68 65 20 73 69 67 6e  e, mask the sign
3230: 20 62 69 74 20 6f 66 66 20 6f 66 20 6e 65 67 61   bit off of nega
3240: 74 69 76 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75  tive.    ** valu
3250: 65 73 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  es, resulting in
3260: 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75   a positive valu
3270: 65 2e 20 20 54 68 65 6e 20 74 61 6b 65 20 74 68  e.  Then take th
3280: 65 20 0a 20 20 20 20 2a 2a 20 32 73 20 63 6f 6d  e .    ** 2s com
3290: 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 61 74 20  plement of that 
32a0: 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2e 20  positive value. 
32b0: 20 54 68 65 20 65 6e 64 20 72 65 73 75 6c 74 20   The end result 
32c0: 63 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  can.    ** there
32d0: 66 6f 72 65 20 62 65 20 6e 6f 20 6c 65 73 73 20  fore be no less 
32e0: 74 68 61 6e 20 2d 39 32 32 33 33 37 32 30 33 36  than -9223372036
32f0: 38 35 34 37 37 35 38 30 37 2e 0a 20 20 20 20 2a  854775807..    *
3300: 2f 0a 20 20 20 20 72 20 3d 20 2d 28 72 20 26 20  /.    r = -(r & 
3310: 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 29 3b 0a  LARGEST_INT64);.
3320: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65    }.  sqlite3_re
3330: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
3340: 78 74 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xt, r);.}../*.**
3350: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
3360: 6f 66 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 4e 29  of randomblob(N)
3370: 2e 20 20 52 65 74 75 72 6e 20 61 20 72 61 6e 64  .  Return a rand
3380: 6f 6d 20 62 6c 6f 62 0a 2a 2a 20 74 68 61 74 20  om blob.** that 
3390: 69 73 20 4e 20 62 79 74 65 73 20 6c 6f 6e 67 2e  is N bytes long.
33a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
33b0: 72 61 6e 64 6f 6d 42 6c 6f 62 28 0a 20 20 73 71  randomBlob(.  sq
33c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
33d0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
33e0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
33f0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
3400: 69 6e 74 20 6e 3b 0a 20 20 75 6e 73 69 67 6e 65  int n;.  unsigne
3410: 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 61 73 73  d char *p;.  ass
3420: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a  ert( argc==1 );.
3430: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3440: 45 52 28 61 72 67 63 29 3b 0a 20 20 6e 20 3d 20  ER(argc);.  n = 
3450: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
3460: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
3470: 28 20 6e 3c 31 20 29 7b 0a 20 20 20 20 6e 20 3d  ( n<1 ){.    n =
3480: 20 31 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 63 6f   1;.  }.  p = co
3490: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74  ntextMalloc(cont
34a0: 65 78 74 2c 20 6e 29 3b 0a 20 20 69 66 28 20 70  ext, n);.  if( p
34b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
34c0: 72 61 6e 64 6f 6d 6e 65 73 73 28 6e 2c 20 70 29  randomness(n, p)
34d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
34e0: 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78  sult_blob(contex
34f0: 74 2c 20 28 63 68 61 72 2a 29 70 2c 20 6e 2c 20  t, (char*)p, n, 
3500: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
3510: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
3520: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
3530: 65 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  e last_insert_ro
3540: 77 69 64 28 29 20 53 51 4c 20 66 75 6e 63 74 69  wid() SQL functi
3550: 6f 6e 2e 20 20 54 68 65 20 72 65 74 75 72 6e 0a  on.  The return.
3560: 2a 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  ** value is the 
3570: 73 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69  same as the sqli
3580: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
3590: 72 6f 77 69 64 28 29 20 41 50 49 20 66 75 6e 63  rowid() API func
35a0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
35b0: 76 6f 69 64 20 6c 61 73 74 5f 69 6e 73 65 72 74  void last_insert
35c0: 5f 72 6f 77 69 64 28 0a 20 20 73 71 6c 69 74 65  _rowid(.  sqlite
35d0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
35e0: 78 74 2c 20 0a 20 20 69 6e 74 20 4e 6f 74 55 73  xt, .  int NotUs
35f0: 65 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  ed, .  sqlite3_v
3600: 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a  alue **NotUsed2.
3610: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
3620: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
3630: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
3640: 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f  text);.  UNUSED_
3650: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
3660: 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
3670: 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 35 31 33   /* IMP: R-51513
3680: 2d 31 32 30 32 36 20 54 68 65 20 6c 61 73 74 5f  -12026 The last_
3690: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 53  insert_rowid() S
36a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  QL function is a
36b0: 0a 20 20 2a 2a 20 77 72 61 70 70 65 72 20 61 72  .  ** wrapper ar
36c0: 6f 75 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33  ound the sqlite3
36d0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
36e0: 69 64 28 29 20 43 2f 43 2b 2b 20 69 6e 74 65 72  id() C/C++ inter
36f0: 66 61 63 65 0a 20 20 2a 2a 20 66 75 6e 63 74 69  face.  ** functi
3700: 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  on. */.  sqlite3
3710: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
3720: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c  ntext, sqlite3_l
3730: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
3740: 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (db));.}../*.** 
3750: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
3760: 66 20 74 68 65 20 63 68 61 6e 67 65 73 28 29 20  f the changes() 
3770: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  SQL function..**
3780: 0a 2a 2a 20 49 4d 50 3a 20 52 2d 36 32 30 37 33  .** IMP: R-62073
3790: 2d 31 31 32 30 39 20 54 68 65 20 63 68 61 6e 67  -11209 The chang
37a0: 65 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  es() SQL functio
37b0: 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 0a 2a  n is a wrapper.*
37c0: 2a 20 61 72 6f 75 6e 64 20 74 68 65 20 73 71 6c  * around the sql
37d0: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 43  ite3_changes() C
37e0: 2f 43 2b 2b 20 66 75 6e 63 74 69 6f 6e 20 61 6e  /C++ function an
37f0: 64 20 68 65 6e 63 65 20 66 6f 6c 6c 6f 77 73 20  d hence follows 
3800: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 72 75 6c 65  the same.** rule
3810: 73 20 66 6f 72 20 63 6f 75 6e 74 69 6e 67 20 63  s for counting c
3820: 68 61 6e 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  hanges..*/.stati
3830: 63 20 76 6f 69 64 20 63 68 61 6e 67 65 73 28 0a  c void changes(.
3840: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
3850: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
3860: 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c  t NotUsed,.  sql
3870: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74  ite3_value **Not
3880: 55 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74  Used2.){.  sqlit
3890: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
38a0: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
38b0: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55  le(context);.  U
38c0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
38d0: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
38e0: 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  d2);.  sqlite3_r
38f0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
3900: 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  t, sqlite3_chang
3910: 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  es(db));.}../*.*
3920: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3930: 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 5f 63 68   of the total_ch
3940: 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75 6e 63  anges() SQL func
3950: 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74 75 72  tion.  The retur
3960: 6e 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68  n value is.** th
3970: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 71  e same as the sq
3980: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
3990: 67 65 73 28 29 20 41 50 49 20 66 75 6e 63 74 69  ges() API functi
39a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
39b0: 69 64 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  id total_changes
39c0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
39d0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
39e0: 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73  int NotUsed,.  s
39f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e  qlite3_value **N
3a00: 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c  otUsed2.){.  sql
3a10: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
3a20: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
3a30: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
3a40: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
3a50: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
3a60: 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a  sed2);.  /* IMP:
3a70: 20 52 2d 35 32 37 35 36 2d 34 31 39 39 33 20 54   R-52756-41993 T
3a80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3a90: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
3aa0: 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
3ab0: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
3ac0: 29 20 43 2f 43 2b 2b 20 69 6e 74 65 72 66 61 63  ) C/C++ interfac
3ad0: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  e. */.  sqlite3_
3ae0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
3af0: 78 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  xt, sqlite3_tota
3b00: 6c 5f 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a  l_changes(db));.
3b10: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63  }../*.** A struc
3b20: 74 75 72 65 20 64 65 66 69 6e 69 6e 67 20 68 6f  ture defining ho
3b30: 77 20 74 6f 20 64 6f 20 47 4c 4f 42 2d 73 74 79  w to do GLOB-sty
3b40: 6c 65 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  le comparisons..
3b50: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6d 70 61 72  */.struct compar
3b60: 65 49 6e 66 6f 20 7b 0a 20 20 75 38 20 6d 61 74  eInfo {.  u8 mat
3b70: 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d 61 74 63  chAll;.  u8 matc
3b80: 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61 74 63 68  hOne;.  u8 match
3b90: 53 65 74 3b 0a 20 20 75 38 20 6e 6f 43 61 73 65  Set;.  u8 noCase
3ba0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.};../*.** For 
3bb0: 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6d 61  LIKE and GLOB ma
3bc0: 74 63 68 69 6e 67 20 6f 6e 20 45 42 43 44 49 43  tching on EBCDIC
3bd0: 20 6d 61 63 68 69 6e 65 73 2c 20 61 73 73 75 6d   machines, assum
3be0: 65 20 74 68 61 74 20 65 76 65 72 79 0a 2a 2a 20  e that every.** 
3bf0: 63 68 61 72 61 63 74 65 72 20 69 73 20 65 78 61  character is exa
3c00: 63 74 6c 79 20 6f 6e 65 20 62 79 74 65 20 69 6e  ctly one byte in
3c10: 20 73 69 7a 65 2e 20 20 41 6c 73 6f 2c 20 61 6c   size.  Also, al
3c20: 6c 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65  l characters are
3c30: 0a 2a 2a 20 61 62 6c 65 20 74 6f 20 70 61 72 74  .** able to part
3c40: 69 63 69 70 61 74 65 20 69 6e 20 75 70 70 65 72  icipate in upper
3c50: 2d 63 61 73 65 2d 74 6f 2d 6c 6f 77 65 72 2d 63  -case-to-lower-c
3c60: 61 73 65 20 6d 61 70 70 69 6e 67 73 20 69 6e 20  ase mappings in 
3c70: 45 42 43 44 49 43 0a 2a 2a 20 77 68 65 72 65 61  EBCDIC.** wherea
3c80: 73 20 6f 6e 6c 79 20 63 68 61 72 61 63 74 65 72  s only character
3c90: 73 20 6c 65 73 73 20 74 68 61 6e 20 30 78 38 30  s less than 0x80
3ca0: 20 64 6f 20 69 6e 20 41 53 43 49 49 2e 0a 2a 2f   do in ASCII..*/
3cb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
3cc0: 49 54 45 5f 45 42 43 44 49 43 29 0a 23 20 64 65  ITE_EBCDIC).# de
3cd0: 66 69 6e 65 20 73 71 6c 69 74 65 33 55 74 66 38  fine sqlite3Utf8
3ce0: 52 65 61 64 28 41 29 20 20 20 20 28 2a 28 28 2a  Read(A)    (*((*
3cf0: 41 29 2b 2b 29 29 0a 23 20 64 65 66 69 6e 65 20  A)++)).# define 
3d00: 47 6c 6f 62 55 70 70 65 72 54 6f 4c 6f 77 65 72  GlobUpperToLower
3d10: 28 41 29 20 20 20 41 20 3d 20 73 71 6c 69 74 65  (A)   A = sqlite
3d20: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 41 5d  3UpperToLower[A]
3d30: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3d40: 47 6c 6f 62 55 70 70 65 72 54 6f 4c 6f 77 65 72  GlobUpperToLower
3d50: 28 41 29 20 20 20 69 66 28 20 21 28 28 41 29 26  (A)   if( !((A)&
3d60: 7e 30 78 37 66 29 20 29 7b 20 41 20 3d 20 73 71  ~0x7f) ){ A = sq
3d70: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
3d80: 72 5b 41 5d 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a  r[A]; }.#endif..
3d90: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
3da0: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
3db0: 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b 20 27 2a 27  globInfo = { '*'
3dc0: 2c 20 27 3f 27 2c 20 27 5b 27 2c 20 30 20 7d 3b  , '?', '[', 0 };
3dd0: 0a 2f 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20  ./* The correct 
3de0: 53 51 4c 2d 39 32 20 62 65 68 61 76 69 6f 72 20  SQL-92 behavior 
3df0: 69 73 20 66 6f 72 20 74 68 65 20 4c 49 4b 45 20  is for the LIKE 
3e00: 6f 70 65 72 61 74 6f 72 20 74 6f 20 69 67 6e 6f  operator to igno
3e10: 72 65 0a 2a 2a 20 63 61 73 65 2e 20 20 54 68 75  re.** case.  Thu
3e20: 73 20 20 27 61 27 20 4c 49 4b 45 20 27 41 27 20  s  'a' LIKE 'A' 
3e30: 77 6f 75 6c 64 20 62 65 20 74 72 75 65 2e 20 2a  would be true. *
3e40: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
3e50: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
3e60: 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 20 3d  o likeInfoNorm =
3e70: 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20 30   { '%', '_',   0
3e80: 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66 20 53 51 4c  , 1 };./* If SQL
3e90: 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49  ITE_CASE_SENSITI
3ea0: 56 45 5f 4c 49 4b 45 20 69 73 20 64 65 66 69 6e  VE_LIKE is defin
3eb0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 4c 49 4b  ed, then the LIK
3ec0: 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  E operator.** is
3ed0: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 20   case sensitive 
3ee0: 63 61 75 73 69 6e 67 20 27 61 27 20 4c 49 4b 45  causing 'a' LIKE
3ef0: 20 27 41 27 20 74 6f 20 62 65 20 66 61 6c 73 65   'A' to be false
3f00: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
3f10: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
3f20: 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 41 6c 74 20  nfo likeInfoAlt 
3f30: 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20  = { '%', '_',   
3f40: 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  0, 0 };../*.** C
3f50: 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d 38  ompare two UTF-8
3f60: 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75   strings for equ
3f70: 61 6c 69 74 79 20 77 68 65 72 65 20 74 68 65 20  ality where the 
3f80: 66 69 72 73 74 20 73 74 72 69 6e 67 20 63 61 6e  first string can
3f90: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
3fa0: 62 65 20 61 20 22 67 6c 6f 62 22 20 65 78 70 72  be a "glob" expr
3fb0: 65 73 73 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ession.  Return 
3fc0: 74 72 75 65 20 28 31 29 20 69 66 20 74 68 65 79  true (1) if they
3fd0: 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
3fe0: 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69   and false (0) i
3ff0: 66 20 74 68 65 79 20 61 72 65 20 64 69 66 66 65  f they are diffe
4000: 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62  rent..**.** Glob
4010: 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  bing rules:.**.*
4020: 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20  *      '*'      
4030: 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
4040: 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72  uence of zero or
4050: 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73   more characters
4060: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27  ..**.**      '?'
4070: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65         Matches e
4080: 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61  xactly one chara
4090: 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  cter..**.**     
40a0: 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68  [...]      Match
40b0: 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
40c0: 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73   from the enclos
40d0: 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20  ed list of.**   
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
40f0: 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
4100: 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61     [^...]     Ma
4110: 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
4120: 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65  ter not in the e
4130: 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  nclosed list..**
4140: 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 5b 2e 2e  .** With the [..
4150: 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61  .] and [^...] ma
4160: 74 63 68 69 6e 67 2c 20 61 20 27 5d 27 20 63 68  tching, a ']' ch
4170: 61 72 61 63 74 65 72 20 63 61 6e 20 62 65 20 69  aracter can be i
4180: 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68  ncluded.** in th
4190: 65 20 6c 69 73 74 20 62 79 20 6d 61 6b 69 6e 67  e list by making
41a0: 20 69 74 20 74 68 65 20 66 69 72 73 74 20 63 68   it the first ch
41b0: 61 72 61 63 74 65 72 20 61 66 74 65 72 20 27 5b  aracter after '[
41c0: 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a 2a 2a 20  ' or '^'.  A.** 
41d0: 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61 63 74  range of charact
41e0: 65 72 73 20 63 61 6e 20 62 65 20 73 70 65 63 69  ers can be speci
41f0: 66 69 65 64 20 75 73 69 6e 67 20 27 2d 27 2e 20  fied using '-'. 
4200: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61   Example:.** "[a
4210: 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20 61 6e 79  -z]" matches any
4220: 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72 2d 63 61   single lower-ca
4230: 73 65 20 6c 65 74 74 65 72 2e 20 20 54 6f 20 6d  se letter.  To m
4240: 61 74 63 68 20 61 20 27 2d 27 2c 20 6d 61 6b 65  atch a '-', make
4250: 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61 73 74 20  .** it the last 
4260: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65  character in the
4270: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   list..**.** Thi
4280: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 75  s routine is usu
4290: 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75 74 20  ally quick, but 
42a0: 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e 20 74  can be N**2 in t
42b0: 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e 0a 2a  he worst case..*
42c0: 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20 74 6f 20 6d  *.** Hints: to m
42d0: 61 74 63 68 20 27 2a 27 20 6f 72 20 27 3f 27 2c  atch '*' or '?',
42e0: 20 70 75 74 20 74 68 65 6d 20 69 6e 20 22 5b 5d   put them in "[]
42f0: 22 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  ".  Like this:.*
4300: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 62 63  *.**         abc
4310: 5b 2a 5d 78 79 7a 20 20 20 20 20 20 20 20 4d 61  [*]xyz        Ma
4320: 74 63 68 65 73 20 22 61 62 63 2a 78 79 7a 22 20  tches "abc*xyz" 
4330: 6f 6e 6c 79 0a 2a 2f 0a 73 74 61 74 69 63 20 69  only.*/.static i
4340: 6e 74 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72  nt patternCompar
4350: 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  e(.  const u8 *z
4360: 50 61 74 74 65 72 6e 2c 20 20 20 20 20 20 20 20  Pattern,        
4370: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 6c 6f        /* The glo
4380: 62 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63  b pattern */.  c
4390: 6f 6e 73 74 20 75 38 20 2a 7a 53 74 72 69 6e 67  onst u8 *zString
43a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
43b0: 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 20 74 6f  /* The string to
43c0: 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
43d0: 20 74 68 65 20 67 6c 6f 62 20 2a 2f 0a 20 20 63   the glob */.  c
43e0: 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70  onst struct comp
43f0: 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 2c 20  areInfo *pInfo, 
4400: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
4410: 62 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f 20 74  bout how to do t
4420: 68 65 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  he compare */.  
4430: 75 33 32 20 65 73 63 20 20 20 20 20 20 20 20 20  u32 esc         
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63   /* The escape c
4460: 68 61 72 61 63 74 65 72 20 2a 2f 0a 29 7b 0a 20  haracter */.){. 
4470: 20 75 33 32 20 63 2c 20 63 32 3b 0a 20 20 69 6e   u32 c, c2;.  in
4480: 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20  t invert;.  int 
4490: 73 65 65 6e 3b 0a 20 20 75 38 20 6d 61 74 63 68  seen;.  u8 match
44a0: 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74  One = pInfo->mat
44b0: 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61 74 63  chOne;.  u8 matc
44c0: 68 41 6c 6c 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61  hAll = pInfo->ma
44d0: 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d 61 74  tchAll;.  u8 mat
44e0: 63 68 53 65 74 20 3d 20 70 49 6e 66 6f 2d 3e 6d  chSet = pInfo->m
44f0: 61 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f  atchSet;.  u8 no
4500: 43 61 73 65 20 3d 20 70 49 6e 66 6f 2d 3e 6e 6f  Case = pInfo->no
4510: 43 61 73 65 3b 20 0a 20 20 69 6e 74 20 70 72 65  Case; .  int pre
4520: 76 45 73 63 61 70 65 20 3d 20 30 3b 20 20 20 20  vEscape = 0;    
4530: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
4540: 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  previous charact
4550: 65 72 20 77 61 73 20 27 65 73 63 61 70 65 27 20  er was 'escape' 
4560: 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20  */..  while( (c 
4570: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
4580: 64 28 26 7a 50 61 74 74 65 72 6e 29 29 21 3d 30  d(&zPattern))!=0
4590: 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 6d   ){.    if( c==m
45a0: 61 74 63 68 41 6c 6c 20 26 26 20 21 70 72 65 76  atchAll && !prev
45b0: 45 73 63 61 70 65 20 29 7b 0a 20 20 20 20 20 20  Escape ){.      
45c0: 77 68 69 6c 65 28 20 28 63 3d 73 71 6c 69 74 65  while( (c=sqlite
45d0: 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74 74  3Utf8Read(&zPatt
45e0: 65 72 6e 29 29 20 3d 3d 20 6d 61 74 63 68 41 6c  ern)) == matchAl
45f0: 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
4600: 20 7c 7c 20 63 20 3d 3d 20 6d 61 74 63 68 4f 6e   || c == matchOn
4610: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
4620: 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 26 26 20   c==matchOne && 
4630: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
4640: 26 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a  &zString)==0 ){.
4650: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4660: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
4670: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4680: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
4690: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
46a0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 65 73 63  }else if( c==esc
46b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
46c0: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
46d0: 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  &zPattern);.    
46e0: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
46f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4700: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
4710: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
4720: 3d 6d 61 74 63 68 53 65 74 20 29 7b 0a 20 20 20  =matchSet ){.   
4730: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 73 63       assert( esc
4740: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ==0 );         /
4750: 2a 20 54 68 69 73 20 69 73 20 47 4c 4f 42 2c 20  * This is GLOB, 
4760: 6e 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20 20 20 20  not LIKE */.    
4770: 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 74 63      assert( matc
4780: 68 53 65 74 3c 30 78 38 30 20 29 3b 20 20 2f 2a  hSet<0x80 );  /*
4790: 20 27 5b 27 20 69 73 20 61 20 73 69 6e 67 6c 65   '[' is a single
47a0: 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  -byte character 
47b0: 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  */.        while
47c0: 28 20 2a 7a 53 74 72 69 6e 67 20 26 26 20 70 61  ( *zString && pa
47d0: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 26 7a 50  tternCompare(&zP
47e0: 61 74 74 65 72 6e 5b 2d 31 5d 2c 7a 53 74 72 69  attern[-1],zStri
47f0: 6e 67 2c 70 49 6e 66 6f 2c 65 73 63 29 3d 3d 30  ng,pInfo,esc)==0
4800: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 51   ){.          SQ
4810: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
4820: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  String);.       
4830: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
4840: 6e 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b 0a 20  n *zString!=0;. 
4850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
4860: 6c 65 28 20 28 63 32 20 3d 20 73 71 6c 69 74 65  le( (c2 = sqlite
4870: 33 55 74 66 38 52 65 61 64 28 26 7a 53 74 72 69  3Utf8Read(&zStri
4880: 6e 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ng))!=0 ){.     
4890: 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b     if( noCase ){
48a0: 0a 20 20 20 20 20 20 20 20 20 20 47 6c 6f 62 55  .          GlobU
48b0: 70 70 65 72 54 6f 4c 6f 77 65 72 28 63 32 29 3b  pperToLower(c2);
48c0: 0a 20 20 20 20 20 20 20 20 20 20 47 6c 6f 62 55  .          GlobU
48d0: 70 70 65 72 54 6f 4c 6f 77 65 72 28 63 29 3b 0a  pperToLower(c);.
48e0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
48f0: 20 63 32 20 21 3d 20 30 20 26 26 20 63 32 20 21   c2 != 0 && c2 !
4900: 3d 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  = c ){.         
4910: 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55     c2 = sqlite3U
4920: 74 66 38 52 65 61 64 28 26 7a 53 74 72 69 6e 67  tf8Read(&zString
4930: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 47  );.            G
4940: 6c 6f 62 55 70 70 65 72 54 6f 4c 6f 77 65 72 28  lobUpperToLower(
4950: 63 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  c2);.          }
4960: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
4970: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
4980: 20 63 32 20 21 3d 20 30 20 26 26 20 63 32 20 21   c2 != 0 && c2 !
4990: 3d 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  = c ){.         
49a0: 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55     c2 = sqlite3U
49b0: 74 66 38 52 65 61 64 28 26 7a 53 74 72 69 6e 67  tf8Read(&zString
49c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
49d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
49e0: 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74   if( c2==0 ) ret
49f0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 69  urn 0;.        i
4a00: 66 28 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72  f( patternCompar
4a10: 65 28 7a 50 61 74 74 65 72 6e 2c 7a 53 74 72 69  e(zPattern,zStri
4a20: 6e 67 2c 70 49 6e 66 6f 2c 65 73 63 29 20 29 20  ng,pInfo,esc) ) 
4a30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
4a40: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  }.      return 0
4a50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4a60: 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 26 26 20 21  c==matchOne && !
4a70: 70 72 65 76 45 73 63 61 70 65 20 29 7b 0a 20 20  prevEscape ){.  
4a80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 55      if( sqlite3U
4a90: 74 66 38 52 65 61 64 28 26 7a 53 74 72 69 6e 67  tf8Read(&zString
4aa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4ab0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
4ac0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
4ad0: 63 3d 3d 6d 61 74 63 68 53 65 74 20 29 7b 0a 20  c==matchSet ){. 
4ae0: 20 20 20 20 20 75 33 32 20 70 72 69 6f 72 5f 63       u32 prior_c
4af0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
4b00: 72 74 28 20 65 73 63 3d 3d 30 20 29 3b 20 20 20  rt( esc==0 );   
4b10: 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63   /* This only oc
4b20: 63 75 72 73 20 66 6f 72 20 47 4c 4f 42 2c 20 6e  curs for GLOB, n
4b30: 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20 20 20 20 20  ot LIKE */.     
4b40: 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20   seen = 0;.     
4b50: 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20   invert = 0;.   
4b60: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74     c = sqlite3Ut
4b70: 66 38 52 65 61 64 28 26 7a 53 74 72 69 6e 67 29  f8Read(&zString)
4b80: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  ;.      if( c==0
4b90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
4ba0: 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55     c2 = sqlite3U
4bb0: 74 66 38 52 65 61 64 28 26 7a 50 61 74 74 65 72  tf8Read(&zPatter
4bc0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32  n);.      if( c2
4bd0: 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='^' ){.       
4be0: 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20   invert = 1;.   
4bf0: 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65       c2 = sqlite
4c00: 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74 74  3Utf8Read(&zPatt
4c10: 65 72 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ern);.      }.  
4c20: 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20      if( c2==']' 
4c30: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
4c40: 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31  ==']' ) seen = 1
4c50: 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 73  ;.        c2 = s
4c60: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
4c70: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
4c80: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
4c90: 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b  c2 && c2!=']' ){
4ca0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d  .        if( c2=
4cb0: 3d 27 2d 27 20 26 26 20 7a 50 61 74 74 65 72 6e  ='-' && zPattern
4cc0: 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 50 61 74  [0]!=']' && zPat
4cd0: 74 65 72 6e 5b 30 5d 21 3d 30 20 26 26 20 70 72  tern[0]!=0 && pr
4ce0: 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20  ior_c>0 ){.     
4cf0: 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65       c2 = sqlite
4d00: 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74 74  3Utf8Read(&zPatt
4d10: 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ern);.          
4d20: 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26  if( c>=prior_c &
4d30: 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d  & c<=c2 ) seen =
4d40: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72   1;.          pr
4d50: 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
4d60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d70: 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b      if( c==c2 ){
4d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
4d90: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
4da0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72 69   }.          pri
4db0: 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20  or_c = c2;.     
4dc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20     }.        c2 
4dd0: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
4de0: 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  d(&zPattern);.  
4df0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4e00: 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e  c2==0 || (seen ^
4e10: 20 69 6e 76 65 72 74 29 3d 3d 30 20 29 7b 0a 20   invert)==0 ){. 
4e20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
4e30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4e40: 73 65 20 69 66 28 20 65 73 63 3d 3d 63 20 26 26  se if( esc==c &&
4e50: 20 21 70 72 65 76 45 73 63 61 70 65 20 29 7b 0a   !prevEscape ){.
4e60: 20 20 20 20 20 20 70 72 65 76 45 73 63 61 70 65        prevEscape
4e70: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
4e80: 0a 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69  .      c2 = sqli
4e90: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 53 74  te3Utf8Read(&zSt
4ea0: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28  ring);.      if(
4eb0: 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20   noCase ){.     
4ec0: 20 20 20 47 6c 6f 62 55 70 70 65 72 54 6f 4c 6f     GlobUpperToLo
4ed0: 77 65 72 28 63 29 3b 0a 20 20 20 20 20 20 20 20  wer(c);.        
4ee0: 47 6c 6f 62 55 70 70 65 72 54 6f 4c 6f 77 65 72  GlobUpperToLower
4ef0: 28 63 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (c2);.      }.  
4f00: 20 20 20 20 69 66 28 20 63 21 3d 63 32 20 29 7b      if( c!=c2 ){
4f10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4f20: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
4f30: 20 70 72 65 76 45 73 63 61 70 65 20 3d 20 30 3b   prevEscape = 0;
4f40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4f50: 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 3b  urn *zString==0;
4f60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  .}../*.** The sq
4f70: 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 29 20  lite3_strglob() 
4f80: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e  interface..*/.in
4f90: 74 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  t sqlite3_strglo
4fa0: 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47  b(const char *zG
4fb0: 6c 6f 62 50 61 74 74 65 72 6e 2c 20 63 6f 6e 73  lobPattern, cons
4fc0: 74 20 63 68 61 72 20 2a 7a 53 74 72 69 6e 67 29  t char *zString)
4fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 74 74 65  {.  return patte
4fe0: 72 6e 43 6f 6d 70 61 72 65 28 28 75 38 2a 29 7a  rnCompare((u8*)z
4ff0: 47 6c 6f 62 50 61 74 74 65 72 6e 2c 20 28 75 38  GlobPattern, (u8
5000: 2a 29 7a 53 74 72 69 6e 67 2c 20 26 67 6c 6f 62  *)zString, &glob
5010: 49 6e 66 6f 2c 20 30 29 3d 3d 30 3b 0a 7d 0a 0a  Info, 0)==0;.}..
5020: 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
5030: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
5040: 74 68 61 74 20 74 68 65 20 4c 49 4b 45 20 6f 70  that the LIKE op
5050: 65 72 61 74 6f 72 20 28 6f 72 20 47 4c 4f 42 20  erator (or GLOB 
5060: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6a 75 73 74  which is.** just
5070: 20 61 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20   a variation of 
5080: 4c 49 4b 45 29 20 67 65 74 73 20 63 61 6c 6c 65  LIKE) gets calle
5090: 64 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  d.  This is used
50a0: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
50b0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
50c0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
50d0: 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75  sqlite3_like_cou
50e0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
50f0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
5100: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 6b  ation of the lik
5110: 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  e() SQL function
5120: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
5130: 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74   implements.** t
5140: 68 65 20 62 75 69 6c 64 2d 69 6e 20 4c 49 4b 45  he build-in LIKE
5150: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
5160: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
5170: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  o the function i
5180: 73 20 74 68 65 0a 2a 2a 20 70 61 74 74 65 72 6e  s the.** pattern
5190: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
51a0: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
51b0: 73 74 72 69 6e 67 2e 20 20 53 6f 2c 20 74 68 65  string.  So, the
51c0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a   SQL statements:
51d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41 20 4c  .**.**       A L
51e0: 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69  IKE B.**.** is i
51f0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 6c 69  mplemented as li
5200: 6b 65 28 42 2c 41 29 2e 0a 2a 2a 0a 2a 2a 20 54  ke(B,A)..**.** T
5210: 68 69 73 20 73 61 6d 65 20 66 75 6e 63 74 69 6f  his same functio
5220: 6e 20 28 77 69 74 68 20 61 20 64 69 66 66 65 72  n (with a differ
5230: 65 6e 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  ent compareInfo 
5240: 73 74 72 75 63 74 75 72 65 29 20 63 6f 6d 70 75  structure) compu
5250: 74 65 73 0a 2a 2a 20 74 68 65 20 47 4c 4f 42 20  tes.** the GLOB 
5260: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  operator..*/.sta
5270: 74 69 63 20 76 6f 69 64 20 6c 69 6b 65 46 75 6e  tic void likeFun
5280: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5290: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
52a0: 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73    int argc, .  s
52b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
52c0: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgv.){.  const u
52d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41  nsigned char *zA
52e0: 2c 20 2a 7a 42 3b 0a 20 20 75 33 32 20 65 73 63  , *zB;.  u32 esc
52f0: 61 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ape = 0;.  int n
5300: 50 61 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Pat;.  sqlite3 *
5310: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
5320: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
5330: 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 7a 42 20 3d  ontext);..  zB =
5340: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5350: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
5360: 7a 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  zA = sqlite3_val
5370: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
5380: 3b 0a 0a 20 20 2f 2a 20 4c 69 6d 69 74 20 74 68  ;..  /* Limit th
5390: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
53a0: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61 74  LIKE or GLOB pat
53b0: 74 65 72 6e 20 74 6f 20 61 76 6f 69 64 20 70 72  tern to avoid pr
53c0: 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 6f 66 20 64  oblems.  ** of d
53d0: 65 65 70 20 72 65 63 75 72 73 69 6f 6e 20 61 6e  eep recursion an
53e0: 64 20 4e 2a 4e 20 62 65 68 61 76 69 6f 72 20 69  d N*N behavior i
53f0: 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  n patternCompare
5400: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 74 20  ()..  */.  nPat 
5410: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
5420: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
5430: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 74    testcase( nPat
5440: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
5450: 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
5460: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 20 29  ATTERN_LENGTH] )
5470: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
5480: 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  at==db->aLimit[S
5490: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
54a0: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
54b0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 74  +1 );.  if( nPat
54c0: 20 3e 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   > db->aLimit[SQ
54d0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
54e0: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 20  PATTERN_LENGTH] 
54f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
5500: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
5510: 65 78 74 2c 20 22 4c 49 4b 45 20 6f 72 20 47 4c  ext, "LIKE or GL
5520: 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 6f 20 63  OB pattern too c
5530: 6f 6d 70 6c 65 78 22 2c 20 2d 31 29 3b 0a 20 20  omplex", -1);.  
5540: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5550: 61 73 73 65 72 74 28 20 7a 42 3d 3d 73 71 6c 69  assert( zB==sqli
5560: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5570: 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 45  rgv[0]) );  /* E
5580: 6e 63 6f 64 69 6e 67 20 64 69 64 20 6e 6f 74 20  ncoding did not 
5590: 63 68 61 6e 67 65 20 2a 2f 0a 0a 20 20 69 66 28  change */..  if(
55a0: 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20   argc==3 ){.    
55b0: 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63 68  /* The escape ch
55c0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 6d  aracter string m
55d0: 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66 20 61  ust consist of a
55e0: 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20 63 68   single UTF-8 ch
55f0: 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20  aracter..    ** 
5600: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
5610: 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
5620: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  */.    const uns
5630: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 73 63  igned char *zEsc
5640: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5650: 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a  _text(argv[2]);.
5660: 20 20 20 20 69 66 28 20 7a 45 73 63 3d 3d 30 20      if( zEsc==0 
5670: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
5680: 28 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  ( sqlite3Utf8Cha
5690: 72 4c 65 6e 28 28 63 68 61 72 2a 29 7a 45 73 63  rLen((char*)zEsc
56a0: 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20 20 20 20  , -1)!=1 ){.    
56b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
56c0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
56d0: 0a 20 20 20 20 20 20 20 20 20 20 22 45 53 43 41  .          "ESCA
56e0: 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  PE expression mu
56f0: 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
5700: 68 61 72 61 63 74 65 72 22 2c 20 2d 31 29 3b 0a  haracter", -1);.
5710: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
5720: 20 20 7d 0a 20 20 20 20 65 73 63 61 70 65 20 3d    }.    escape =
5730: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
5740: 28 26 7a 45 73 63 29 3b 0a 20 20 7d 0a 20 20 69  (&zEsc);.  }.  i
5750: 66 28 20 7a 41 20 26 26 20 7a 42 20 29 7b 0a 20  f( zA && zB ){. 
5760: 20 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72     struct compar
5770: 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 73  eInfo *pInfo = s
5780: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
5790: 28 63 6f 6e 74 65 78 74 29 3b 0a 23 69 66 64 65  (context);.#ifde
57a0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
57b0: 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63    sqlite3_like_c
57c0: 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
57d0: 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f     .    sqlite3_
57e0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
57f0: 78 74 2c 20 70 61 74 74 65 72 6e 43 6f 6d 70 61  xt, patternCompa
5800: 72 65 28 7a 42 2c 20 7a 41 2c 20 70 49 6e 66 6f  re(zB, zA, pInfo
5810: 2c 20 65 73 63 61 70 65 29 29 3b 0a 20 20 7d 0a  , escape));.  }.
5820: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
5830: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4e  ntation of the N
5840: 55 4c 4c 49 46 28 78 2c 79 29 20 66 75 6e 63 74  ULLIF(x,y) funct
5850: 69 6f 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ion.  The result
5860: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
5870: 20 61 72 67 75 6d 65 6e 74 20 69 66 20 74 68 65   argument if the
5880: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 64   arguments are d
5890: 69 66 66 65 72 65 6e 74 2e 20 20 54 68 65 20 72  ifferent.  The r
58a0: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66  esult is NULL if
58b0: 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
58c0: 73 20 61 72 65 20 65 71 75 61 6c 20 74 6f 20 65  s are equal to e
58d0: 61 63 68 20 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74  ach other..*/.st
58e0: 61 74 69 63 20 76 6f 69 64 20 6e 75 6c 6c 69 66  atic void nullif
58f0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
5900: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
5910: 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c  ,.  int NotUsed,
5920: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5930: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 43 6f 6c   **argv.){.  Col
5940: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
5950: 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c  lite3GetFuncColl
5960: 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  Seq(context);.  
5970: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5980: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  (NotUsed);.  if(
5990: 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
59a0: 72 65 28 61 72 67 76 5b 30 5d 2c 20 61 72 67 76  re(argv[0], argv
59b0: 5b 31 5d 2c 20 70 43 6f 6c 6c 29 21 3d 30 20 29  [1], pColl)!=0 )
59c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
59d0: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
59e0: 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt, argv[0]);.  
59f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  }.}../*.** Imple
5a00: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
5a10: 20 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 28   sqlite_version(
5a20: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  ) function.  The
5a30: 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76   result is the v
5a40: 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  ersion.** of the
5a50: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
5a60: 74 68 61 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e  that is running.
5a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a80: 76 65 72 73 69 6f 6e 46 75 6e 63 28 0a 20 20 73  versionFunc(.  s
5a90: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5aa0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e  context,.  int N
5ab0: 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65  otUsed,.  sqlite
5ac0: 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65  3_value **NotUse
5ad0: 64 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  d2.){.  UNUSED_P
5ae0: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
5af0: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
5b00: 2f 2a 20 49 4d 50 3a 20 52 2d 34 38 36 39 39 2d  /* IMP: R-48699-
5b10: 34 38 36 31 37 20 54 68 69 73 20 66 75 6e 63 74  48617 This funct
5b20: 69 6f 6e 20 69 73 20 61 6e 20 53 51 4c 20 77 72  ion is an SQL wr
5b30: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65  apper around the
5b40: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 69  .  ** sqlite3_li
5b50: 62 76 65 72 73 69 6f 6e 28 29 20 43 2d 69 6e 74  bversion() C-int
5b60: 65 72 66 61 63 65 2e 20 2a 2f 0a 20 20 73 71 6c  erface. */.  sql
5b70: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
5b80: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
5b90: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20  3_libversion(), 
5ba0: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
5bb0: 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  C);.}../*.** Imp
5bc0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
5bd0: 68 65 20 73 71 6c 69 74 65 5f 73 6f 75 72 63 65  he sqlite_source
5be0: 5f 69 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  _id() function. 
5bf0: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  The result is a 
5c00: 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 69  string.** that i
5c10: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61  dentifies the pa
5c20: 72 74 69 63 75 6c 61 72 20 76 65 72 73 69 6f 6e  rticular version
5c30: 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20 63   of the source c
5c40: 6f 64 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c  ode used to buil
5c50: 64 0a 2a 2a 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  d.** SQLite..*/.
5c60: 73 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75 72  static void sour
5c70: 63 65 69 64 46 75 6e 63 28 0a 20 20 73 71 6c 69  ceidFunc(.  sqli
5c80: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5c90: 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55  text,.  int NotU
5ca0: 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  sed,.  sqlite3_v
5cb0: 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a  alue **NotUsed2.
5cc0: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
5cd0: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
5ce0: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20  NotUsed2);.  /* 
5cf0: 49 4d 50 3a 20 52 2d 32 34 34 37 30 2d 33 31 31  IMP: R-24470-311
5d00: 33 36 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  36 This function
5d10: 20 69 73 20 61 6e 20 53 51 4c 20 77 72 61 70 70   is an SQL wrapp
5d20: 65 72 20 61 72 6f 75 6e 64 20 74 68 65 0a 20 20  er around the.  
5d30: 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  ** sqlite3_sourc
5d40: 65 69 64 28 29 20 43 20 69 6e 74 65 72 66 61 63  eid() C interfac
5d50: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  e. */.  sqlite3_
5d60: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
5d70: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 73 6f 75  ext, sqlite3_sou
5d80: 72 63 65 69 64 28 29 2c 20 2d 31 2c 20 53 51 4c  rceid(), -1, SQL
5d90: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a  ITE_STATIC);.}..
5da0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
5db0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
5dc0: 74 65 5f 6c 6f 67 28 29 20 66 75 6e 63 74 69 6f  te_log() functio
5dd0: 6e 2e 20 20 54 68 69 73 20 69 73 20 61 20 77 72  n.  This is a wr
5de0: 61 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a 20  apper around.** 
5df0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 2e 20 20  sqlite3_log().  
5e00: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
5e10: 20 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20 66   is NULL.  The f
5e20: 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 70  unction exists p
5e30: 75 72 65 6c 79 20 66 6f 72 0a 2a 2a 20 69 74 73  urely for.** its
5e40: 20 73 69 64 65 2d 65 66 66 65 63 74 73 2e 0a 2a   side-effects..*
5e50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 72  /.static void er
5e60: 72 6c 6f 67 46 75 6e 63 28 0a 20 20 73 71 6c 69  rlogFunc(.  sqli
5e70: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5e80: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
5e90: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5ea0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 55 4e  e **argv.){.  UN
5eb0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
5ec0: 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rgc);.  UNUSED_P
5ed0: 41 52 41 4d 45 54 45 52 28 63 6f 6e 74 65 78 74  ARAMETER(context
5ee0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  );.  sqlite3_log
5ef0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69  (sqlite3_value_i
5f00: 6e 74 28 61 72 67 76 5b 30 5d 29 2c 20 22 25 73  nt(argv[0]), "%s
5f10: 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ", sqlite3_value
5f20: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 29 3b  _text(argv[1]));
5f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
5f40: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
5f50: 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70  sqlite_compileop
5f60: 74 69 6f 6e 5f 75 73 65 64 28 29 20 66 75 6e 63  tion_used() func
5f70: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 73  tion..** The res
5f80: 75 6c 74 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ult is an intege
5f90: 72 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65  r that identifie
5fa0: 73 20 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65  s if the compile
5fb0: 72 20 6f 70 74 69 6f 6e 0a 2a 2a 20 77 61 73 20  r option.** was 
5fc0: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 53 51  used to build SQ
5fd0: 4c 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  Lite..*/.#ifndef
5fe0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
5ff0: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
6000: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
6010: 70 69 6c 65 6f 70 74 69 6f 6e 75 73 65 64 46 75  pileoptionusedFu
6020: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
6030: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
6040: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
6050: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
6060: 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  gv.){.  const ch
6070: 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20  ar *zOptName;.  
6080: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
6090: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
60a0: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 2f  METER(argc);.  /
60b0: 2a 20 49 4d 50 3a 20 52 2d 33 39 35 36 34 2d 33  * IMP: R-39564-3
60c0: 36 33 30 35 20 54 68 65 20 73 71 6c 69 74 65 5f  6305 The sqlite_
60d0: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73  compileoption_us
60e0: 65 64 28 29 20 53 51 4c 0a 20 20 2a 2a 20 66 75  ed() SQL.  ** fu
60f0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
6100: 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 73  per around the s
6110: 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70  qlite3_compileop
6120: 74 69 6f 6e 5f 75 73 65 64 28 29 20 43 2f 43 2b  tion_used() C/C+
6130: 2b 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  +.  ** function.
6140: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 7a 4f 70  .  */.  if( (zOp
6150: 74 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  tName = (const c
6160: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
6170: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
6180: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
6190: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
61a0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
61b0: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73  compileoption_us
61c0: 65 64 28 7a 4f 70 74 4e 61 6d 65 29 29 3b 0a 20  ed(zOptName));. 
61d0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
61e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49  QLITE_OMIT_COMPI
61f0: 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a  LEOPTION_DIAGS *
6200: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
6210: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
6220: 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74  qlite_compileopt
6230: 69 6f 6e 5f 67 65 74 28 29 20 66 75 6e 63 74 69  ion_get() functi
6240: 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 72 65 73 75  on. .** The resu
6250: 6c 74 20 69 73 20 61 20 73 74 72 69 6e 67 20 74  lt is a string t
6260: 68 61 74 20 69 64 65 6e 74 69 66 69 65 73 20 74  hat identifies t
6270: 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  he compiler opti
6280: 6f 6e 73 20 0a 2a 2a 20 75 73 65 64 20 74 6f 20  ons .** used to 
6290: 62 75 69 6c 64 20 53 51 4c 69 74 65 2e 0a 2a 2f  build SQLite..*/
62a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
62b0: 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
62c0: 4f 4e 5f 44 49 41 47 53 0a 73 74 61 74 69 63 20  ON_DIAGS.static 
62d0: 76 6f 69 64 20 63 6f 6d 70 69 6c 65 6f 70 74 69  void compileopti
62e0: 6f 6e 67 65 74 46 75 6e 63 28 0a 20 20 73 71 6c  ongetFunc(.  sql
62f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
6300: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
6310: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
6320: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
6330: 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  nt n;.  assert( 
6340: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55  argc==1 );.  UNU
6350: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
6360: 67 63 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52  gc);.  /* IMP: R
6370: 2d 30 34 39 32 32 2d 32 34 30 37 36 20 54 68 65  -04922-24076 The
6380: 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f   sqlite_compileo
6390: 70 74 69 6f 6e 5f 67 65 74 28 29 20 53 51 4c 20  ption_get() SQL 
63a0: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
63b0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
63c0: 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f  d the sqlite3_co
63d0: 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28  mpileoption_get(
63e0: 29 20 43 2f 43 2b 2b 20 66 75 6e 63 74 69 6f 6e  ) C/C++ function
63f0: 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c  ..  */.  n = sql
6400: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
6410: 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74  rgv[0]);.  sqlit
6420: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
6430: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
6440: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65  compileoption_ge
6450: 74 28 6e 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45  t(n), -1, SQLITE
6460: 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 23 65 6e 64  _STATIC);.}.#end
6470: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6480: 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f  T_COMPILEOPTION_
6490: 44 49 41 47 53 20 2a 2f 0a 0a 2f 2a 20 41 72 72  DIAGS */../* Arr
64a0: 61 79 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e  ay for convertin
64b0: 67 20 66 72 6f 6d 20 68 61 6c 66 2d 62 79 74 65  g from half-byte
64c0: 73 20 28 6e 79 62 62 6c 65 73 29 20 69 6e 74 6f  s (nybbles) into
64d0: 20 41 53 43 49 49 20 68 65 78 0a 2a 2a 20 64 69   ASCII hex.** di
64e0: 67 69 74 73 2e 20 2a 2f 0a 73 74 61 74 69 63 20  gits. */.static 
64f0: 63 6f 6e 73 74 20 63 68 61 72 20 68 65 78 64 69  const char hexdi
6500: 67 69 74 73 5b 5d 20 3d 20 7b 0a 20 20 27 30 27  gits[] = {.  '0'
6510: 2c 20 27 31 27 2c 20 27 32 27 2c 20 27 33 27 2c  , '1', '2', '3',
6520: 20 27 34 27 2c 20 27 35 27 2c 20 27 36 27 2c 20   '4', '5', '6', 
6530: 27 37 27 2c 0a 20 20 27 38 27 2c 20 27 39 27 2c  '7',.  '8', '9',
6540: 20 27 41 27 2c 20 27 42 27 2c 20 27 43 27 2c 20   'A', 'B', 'C', 
6550: 27 44 27 2c 20 27 45 27 2c 20 27 46 27 20 0a 7d  'D', 'E', 'F' .}
6560: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
6570: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 51  ntation of the Q
6580: 55 4f 54 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e  UOTE() function.
6590: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
65a0: 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  takes a single.*
65b0: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20  * argument.  If 
65c0: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
65d0: 6e 75 6d 65 72 69 63 2c 20 74 68 65 20 72 65 74  numeric, the ret
65e0: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
65f0: 20 73 61 6d 65 20 61 73 0a 2a 2a 20 74 68 65 20   same as.** the 
6600: 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20 74 68  argument.  If th
6610: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  e argument is NU
6620: 4c 4c 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  LL, the return v
6630: 61 6c 75 65 20 69 73 20 74 68 65 20 73 74 72 69  alue is the stri
6640: 6e 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e 20 20 4f  ng.** "NULL".  O
6650: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 72  therwise, the ar
6660: 67 75 6d 65 6e 74 20 69 73 20 65 6e 63 6c 6f 73  gument is enclos
6670: 65 64 20 69 6e 20 73 69 6e 67 6c 65 20 71 75 6f  ed in single quo
6680: 74 65 73 20 77 69 74 68 0a 2a 2a 20 73 69 6e 67  tes with.** sing
6690: 6c 65 2d 71 75 6f 74 65 20 65 73 63 61 70 65 73  le-quote escapes
66a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
66b0: 20 71 75 6f 74 65 46 75 6e 63 28 73 71 6c 69 74   quoteFunc(sqlit
66c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
66d0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
66e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
66f0: 72 67 76 29 7b 0a 20 20 61 73 73 65 72 74 28 20  rgv){.  assert( 
6700: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55  argc==1 );.  UNU
6710: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
6720: 67 63 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  gc);.  switch( s
6730: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
6740: 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20  e(argv[0]) ){.  
6750: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
6760: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75  OAT: {.      dou
6770: 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20  ble r1, r2;.    
6780: 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
6790: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
67a0: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
67b0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
67c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
67d0: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
67e0: 7a 42 75 66 2c 20 22 25 21 2e 31 35 67 22 2c 20  zBuf, "%!.15g", 
67f0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
6800: 65 33 41 74 6f 46 28 7a 42 75 66 2c 20 26 72 32  e3AtoF(zBuf, &r2
6810: 2c 20 32 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  , 20, SQLITE_UTF
6820: 38 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 31  8);.      if( r1
6830: 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20  !=r2 ){.        
6840: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6850: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
6860: 42 75 66 2c 20 22 25 21 2e 32 30 65 22 2c 20 72  Buf, "%!.20e", r
6870: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
6880: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6890: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
68a0: 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
68b0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
68c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
68d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
68e0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
68f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
6900: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
6910: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 62 72  gv[0]);.      br
6920: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6930: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
6940: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
6950: 54 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Text = 0;.      
6960: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 42 6c 6f  char const *zBlo
6970: 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  b = sqlite3_valu
6980: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
6990: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62  .      int nBlob
69a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
69b0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
69c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
69d0: 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76 61  Blob==sqlite3_va
69e0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
69f0: 29 20 29 3b 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64  ) ); /* No encod
6a00: 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ing change */.  
6a10: 20 20 20 20 7a 54 65 78 74 20 3d 20 28 63 68 61      zText = (cha
6a20: 72 20 2a 29 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  r *)contextMallo
6a30: 63 28 63 6f 6e 74 65 78 74 2c 20 28 32 2a 28 69  c(context, (2*(i
6a40: 36 34 29 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a 20  64)nBlob)+4); . 
6a50: 20 20 20 20 20 69 66 28 20 7a 54 65 78 74 20 29       if( zText )
6a60: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
6a70: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
6a80: 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b  ; i<nBlob; i++){
6a90: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 78 74  .          zText
6aa0: 5b 28 69 2a 32 29 2b 32 5d 20 3d 20 68 65 78 64  [(i*2)+2] = hexd
6ab0: 69 67 69 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 3e  igits[(zBlob[i]>
6ac0: 3e 34 29 26 30 78 30 46 5d 3b 0a 20 20 20 20 20  >4)&0x0F];.     
6ad0: 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29       zText[(i*2)
6ae0: 2b 33 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b  +3] = hexdigits[
6af0: 28 7a 42 6c 6f 62 5b 69 5d 29 26 30 78 30 46 5d  (zBlob[i])&0x0F]
6b00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6b10: 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62      zText[(nBlob
6b20: 2a 32 29 2b 32 5d 20 3d 20 27 5c 27 27 3b 0a 20  *2)+2] = '\'';. 
6b30: 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42         zText[(nB
6b40: 6c 6f 62 2a 32 29 2b 33 5d 20 3d 20 27 5c 30 27  lob*2)+3] = '\0'
6b50: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b  ;.        zText[
6b60: 30 5d 20 3d 20 27 58 27 3b 0a 20 20 20 20 20 20  0] = 'X';.      
6b70: 20 20 7a 54 65 78 74 5b 31 5d 20 3d 20 27 5c 27    zText[1] = '\'
6b80: 27 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ';.        sqlit
6b90: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
6ba0: 6f 6e 74 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d  ontext, zText, -
6bb0: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
6bc0: 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ENT);.        sq
6bd0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74  lite3_free(zText
6be0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6bf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6c00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
6c10: 58 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  XT: {.      int 
6c20: 69 2c 6a 3b 0a 20 20 20 20 20 20 75 36 34 20 6e  i,j;.      u64 n
6c30: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e  ;.      const un
6c40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 72  signed char *zAr
6c50: 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  g = sqlite3_valu
6c60: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
6c70: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  .      char *z;.
6c80: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 72 67 3d  .      if( zArg=
6c90: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
6ca0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 30 3b     for(i=0, n=0;
6cb0: 20 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 20   zArg[i]; i++){ 
6cc0: 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27  if( zArg[i]=='\'
6cd0: 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20  ' ) n++; }.     
6ce0: 20 7a 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c   z = contextMall
6cf0: 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36  oc(context, ((i6
6d00: 34 29 69 29 2b 28 28 69 36 34 29 6e 29 2b 33 29  4)i)+((i64)n)+3)
6d10: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b  ;.      if( z ){
6d20: 0a 20 20 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20  .        z[0] = 
6d30: 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 66 6f  '\'';.        fo
6d40: 72 28 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41 72 67  r(i=0, j=1; zArg
6d50: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
6d60: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41       z[j++] = zA
6d70: 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  rg[i];.         
6d80: 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c   if( zArg[i]=='\
6d90: 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  '' ){.          
6da0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b    z[j++] = '\'';
6db0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6dc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
6dd0: 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [j++] = '\'';.  
6de0: 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a        z[j] = 0;.
6df0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6e00: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
6e10: 65 78 74 2c 20 7a 2c 20 6a 2c 20 73 71 6c 69 74  ext, z, j, sqlit
6e20: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20  e3_free);.      
6e30: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6e40: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
6e50: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
6e60: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
6e70: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53  type(argv[0])==S
6e80: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20  QLITE_NULL );.  
6e90: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6ea0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
6eb0: 20 22 4e 55 4c 4c 22 2c 20 34 2c 20 53 51 4c 49   "NULL", 4, SQLI
6ec0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
6ed0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6ee0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
6ef0: 75 6e 69 63 6f 64 65 28 29 20 66 75 6e 63 74 69  unicode() functi
6f00: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  on.  Return the 
6f10: 69 6e 74 65 67 65 72 20 75 6e 69 63 6f 64 65 20  integer unicode 
6f20: 63 6f 64 65 2d 70 6f 69 6e 74 20 76 61 6c 75 65  code-point value
6f30: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 69 72 73  .** for the firs
6f40: 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  t character of t
6f50: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e  he input string.
6f60: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
6f70: 20 75 6e 69 63 6f 64 65 46 75 6e 63 28 0a 20 20   unicodeFunc(.  
6f80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6f90: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
6fa0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
6fb0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
6fc0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
6fd0: 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
6fe0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
6ff0: 67 76 5b 30 5d 29 3b 0a 20 20 28 76 6f 69 64 29  gv[0]);.  (void)
7000: 61 72 67 63 3b 0a 20 20 69 66 28 20 7a 20 26 26  argc;.  if( z &&
7010: 20 7a 5b 30 5d 20 29 20 73 71 6c 69 74 65 33 5f   z[0] ) sqlite3_
7020: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
7030: 78 74 2c 20 73 71 6c 69 74 65 33 55 74 66 38 52  xt, sqlite3Utf8R
7040: 65 61 64 28 26 7a 29 29 3b 0a 7d 0a 0a 2f 2a 0a  ead(&z));.}../*.
7050: 2a 2a 20 54 68 65 20 63 68 61 72 28 29 20 66 75  ** The char() fu
7060: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 7a 65 72  nction takes zer
7070: 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65  o or more argume
7080: 6e 74 73 2c 20 65 61 63 68 20 6f 66 20 77 68 69  nts, each of whi
7090: 63 68 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65  ch is.** an inte
70a0: 67 65 72 2e 20 20 49 74 20 63 6f 6e 73 74 72 75  ger.  It constru
70b0: 63 74 73 20 61 20 73 74 72 69 6e 67 20 77 68 65  cts a string whe
70c0: 72 65 20 65 61 63 68 20 63 68 61 72 61 63 74 65  re each characte
70d0: 72 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 0a  r of the string.
70e0: 2a 2a 20 69 73 20 74 68 65 20 75 6e 69 63 6f 64  ** is the unicod
70f0: 65 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20  e character for 
7100: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
7110: 67 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  g integer argume
7120: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
7130: 69 64 20 63 68 61 72 46 75 6e 63 28 0a 20 20 73  id charFunc(.  s
7140: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7150: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
7160: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
7170: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
7180: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7190: 7a 2c 20 2a 7a 4f 75 74 3b 0a 20 20 69 6e 74 20  z, *zOut;.  int 
71a0: 69 3b 0a 20 20 7a 4f 75 74 20 3d 20 7a 20 3d 20  i;.  zOut = z = 
71b0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
71c0: 61 72 67 63 2a 34 2b 31 20 29 3b 0a 20 20 69 66  argc*4+1 );.  if
71d0: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( z==0 ){.    sq
71e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
71f0: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
7200: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7210: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
7220: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
7230: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b  sqlite3_int64 x;
7240: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 3b  .    unsigned c;
7250: 0a 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33  .    x = sqlite3
7260: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
7270: 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 78  v[i]);.    if( x
7280: 3c 30 20 7c 7c 20 78 3e 30 78 31 30 66 66 66 66  <0 || x>0x10ffff
7290: 20 29 20 78 20 3d 20 30 78 66 66 66 64 3b 0a 20   ) x = 0xfffd;. 
72a0: 20 20 20 63 20 3d 20 28 75 6e 73 69 67 6e 65 64     c = (unsigned
72b0: 29 28 78 20 26 20 30 78 31 66 66 66 66 66 29 3b  )(x & 0x1fffff);
72c0: 0a 20 20 20 20 69 66 28 20 63 3c 30 78 30 30 30  .    if( c<0x000
72d0: 38 30 20 29 7b 0a 20 20 20 20 20 20 2a 7a 4f 75  80 ){.      *zOu
72e0: 74 2b 2b 20 3d 20 28 75 38 29 28 63 26 30 78 46  t++ = (u8)(c&0xF
72f0: 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  F);.    }else if
7300: 28 20 63 3c 30 78 30 30 38 30 30 20 29 7b 0a 20  ( c<0x00800 ){. 
7310: 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30       *zOut++ = 0
7320: 78 43 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 36  xC0 + (u8)((c>>6
7330: 29 26 30 78 31 46 29 3b 0a 20 20 20 20 20 20 2a  )&0x1F);.      *
7340: 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20  zOut++ = 0x80 + 
7350: 28 75 38 29 28 63 20 26 20 30 78 33 46 29 3b 0a  (u8)(c & 0x3F);.
7360: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c      }else if( c<
7370: 30 78 31 30 30 30 30 20 29 7b 0a 20 20 20 20 20  0x10000 ){.     
7380: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 45 30 20   *zOut++ = 0xE0 
7390: 2b 20 28 75 38 29 28 28 63 3e 3e 31 32 29 26 30  + (u8)((c>>12)&0
73a0: 78 30 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75  x0F);.      *zOu
73b0: 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38  t++ = 0x80 + (u8
73c0: 29 28 28 63 3e 3e 36 29 20 26 20 30 78 33 46 29  )((c>>6) & 0x3F)
73d0: 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20  ;.      *zOut++ 
73e0: 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 63 20  = 0x80 + (u8)(c 
73f0: 26 20 30 78 33 46 29 3b 0a 20 20 20 20 7d 65 6c  & 0x3F);.    }el
7400: 73 65 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b  se{.      *zOut+
7410: 2b 20 3d 20 30 78 46 30 20 2b 20 28 75 38 29 28  + = 0xF0 + (u8)(
7420: 28 63 3e 3e 31 38 29 20 26 20 30 78 30 37 29 3b  (c>>18) & 0x07);
7430: 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d  .      *zOut++ =
7440: 20 30 78 38 30 20 2b 20 28 75 38 29 28 28 63 3e   0x80 + (u8)((c>
7450: 3e 31 32 29 20 26 20 30 78 33 46 29 3b 0a 20 20  >12) & 0x3F);.  
7460: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
7470: 38 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 36 29  80 + (u8)((c>>6)
7480: 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 20 20   & 0x3F);.      
7490: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b  *zOut++ = 0x80 +
74a0: 20 28 75 38 29 28 63 20 26 20 30 78 33 46 29 3b   (u8)(c & 0x3F);
74b0: 0a 20 20 20 20 7d 20 20 20 20 20 20 20 20 20 20  .    }          
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74e0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
74f0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7500: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28  _text(context, (
7510: 63 68 61 72 2a 29 7a 2c 20 28 69 6e 74 29 28 7a  char*)z, (int)(z
7520: 4f 75 74 2d 7a 29 2c 20 73 71 6c 69 74 65 33 5f  Out-z), sqlite3_
7530: 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  free);.}../*.** 
7540: 54 68 65 20 68 65 78 28 29 20 66 75 6e 63 74 69  The hex() functi
7550: 6f 6e 2e 20 20 49 6e 74 65 72 70 72 65 74 20 74  on.  Interpret t
7560: 68 65 20 61 72 67 75 6d 65 6e 74 20 61 73 20 61  he argument as a
7570: 20 62 6c 6f 62 2e 20 20 52 65 74 75 72 6e 0a 2a   blob.  Return.*
7580: 2a 20 61 20 68 65 78 61 64 65 63 69 6d 61 6c 20  * a hexadecimal 
7590: 72 65 6e 64 65 72 69 6e 67 20 61 73 20 74 65 78  rendering as tex
75a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
75b0: 64 20 68 65 78 46 75 6e 63 28 0a 20 20 73 71 6c  d hexFunc(.  sql
75c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
75d0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
75e0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
75f0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
7600: 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74  nt i, n;.  const
7610: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7620: 70 42 6c 6f 62 3b 0a 20 20 63 68 61 72 20 2a 7a  pBlob;.  char *z
7630: 48 65 78 2c 20 2a 7a 3b 0a 20 20 61 73 73 65 72  Hex, *z;.  asser
7640: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
7650: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
7660: 28 61 72 67 63 29 3b 0a 20 20 70 42 6c 6f 62 20  (argc);.  pBlob 
7670: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
7680: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
7690: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
76a0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
76b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 6c  );.  assert( pBl
76c0: 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  ob==sqlite3_valu
76d0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20  e_blob(argv[0]) 
76e0: 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69  );  /* No encodi
76f0: 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a  ng change */.  z
7700: 20 3d 20 7a 48 65 78 20 3d 20 63 6f 6e 74 65 78   = zHex = contex
7710: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
7720: 20 28 28 69 36 34 29 6e 29 2a 32 20 2b 20 31 29   ((i64)n)*2 + 1)
7730: 3b 0a 20 20 69 66 28 20 7a 48 65 78 20 29 7b 0a  ;.  if( zHex ){.
7740: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
7750: 3b 20 69 2b 2b 2c 20 70 42 6c 6f 62 2b 2b 29 7b  ; i++, pBlob++){
7760: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
7770: 63 68 61 72 20 63 20 3d 20 2a 70 42 6c 6f 62 3b  char c = *pBlob;
7780: 0a 20 20 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20  .      *(z++) = 
7790: 68 65 78 64 69 67 69 74 73 5b 28 63 3e 3e 34 29  hexdigits[(c>>4)
77a0: 26 30 78 66 5d 3b 0a 20 20 20 20 20 20 2a 28 7a  &0xf];.      *(z
77b0: 2b 2b 29 20 3d 20 68 65 78 64 69 67 69 74 73 5b  ++) = hexdigits[
77c0: 63 26 30 78 66 5d 3b 0a 20 20 20 20 7d 0a 20 20  c&0xf];.    }.  
77d0: 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 73 71    *z = 0;.    sq
77e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
77f0: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 48 65 78 2c  t(context, zHex,
7800: 20 6e 2a 32 2c 20 73 71 6c 69 74 65 33 5f 66 72   n*2, sqlite3_fr
7810: 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ee);.  }.}../*.*
7820: 2a 20 54 68 65 20 7a 65 72 6f 62 6c 6f 62 28 4e  * The zeroblob(N
7830: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
7840: 6e 73 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  ns a zero-filled
7850: 20 62 6c 6f 62 20 6f 66 20 73 69 7a 65 20 4e 20   blob of size N 
7860: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
7870: 20 76 6f 69 64 20 7a 65 72 6f 62 6c 6f 62 46 75   void zeroblobFu
7880: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
7890: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
78a0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
78b0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
78c0: 67 76 0a 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20  gv.){.  i64 n;. 
78d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
78e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
78f0: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
7900: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  );.  assert( arg
7910: 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==1 );.  UNUSED
7920: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
7930: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  n = sqlite3_
7940: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
7950: 5b 30 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  [0]);.  testcase
7960: 28 20 6e 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( n==db->aLimit[
7970: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
7980: 47 54 48 5d 20 29 3b 0a 20 20 74 65 73 74 63 61  GTH] );.  testca
7990: 73 65 28 20 6e 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( n==db->aLimi
79a0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
79b0: 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20 20 69 66  ENGTH]+1 );.  if
79c0: 28 20 6e 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ( n>db->aLimit[S
79d0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
79e0: 54 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TH] ){.    sqlit
79f0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
7a00: 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b  toobig(context);
7a10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
7a20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72  lite3_result_zer
7a30: 6f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28  oblob(context, (
7a40: 69 6e 74 29 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20  int)n); /* IMP: 
7a50: 52 2d 30 30 32 39 33 2d 36 34 39 39 34 20 2a 2f  R-00293-64994 */
7a60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
7a70: 65 20 72 65 70 6c 61 63 65 28 29 20 66 75 6e 63  e replace() func
7a80: 74 69 6f 6e 2e 20 20 54 68 72 65 65 20 61 72 67  tion.  Three arg
7a90: 75 6d 65 6e 74 73 20 61 72 65 20 61 6c 6c 20 73  uments are all s
7aa0: 74 72 69 6e 67 73 3a 20 63 61 6c 6c 0a 2a 2a 20  trings: call.** 
7ab0: 74 68 65 6d 20 41 2c 20 42 2c 20 61 6e 64 20 43  them A, B, and C
7ac0: 2e 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  . The result is 
7ad0: 61 6c 73 6f 20 61 20 73 74 72 69 6e 67 20 77 68  also a string wh
7ae0: 69 63 68 20 69 73 20 64 65 72 69 76 65 64 0a 2a  ich is derived.*
7af0: 2a 20 66 72 6f 6d 20 41 20 62 79 20 72 65 70 6c  * from A by repl
7b00: 61 63 69 6e 67 20 65 76 65 72 79 20 6f 63 63 75  acing every occu
7b10: 72 72 65 6e 63 65 20 6f 66 20 42 20 77 69 74 68  rrence of B with
7b20: 20 43 2e 20 20 54 68 65 20 6d 61 74 63 68 0a 2a   C.  The match.*
7b30: 2a 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 2e  * must be exact.
7b40: 20 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75    Collating sequ
7b50: 65 6e 63 65 73 20 61 72 65 20 6e 6f 74 20 75 73  ences are not us
7b60: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
7b70: 69 64 20 72 65 70 6c 61 63 65 46 75 6e 63 28 0a  id replaceFunc(.
7b80: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
7b90: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
7ba0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
7bb0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
7bc0: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
7bd0: 65 64 20 63 68 61 72 20 2a 7a 53 74 72 3b 20 20  ed char *zStr;  
7be0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70        /* The inp
7bf0: 75 74 20 73 74 72 69 6e 67 20 41 20 2a 2f 0a 20  ut string A */. 
7c00: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7c10: 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20  char *zPattern; 
7c20: 20 20 20 2f 2a 20 54 68 65 20 70 61 74 74 65 72     /* The patter
7c30: 6e 20 73 74 72 69 6e 67 20 42 20 2a 2f 0a 20 20  n string B */.  
7c40: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
7c50: 68 61 72 20 2a 7a 52 65 70 3b 20 20 20 20 20 20  har *zRep;      
7c60: 20 20 2f 2a 20 54 68 65 20 72 65 70 6c 61 63 65    /* The replace
7c70: 6d 65 6e 74 20 73 74 72 69 6e 67 20 43 20 2a 2f  ment string C */
7c80: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
7c90: 20 2a 7a 4f 75 74 3b 20 20 20 20 20 20 20 20 20   *zOut;         
7ca0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
7cb0: 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 72  ut */.  int nStr
7cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7cd0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 53 74 72   /* Size of zStr
7ce0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74 65   */.  int nPatte
7cf0: 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rn;            /
7d00: 2a 20 53 69 7a 65 20 6f 66 20 7a 50 61 74 74 65  * Size of zPatte
7d10: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 70  rn */.  int nRep
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7d30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 52 65 70   /* Size of zRep
7d40: 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 75 74 3b 20   */.  i64 nOut; 
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7d60: 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  * Maximum size o
7d70: 66 20 7a 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20  f zOut */.  int 
7d80: 6c 6f 6f 70 4c 69 6d 69 74 3b 20 20 20 20 20 20  loopLimit;      
7d90: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 7a 53 74       /* Last zSt
7da0: 72 5b 5d 20 74 68 61 74 20 6d 69 67 68 74 20 6d  r[] that might m
7db0: 61 74 63 68 20 7a 50 61 74 74 65 72 6e 5b 5d 20  atch zPattern[] 
7dc0: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7de0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
7df0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  /..  assert( arg
7e00: 63 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==3 );.  UNUSED
7e10: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
7e20: 3b 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74  ;.  zStr = sqlit
7e30: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
7e40: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 53  gv[0]);.  if( zS
7e50: 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  tr==0 ) return;.
7e60: 20 20 6e 53 74 72 20 3d 20 73 71 6c 69 74 65 33    nStr = sqlite3
7e70: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
7e80: 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  v[0]);.  assert(
7e90: 20 7a 53 74 72 3d 3d 73 71 6c 69 74 65 33 5f 76   zStr==sqlite3_v
7ea0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
7eb0: 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63  ]) );  /* No enc
7ec0: 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a  oding change */.
7ed0: 20 20 7a 50 61 74 74 65 72 6e 20 3d 20 73 71 6c    zPattern = sql
7ee0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
7ef0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20  argv[1]);.  if( 
7f00: 7a 50 61 74 74 65 72 6e 3d 3d 30 20 29 7b 0a 20  zPattern==0 ){. 
7f10: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7f20: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
7f30: 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[1])==SQLITE_N
7f40: 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ULL.            
7f50: 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  || sqlite3_conte
7f60: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
7f70: 74 65 78 74 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  text)->mallocFai
7f80: 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
7f90: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50 61  n;.  }.  if( zPa
7fa0: 74 74 65 72 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20  ttern[0]==0 ){. 
7fb0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7fc0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
7fd0: 67 76 5b 31 5d 29 21 3d 53 51 4c 49 54 45 5f 4e  gv[1])!=SQLITE_N
7fe0: 55 4c 4c 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ULL );.    sqlit
7ff0: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
8000: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
8010: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8020: 20 7d 0a 20 20 6e 50 61 74 74 65 72 6e 20 3d 20   }.  nPattern = 
8030: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
8040: 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  tes(argv[1]);.  
8050: 61 73 73 65 72 74 28 20 7a 50 61 74 74 65 72 6e  assert( zPattern
8060: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
8070: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 20 29 3b  text(argv[1]) );
8080: 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67    /* No encoding
8090: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 52 65   change */.  zRe
80a0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  p = sqlite3_valu
80b0: 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b  e_text(argv[2]);
80c0: 0a 20 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29  .  if( zRep==0 )
80d0: 20 72 65 74 75 72 6e 3b 0a 20 20 6e 52 65 70 20   return;.  nRep 
80e0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
80f0: 62 79 74 65 73 28 61 72 67 76 5b 32 5d 29 3b 0a  bytes(argv[2]);.
8100: 20 20 61 73 73 65 72 74 28 20 7a 52 65 70 3d 3d    assert( zRep==
8110: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8120: 78 74 28 61 72 67 76 5b 32 5d 29 20 29 3b 0a 20  xt(argv[2]) );. 
8130: 20 6e 4f 75 74 20 3d 20 6e 53 74 72 20 2b 20 31   nOut = nStr + 1
8140: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74  ;.  assert( nOut
8150: 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  <SQLITE_MAX_LENG
8160: 54 48 20 29 3b 0a 20 20 7a 4f 75 74 20 3d 20 63  TH );.  zOut = c
8170: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
8180: 74 65 78 74 2c 20 28 69 36 34 29 6e 4f 75 74 29  text, (i64)nOut)
8190: 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20  ;.  if( zOut==0 
81a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
81b0: 20 7d 0a 20 20 6c 6f 6f 70 4c 69 6d 69 74 20 3d   }.  loopLimit =
81c0: 20 6e 53 74 72 20 2d 20 6e 50 61 74 74 65 72 6e   nStr - nPattern
81d0: 3b 20 20 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ;  .  for(i=j=0;
81e0: 20 69 3c 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20 69   i<=loopLimit; i
81f0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 74  ++){.    if( zSt
8200: 72 5b 69 5d 21 3d 7a 50 61 74 74 65 72 6e 5b 30  r[i]!=zPattern[0
8210: 5d 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 7a 53 74  ] || memcmp(&zSt
8220: 72 5b 69 5d 2c 20 7a 50 61 74 74 65 72 6e 2c 20  r[i], zPattern, 
8230: 6e 50 61 74 74 65 72 6e 29 20 29 7b 0a 20 20 20  nPattern) ){.   
8240: 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a     zOut[j++] = z
8250: 53 74 72 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  Str[i];.    }els
8260: 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 7a 4f 6c  e{.      u8 *zOl
8270: 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
8280: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
8290: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
82a0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
82b0: 20 6e 4f 75 74 20 2b 3d 20 6e 52 65 70 20 2d 20   nOut += nRep - 
82c0: 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20  nPattern;.      
82d0: 74 65 73 74 63 61 73 65 28 20 6e 4f 75 74 2d 31  testcase( nOut-1
82e0: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
82f0: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
8300: 5d 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ] );.      testc
8310: 61 73 65 28 20 6e 4f 75 74 2d 32 3d 3d 64 62 2d  ase( nOut-2==db-
8320: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
8330: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a  IMIT_LENGTH] );.
8340: 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 2d 31        if( nOut-1
8350: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
8360: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
8370: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8380: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8390: 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29  _toobig(context)
83a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
83b0: 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
83c0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
83d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4f 6c 64      }.      zOld
83e0: 20 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 20 20 7a   = zOut;.      z
83f0: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  Out = sqlite3_re
8400: 61 6c 6c 6f 63 28 7a 4f 75 74 2c 20 28 69 6e 74  alloc(zOut, (int
8410: 29 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66  )nOut);.      if
8420: 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  ( zOut==0 ){.   
8430: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8440: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
8450: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
8460: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8470: 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Old);.        re
8480: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
8490: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74      memcpy(&zOut
84a0: 5b 6a 5d 2c 20 7a 52 65 70 2c 20 6e 52 65 70 29  [j], zRep, nRep)
84b0: 3b 0a 20 20 20 20 20 20 6a 20 2b 3d 20 6e 52 65  ;.      j += nRe
84c0: 70 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50  p;.      i += nP
84d0: 61 74 74 65 72 6e 2d 31 3b 0a 20 20 20 20 7d 0a  attern-1;.    }.
84e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 2b    }.  assert( j+
84f0: 6e 53 74 72 2d 69 2b 31 3d 3d 6e 4f 75 74 20 29  nStr-i+1==nOut )
8500: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74  ;.  memcpy(&zOut
8510: 5b 6a 5d 2c 20 26 7a 53 74 72 5b 69 5d 2c 20 6e  [j], &zStr[i], n
8520: 53 74 72 2d 69 29 3b 0a 20 20 6a 20 2b 3d 20 6e  Str-i);.  j += n
8530: 53 74 72 20 2d 20 69 3b 0a 20 20 61 73 73 65 72  Str - i;.  asser
8540: 74 28 20 6a 3c 3d 6e 4f 75 74 20 29 3b 0a 20 20  t( j<=nOut );.  
8550: 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 73  zOut[j] = 0;.  s
8560: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
8570: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
8580: 72 2a 29 7a 4f 75 74 2c 20 6a 2c 20 73 71 6c 69  r*)zOut, j, sqli
8590: 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  te3_free);.}../*
85a0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
85b0: 6f 6e 20 6f 66 20 74 68 65 20 54 52 49 4d 28 29  on of the TRIM()
85c0: 2c 20 4c 54 52 49 4d 28 29 2c 20 61 6e 64 20 52  , LTRIM(), and R
85d0: 54 52 49 4d 28 29 20 66 75 6e 63 74 69 6f 6e 73  TRIM() functions
85e0: 2e 0a 2a 2a 20 54 68 65 20 75 73 65 72 64 61 74  ..** The userdat
85f0: 61 20 69 73 20 30 78 31 20 66 6f 72 20 6c 65 66  a is 0x1 for lef
8600: 74 20 74 72 69 6d 2c 20 30 78 32 20 66 6f 72 20  t trim, 0x2 for 
8610: 72 69 67 68 74 20 74 72 69 6d 2c 20 30 78 33 20  right trim, 0x3 
8620: 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61  for both..*/.sta
8630: 74 69 63 20 76 6f 69 64 20 74 72 69 6d 46 75 6e  tic void trimFun
8640: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
8650: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
8660: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
8670: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
8680: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  v.){.  const uns
8690: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b  igned char *zIn;
86a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
86b0: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 6f  t string */.  co
86c0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
86d0: 72 20 2a 7a 43 68 61 72 53 65 74 3b 20 20 20 20  r *zCharSet;    
86e0: 2f 2a 20 53 65 74 20 6f 66 20 63 68 61 72 61 63  /* Set of charac
86f0: 74 65 72 73 20 74 6f 20 74 72 69 6d 20 2a 2f 0a  ters to trim */.
8700: 20 20 69 6e 74 20 6e 49 6e 3b 20 20 20 20 20 20    int nIn;      
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8730: 20 62 79 74 65 73 20 69 6e 20 69 6e 70 75 74 20   bytes in input 
8740: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20  */.  int flags; 
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8760: 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 74 72 69         /* 1: tri
8770: 6d 6c 65 66 74 20 20 32 3a 20 74 72 69 6d 72 69  mleft  2: trimri
8780: 67 68 74 20 20 33 3a 20 74 72 69 6d 20 2a 2f 0a  ght  3: trim */.
8790: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87b0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
87c0: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
87d0: 64 20 63 68 61 72 20 2a 61 4c 65 6e 20 3d 20 30  d char *aLen = 0
87e0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65  ;          /* Le
87f0: 6e 67 74 68 20 6f 66 20 65 61 63 68 20 63 68 61  ngth of each cha
8800: 72 61 63 74 65 72 20 69 6e 20 7a 43 68 61 72 53  racter in zCharS
8810: 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  et */.  unsigned
8820: 20 63 68 61 72 20 2a 2a 61 7a 43 68 61 72 20 3d   char **azChar =
8830: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64   0;       /* Ind
8840: 69 76 69 64 75 61 6c 20 63 68 61 72 61 63 74 65  ividual characte
8850: 72 73 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a  rs in zCharSet *
8860: 2f 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 20 20  /.  int nChar;  
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8890: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
88a0: 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 0a 20 20   zCharSet */..  
88b0: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
88c0: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
88d0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
88e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
88f0: 20 20 7a 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f    zIn = sqlite3_
8900: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
8910: 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e 3d 3d  0]);.  if( zIn==
8920: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 49  0 ) return;.  nI
8930: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
8940: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
8950: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 3d  ;.  assert( zIn=
8960: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
8970: 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a  ext(argv[0]) );.
8980: 20 20 69 66 28 20 61 72 67 63 3d 3d 31 20 29 7b    if( argc==1 ){
8990: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
89a0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
89b0: 6c 65 6e 4f 6e 65 5b 5d 20 3d 20 7b 20 31 20 7d  lenOne[] = { 1 }
89c0: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 75 6e 73  ;.    static uns
89d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e  igned char * con
89e0: 73 74 20 61 7a 4f 6e 65 5b 5d 20 3d 20 7b 20 28  st azOne[] = { (
89f0: 75 38 2a 29 22 20 22 20 7d 3b 0a 20 20 20 20 6e  u8*)" " };.    n
8a00: 43 68 61 72 20 3d 20 31 3b 0a 20 20 20 20 61 4c  Char = 1;.    aL
8a10: 65 6e 20 3d 20 28 75 38 2a 29 6c 65 6e 4f 6e 65  en = (u8*)lenOne
8a20: 3b 0a 20 20 20 20 61 7a 43 68 61 72 20 3d 20 28  ;.    azChar = (
8a30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a  unsigned char **
8a40: 29 61 7a 4f 6e 65 3b 0a 20 20 20 20 7a 43 68 61  )azOne;.    zCha
8a50: 72 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  rSet = 0;.  }els
8a60: 65 20 69 66 28 20 28 7a 43 68 61 72 53 65 74 20  e if( (zCharSet 
8a70: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8a80: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 29 3d 3d  text(argv[1]))==
8a90: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
8aa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
8ab0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
8ac0: 72 20 2a 7a 3b 0a 20 20 20 20 66 6f 72 28 7a 3d  r *z;.    for(z=
8ad0: 7a 43 68 61 72 53 65 74 2c 20 6e 43 68 61 72 3d  zCharSet, nChar=
8ae0: 30 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b  0; *z; nChar++){
8af0: 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b  .      SQLITE_SK
8b00: 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20  IP_UTF8(z);.    
8b10: 7d 0a 20 20 20 20 69 66 28 20 6e 43 68 61 72 3e  }.    if( nChar>
8b20: 30 20 29 7b 0a 20 20 20 20 20 20 61 7a 43 68 61  0 ){.      azCha
8b30: 72 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  r = contextMallo
8b40: 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34  c(context, ((i64
8b50: 29 6e 43 68 61 72 29 2a 28 73 69 7a 65 6f 66 28  )nChar)*(sizeof(
8b60: 63 68 61 72 2a 29 2b 31 29 29 3b 0a 20 20 20 20  char*)+1));.    
8b70: 20 20 69 66 28 20 61 7a 43 68 61 72 3d 3d 30 20    if( azChar==0 
8b80: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
8b90: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
8ba0: 20 61 4c 65 6e 20 3d 20 28 75 6e 73 69 67 6e 65   aLen = (unsigne
8bb0: 64 20 63 68 61 72 2a 29 26 61 7a 43 68 61 72 5b  d char*)&azChar[
8bc0: 6e 43 68 61 72 5d 3b 0a 20 20 20 20 20 20 66 6f  nChar];.      fo
8bd0: 72 28 7a 3d 7a 43 68 61 72 53 65 74 2c 20 6e 43  r(z=zCharSet, nC
8be0: 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68 61 72  har=0; *z; nChar
8bf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 7a 43  ++){.        azC
8c00: 68 61 72 5b 6e 43 68 61 72 5d 20 3d 20 28 75 6e  har[nChar] = (un
8c10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 3b  signed char *)z;
8c20: 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
8c30: 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20  SKIP_UTF8(z);.  
8c40: 20 20 20 20 20 20 61 4c 65 6e 5b 6e 43 68 61 72        aLen[nChar
8c50: 5d 20 3d 20 28 75 38 29 28 7a 20 2d 20 61 7a 43  ] = (u8)(z - azC
8c60: 68 61 72 5b 6e 43 68 61 72 5d 29 3b 0a 20 20 20  har[nChar]);.   
8c70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8c80: 20 69 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a   if( nChar>0 ){.
8c90: 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49      flags = SQLI
8ca0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 73 71  TE_PTR_TO_INT(sq
8cb0: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
8cc0: 63 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 69  context));.    i
8cd0: 66 28 20 66 6c 61 67 73 20 26 20 31 20 29 7b 0a  f( flags & 1 ){.
8ce0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49 6e        while( nIn
8cf0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  >0 ){.        in
8d00: 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  t len = 0;.     
8d10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
8d20: 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  har; i++){.     
8d30: 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b       len = aLen[
8d40: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
8d50: 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d 65  ( len<=nIn && me
8d60: 6d 63 6d 70 28 7a 49 6e 2c 20 61 7a 43 68 61 72  mcmp(zIn, azChar
8d70: 5b 69 5d 2c 20 6c 65 6e 29 3d 3d 30 20 29 20 62  [i], len)==0 ) b
8d80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
8d90: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e          if( i>=n
8da0: 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  Char ) break;.  
8db0: 20 20 20 20 20 20 7a 49 6e 20 2b 3d 20 6c 65 6e        zIn += len
8dc0: 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 2d 3d  ;.        nIn -=
8dd0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20   len;.      }.  
8de0: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 6c 61 67    }.    if( flag
8df0: 73 20 26 20 32 20 29 7b 0a 20 20 20 20 20 20 77  s & 2 ){.      w
8e00: 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20  hile( nIn>0 ){. 
8e10: 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d         int len =
8e20: 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
8e30: 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b  i=0; i<nChar; i+
8e40: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65  +){.          le
8e50: 6e 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20  n = aLen[i];.   
8e60: 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d         if( len<=
8e70: 6e 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28 26 7a  nIn && memcmp(&z
8e80: 49 6e 5b 6e 49 6e 2d 6c 65 6e 5d 2c 61 7a 43 68  In[nIn-len],azCh
8e90: 61 72 5b 69 5d 2c 6c 65 6e 29 3d 3d 30 20 29 20  ar[i],len)==0 ) 
8ea0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
8eb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
8ec0: 6e 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20  nChar ) break;. 
8ed0: 20 20 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65         nIn -= le
8ee0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
8ef0: 0a 20 20 20 20 69 66 28 20 7a 43 68 61 72 53 65  .    if( zCharSe
8f00: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
8f10: 65 33 5f 66 72 65 65 28 61 7a 43 68 61 72 29 3b  e3_free(azChar);
8f20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
8f30: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
8f40: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a  (context, (char*
8f50: 29 7a 49 6e 2c 20 6e 49 6e 2c 20 53 51 4c 49 54  )zIn, nIn, SQLIT
8f60: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
8f70: 0a 0a 2f 2a 20 49 4d 50 3a 20 52 2d 32 35 33 36  ../* IMP: R-2536
8f80: 31 2d 31 36 31 35 30 20 54 68 69 73 20 66 75 6e  1-16150 This fun
8f90: 63 74 69 6f 6e 20 69 73 20 6f 6d 69 74 74 65 64  ction is omitted
8fa0: 20 66 72 6f 6d 20 53 51 4c 69 74 65 20 62 79 20   from SQLite by 
8fb0: 64 65 66 61 75 6c 74 2e 20 49 74 0a 2a 2a 20 69  default. It.** i
8fc0: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
8fd0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   if the SQLITE_S
8fe0: 4f 55 4e 44 45 58 20 63 6f 6d 70 69 6c 65 2d 74  OUNDEX compile-t
8ff0: 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73  ime option is us
9000: 65 64 0a 2a 2a 20 77 68 65 6e 20 53 51 4c 69 74  ed.** when SQLit
9010: 65 20 69 73 20 62 75 69 6c 74 2e 0a 2a 2f 0a 23  e is built..*/.#
9020: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55  ifdef SQLITE_SOU
9030: 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  NDEX./*.** Compu
9040: 74 65 20 74 68 65 20 73 6f 75 6e 64 65 78 20 65  te the soundex e
9050: 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 77 6f 72  ncoding of a wor
9060: 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52 2d  d..**.** IMP: R-
9070: 35 39 37 38 32 2d 30 30 30 37 32 20 54 68 65 20  59782-00072 The 
9080: 73 6f 75 6e 64 65 78 28 58 29 20 66 75 6e 63 74  soundex(X) funct
9090: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74  ion returns a st
90a0: 72 69 6e 67 20 74 68 61 74 20 69 73 20 74 68 65  ring that is the
90b0: 0a 2a 2a 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f  .** soundex enco
90c0: 64 69 6e 67 20 6f 66 20 74 68 65 20 73 74 72 69  ding of the stri
90d0: 6e 67 20 58 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ng X. .*/.static
90e0: 20 76 6f 69 64 20 73 6f 75 6e 64 65 78 46 75 6e   void soundexFun
90f0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
9100: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
9110: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
9120: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
9130: 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 52 65 73  v.){.  char zRes
9140: 75 6c 74 5b 38 5d 3b 0a 20 20 63 6f 6e 73 74 20  ult[8];.  const 
9150: 75 38 20 2a 7a 49 6e 3b 0a 20 20 69 6e 74 20 69  u8 *zIn;.  int i
9160: 2c 20 6a 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  , j;.  static co
9170: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
9180: 72 20 69 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  r iCode[] = {.  
9190: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
91a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
91b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
91c0: 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,.    0, 0, 0, 0
91d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
91e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
91f0: 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20  0, 0,.    0, 0, 
9200: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9210: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9220: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c   0, 0, 0,.    0,
9230: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9240: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9250: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
9260: 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c    0, 0, 1, 2, 3,
9270: 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20   0, 1, 2, 0, 0, 
9280: 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30  2, 2, 4, 5, 5, 0
9290: 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20 32  ,.    1, 2, 6, 2
92a0: 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c  , 3, 0, 1, 0, 2,
92b0: 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 2, 0, 0, 0, 
92c0: 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20  0, 0,.    0, 0, 
92d0: 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32  1, 2, 3, 0, 1, 2
92e0: 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c  , 0, 0, 2, 2, 4,
92f0: 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c   5, 5, 0,.    1,
9300: 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20   2, 6, 2, 3, 0, 
9310: 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30  1, 0, 2, 0, 2, 0
9320: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
9330: 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  };.  assert( arg
9340: 63 3d 3d 31 20 29 3b 0a 20 20 7a 49 6e 20 3d 20  c==1 );.  zIn = 
9350: 28 75 38 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  (u8*)sqlite3_val
9360: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
9370: 3b 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29  ;.  if( zIn==0 )
9380: 20 7a 49 6e 20 3d 20 28 75 38 2a 29 22 22 3b 0a   zIn = (u8*)"";.
9390: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 49 6e 5b 69    for(i=0; zIn[i
93a0: 5d 20 26 26 20 21 73 71 6c 69 74 65 33 49 73 61  ] && !sqlite3Isa
93b0: 6c 70 68 61 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b  lpha(zIn[i]); i+
93c0: 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 49 6e 5b 69  +){}.  if( zIn[i
93d0: 5d 20 29 7b 0a 20 20 20 20 75 38 20 70 72 65 76  ] ){.    u8 prev
93e0: 63 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e  code = iCode[zIn
93f0: 5b 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 7a  [i]&0x7f];.    z
9400: 52 65 73 75 6c 74 5b 30 5d 20 3d 20 73 71 6c 69  Result[0] = sqli
9410: 74 65 33 54 6f 75 70 70 65 72 28 7a 49 6e 5b 69  te3Toupper(zIn[i
9420: 5d 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b  ]);.    for(j=1;
9430: 20 6a 3c 34 20 26 26 20 7a 49 6e 5b 69 5d 3b 20   j<4 && zIn[i]; 
9440: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
9450: 63 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e  code = iCode[zIn
9460: 5b 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 20  [i]&0x7f];.     
9470: 20 69 66 28 20 63 6f 64 65 3e 30 20 29 7b 0a 20   if( code>0 ){. 
9480: 20 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 21         if( code!
9490: 3d 70 72 65 76 63 6f 64 65 20 29 7b 0a 20 20 20  =prevcode ){.   
94a0: 20 20 20 20 20 20 20 70 72 65 76 63 6f 64 65 20         prevcode 
94b0: 3d 20 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  = code;.        
94c0: 20 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d    zResult[j++] =
94d0: 20 63 6f 64 65 20 2b 20 27 30 27 3b 0a 20 20 20   code + '0';.   
94e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
94f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 72 65 76  se{.        prev
9500: 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  code = 0;.      
9510: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  }.    }.    whil
9520: 65 28 20 6a 3c 34 20 29 7b 0a 20 20 20 20 20 20  e( j<4 ){.      
9530: 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 27  zResult[j++] = '
9540: 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52  0';.    }.    zR
9550: 65 73 75 6c 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20  esult[j] = 0;.  
9560: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9570: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
9580: 52 65 73 75 6c 74 2c 20 34 2c 20 53 51 4c 49 54  Result, 4, SQLIT
9590: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
95a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 4d  }else{.    /* IM
95b0: 50 3a 20 52 2d 36 34 38 39 34 2d 35 30 33 32 31  P: R-64894-50321
95c0: 20 54 68 65 20 73 74 72 69 6e 67 20 22 3f 30 30   The string "?00
95d0: 30 22 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  0" is returned i
95e0: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 20  f the argument. 
95f0: 20 20 20 2a 2a 20 69 73 20 4e 55 4c 4c 20 6f 72     ** is NULL or
9600: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 41 53 43   contains no ASC
9610: 49 49 20 61 6c 70 68 61 62 65 74 69 63 20 63 68  II alphabetic ch
9620: 61 72 61 63 74 65 72 73 2e 20 2a 2f 0a 20 20 20  aracters. */.   
9630: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9640: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 3f  text(context, "?
9650: 30 30 30 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  000", 4, SQLITE_
9660: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
9670: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9680: 53 4f 55 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  SOUNDEX */..#ifn
9690: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
96a0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
96b0: 2a 0a 2a 2a 20 41 20 66 75 6e 63 74 69 6f 6e 20  *.** A function 
96c0: 74 68 61 74 20 6c 6f 61 64 73 20 61 20 73 68 61  that loads a sha
96d0: 72 65 64 2d 6c 69 62 72 61 72 79 20 65 78 74 65  red-library exte
96e0: 6e 73 69 6f 6e 20 74 68 65 6e 20 72 65 74 75 72  nsion then retur
96f0: 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  ns NULL..*/.stat
9700: 69 63 20 76 6f 69 64 20 6c 6f 61 64 45 78 74 28  ic void loadExt(
9710: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
9720: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
9730: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
9740: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
9750: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
9760: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
9770: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
9780: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f  t(argv[0]);.  co
9790: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 6f 63 3b  nst char *zProc;
97a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
97b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
97c0: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
97d0: 78 74 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  xt);.  char *zEr
97e0: 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 69 66 28  rMsg = 0;..  if(
97f0: 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20   argc==2 ){.    
9800: 7a 50 72 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63  zProc = (const c
9810: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
9820: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
9830: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9840: 7a 50 72 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  zProc = 0;.  }. 
9850: 20 69 66 28 20 7a 46 69 6c 65 20 26 26 20 73 71   if( zFile && sq
9860: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
9870: 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20  sion(db, zFile, 
9880: 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29  zProc, &zErrMsg)
9890: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
98a0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
98b0: 74 65 78 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d  text, zErrMsg, -
98c0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
98d0: 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
98e0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
98f0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
9900: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
9910: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
9920: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
9930: 61 0a 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76  a.** sum() or av
9940: 67 28 29 20 61 67 67 72 65 67 61 74 65 20 63 6f  g() aggregate co
9950: 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  mputation..*/.ty
9960: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75 6d  pedef struct Sum
9970: 43 74 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75  Ctx SumCtx;.stru
9980: 63 74 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f  ct SumCtx {.  do
9990: 75 62 6c 65 20 72 53 75 6d 3b 20 20 20 20 20 20  uble rSum;      
99a0: 2f 2a 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  /* Floating poin
99b0: 74 20 73 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69  t sum */.  i64 i
99c0: 53 75 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Sum;         /* 
99d0: 49 6e 74 65 67 65 72 20 73 75 6d 20 2a 2f 20 20  Integer sum */  
99e0: 20 0a 20 20 69 36 34 20 63 6e 74 3b 20 20 20 20   .  i64 cnt;    
99f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9a00: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d  of elements summ
9a10: 65 64 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66  ed */.  u8 overf
9a20: 6c 6f 77 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  low;      /* Tru
9a30: 65 20 69 66 20 69 6e 74 65 67 65 72 20 6f 76 65  e if integer ove
9a40: 72 66 6c 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20  rflow seen */.  
9a50: 75 38 20 61 70 70 72 6f 78 3b 20 20 20 20 20 20  u8 approx;      
9a60: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e    /* True if non
9a70: 2d 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77  -integer value w
9a80: 61 73 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  as input to the 
9a90: 73 75 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  sum */.};../*.**
9aa0: 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74   Routines used t
9ab0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73 75  o compute the su
9ac0: 6d 2c 20 61 76 65 72 61 67 65 2c 20 61 6e 64 20  m, average, and 
9ad0: 74 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  total..**.** The
9ae0: 20 53 55 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20   SUM() function 
9af0: 66 6f 6c 6c 6f 77 73 20 74 68 65 20 28 62 72 6f  follows the (bro
9b00: 6b 65 6e 29 20 53 51 4c 20 73 74 61 6e 64 61 72  ken) SQL standar
9b10: 64 20 77 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a  d which means.**
9b20: 20 74 68 61 74 20 69 74 20 72 65 74 75 72 6e 73   that it returns
9b30: 20 4e 55 4c 4c 20 69 66 20 69 74 20 73 75 6d 73   NULL if it sums
9b40: 20 6f 76 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e   over no inputs.
9b50: 20 20 54 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a    TOTAL returns.
9b60: 2a 2a 20 30 2e 30 20 69 6e 20 74 68 61 74 20 63  ** 0.0 in that c
9b70: 61 73 65 2e 20 20 49 6e 20 61 64 64 69 74 69 6f  ase.  In additio
9b80: 6e 2c 20 54 4f 54 41 4c 20 61 6c 77 61 79 73 20  n, TOTAL always 
9b90: 72 65 74 75 72 6e 73 20 61 20 66 6c 6f 61 74 20  returns a float 
9ba0: 77 68 65 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67  where.** SUM mig
9bb0: 68 74 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74  ht return an int
9bc0: 65 67 65 72 20 69 66 20 69 74 20 6e 65 76 65 72  eger if it never
9bd0: 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 20 66 6c   encounters a fl
9be0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
9bf0: 76 61 6c 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65  value.  TOTAL ne
9c00: 76 65 72 20 66 61 69 6c 73 2c 20 62 75 74 20 53  ver fails, but S
9c10: 55 4d 20 6d 69 67 68 74 20 74 68 72 6f 75 67 68  UM might through
9c20: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
9c30: 0a 2a 2a 20 69 74 20 6f 76 65 72 66 6c 6f 77 73  .** it overflows
9c40: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
9c50: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 53  static void sumS
9c60: 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  tep(sqlite3_cont
9c70: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
9c80: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
9c90: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
9ca0: 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e   SumCtx *p;.  in
9cb0: 74 20 74 79 70 65 3b 0a 20 20 61 73 73 65 72 74  t type;.  assert
9cc0: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55  ( argc==1 );.  U
9cd0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
9ce0: 61 72 67 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c  argc);.  p = sql
9cf0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
9d00: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
9d10: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74  sizeof(*p));.  t
9d20: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ype = sqlite3_va
9d30: 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65  lue_numeric_type
9d40: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
9d50: 20 70 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49   p && type!=SQLI
9d60: 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  TE_NULL ){.    p
9d70: 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28  ->cnt++;.    if(
9d80: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e   type==SQLITE_IN
9d90: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 69  TEGER ){.      i
9da0: 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76  64 v = sqlite3_v
9db0: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
9dc0: 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53  0]);.      p->rS
9dd0: 75 6d 20 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69  um += v;.      i
9de0: 66 28 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d  f( (p->approx|p-
9df0: 3e 6f 76 65 72 66 6c 6f 77 29 3d 3d 30 20 26 26  >overflow)==0 &&
9e00: 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34   sqlite3AddInt64
9e10: 28 26 70 2d 3e 69 53 75 6d 2c 20 76 29 20 29 7b  (&p->iSum, v) ){
9e20: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 76 65 72  .        p->over
9e30: 66 6c 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20 20  flow = 1;.      
9e40: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
9e50: 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 73 71     p->rSum += sq
9e60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
9e70: 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  le(argv[0]);.   
9e80: 20 20 20 70 2d 3e 61 70 70 72 6f 78 20 3d 20 31     p->approx = 1
9e90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
9ea0: 61 74 69 63 20 76 6f 69 64 20 73 75 6d 46 69 6e  atic void sumFin
9eb0: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
9ec0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
9ed0: 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20  .  SumCtx *p;.  
9ee0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
9ef0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
9f00: 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28  ntext, 0);.  if(
9f10: 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29   p && p->cnt>0 )
9f20: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 76 65  {.    if( p->ove
9f30: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 73  rflow ){.      s
9f40: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
9f50: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 69 6e 74  ror(context,"int
9f60: 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c 2d  eger overflow",-
9f70: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  1);.    }else if
9f80: 28 20 70 2d 3e 61 70 70 72 6f 78 20 29 7b 0a 20  ( p->approx ){. 
9f90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
9fa0: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
9fb0: 78 74 2c 20 70 2d 3e 72 53 75 6d 29 3b 0a 20 20  xt, p->rSum);.  
9fc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
9fd0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
9fe0: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e  t64(context, p->
9ff0: 69 53 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  iSum);.    }.  }
a000: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
a010: 76 67 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  vgFinalize(sqlit
a020: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
a030: 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a  ext){.  SumCtx *
a040: 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  p;.  p = sqlite3
a050: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
a060: 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a  xt(context, 0);.
a070: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 63 6e    if( p && p->cn
a080: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
a090: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
a0a0: 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53 75  (context, p->rSu
a0b0: 6d 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e 74  m/(double)p->cnt
a0c0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
a0d0: 76 6f 69 64 20 74 6f 74 61 6c 46 69 6e 61 6c 69  void totalFinali
a0e0: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
a0f0: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
a100: 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  SumCtx *p;.  p =
a110: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
a120: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
a130: 78 74 2c 20 30 29 3b 0a 20 20 2f 2a 20 28 64 6f  xt, 0);.  /* (do
a140: 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f  uble)0 In case o
a150: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
a160: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20  OATING_POINT... 
a170: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  */.  sqlite3_res
a180: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
a190: 78 74 2c 20 70 20 3f 20 70 2d 3e 72 53 75 6d 20  xt, p ? p->rSum 
a1a0: 3a 20 28 64 6f 75 62 6c 65 29 30 29 3b 0a 7d 0a  : (double)0);.}.
a1b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
a1c0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  wing structure k
a1d0: 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 73 74  eeps track of st
a1e0: 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
a1f0: 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75 6e 74  for the.** count
a200: 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  () aggregate fun
a210: 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65  ction..*/.typede
a220: 66 20 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74  f struct CountCt
a230: 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75  x CountCtx;.stru
a240: 63 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20  ct CountCtx {.  
a250: 69 36 34 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  i64 n;.};../*.**
a260: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70   Routines to imp
a270: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  lement the count
a280: 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  () aggregate fun
a290: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
a2a0: 20 76 6f 69 64 20 63 6f 75 6e 74 53 74 65 70 28   void countStep(
a2b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
a2c0: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
a2d0: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
a2e0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75  e **argv){.  Cou
a2f0: 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ntCtx *p;.  p = 
a300: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
a310: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
a320: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
a330: 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c    if( (argc==0 |
a340: 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73  | SQLITE_NULL!=s
a350: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
a360: 65 28 61 72 67 76 5b 30 5d 29 29 20 26 26 20 70  e(argv[0])) && p
a370: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a   ){.    p->n++;.
a380: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
a390: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
a3a0: 54 45 44 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c  TED.  /* The sql
a3b0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
a3c0: 6f 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  ount() function 
a3d0: 69 73 20 64 65 70 72 65 63 61 74 65 64 2e 20 20  is deprecated.  
a3e0: 42 75 74 20 6a 75 73 74 20 74 6f 20 6d 61 6b 65  But just to make
a3f0: 0a 20 20 2a 2a 20 73 75 72 65 20 69 74 20 73 74  .  ** sure it st
a400: 69 6c 6c 20 6f 70 65 72 61 74 65 73 20 63 6f 72  ill operates cor
a410: 72 65 63 74 6c 79 2c 20 76 65 72 69 66 79 20 74  rectly, verify t
a420: 68 61 74 20 69 74 73 20 63 6f 75 6e 74 20 61 67  hat its count ag
a430: 72 65 65 73 20 77 69 74 68 20 6f 75 72 20 0a 20  rees with our . 
a440: 20 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 63 6f 75   ** internal cou
a450: 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20 63 6f  nt when using co
a460: 75 6e 74 28 2a 29 20 61 6e 64 20 77 68 65 6e 20  unt(*) and when 
a470: 74 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20  the total count 
a480: 63 61 6e 20 62 65 0a 20 20 2a 2a 20 65 78 70 72  can be.  ** expr
a490: 65 73 73 65 64 20 61 73 20 61 20 33 32 2d 62 69  essed as a 32-bi
a4a0: 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
a4b0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
a4c0: 7c 7c 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 3e  || p==0 || p->n>
a4d0: 30 78 37 66 66 66 66 66 66 66 0a 20 20 20 20 20  0x7fffffff.     
a4e0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6e 3d 3d 73 71       || p->n==sq
a4f0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
a500: 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 20 29  count(context) )
a510: 3b 0a 23 65 6e 64 69 66 0a 7d 20 20 20 0a 73 74  ;.#endif.}   .st
a520: 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 46  atic void countF
a530: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
a540: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
a550: 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70  ){.  CountCtx *p
a560: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
a570: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
a580: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
a590: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a5a0: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70  int64(context, p
a5b0: 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a   ? p->n : 0);.}.
a5c0: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
a5d0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e  to implement min
a5e0: 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67  () and max() agg
a5f0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
a600: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a610: 20 6d 69 6e 6d 61 78 53 74 65 70 28 0a 20 20 73   minmaxStep(.  s
a620: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
a630: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
a640: 4e 6f 74 55 73 65 64 2c 20 0a 20 20 73 71 6c 69  NotUsed, .  sqli
a650: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
a660: 0a 29 7b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 20  .){.  Mem *pArg 
a670: 20 3d 20 28 4d 65 6d 20 2a 29 61 72 67 76 5b 30   = (Mem *)argv[0
a680: 5d 3b 0a 20 20 4d 65 6d 20 2a 70 42 65 73 74 3b  ];.  Mem *pBest;
a690: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
a6a0: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 0a 20  TER(NotUsed);.. 
a6b0: 20 70 42 65 73 74 20 3d 20 28 4d 65 6d 20 2a 29   pBest = (Mem *)
a6c0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
a6d0: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
a6e0: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42 65 73 74  t, sizeof(*pBest
a6f0: 29 29 3b 0a 20 20 69 66 28 20 21 70 42 65 73 74  ));.  if( !pBest
a700: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
a710: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
a720: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53  type(argv[0])==S
a730: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
a740: 20 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61    if( pBest->fla
a750: 67 73 20 29 20 73 71 6c 69 74 65 33 53 6b 69 70  gs ) sqlite3Skip
a760: 41 63 63 75 6d 75 6c 61 74 6f 72 4c 6f 61 64 28  AccumulatorLoad(
a770: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73  context);.  }els
a780: 65 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61  e if( pBest->fla
a790: 67 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61  gs ){.    int ma
a7a0: 78 3b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a  x;.    int cmp;.
a7b0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
a7c0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46  ll = sqlite3GetF
a7d0: 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65  uncCollSeq(conte
a7e0: 78 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73  xt);.    /* This
a7f0: 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 69   step function i
a800: 73 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  s used for both 
a810: 74 68 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61  the min() and ma
a820: 78 28 29 20 61 67 67 72 65 67 61 74 65 73 2c 0a  x() aggregates,.
a830: 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20      ** the only 
a840: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
a850: 65 6e 20 74 68 65 20 74 77 6f 20 62 65 69 6e 67  en the two being
a860: 20 74 68 61 74 20 74 68 65 20 73 65 6e 73 65 20   that the sense 
a870: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  of the.    ** co
a880: 6d 70 61 72 69 73 6f 6e 20 69 73 20 69 6e 76 65  mparison is inve
a890: 72 74 65 64 2e 20 46 6f 72 20 74 68 65 20 6d 61  rted. For the ma
a8a0: 78 28 29 20 61 67 67 72 65 67 61 74 65 2c 20 74  x() aggregate, t
a8b0: 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
a8c0: 33 5f 75 73 65 72 5f 64 61 74 61 28 29 20 66 75  3_user_data() fu
a8d0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 28  nction returns (
a8e0: 76 6f 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d  void *)-1. For m
a8f0: 69 6e 28 29 20 69 74 0a 20 20 20 20 2a 2a 20 72  in() it.    ** r
a900: 65 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 64  eturns (void *)d
a910: 62 2c 20 77 68 65 72 65 20 64 62 20 69 73 20 74  b, where db is t
a920: 68 65 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61  he sqlite3* data
a930: 62 61 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  base pointer..  
a940: 20 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 74    ** Therefore t
a950: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
a960: 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
a970: 27 6d 61 78 27 20 74 6f 20 31 20 66 6f 72 20 74  'max' to 1 for t
a980: 68 65 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20  he max().    ** 
a990: 61 67 67 72 65 67 61 74 65 2c 20 6f 72 20 30 20  aggregate, or 0 
a9a0: 66 6f 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a  for min()..    *
a9b0: 2f 0a 20 20 20 20 6d 61 78 20 3d 20 73 71 6c 69  /.    max = sqli
a9c0: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
a9d0: 6e 74 65 78 74 29 21 3d 30 3b 0a 20 20 20 20 63  ntext)!=0;.    c
a9e0: 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  mp = sqlite3MemC
a9f0: 6f 6d 70 61 72 65 28 70 42 65 73 74 2c 20 70 41  ompare(pBest, pA
aa00: 72 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  rg, pColl);.    
aa10: 69 66 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c  if( (max && cmp<
aa20: 30 29 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63  0) || (!max && c
aa30: 6d 70 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73  mp>0) ){.      s
aa40: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
aa50: 79 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a  y(pBest, pArg);.
aa60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aa70: 20 73 71 6c 69 74 65 33 53 6b 69 70 41 63 63 75   sqlite3SkipAccu
aa80: 6d 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74  mulatorLoad(cont
aa90: 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ext);.    }.  }e
aaa0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
aab0: 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73  VdbeMemCopy(pBes
aac0: 74 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  t, pArg);.  }.}.
aad0: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d  static void minM
aae0: 61 78 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  axFinalize(sqlit
aaf0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
ab00: 65 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ext){.  sqlite3_
ab10: 76 61 6c 75 65 20 2a 70 52 65 73 3b 0a 20 20 70  value *pRes;.  p
ab20: 52 65 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  Res = (sqlite3_v
ab30: 61 6c 75 65 20 2a 29 73 71 6c 69 74 65 33 5f 61  alue *)sqlite3_a
ab40: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
ab50: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
ab60: 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20  if( pRes ){.    
ab70: 69 66 28 20 70 52 65 73 2d 3e 66 6c 61 67 73 20  if( pRes->flags 
ab80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ab90: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f  _result_value(co
aba0: 6e 74 65 78 74 2c 20 70 52 65 73 29 3b 0a 20 20  ntext, pRes);.  
abb0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
abc0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52  dbeMemRelease(pR
abd0: 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  es);.  }.}../*.*
abe0: 2a 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 45  * group_concat(E
abf0: 58 50 52 2c 20 3f 53 45 50 41 52 41 54 4f 52 3f  XPR, ?SEPARATOR?
ac00: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
ac10: 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70   groupConcatStep
ac20: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
ac30: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
ac40: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
ac50: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
ac60: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
ac70: 20 2a 7a 56 61 6c 3b 0a 20 20 53 74 72 41 63 63   *zVal;.  StrAcc
ac80: 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 63 6f  um *pAccum;.  co
ac90: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a  nst char *zSep;.
aca0: 20 20 69 6e 74 20 6e 56 61 6c 2c 20 6e 53 65 70    int nVal, nSep
acb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
acc0: 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29  ==1 || argc==2 )
acd0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
ace0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
acf0: 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
ad00: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 41 63   ) return;.  pAc
ad10: 63 75 6d 20 3d 20 28 53 74 72 41 63 63 75 6d 2a  cum = (StrAccum*
ad20: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
ad30: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
ad40: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 41 63 63  xt, sizeof(*pAcc
ad50: 75 6d 29 29 3b 0a 0a 20 20 69 66 28 20 70 41 63  um));..  if( pAc
ad60: 63 75 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  cum ){.    sqlit
ad70: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
ad80: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
ad90: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  le(context);.   
ada0: 20 69 6e 74 20 66 69 72 73 74 54 65 72 6d 20 3d   int firstTerm =
adb0: 20 70 41 63 63 75 6d 2d 3e 75 73 65 4d 61 6c 6c   pAccum->useMall
adc0: 6f 63 3d 3d 30 3b 0a 20 20 20 20 70 41 63 63 75  oc==0;.    pAccu
add0: 6d 2d 3e 75 73 65 4d 61 6c 6c 6f 63 20 3d 20 32  m->useMalloc = 2
ade0: 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e 6d 78  ;.    pAccum->mx
adf0: 41 6c 6c 6f 63 20 3d 20 64 62 2d 3e 61 4c 69 6d  Alloc = db->aLim
ae00: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
ae10: 4c 45 4e 47 54 48 5d 3b 0a 20 20 20 20 69 66 28  LENGTH];.    if(
ae20: 20 21 66 69 72 73 74 54 65 72 6d 20 29 7b 0a 20   !firstTerm ){. 
ae30: 20 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d 32       if( argc==2
ae40: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 70   ){.        zSep
ae50: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
ae60: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
ae70: 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e  v[1]);.        n
ae80: 53 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Sep = sqlite3_va
ae90: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31  lue_bytes(argv[1
aea0: 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
aeb0: 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
aec0: 22 2c 22 3b 0a 20 20 20 20 20 20 20 20 6e 53 65  ",";.        nSe
aed0: 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  p = 1;.      }. 
aee0: 20 20 20 20 20 69 66 28 20 6e 53 65 70 20 29 20       if( nSep ) 
aef0: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
af00: 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a 53  ppend(pAccum, zS
af10: 65 70 2c 20 6e 53 65 70 29 3b 0a 20 20 20 20 7d  ep, nSep);.    }
af20: 0a 20 20 20 20 7a 56 61 6c 20 3d 20 28 63 68 61  .    zVal = (cha
af30: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
af40: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
af50: 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74      nVal = sqlit
af60: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
af70: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[0]);.    if(
af80: 20 6e 56 61 6c 20 7c 7c 20 66 69 72 73 74 54 65   nVal || firstTe
af90: 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72 41  rm ) sqlite3StrA
afa0: 63 63 75 6d 41 70 70 65 6e 64 28 70 41 63 63 75  ccumAppend(pAccu
afb0: 6d 2c 20 7a 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a  m, zVal, nVal);.
afc0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
afd0: 64 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e  d groupConcatFin
afe0: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
aff0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
b000: 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 41 63  .  StrAccum *pAc
b010: 63 75 6d 3b 0a 20 20 70 41 63 63 75 6d 20 3d 20  cum;.  pAccum = 
b020: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
b030: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
b040: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 41 63  t, 0);.  if( pAc
b050: 63 75 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70  cum ){.    if( p
b060: 41 63 63 75 6d 2d 3e 61 63 63 45 72 72 6f 72 3d  Accum->accError=
b070: 3d 53 54 52 41 43 43 55 4d 5f 54 4f 4f 42 49 47  =STRACCUM_TOOBIG
b080: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b090: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74  3_result_error_t
b0a0: 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a  oobig(context);.
b0b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
b0c0: 63 63 75 6d 2d 3e 61 63 63 45 72 72 6f 72 3d 3d  ccum->accError==
b0d0: 53 54 52 41 43 43 55 4d 5f 4e 4f 4d 45 4d 20 29  STRACCUM_NOMEM )
b0e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b0f0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
b100: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
b110: 20 7d 65 6c 73 65 7b 20 20 20 20 0a 20 20 20 20   }else{    .    
b120: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
b130: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  _text(context, s
b140: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
b150: 6e 69 73 68 28 70 41 63 63 75 6d 29 2c 20 2d 31  nish(pAccum), -1
b160: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
b180: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20  ite3_free);.    
b190: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
b1a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
b1b0: 20 70 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20   per-connection 
b1c0: 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74 72  function registr
b1d0: 61 74 69 6f 6e 2e 20 20 4d 6f 73 74 0a 2a 2a 20  ation.  Most.** 
b1e0: 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  of the built-in 
b1f0: 66 75 6e 63 74 69 6f 6e 73 20 61 62 6f 76 65 20  functions above 
b200: 61 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  are part of the 
b210: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
b220: 73 65 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  set..** This rou
b230: 74 69 6e 65 20 6f 6e 6c 79 20 64 65 61 6c 73 20  tine only deals 
b240: 77 69 74 68 20 74 68 6f 73 65 20 74 68 61 74 20  with those that 
b250: 61 72 65 20 6e 6f 74 20 67 6c 6f 62 61 6c 2e 0a  are not global..
b260: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
b270: 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
b280: 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20  nctions(sqlite3 
b290: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *db){.  int rc =
b2a0: 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
b2b0: 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  d_function(db, "
b2c0: 4d 41 54 43 48 22 2c 20 32 29 3b 0a 20 20 61 73  MATCH", 2);.  as
b2d0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
b2e0: 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51  _NOMEM || rc==SQ
b2f0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
b300: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
b310: 4d 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  M ){.    db->mal
b320: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
b330: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
b340: 74 68 65 20 4c 49 4b 45 4f 50 54 20 66 6c 61 67  the LIKEOPT flag
b350: 20 6f 6e 20 74 68 65 20 32 2d 61 72 67 75 6d 65   on the 2-argume
b360: 6e 74 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  nt function with
b370: 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e   the given name.
b380: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b390: 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 73  setLikeOptFlag(s
b3a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
b3b0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 75  t char *zName, u
b3c0: 38 20 66 6c 61 67 56 61 6c 29 7b 0a 20 20 46 75  8 flagVal){.  Fu
b3d0: 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 70  ncDef *pDef;.  p
b3e0: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
b3f0: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e  dFunction(db, zN
b400: 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
b410: 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 0a 20 20 20  en30(zName),.   
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 20 20 20 20 20 20 20 20 20 20 32 2c 20 53 51 4c            2, SQL
b440: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
b450: 69 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29  if( ALWAYS(pDef)
b460: 20 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66 75   ){.    pDef->fu
b470: 6e 63 46 6c 61 67 73 20 7c 3d 20 66 6c 61 67 56  ncFlags |= flagV
b480: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
b490: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 62 75   Register the bu
b4a0: 69 6c 74 2d 69 6e 20 4c 49 4b 45 20 61 6e 64 20  ilt-in LIKE and 
b4b0: 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20  GLOB functions. 
b4c0: 20 54 68 65 20 63 61 73 65 53 65 6e 73 69 74 69   The caseSensiti
b4d0: 76 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ve.** parameter 
b4e0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
b4f0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 4c 49  er or not the LI
b500: 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63  KE operator is c
b510: 61 73 65 0a 2a 2a 20 73 65 6e 73 69 74 69 76 65  ase.** sensitive
b520: 2e 20 20 47 4c 4f 42 20 69 73 20 61 6c 77 61 79  .  GLOB is alway
b530: 73 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65  s case sensitive
b540: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b550: 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e  3RegisterLikeFun
b560: 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a  ctions(sqlite3 *
b570: 64 62 2c 20 69 6e 74 20 63 61 73 65 53 65 6e 73  db, int caseSens
b580: 69 74 69 76 65 29 7b 0a 20 20 73 74 72 75 63 74  itive){.  struct
b590: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49   compareInfo *pI
b5a0: 6e 66 6f 3b 0a 20 20 69 66 28 20 63 61 73 65 53  nfo;.  if( caseS
b5b0: 65 6e 73 69 74 69 76 65 20 29 7b 0a 20 20 20 20  ensitive ){.    
b5c0: 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20  pInfo = (struct 
b5d0: 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69  compareInfo*)&li
b5e0: 6b 65 49 6e 66 6f 41 6c 74 3b 0a 20 20 7d 65 6c  keInfoAlt;.  }el
b5f0: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20  se{.    pInfo = 
b600: 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49  (struct compareI
b610: 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 4e 6f  nfo*)&likeInfoNo
b620: 72 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rm;.  }.  sqlite
b630: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
b640: 22 6c 69 6b 65 22 2c 20 32 2c 20 53 51 4c 49 54  "like", 2, SQLIT
b650: 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c  E_UTF8, pInfo, l
b660: 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30  ikeFunc, 0, 0, 0
b670: 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61  );.  sqlite3Crea
b680: 74 65 46 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65  teFunc(db, "like
b690: 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 3, SQLITE_UTF
b6a0: 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75  8, pInfo, likeFu
b6b0: 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nc, 0, 0, 0);.  
b6c0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
b6d0: 63 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20 32 2c  c(db, "glob", 2,
b6e0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
b6f0: 20 20 20 20 20 28 73 74 72 75 63 74 20 63 6f 6d       (struct com
b700: 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c 6f 62 49  pareInfo*)&globI
b710: 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30  nfo, likeFunc, 0
b720: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 65 74 4c 69  , 0, 0);.  setLi
b730: 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22 67  keOptFlag(db, "g
b740: 6c 6f 62 22 2c 20 53 51 4c 49 54 45 5f 46 55 4e  lob", SQLITE_FUN
b750: 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f  C_LIKE | SQLITE_
b760: 46 55 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73 65  FUNC_CASE);.  se
b770: 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c  tLikeOptFlag(db,
b780: 20 22 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20 20   "like", .      
b790: 63 61 73 65 53 65 6e 73 69 74 69 76 65 20 3f 20  caseSensitive ? 
b7a0: 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b  (SQLITE_FUNC_LIK
b7b0: 45 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  E | SQLITE_FUNC_
b7c0: 43 41 53 45 29 20 3a 20 53 51 4c 49 54 45 5f 46  CASE) : SQLITE_F
b7d0: 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f 2a  UNC_LIKE);.}../*
b7e0: 0a 2a 2a 20 70 45 78 70 72 20 70 6f 69 6e 74 73  .** pExpr points
b7f0: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
b800: 6e 20 77 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e  n which implemen
b810: 74 73 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ts a function.  
b820: 49 66 0a 2a 2a 20 69 74 20 69 73 20 61 70 70 72  If.** it is appr
b830: 6f 70 72 69 61 74 65 20 74 6f 20 61 70 70 6c 79  opriate to apply
b840: 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69   the LIKE optimi
b850: 7a 61 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 66  zation to that f
b860: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20  unction.** then 
b870: 73 65 74 20 61 57 63 5b 30 5d 20 74 68 72 6f 75  set aWc[0] throu
b880: 67 68 20 61 57 63 5b 32 5d 20 74 6f 20 74 68 65  gh aWc[2] to the
b890: 20 77 69 6c 64 63 61 72 64 20 63 68 61 72 61 63   wildcard charac
b8a0: 74 65 72 73 20 61 6e 64 0a 2a 2a 20 72 65 74 75  ters and.** retu
b8b0: 72 6e 20 54 52 55 45 2e 20 20 49 66 20 74 68 65  rn TRUE.  If the
b8c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
b8d0: 20 61 20 4c 49 4b 45 2d 73 74 79 6c 65 20 66 75   a LIKE-style fu
b8e0: 6e 63 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20 72  nction then.** r
b8f0: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a  eturn FALSE..*/.
b900: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 4c 69 6b  int sqlite3IsLik
b910: 65 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65  eFunction(sqlite
b920: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 45 78  3 *db, Expr *pEx
b930: 70 72 2c 20 69 6e 74 20 2a 70 49 73 4e 6f 63 61  pr, int *pIsNoca
b940: 73 65 2c 20 63 68 61 72 20 2a 61 57 63 29 7b 0a  se, char *aWc){.
b950: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
b960: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
b970: 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 0a 20  !=TK_FUNCTION . 
b980: 20 20 7c 7c 20 21 70 45 78 70 72 2d 3e 78 2e 70    || !pExpr->x.p
b990: 4c 69 73 74 20 0a 20 20 20 7c 7c 20 70 45 78 70  List .   || pExp
b9a0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
b9b0: 72 21 3d 32 0a 20 20 29 7b 0a 20 20 20 20 72 65  r!=2.  ){.    re
b9c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73  turn 0;.  }.  as
b9d0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
b9e0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
b9f0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
ba00: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
ba10: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
ba20: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
ba30: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
ba50: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
ba60: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c  Expr->u.zToken),
ba70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c                2,
ba90: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
baa0: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 44  ;.  if( NEVER(pD
bab0: 65 66 3d 3d 30 29 20 7c 7c 20 28 70 44 65 66 2d  ef==0) || (pDef-
bac0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
bad0: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3d 3d  ITE_FUNC_LIKE)==
bae0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
baf0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
bb00: 20 6d 65 6d 63 70 79 28 29 20 73 74 61 74 65 6d   memcpy() statem
bb10: 65 6e 74 20 61 73 73 75 6d 65 73 20 74 68 61 74  ent assumes that
bb20: 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68   the wildcard ch
bb30: 61 72 61 63 74 65 72 73 20 61 72 65 0a 20 20 2a  aracters are.  *
bb40: 2a 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  * the first thre
bb50: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  e statements in 
bb60: 74 68 65 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  the compareInfo 
bb70: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 0a  structure.  The.
bb80: 20 20 2a 2a 20 61 73 73 65 72 74 73 28 29 20 74    ** asserts() t
bb90: 68 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72 69 66  hat follow verif
bba0: 79 20 74 68 61 74 20 61 73 73 75 6d 70 74 69 6f  y that assumptio
bbb0: 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  n.  */.  memcpy(
bbc0: 61 57 63 2c 20 70 44 65 66 2d 3e 70 55 73 65 72  aWc, pDef->pUser
bbd0: 44 61 74 61 2c 20 33 29 3b 0a 20 20 61 73 73 65  Data, 3);.  asse
bbe0: 72 74 28 20 28 63 68 61 72 2a 29 26 6c 69 6b 65  rt( (char*)&like
bbf0: 49 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68 61 72  InfoAlt == (char
bc00: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d  *)&likeInfoAlt.m
bc10: 61 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61 73 73  atchAll );.  ass
bc20: 65 72 74 28 20 26 28 28 63 68 61 72 2a 29 26 6c  ert( &((char*)&l
bc30: 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d 20 3d  ikeInfoAlt)[1] =
bc40: 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  = (char*)&likeIn
bc50: 66 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65 20 29  foAlt.matchOne )
bc60: 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28 28 63  ;.  assert( &((c
bc70: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
bc80: 74 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72 2a 29  t)[2] == (char*)
bc90: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74  &likeInfoAlt.mat
bca0: 63 68 53 65 74 20 29 3b 0a 20 20 2a 70 49 73 4e  chSet );.  *pIsN
bcb0: 6f 63 61 73 65 20 3d 20 28 70 44 65 66 2d 3e 66  ocase = (pDef->f
bcc0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
bcd0: 45 5f 46 55 4e 43 5f 43 41 53 45 29 3d 3d 30 3b  E_FUNC_CASE)==0;
bce0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
bcf0: 2f 2a 0a 2a 2a 20 41 6c 6c 20 61 6c 6c 20 6f 66  /*.** All all of
bd00: 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74 72   the FuncDef str
bd10: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 61  uctures in the a
bd20: 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 61 72  BuiltinFunc[] ar
bd30: 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20  ray above.** to 
bd40: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
bd50: 69 6f 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 20  ion hash table. 
bd60: 20 54 68 69 73 20 6f 63 63 75 72 73 20 61 74 20   This occurs at 
bd70: 73 74 61 72 74 2d 74 69 6d 65 20 28 61 73 0a 2a  start-time (as.*
bd80: 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  * a consequence 
bd90: 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  of calling sqlit
bda0: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 29  e3_initialize())
bdb0: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
bdc0: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 0a  is routine runs.
bdd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
bde0: 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e  egisterGlobalFun
bdf0: 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20  ctions(void){.  
be00: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  /*.  ** The foll
be10: 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64  owing array hold
be20: 73 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  s FuncDef struct
be30: 75 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  ures for all of 
be40: 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20  the functions.  
be50: 2a 2a 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ** defined in th
be60: 69 73 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20  is file..  **.  
be70: 2a 2a 20 54 68 65 20 61 72 72 61 79 20 63 61 6e  ** The array can
be80: 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20  not be constant 
be90: 73 69 6e 63 65 20 63 68 61 6e 67 65 73 20 61 72  since changes ar
bea0: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 0a 20 20  e made to the.  
beb0: 2a 2a 20 46 75 6e 63 44 65 66 2e 70 48 61 73 68  ** FuncDef.pHash
bec0: 20 65 6c 65 6d 65 6e 74 73 20 61 74 20 73 74 61   elements at sta
bed0: 72 74 2d 74 69 6d 65 2e 20 20 54 68 65 20 65 6c  rt-time.  The el
bee0: 65 6d 65 6e 74 73 20 6f 66 20 74 68 69 73 20 61  ements of this a
bef0: 72 72 61 79 0a 20 20 2a 2a 20 61 72 65 20 72 65  rray.  ** are re
bf00: 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 69 6e  ad-only after in
bf10: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69 73 20  itialization is 
bf20: 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a 2f 0a 20  complete..  */. 
bf30: 20 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 57   static SQLITE_W
bf40: 53 44 20 46 75 6e 63 44 65 66 20 61 42 75 69 6c  SD FuncDef aBuil
bf50: 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20  tinFunc[] = {.  
bf60: 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d    FUNCTION(ltrim
bf70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
bf80: 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 1, 0, trimFunc
bf90: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
bfa0: 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20  FUNCTION(ltrim, 
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
bfc0: 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20  1, 0, trimFunc  
bfd0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
bfe0: 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20  NCTION(rtrim,   
bff0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 32 2c             1, 2,
c000: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
c010: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
c020: 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20 20  TION(rtrim,     
c030: 20 20 20 20 20 20 20 20 20 32 2c 20 32 2c 20 30           2, 2, 0
c040: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
c050: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
c060: 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20  ON(trim,        
c070: 20 20 20 20 20 20 20 31 2c 20 33 2c 20 30 2c 20         1, 3, 0, 
c080: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
c090: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
c0a0: 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20  (trim,          
c0b0: 20 20 20 20 20 32 2c 20 33 2c 20 30 2c 20 74 72       2, 3, 0, tr
c0c0: 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29  imFunc         )
c0d0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d  ,.    FUNCTION(m
c0e0: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
c0f0: 20 20 2d 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d    -1, 0, 1, minm
c100: 61 78 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  axFunc       ),.
c110: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e      FUNCTION(min
c120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c130: 20 30 2c 20 30 2c 20 31 2c 20 30 20 20 20 20 20   0, 0, 1, 0     
c140: 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20             ),.  
c150: 20 20 41 47 47 52 45 47 41 54 45 28 6d 69 6e 2c    AGGREGATE(min,
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
c170: 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74  , 0, 1, minmaxSt
c180: 65 70 2c 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  ep,      minMaxF
c190: 69 6e 61 6c 69 7a 65 20 29 2c 0a 20 20 20 20 46  inalize ),.    F
c1a0: 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20  UNCTION(max,    
c1b0: 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 31             -1, 1
c1c0: 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20  , 1, minmaxFunc 
c1d0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
c1e0: 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20  CTION(max,      
c1f0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c 20            0, 1, 
c200: 31 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  1, 0            
c210: 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45      ),.    AGGRE
c220: 47 41 54 45 28 6d 61 78 2c 20 20 20 20 20 20 20  GATE(max,       
c230: 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20 31 2c          1, 1, 1,
c240: 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20 20 20   minmaxStep,    
c250: 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65    minMaxFinalize
c260: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
c270: 32 28 74 79 70 65 6f 66 2c 20 20 20 20 20 20 20  2(typeof,       
c280: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 74 79       1, 0, 0, ty
c290: 70 65 6f 66 46 75 6e 63 2c 20 20 53 51 4c 49 54  peofFunc,  SQLIT
c2a0: 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 2c 0a  E_FUNC_TYPEOF),.
c2b0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 6c 65      FUNCTION2(le
c2c0: 6e 67 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  ngth,           
c2d0: 20 31 2c 20 30 2c 20 30 2c 20 6c 65 6e 67 74 68   1, 0, 0, length
c2e0: 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55  Func,  SQLITE_FU
c2f0: 4e 43 5f 4c 45 4e 47 54 48 29 2c 0a 20 20 20 20  NC_LENGTH),.    
c300: 46 55 4e 43 54 49 4f 4e 28 69 6e 73 74 72 2c 20  FUNCTION(instr, 
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
c320: 30 2c 20 30 2c 20 69 6e 73 74 72 46 75 6e 63 20  0, 0, instrFunc 
c330: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
c340: 4e 43 54 49 4f 4e 28 73 75 62 73 74 72 2c 20 20  NCTION(substr,  
c350: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
c360: 20 30 2c 20 73 75 62 73 74 72 46 75 6e 63 20 20   0, substrFunc  
c370: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
c380: 54 49 4f 4e 28 73 75 62 73 74 72 2c 20 20 20 20  TION(substr,    
c390: 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c 20 30           3, 0, 0
c3a0: 2c 20 73 75 62 73 74 72 46 75 6e 63 20 20 20 20  , substrFunc    
c3b0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
c3c0: 4f 4e 28 70 72 69 6e 74 66 2c 20 20 20 20 20 20  ON(printf,      
c3d0: 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20        -1, 0, 0, 
c3e0: 70 72 69 6e 74 66 46 75 6e 63 20 20 20 20 20 20  printfFunc      
c3f0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
c400: 28 75 6e 69 63 6f 64 65 2c 20 20 20 20 20 20 20  (unicode,       
c410: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 75 6e       1, 0, 0, un
c420: 69 63 6f 64 65 46 75 6e 63 20 20 20 20 20 20 29  icodeFunc      )
c430: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63  ,.    FUNCTION(c
c440: 68 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  har,            
c450: 20 20 2d 31 2c 20 30 2c 20 30 2c 20 63 68 61 72    -1, 0, 0, char
c460: 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a  Func         ),.
c470: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 61 62 73      FUNCTION(abs
c480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c490: 20 31 2c 20 30 2c 20 30 2c 20 61 62 73 46 75 6e   1, 0, 0, absFun
c4a0: 63 20 20 20 20 20 20 20 20 20 20 29 2c 0a 23 69  c          ),.#i
c4b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c4c0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
c4d0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f  .    FUNCTION(ro
c4e0: 75 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  und,            
c4f0: 20 20 31 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64    1, 0, 0, round
c500: 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20  Func        ),. 
c510: 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e     FUNCTION(roun
c520: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
c530: 32 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75  2, 0, 0, roundFu
c540: 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 23 65 6e  nc        ),.#en
c550: 64 69 66 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e  dif.    FUNCTION
c560: 28 75 70 70 65 72 2c 20 20 20 20 20 20 20 20 20  (upper,         
c570: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 75 70       1, 0, 0, up
c580: 70 65 72 46 75 6e 63 20 20 20 20 20 20 20 20 29  perFunc        )
c590: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c  ,.    FUNCTION(l
c5a0: 6f 77 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ower,           
c5b0: 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 77 65     1, 0, 0, lowe
c5c0: 72 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a  rFunc        ),.
c5d0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61      FUNCTION(coa
c5e0: 6c 65 73 63 65 2c 20 20 20 20 20 20 20 20 20 20  lesce,          
c5f0: 20 31 2c 20 30 2c 20 30 2c 20 30 20 20 20 20 20   1, 0, 0, 0     
c600: 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20             ),.  
c610: 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65    FUNCTION(coale
c620: 73 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 30  sce,           0
c630: 2c 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20  , 0, 0, 0       
c640: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
c650: 46 55 4e 43 54 49 4f 4e 32 28 63 6f 61 6c 65 73  FUNCTION2(coales
c660: 63 65 2c 20 20 20 20 20 20 20 20 20 2d 31 2c 20  ce,         -1, 
c670: 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20  0, 0, noopFunc, 
c680: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41   SQLITE_FUNC_COA
c690: 4c 45 53 43 45 29 2c 0a 20 20 20 20 46 55 4e 43  LESCE),.    FUNC
c6a0: 54 49 4f 4e 28 68 65 78 2c 20 20 20 20 20 20 20  TION(hex,       
c6b0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
c6c0: 2c 20 68 65 78 46 75 6e 63 20 20 20 20 20 20 20  , hexFunc       
c6d0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
c6e0: 4f 4e 32 28 69 66 6e 75 6c 6c 2c 20 20 20 20 20  ON2(ifnull,     
c6f0: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20         2, 0, 0, 
c700: 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54  noopFunc,  SQLIT
c710: 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 29  E_FUNC_COALESCE)
c720: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28  ,.    FUNCTION2(
c730: 75 6e 6c 69 6b 65 6c 79 2c 20 20 20 20 20 20 20  unlikely,       
c740: 20 20 20 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70     1, 0, 0, noop
c750: 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55  Func,  SQLITE_FU
c760: 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29 2c 0a 20 20  NC_UNLIKELY),.  
c770: 20 20 46 55 4e 43 54 49 4f 4e 32 28 6c 69 6b 65    FUNCTION2(like
c780: 6c 69 68 6f 6f 64 2c 20 20 20 20 20 20 20 20 32  lihood,        2
c790: 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63  , 0, 0, noopFunc
c7a0: 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55  ,  SQLITE_FUNC_U
c7b0: 4e 4c 49 4b 45 4c 59 29 2c 0a 20 20 20 20 56 46  NLIKELY),.    VF
c7c0: 55 4e 43 54 49 4f 4e 28 72 61 6e 64 6f 6d 2c 20  UNCTION(random, 
c7d0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
c7e0: 20 30 2c 20 72 61 6e 64 6f 6d 46 75 6e 63 20 20   0, randomFunc  
c7f0: 20 20 20 20 20 29 2c 0a 20 20 20 20 56 46 55 4e       ),.    VFUN
c800: 43 54 49 4f 4e 28 72 61 6e 64 6f 6d 62 6c 6f 62  CTION(randomblob
c810: 2c 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30  ,        1, 0, 0
c820: 2c 20 72 61 6e 64 6f 6d 42 6c 6f 62 20 20 20 20  , randomBlob    
c830: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
c840: 4f 4e 28 6e 75 6c 6c 69 66 2c 20 20 20 20 20 20  ON(nullif,      
c850: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 31 2c 20         2, 0, 1, 
c860: 6e 75 6c 6c 69 66 46 75 6e 63 20 20 20 20 20 20  nullifFunc      
c870: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
c880: 28 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 2c  (sqlite_version,
c890: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 76 65       0, 0, 0, ve
c8a0: 72 73 69 6f 6e 46 75 6e 63 20 20 20 20 20 20 29  rsionFunc      )
c8b0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73  ,.    FUNCTION(s
c8c0: 71 6c 69 74 65 5f 73 6f 75 72 63 65 5f 69 64 2c  qlite_source_id,
c8d0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 73 6f 75 72     0, 0, 0, sour
c8e0: 63 65 69 64 46 75 6e 63 20 20 20 20 20 29 2c 0a  ceidFunc     ),.
c8f0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c      FUNCTION(sql
c900: 69 74 65 5f 6c 6f 67 2c 20 20 20 20 20 20 20 20  ite_log,        
c910: 20 32 2c 20 30 2c 20 30 2c 20 65 72 72 6c 6f 67   2, 0, 0, errlog
c920: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 23 69  Func       ),.#i
c930: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c940: 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f  T_COMPILEOPTION_
c950: 44 49 41 47 53 0a 20 20 20 20 46 55 4e 43 54 49  DIAGS.    FUNCTI
c960: 4f 4e 28 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c  ON(sqlite_compil
c970: 65 6f 70 74 69 6f 6e 5f 75 73 65 64 2c 31 2c 20  eoption_used,1, 
c980: 30 2c 20 30 2c 20 63 6f 6d 70 69 6c 65 6f 70 74  0, 0, compileopt
c990: 69 6f 6e 75 73 65 64 46 75 6e 63 20 20 29 2c 0a  ionusedFunc  ),.
c9a0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c      FUNCTION(sql
c9b0: 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  ite_compileoptio
c9c0: 6e 5f 67 65 74 2c 20 31 2c 20 30 2c 20 30 2c 20  n_get, 1, 0, 0, 
c9d0: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74  compileoptionget
c9e0: 46 75 6e 63 20 20 29 2c 0a 23 65 6e 64 69 66 20  Func  ),.#endif 
c9f0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
ca00: 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41  OMPILEOPTION_DIA
ca10: 47 53 20 2a 2f 0a 20 20 20 20 46 55 4e 43 54 49  GS */.    FUNCTI
ca20: 4f 4e 28 71 75 6f 74 65 2c 20 20 20 20 20 20 20  ON(quote,       
ca30: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
ca40: 71 75 6f 74 65 46 75 6e 63 20 20 20 20 20 20 20  quoteFunc       
ca50: 20 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f   ),.    VFUNCTIO
ca60: 4e 28 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  N(last_insert_ro
ca70: 77 69 64 2c 20 30 2c 20 30 2c 20 30 2c 20 6c 61  wid, 0, 0, 0, la
ca80: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 29  st_insert_rowid)
ca90: 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28  ,.    VFUNCTION(
caa0: 63 68 61 6e 67 65 73 2c 20 20 20 20 20 20 20 20  changes,        
cab0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 63 68 61 6e     0, 0, 0, chan
cac0: 67 65 73 20 20 20 20 20 20 20 20 20 20 29 2c 0a  ges          ),.
cad0: 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 74 6f      VFUNCTION(to
cae0: 74 61 6c 5f 63 68 61 6e 67 65 73 2c 20 20 20 20  tal_changes,    
caf0: 20 30 2c 20 30 2c 20 30 2c 20 74 6f 74 61 6c 5f   0, 0, 0, total_
cb00: 63 68 61 6e 67 65 73 20 20 20 20 29 2c 0a 20 20  changes    ),.  
cb10: 20 20 46 55 4e 43 54 49 4f 4e 28 72 65 70 6c 61    FUNCTION(repla
cb20: 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 33  ce,            3
cb30: 2c 20 30 2c 20 30 2c 20 72 65 70 6c 61 63 65 46  , 0, 0, replaceF
cb40: 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20  unc      ),.    
cb50: 46 55 4e 43 54 49 4f 4e 28 7a 65 72 6f 62 6c 6f  FUNCTION(zeroblo
cb60: 62 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  b,           1, 
cb70: 30 2c 20 30 2c 20 7a 65 72 6f 62 6c 6f 62 46 75  0, 0, zeroblobFu
cb80: 6e 63 20 20 20 20 20 29 2c 0a 20 20 23 69 66 64  nc     ),.  #ifd
cb90: 65 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45  ef SQLITE_SOUNDE
cba0: 58 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73  X.    FUNCTION(s
cbb0: 6f 75 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  oundex,         
cbc0: 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 6f 75 6e     1, 0, 0, soun
cbd0: 64 65 78 46 75 6e 63 20 20 20 20 20 20 29 2c 0a  dexFunc      ),.
cbe0: 20 20 23 65 6e 64 69 66 0a 20 20 23 69 66 6e 64    #endif.  #ifnd
cbf0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
cc00: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
cc10: 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f    FUNCTION(load_
cc20: 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 31  extension,     1
cc30: 2c 20 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20  , 0, 0, loadExt 
cc40: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
cc50: 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78  FUNCTION(load_ex
cc60: 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 32 2c 20  tension,     2, 
cc70: 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20  0, 0, loadExt   
cc80: 20 20 20 20 20 20 20 29 2c 0a 20 20 23 65 6e 64         ),.  #end
cc90: 69 66 0a 20 20 20 20 41 47 47 52 45 47 41 54 45  if.    AGGREGATE
cca0: 28 73 75 6d 2c 20 20 20 20 20 20 20 20 20 20 20  (sum,           
ccb0: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d      1, 0, 0, sum
ccc0: 53 74 65 70 2c 20 20 20 20 20 20 20 20 20 73 75  Step,         su
ccd0: 6d 46 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a  mFinalize    ),.
cce0: 20 20 20 20 41 47 47 52 45 47 41 54 45 28 74 6f      AGGREGATE(to
ccf0: 74 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  tal,            
cd00: 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65   1, 0, 0, sumSte
cd10: 70 2c 20 20 20 20 20 20 20 20 20 74 6f 74 61 6c  p,         total
cd20: 46 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20  Finalize    ),. 
cd30: 20 20 20 41 47 47 52 45 47 41 54 45 28 61 76 67     AGGREGATE(avg
cd40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
cd50: 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70  1, 0, 0, sumStep
cd60: 2c 20 20 20 20 20 20 20 20 20 61 76 67 46 69 6e  ,         avgFin
cd70: 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 2f 2a 20  alize    ),. /* 
cd80: 41 47 47 52 45 47 41 54 45 28 63 6f 75 6e 74 2c  AGGREGATE(count,
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
cda0: 30 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c  0, 0, countStep,
cdb0: 20 20 20 20 20 20 20 63 6f 75 6e 74 46 69 6e 61         countFina
cdc0: 6c 69 7a 65 20 20 29 2c 20 2a 2f 0a 20 20 20 20  lize  ), */.    
cdd0: 7b 30 2c 53 51 4c 49 54 45 5f 55 54 46 38 7c 53  {0,SQLITE_UTF8|S
cde0: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54  QLITE_FUNC_COUNT
cdf0: 2c 30 2c 30 2c 30 2c 63 6f 75 6e 74 53 74 65 70  ,0,0,0,countStep
ce00: 2c 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 22  ,countFinalize,"
ce10: 63 6f 75 6e 74 22 2c 30 2c 30 7d 2c 0a 20 20 20  count",0,0},.   
ce20: 20 41 47 47 52 45 47 41 54 45 28 63 6f 75 6e 74   AGGREGATE(count
ce30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  ,             1,
ce40: 20 30 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65 70   0, 0, countStep
ce50: 2c 20 20 20 20 20 20 20 63 6f 75 6e 74 46 69 6e  ,       countFin
ce60: 61 6c 69 7a 65 20 20 29 2c 0a 20 20 20 20 41 47  alize  ),.    AG
ce70: 47 52 45 47 41 54 45 28 67 72 6f 75 70 5f 63 6f  GREGATE(group_co
ce80: 6e 63 61 74 2c 20 20 20 20 20 20 31 2c 20 30 2c  ncat,      1, 0,
ce90: 20 30 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 53   0, groupConcatS
cea0: 74 65 70 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74  tep, groupConcat
ceb0: 46 69 6e 61 6c 69 7a 65 29 2c 0a 20 20 20 20 41  Finalize),.    A
cec0: 47 47 52 45 47 41 54 45 28 67 72 6f 75 70 5f 63  GGREGATE(group_c
ced0: 6f 6e 63 61 74 2c 20 20 20 20 20 20 32 2c 20 30  oncat,      2, 0
cee0: 2c 20 30 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74  , 0, groupConcat
cef0: 53 74 65 70 2c 20 67 72 6f 75 70 43 6f 6e 63 61  Step, groupConca
cf00: 74 46 69 6e 61 6c 69 7a 65 29 2c 0a 20 20 0a 20  tFinalize),.  . 
cf10: 20 20 20 4c 49 4b 45 46 55 4e 43 28 67 6c 6f 62     LIKEFUNC(glob
cf20: 2c 20 32 2c 20 26 67 6c 6f 62 49 6e 66 6f 2c 20  , 2, &globInfo, 
cf30: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
cf40: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53  |SQLITE_FUNC_CAS
cf50: 45 29 2c 0a 20 20 23 69 66 64 65 66 20 53 51 4c  E),.  #ifdef SQL
cf60: 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49  ITE_CASE_SENSITI
cf70: 56 45 5f 4c 49 4b 45 0a 20 20 20 20 4c 49 4b 45  VE_LIKE.    LIKE
cf80: 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c 20 26 6c  FUNC(like, 2, &l
cf90: 69 6b 65 49 6e 66 6f 41 6c 74 2c 20 53 51 4c 49  ikeInfoAlt, SQLI
cfa0: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c  TE_FUNC_LIKE|SQL
cfb0: 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a  ITE_FUNC_CASE),.
cfc0: 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b      LIKEFUNC(lik
cfd0: 65 2c 20 33 2c 20 26 6c 69 6b 65 49 6e 66 6f 41  e, 3, &likeInfoA
cfe0: 6c 74 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  lt, SQLITE_FUNC_
cff0: 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43  LIKE|SQLITE_FUNC
d000: 5f 43 41 53 45 29 2c 0a 20 20 23 65 6c 73 65 0a  _CASE),.  #else.
d010: 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b      LIKEFUNC(lik
d020: 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e  e, 2, &likeInfoN
d030: 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  orm, SQLITE_FUNC
d040: 5f 4c 49 4b 45 29 2c 0a 20 20 20 20 4c 49 4b 45  _LIKE),.    LIKE
d050: 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c 20 26 6c  FUNC(like, 3, &l
d060: 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c  ikeInfoNorm, SQL
d070: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a  ITE_FUNC_LIKE),.
d080: 20 20 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 0a 20    #endif.  };.. 
d090: 20 69 6e 74 20 69 3b 0a 20 20 46 75 6e 63 44 65   int i;.  FuncDe
d0a0: 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26  fHash *pHash = &
d0b0: 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48 61  GLOBAL(FuncDefHa
d0c0: 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  sh, sqlite3Globa
d0d0: 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 46  lFunctions);.  F
d0e0: 75 6e 63 44 65 66 20 2a 61 46 75 6e 63 20 3d 20  uncDef *aFunc = 
d0f0: 28 46 75 6e 63 44 65 66 2a 29 26 47 4c 4f 42 41  (FuncDef*)&GLOBA
d100: 4c 28 46 75 6e 63 44 65 66 2c 20 61 42 75 69 6c  L(FuncDef, aBuil
d110: 74 69 6e 46 75 6e 63 29 3b 0a 0a 20 20 66 6f 72  tinFunc);..  for
d120: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
d130: 65 28 61 42 75 69 6c 74 69 6e 46 75 6e 63 29 3b  e(aBuiltinFunc);
d140: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
d150: 65 33 46 75 6e 63 44 65 66 49 6e 73 65 72 74 28  e3FuncDefInsert(
d160: 70 48 61 73 68 2c 20 26 61 46 75 6e 63 5b 69 5d  pHash, &aFunc[i]
d170: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
d180: 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d 65  RegisterDateTime
d190: 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 69 66  Functions();.#if
d1a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d1b0: 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 73 71  _ALTERTABLE.  sq
d1c0: 6c 69 74 65 33 41 6c 74 65 72 46 75 6e 63 74 69  lite3AlterFuncti
d1d0: 6f 6e 73 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ons();.#endif.#i
d1e0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
d1f0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 7c  _ENABLE_STAT3) |
d200: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
d210: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 0a 20  _ENABLE_STAT4). 
d220: 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 46   sqlite3AnalyzeF
d230: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 65 6e 64  unctions();.#end
d240: 69 66 0a 7d 0a                                   if.}.