/ Hex Artifact Content
Login

Artifact f4499b39d66b71825514334ce67b32ff14bd19f5:


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 20 29 3b 0a 20 20 69 66 28 20  argc*4 );.  if( 
71d0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  z==0 ){.    sqli
71e0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
71f0: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
7200: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7210: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
7220: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  gc; i++){.    sq
7230: 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20  lite3_int64 x;. 
7240: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 3b 0a 20     unsigned c;. 
7250: 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 76     x = sqlite3_v
7260: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
7270: 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 78 3c 30  i]);.    if( x<0
7280: 20 7c 7c 20 78 3e 30 78 31 30 66 66 66 66 20 29   || x>0x10ffff )
7290: 20 78 20 3d 20 30 78 66 66 66 64 3b 0a 20 20 20   x = 0xfffd;.   
72a0: 20 63 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 28   c = (unsigned)(
72b0: 78 20 26 20 30 78 31 66 66 66 66 66 29 3b 0a 20  x & 0x1fffff);. 
72c0: 20 20 20 69 66 28 20 63 3c 30 78 30 30 30 38 30     if( c<0x00080
72d0: 20 29 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b   ){.      *zOut+
72e0: 2b 20 3d 20 28 75 38 29 28 63 26 30 78 46 46 29  + = (u8)(c&0xFF)
72f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7300: 63 3c 30 78 30 30 38 30 30 20 29 7b 0a 20 20 20  c<0x00800 ){.   
7310: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 43     *zOut++ = 0xC
7320: 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 36 29 26  0 + (u8)((c>>6)&
7330: 30 78 31 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f  0x1F);.      *zO
7340: 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75  ut++ = 0x80 + (u
7350: 38 29 28 63 20 26 20 30 78 33 46 29 3b 0a 20 20  8)(c & 0x3F);.  
7360: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c 30 78    }else if( c<0x
7370: 31 30 30 30 30 20 29 7b 0a 20 20 20 20 20 20 2a  10000 ){.      *
7380: 7a 4f 75 74 2b 2b 20 3d 20 30 78 45 30 20 2b 20  zOut++ = 0xE0 + 
7390: 28 75 38 29 28 28 63 3e 3e 31 32 29 26 30 78 30  (u8)((c>>12)&0x0
73a0: 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b  F);.      *zOut+
73b0: 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28  + = 0x80 + (u8)(
73c0: 28 63 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 0a  (c>>6) & 0x3F);.
73d0: 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20        *zOut++ = 
73e0: 30 78 38 30 20 2b 20 28 75 38 29 28 63 20 26 20  0x80 + (u8)(c & 
73f0: 30 78 33 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0x3F);.    }else
7400: 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20  {.      *zOut++ 
7410: 3d 20 30 78 46 30 20 2b 20 28 75 38 29 28 28 63  = 0xF0 + (u8)((c
7420: 3e 3e 31 38 29 20 26 20 30 78 30 37 29 3b 0a 20  >>18) & 0x07);. 
7430: 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30       *zOut++ = 0
7440: 78 38 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 31  x80 + (u8)((c>>1
7450: 32 29 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20  2) & 0x3F);.    
7460: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30    *zOut++ = 0x80
7470: 20 2b 20 28 75 38 29 28 28 63 3e 3e 36 29 20 26   + (u8)((c>>6) &
7480: 20 30 78 33 46 29 3b 0a 20 20 20 20 20 20 2a 7a   0x3F);.      *z
7490: 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28  Out++ = 0x80 + (
74a0: 75 38 29 28 63 20 26 20 30 78 33 46 29 3b 0a 20  u8)(c & 0x3F);. 
74b0: 20 20 20 7d 20 20 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 5c 0a 20 20 7d 0a 20 20          \.  }.  
74f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
7500: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  ext(context, (ch
7510: 61 72 2a 29 7a 2c 20 28 69 6e 74 29 28 7a 4f 75  ar*)z, (int)(zOu
7520: 74 2d 7a 29 2c 20 73 71 6c 69 74 65 33 5f 66 72  t-z), sqlite3_fr
7530: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ee);.}../*.** Th
7540: 65 20 68 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  e hex() function
7550: 2e 20 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  .  Interpret the
7560: 20 61 72 67 75 6d 65 6e 74 20 61 73 20 61 20 62   argument as a b
7570: 6c 6f 62 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  lob.  Return.** 
7580: 61 20 68 65 78 61 64 65 63 69 6d 61 6c 20 72 65  a hexadecimal re
7590: 6e 64 65 72 69 6e 67 20 61 73 20 74 65 78 74 2e  ndering as text.
75a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
75b0: 68 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  hexFunc(.  sqlit
75c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
75d0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
75e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
75f0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
7600: 20 69 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75   i, n;.  const u
7610: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
7620: 6c 6f 62 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65  lob;.  char *zHe
7630: 78 2c 20 2a 7a 3b 0a 20 20 61 73 73 65 72 74 28  x, *z;.  assert(
7640: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
7650: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
7660: 72 67 63 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20  rgc);.  pBlob = 
7670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
7680: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e  ob(argv[0]);.  n
7690: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
76a0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
76b0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 6c 6f 62  .  assert( pBlob
76c0: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
76d0: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b  blob(argv[0]) );
76e0: 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67    /* No encoding
76f0: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 20 3d   change */.  z =
7700: 20 7a 48 65 78 20 3d 20 63 6f 6e 74 65 78 74 4d   zHex = contextM
7710: 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28  alloc(context, (
7720: 28 69 36 34 29 6e 29 2a 32 20 2b 20 31 29 3b 0a  (i64)n)*2 + 1);.
7730: 20 20 69 66 28 20 7a 48 65 78 20 29 7b 0a 20 20    if( zHex ){.  
7740: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
7750: 69 2b 2b 2c 20 70 42 6c 6f 62 2b 2b 29 7b 0a 20  i++, pBlob++){. 
7760: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
7770: 61 72 20 63 20 3d 20 2a 70 42 6c 6f 62 3b 0a 20  ar c = *pBlob;. 
7780: 20 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65       *(z++) = he
7790: 78 64 69 67 69 74 73 5b 28 63 3e 3e 34 29 26 30  xdigits[(c>>4)&0
77a0: 78 66 5d 3b 0a 20 20 20 20 20 20 2a 28 7a 2b 2b  xf];.      *(z++
77b0: 29 20 3d 20 68 65 78 64 69 67 69 74 73 5b 63 26  ) = hexdigits[c&
77c0: 30 78 66 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  0xf];.    }.    
77d0: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  *z = 0;.    sqli
77e0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
77f0: 63 6f 6e 74 65 78 74 2c 20 7a 48 65 78 2c 20 6e  context, zHex, n
7800: 2a 32 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  *2, sqlite3_free
7810: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7820: 54 68 65 20 7a 65 72 6f 62 6c 6f 62 28 4e 29 20  The zeroblob(N) 
7830: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
7840: 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 62   a zero-filled b
7850: 6c 6f 62 20 6f 66 20 73 69 7a 65 20 4e 20 62 79  lob of size N by
7860: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
7870: 6f 69 64 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63  oid zeroblobFunc
7880: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
7890: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
78a0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
78b0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
78c0: 0a 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 73  .){.  i64 n;.  s
78d0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
78e0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
78f0: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
7900: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
7910: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
7920: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
7930: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
7940: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
7950: 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
7960: 6e 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  n==db->aLimit[SQ
7970: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
7980: 48 5d 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  H] );.  testcase
7990: 28 20 6e 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( n==db->aLimit[
79a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
79b0: 47 54 48 5d 2b 31 20 29 3b 0a 20 20 69 66 28 20  GTH]+1 );.  if( 
79c0: 6e 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  n>db->aLimit[SQL
79d0: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
79e0: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
79f0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f  _result_error_to
7a00: 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20  obig(context);. 
7a10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
7a20: 74 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62  te3_result_zerob
7a30: 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28 69 6e  lob(context, (in
7a40: 74 29 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  t)n); /* IMP: R-
7a50: 30 30 32 39 33 2d 36 34 39 39 34 20 2a 2f 0a 20  00293-64994 */. 
7a60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
7a70: 72 65 70 6c 61 63 65 28 29 20 66 75 6e 63 74 69  replace() functi
7a80: 6f 6e 2e 20 20 54 68 72 65 65 20 61 72 67 75 6d  on.  Three argum
7a90: 65 6e 74 73 20 61 72 65 20 61 6c 6c 20 73 74 72  ents are all str
7aa0: 69 6e 67 73 3a 20 63 61 6c 6c 0a 2a 2a 20 74 68  ings: call.** th
7ab0: 65 6d 20 41 2c 20 42 2c 20 61 6e 64 20 43 2e 20  em A, B, and C. 
7ac0: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  The result is al
7ad0: 73 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  so a string whic
7ae0: 68 20 69 73 20 64 65 72 69 76 65 64 0a 2a 2a 20  h is derived.** 
7af0: 66 72 6f 6d 20 41 20 62 79 20 72 65 70 6c 61 63  from A by replac
7b00: 69 6e 67 20 65 76 65 72 79 20 6f 63 63 75 72 72  ing every occurr
7b10: 65 6e 63 65 20 6f 66 20 42 20 77 69 74 68 20 43  ence of B with C
7b20: 2e 20 20 54 68 65 20 6d 61 74 63 68 0a 2a 2a 20  .  The match.** 
7b30: 6d 75 73 74 20 62 65 20 65 78 61 63 74 2e 20 20  must be exact.  
7b40: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
7b50: 63 65 73 20 61 72 65 20 6e 6f 74 20 75 73 65 64  ces are not used
7b60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7b70: 20 72 65 70 6c 61 63 65 46 75 6e 63 28 0a 20 20   replaceFunc(.  
7b80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7b90: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
7ba0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
7bb0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
7bc0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
7bd0: 20 63 68 61 72 20 2a 7a 53 74 72 3b 20 20 20 20   char *zStr;    
7be0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74      /* The input
7bf0: 20 73 74 72 69 6e 67 20 41 20 2a 2f 0a 20 20 63   string A */.  c
7c00: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
7c10: 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20  ar *zPattern;   
7c20: 20 2f 2a 20 54 68 65 20 70 61 74 74 65 72 6e 20   /* The pattern 
7c30: 73 74 72 69 6e 67 20 42 20 2a 2f 0a 20 20 63 6f  string B */.  co
7c40: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
7c50: 72 20 2a 7a 52 65 70 3b 20 20 20 20 20 20 20 20  r *zRep;        
7c60: 2f 2a 20 54 68 65 20 72 65 70 6c 61 63 65 6d 65  /* The replaceme
7c70: 6e 74 20 73 74 72 69 6e 67 20 43 20 2a 2f 0a 20  nt string C */. 
7c80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7c90: 7a 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  zOut;           
7ca0: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
7cb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 72 3b 20   */.  int nStr; 
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7cd0: 2a 20 53 69 7a 65 20 6f 66 20 7a 53 74 72 20 2a  * Size of zStr *
7ce0: 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e  /.  int nPattern
7cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7d00: 53 69 7a 65 20 6f 66 20 7a 50 61 74 74 65 72 6e  Size of zPattern
7d10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 70 3b 20   */.  int nRep; 
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7d30: 2a 20 53 69 7a 65 20 6f 66 20 7a 52 65 70 20 2a  * Size of zRep *
7d40: 2f 0a 20 20 69 36 34 20 6e 4f 75 74 3b 20 20 20  /.  i64 nOut;   
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d60: 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  Maximum size of 
7d70: 7a 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  zOut */.  int lo
7d80: 6f 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  opLimit;        
7d90: 20 20 20 2f 2a 20 4c 61 73 74 20 7a 53 74 72 5b     /* Last zStr[
7da0: 5d 20 74 68 61 74 20 6d 69 67 68 74 20 6d 61 74  ] that might mat
7db0: 63 68 20 7a 50 61 74 74 65 72 6e 5b 5d 20 2a 2f  ch zPattern[] */
7dc0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7de0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
7df0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
7e00: 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =3 );.  UNUSED_P
7e10: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
7e20: 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33    zStr = sqlite3
7e30: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
7e40: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 53 74 72  [0]);.  if( zStr
7e50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7e60: 6e 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  nStr = sqlite3_v
7e70: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
7e80: 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  0]);.  assert( z
7e90: 53 74 72 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  Str==sqlite3_val
7ea0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
7eb0: 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64   );  /* No encod
7ec0: 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ing change */.  
7ed0: 7a 50 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74  zPattern = sqlit
7ee0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
7ef0: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50  gv[1]);.  if( zP
7f00: 61 74 74 65 72 6e 3d 3d 30 20 29 7b 0a 20 20 20  attern==0 ){.   
7f10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7f20: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
7f30: 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [1])==SQLITE_NUL
7f40: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
7f50: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7f60: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
7f70: 78 74 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  xt)->mallocFaile
7f80: 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
7f90: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50 61 74 74  .  }.  if( zPatt
7fa0: 65 72 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ern[0]==0 ){.   
7fb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7fc0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
7fd0: 5b 31 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  [1])!=SQLITE_NUL
7fe0: 4c 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  L );.    sqlite3
7ff0: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f  _result_value(co
8000: 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b  ntext, argv[0]);
8010: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8020: 0a 20 20 6e 50 61 74 74 65 72 6e 20 3d 20 73 71  .  nPattern = sq
8030: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8040: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73  s(argv[1]);.  as
8050: 73 65 72 74 28 20 7a 50 61 74 74 65 72 6e 3d 3d  sert( zPattern==
8060: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8070: 78 74 28 61 72 67 76 5b 31 5d 29 20 29 3b 20 20  xt(argv[1]) );  
8080: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
8090: 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 52 65 70 20  hange */.  zRep 
80a0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
80b0: 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20  text(argv[2]);. 
80c0: 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29 20 72   if( zRep==0 ) r
80d0: 65 74 75 72 6e 3b 0a 20 20 6e 52 65 70 20 3d 20  eturn;.  nRep = 
80e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
80f0: 74 65 73 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  tes(argv[2]);.  
8100: 61 73 73 65 72 74 28 20 7a 52 65 70 3d 3d 73 71  assert( zRep==sq
8110: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
8120: 28 61 72 67 76 5b 32 5d 29 20 29 3b 0a 20 20 6e  (argv[2]) );.  n
8130: 4f 75 74 20 3d 20 6e 53 74 72 20 2b 20 31 3b 0a  Out = nStr + 1;.
8140: 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3c 53    assert( nOut<S
8150: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
8160: 20 29 3b 0a 20 20 7a 4f 75 74 20 3d 20 63 6f 6e   );.  zOut = con
8170: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
8180: 78 74 2c 20 28 69 36 34 29 6e 4f 75 74 29 3b 0a  xt, (i64)nOut);.
8190: 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b    if( zOut==0 ){
81a0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
81b0: 0a 20 20 6c 6f 6f 70 4c 69 6d 69 74 20 3d 20 6e  .  loopLimit = n
81c0: 53 74 72 20 2d 20 6e 50 61 74 74 65 72 6e 3b 20  Str - nPattern; 
81d0: 20 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69   .  for(i=j=0; i
81e0: 3c 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20 69 2b 2b  <=loopLimit; i++
81f0: 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 74 72 5b  ){.    if( zStr[
8200: 69 5d 21 3d 7a 50 61 74 74 65 72 6e 5b 30 5d 20  i]!=zPattern[0] 
8210: 7c 7c 20 6d 65 6d 63 6d 70 28 26 7a 53 74 72 5b  || memcmp(&zStr[
8220: 69 5d 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e 50  i], zPattern, nP
8230: 61 74 74 65 72 6e 29 20 29 7b 0a 20 20 20 20 20  attern) ){.     
8240: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 53 74   zOut[j++] = zSt
8250: 72 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  r[i];.    }else{
8260: 0a 20 20 20 20 20 20 75 38 20 2a 7a 4f 6c 64 3b  .      u8 *zOld;
8270: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
8280: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
8290: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
82a0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ontext);.      n
82b0: 4f 75 74 20 2b 3d 20 6e 52 65 70 20 2d 20 6e 50  Out += nRep - nP
82c0: 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 74 65  attern;.      te
82d0: 73 74 63 61 73 65 28 20 6e 4f 75 74 2d 31 3d 3d  stcase( nOut-1==
82e0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
82f0: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
8300: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8310: 65 28 20 6e 4f 75 74 2d 32 3d 3d 64 62 2d 3e 61  e( nOut-2==db->a
8320: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8330: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20  IT_LENGTH] );.  
8340: 20 20 20 20 69 66 28 20 6e 4f 75 74 2d 31 3e 64      if( nOut-1>d
8350: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8360: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
8370: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8380: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74  3_result_error_t
8390: 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a  oobig(context);.
83a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
83b0: 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
83c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
83d0: 20 20 7d 0a 20 20 20 20 20 20 7a 4f 6c 64 20 3d    }.      zOld =
83e0: 20 7a 4f 75 74 3b 0a 20 20 20 20 20 20 7a 4f 75   zOut;.      zOu
83f0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  t = sqlite3_real
8400: 6c 6f 63 28 7a 4f 75 74 2c 20 28 69 6e 74 29 6e  loc(zOut, (int)n
8410: 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Out);.      if( 
8420: 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zOut==0 ){.     
8430: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8440: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
8450: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
8460: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c  sqlite3_free(zOl
8470: 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
8480: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
8490: 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a    memcpy(&zOut[j
84a0: 5d 2c 20 7a 52 65 70 2c 20 6e 52 65 70 29 3b 0a  ], zRep, nRep);.
84b0: 20 20 20 20 20 20 6a 20 2b 3d 20 6e 52 65 70 3b        j += nRep;
84c0: 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50 61 74  .      i += nPat
84d0: 74 65 72 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  tern-1;.    }.  
84e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 2b 6e 53  }.  assert( j+nS
84f0: 74 72 2d 69 2b 31 3d 3d 6e 4f 75 74 20 29 3b 0a  tr-i+1==nOut );.
8500: 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a    memcpy(&zOut[j
8510: 5d 2c 20 26 7a 53 74 72 5b 69 5d 2c 20 6e 53 74  ], &zStr[i], nSt
8520: 72 2d 69 29 3b 0a 20 20 6a 20 2b 3d 20 6e 53 74  r-i);.  j += nSt
8530: 72 20 2d 20 69 3b 0a 20 20 61 73 73 65 72 74 28  r - i;.  assert(
8540: 20 6a 3c 3d 6e 4f 75 74 20 29 3b 0a 20 20 7a 4f   j<=nOut );.  zO
8550: 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  ut[j] = 0;.  sql
8560: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
8570: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a  (context, (char*
8580: 29 7a 4f 75 74 2c 20 6a 2c 20 73 71 6c 69 74 65  )zOut, j, sqlite
8590: 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  3_free);.}../*.*
85a0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
85b0: 20 6f 66 20 74 68 65 20 54 52 49 4d 28 29 2c 20   of the TRIM(), 
85c0: 4c 54 52 49 4d 28 29 2c 20 61 6e 64 20 52 54 52  LTRIM(), and RTR
85d0: 49 4d 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  IM() functions..
85e0: 2a 2a 20 54 68 65 20 75 73 65 72 64 61 74 61 20  ** The userdata 
85f0: 69 73 20 30 78 31 20 66 6f 72 20 6c 65 66 74 20  is 0x1 for left 
8600: 74 72 69 6d 2c 20 30 78 32 20 66 6f 72 20 72 69  trim, 0x2 for ri
8610: 67 68 74 20 74 72 69 6d 2c 20 30 78 33 20 66 6f  ght trim, 0x3 fo
8620: 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
8630: 63 20 76 6f 69 64 20 74 72 69 6d 46 75 6e 63 28  c void trimFunc(
8640: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
8650: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
8660: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
8670: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
8680: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
8690: 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 20 20  ned char *zIn;  
86a0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
86b0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73  string */.  cons
86c0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
86d0: 2a 7a 43 68 61 72 53 65 74 3b 20 20 20 20 2f 2a  *zCharSet;    /*
86e0: 20 53 65 74 20 6f 66 20 63 68 61 72 61 63 74 65   Set of characte
86f0: 72 73 20 74 6f 20 74 72 69 6d 20 2a 2f 0a 20 20  rs to trim */.  
8700: 69 6e 74 20 6e 49 6e 3b 20 20 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 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
8730: 79 74 65 73 20 69 6e 20 69 6e 70 75 74 20 2a 2f  ytes in input */
8740: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 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 2f 2a 20 31 3a 20 74 72 69 6d 6c       /* 1: triml
8770: 65 66 74 20 20 32 3a 20 74 72 69 6d 72 69 67 68  eft  2: trimrigh
8780: 74 20 20 33 3a 20 74 72 69 6d 20 2a 2f 0a 20 20  t  3: trim */.  
8790: 69 6e 74 20 69 3b 20 20 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 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
87c0: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
87d0: 63 68 61 72 20 2a 61 4c 65 6e 20 3d 20 30 3b 20  char *aLen = 0; 
87e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
87f0: 74 68 20 6f 66 20 65 61 63 68 20 63 68 61 72 61  th of each chara
8800: 63 74 65 72 20 69 6e 20 7a 43 68 61 72 53 65 74  cter in zCharSet
8810: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
8820: 68 61 72 20 2a 2a 61 7a 43 68 61 72 20 3d 20 30  har **azChar = 0
8830: 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 76  ;       /* Indiv
8840: 69 64 75 61 6c 20 63 68 61 72 61 63 74 65 72 73  idual characters
8850: 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a   in zCharSet */.
8860: 20 20 69 6e 74 20 6e 43 68 61 72 3b 20 20 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 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8890: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
88a0: 43 68 61 72 53 65 74 20 2a 2f 0a 0a 20 20 69 66  CharSet */..  if
88b0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
88c0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53  type(argv[0])==S
88d0: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
88e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
88f0: 7a 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  zIn = sqlite3_va
8900: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
8910: 29 3b 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20  );.  if( zIn==0 
8920: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 49 6e 20  ) return;.  nIn 
8930: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8940: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
8950: 20 20 61 73 73 65 72 74 28 20 7a 49 6e 3d 3d 73    assert( zIn==s
8960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8970: 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20  t(argv[0]) );.  
8980: 69 66 28 20 61 72 67 63 3d 3d 31 20 29 7b 0a 20  if( argc==1 ){. 
8990: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
89a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65  unsigned char le
89b0: 6e 4f 6e 65 5b 5d 20 3d 20 7b 20 31 20 7d 3b 0a  nOne[] = { 1 };.
89c0: 20 20 20 20 73 74 61 74 69 63 20 75 6e 73 69 67      static unsig
89d0: 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
89e0: 20 61 7a 4f 6e 65 5b 5d 20 3d 20 7b 20 28 75 38   azOne[] = { (u8
89f0: 2a 29 22 20 22 20 7d 3b 0a 20 20 20 20 6e 43 68  *)" " };.    nCh
8a00: 61 72 20 3d 20 31 3b 0a 20 20 20 20 61 4c 65 6e  ar = 1;.    aLen
8a10: 20 3d 20 28 75 38 2a 29 6c 65 6e 4f 6e 65 3b 0a   = (u8*)lenOne;.
8a20: 20 20 20 20 61 7a 43 68 61 72 20 3d 20 28 75 6e      azChar = (un
8a30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 29 61  signed char **)a
8a40: 7a 4f 6e 65 3b 0a 20 20 20 20 7a 43 68 61 72 53  zOne;.    zCharS
8a50: 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  et = 0;.  }else 
8a60: 69 66 28 20 28 7a 43 68 61 72 53 65 74 20 3d 20  if( (zCharSet = 
8a70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8a80: 78 74 28 61 72 67 76 5b 31 5d 29 29 3d 3d 30 20  xt(argv[1]))==0 
8a90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
8aa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
8ab0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
8ac0: 2a 7a 3b 0a 20 20 20 20 66 6f 72 28 7a 3d 7a 43  *z;.    for(z=zC
8ad0: 68 61 72 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b  harSet, nChar=0;
8ae0: 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20   *z; nChar++){. 
8af0: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50       SQLITE_SKIP
8b00: 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 7d 0a  _UTF8(z);.    }.
8b10: 20 20 20 20 69 66 28 20 6e 43 68 61 72 3e 30 20      if( nChar>0 
8b20: 29 7b 0a 20 20 20 20 20 20 61 7a 43 68 61 72 20  ){.      azChar 
8b30: 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28  = contextMalloc(
8b40: 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29 6e  context, ((i64)n
8b50: 43 68 61 72 29 2a 28 73 69 7a 65 6f 66 28 63 68  Char)*(sizeof(ch
8b60: 61 72 2a 29 2b 31 29 29 3b 0a 20 20 20 20 20 20  ar*)+1));.      
8b70: 69 66 28 20 61 7a 43 68 61 72 3d 3d 30 20 29 7b  if( azChar==0 ){
8b80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
8b90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
8ba0: 4c 65 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  Len = (unsigned 
8bb0: 63 68 61 72 2a 29 26 61 7a 43 68 61 72 5b 6e 43  char*)&azChar[nC
8bc0: 68 61 72 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28  har];.      for(
8bd0: 7a 3d 7a 43 68 61 72 53 65 74 2c 20 6e 43 68 61  z=zCharSet, nCha
8be0: 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b  r=0; *z; nChar++
8bf0: 29 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 68 61  ){.        azCha
8c00: 72 5b 6e 43 68 61 72 5d 20 3d 20 28 75 6e 73 69  r[nChar] = (unsi
8c10: 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 3b 0a 20  gned char *)z;. 
8c20: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b         SQLITE_SK
8c30: 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20  IP_UTF8(z);.    
8c40: 20 20 20 20 61 4c 65 6e 5b 6e 43 68 61 72 5d 20      aLen[nChar] 
8c50: 3d 20 28 75 38 29 28 7a 20 2d 20 61 7a 43 68 61  = (u8)(z - azCha
8c60: 72 5b 6e 43 68 61 72 5d 29 3b 0a 20 20 20 20 20  r[nChar]);.     
8c70: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
8c80: 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20  f( nChar>0 ){.  
8c90: 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
8ca0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 73 71 6c 69  _PTR_TO_INT(sqli
8cb0: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
8cc0: 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 69 66 28  ntext));.    if(
8cd0: 20 66 6c 61 67 73 20 26 20 31 20 29 7b 0a 20 20   flags & 1 ){.  
8ce0: 20 20 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30      while( nIn>0
8cf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
8d00: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  len = 0;.       
8d10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61   for(i=0; i<nCha
8d20: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
8d30: 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b 69 5d     len = aLen[i]
8d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
8d50: 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d 65 6d 63  len<=nIn && memc
8d60: 6d 70 28 7a 49 6e 2c 20 61 7a 43 68 61 72 5b 69  mp(zIn, azChar[i
8d70: 5d 2c 20 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65  ], len)==0 ) bre
8d80: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
8d90: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68        if( i>=nCh
8da0: 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ar ) break;.    
8db0: 20 20 20 20 7a 49 6e 20 2b 3d 20 6c 65 6e 3b 0a      zIn += len;.
8dc0: 20 20 20 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c          nIn -= l
8dd0: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
8de0: 7d 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  }.    if( flags 
8df0: 26 20 32 20 29 7b 0a 20 20 20 20 20 20 77 68 69  & 2 ){.      whi
8e00: 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  le( nIn>0 ){.   
8e10: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30       int len = 0
8e20: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
8e30: 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29  0; i<nChar; i++)
8e40: 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20  {.          len 
8e50: 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20 20  = aLen[i];.     
8e60: 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e 49       if( len<=nI
8e70: 6e 20 26 26 20 6d 65 6d 63 6d 70 28 26 7a 49 6e  n && memcmp(&zIn
8e80: 5b 6e 49 6e 2d 6c 65 6e 5d 2c 61 7a 43 68 61 72  [nIn-len],azChar
8e90: 5b 69 5d 2c 6c 65 6e 29 3d 3d 30 20 29 20 62 72  [i],len)==0 ) br
8ea0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
8eb0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43         if( i>=nC
8ec0: 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  har ) break;.   
8ed0: 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b       nIn -= len;
8ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8ef0: 20 20 20 69 66 28 20 7a 43 68 61 72 53 65 74 20     if( zCharSet 
8f00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8f10: 5f 66 72 65 65 28 61 7a 43 68 61 72 29 3b 0a 20  _free(azChar);. 
8f20: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
8f30: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
8f40: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a  ontext, (char*)z
8f50: 49 6e 2c 20 6e 49 6e 2c 20 53 51 4c 49 54 45 5f  In, nIn, SQLITE_
8f60: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 0a  TRANSIENT);.}...
8f70: 2f 2a 20 49 4d 50 3a 20 52 2d 32 35 33 36 31 2d  /* IMP: R-25361-
8f80: 31 36 31 35 30 20 54 68 69 73 20 66 75 6e 63 74  16150 This funct
8f90: 69 6f 6e 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ion is omitted f
8fa0: 72 6f 6d 20 53 51 4c 69 74 65 20 62 79 20 64 65  rom SQLite by de
8fb0: 66 61 75 6c 74 2e 20 49 74 0a 2a 2a 20 69 73 20  fault. It.** is 
8fc0: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69  only available i
8fd0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 4f 55  f the SQLITE_SOU
8fe0: 4e 44 45 58 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  NDEX compile-tim
8ff0: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
9000: 0a 2a 2a 20 77 68 65 6e 20 53 51 4c 69 74 65 20  .** when SQLite 
9010: 69 73 20 62 75 69 6c 74 2e 0a 2a 2f 0a 23 69 66  is built..*/.#if
9020: 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44  def SQLITE_SOUND
9030: 45 58 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  EX./*.** Compute
9040: 20 74 68 65 20 73 6f 75 6e 64 65 78 20 65 6e 63   the soundex enc
9050: 6f 64 69 6e 67 20 6f 66 20 61 20 77 6f 72 64 2e  oding of a word.
9060: 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52 2d 35 39  .**.** IMP: R-59
9070: 37 38 32 2d 30 30 30 37 32 20 54 68 65 20 73 6f  782-00072 The so
9080: 75 6e 64 65 78 28 58 29 20 66 75 6e 63 74 69 6f  undex(X) functio
9090: 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74 72 69  n returns a stri
90a0: 6e 67 20 74 68 61 74 20 69 73 20 74 68 65 0a 2a  ng that is the.*
90b0: 2a 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69  * soundex encodi
90c0: 6e 67 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  ng of the string
90d0: 20 58 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76   X. .*/.static v
90e0: 6f 69 64 20 73 6f 75 6e 64 65 78 46 75 6e 63 28  oid soundexFunc(
90f0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
9100: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
9110: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
9120: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
9130: 29 7b 0a 20 20 63 68 61 72 20 7a 52 65 73 75 6c  ){.  char zResul
9140: 74 5b 38 5d 3b 0a 20 20 63 6f 6e 73 74 20 75 38  t[8];.  const u8
9150: 20 2a 7a 49 6e 3b 0a 20 20 69 6e 74 20 69 2c 20   *zIn;.  int i, 
9160: 6a 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  j;.  static cons
9170: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
9180: 69 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  iCode[] = {.    
9190: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
91a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
91b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
91c0: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
91d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
91e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
91f0: 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c   0,.    0, 0, 0,
9200: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9210: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9220: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30  , 0, 0,.    0, 0
9230: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9240: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9250: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
9260: 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30  0, 0, 1, 2, 3, 0
9270: 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c  , 1, 2, 0, 0, 2,
9280: 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a   2, 4, 5, 5, 0,.
9290: 20 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20      1, 2, 6, 2, 
92a0: 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30  3, 0, 1, 0, 2, 0
92b0: 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 2, 0, 0, 0, 0,
92c0: 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c   0,.    0, 0, 1,
92d0: 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20   2, 3, 0, 1, 2, 
92e0: 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35  0, 0, 2, 2, 4, 5
92f0: 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32  , 5, 0,.    1, 2
9300: 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c  , 6, 2, 3, 0, 1,
9310: 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20   0, 2, 0, 2, 0, 
9320: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 7d 3b  0, 0, 0, 0,.  };
9330: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
9340: 3d 31 20 29 3b 0a 20 20 7a 49 6e 20 3d 20 28 75  =1 );.  zIn = (u
9350: 38 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  8*)sqlite3_value
9360: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
9370: 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 7a    if( zIn==0 ) z
9380: 49 6e 20 3d 20 28 75 38 2a 29 22 22 3b 0a 20 20  In = (u8*)"";.  
9390: 66 6f 72 28 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20  for(i=0; zIn[i] 
93a0: 26 26 20 21 73 71 6c 69 74 65 33 49 73 61 6c 70  && !sqlite3Isalp
93b0: 68 61 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29  ha(zIn[i]); i++)
93c0: 7b 7d 0a 20 20 69 66 28 20 7a 49 6e 5b 69 5d 20  {}.  if( zIn[i] 
93d0: 29 7b 0a 20 20 20 20 75 38 20 70 72 65 76 63 6f  ){.    u8 prevco
93e0: 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69  de = iCode[zIn[i
93f0: 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 7a 52 65  ]&0x7f];.    zRe
9400: 73 75 6c 74 5b 30 5d 20 3d 20 73 71 6c 69 74 65  sult[0] = sqlite
9410: 33 54 6f 75 70 70 65 72 28 7a 49 6e 5b 69 5d 29  3Toupper(zIn[i])
9420: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  ;.    for(j=1; j
9430: 3c 34 20 26 26 20 7a 49 6e 5b 69 5d 3b 20 69 2b  <4 && zIn[i]; i+
9440: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  +){.      int co
9450: 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69  de = iCode[zIn[i
9460: 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 20 20 69  ]&0x7f];.      i
9470: 66 28 20 63 6f 64 65 3e 30 20 29 7b 0a 20 20 20  f( code>0 ){.   
9480: 20 20 20 20 20 69 66 28 20 63 6f 64 65 21 3d 70       if( code!=p
9490: 72 65 76 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  revcode ){.     
94a0: 20 20 20 20 20 70 72 65 76 63 6f 64 65 20 3d 20       prevcode = 
94b0: 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  code;.          
94c0: 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63  zResult[j++] = c
94d0: 6f 64 65 20 2b 20 27 30 27 3b 0a 20 20 20 20 20  ode + '0';.     
94e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
94f0: 7b 0a 20 20 20 20 20 20 20 20 70 72 65 76 63 6f  {.        prevco
9500: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  de = 0;.      }.
9510: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
9520: 20 6a 3c 34 20 29 7b 0a 20 20 20 20 20 20 7a 52   j<4 ){.      zR
9530: 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 27 30 27  esult[j++] = '0'
9540: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 73  ;.    }.    zRes
9550: 75 6c 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  ult[j] = 0;.    
9560: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
9570: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52 65  ext(context, zRe
9580: 73 75 6c 74 2c 20 34 2c 20 53 51 4c 49 54 45 5f  sult, 4, SQLITE_
9590: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65  TRANSIENT);.  }e
95a0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a  lse{.    /* IMP:
95b0: 20 52 2d 36 34 38 39 34 2d 35 30 33 32 31 20 54   R-64894-50321 T
95c0: 68 65 20 73 74 72 69 6e 67 20 22 3f 30 30 30 22  he string "?000"
95d0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
95e0: 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 20 20 20  the argument.   
95f0: 20 2a 2a 20 69 73 20 4e 55 4c 4c 20 6f 72 20 63   ** is NULL or c
9600: 6f 6e 74 61 69 6e 73 20 6e 6f 20 41 53 43 49 49  ontains no ASCII
9610: 20 61 6c 70 68 61 62 65 74 69 63 20 63 68 61 72   alphabetic char
9620: 61 63 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 73  acters. */.    s
9630: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
9640: 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 3f 30 30  xt(context, "?00
9650: 30 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54  0", 4, SQLITE_ST
9660: 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ATIC);.  }.}.#en
9670: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f  dif /* SQLITE_SO
9680: 55 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65  UNDEX */..#ifnde
9690: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
96a0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
96b0: 2a 2a 20 41 20 66 75 6e 63 74 69 6f 6e 20 74 68  ** A function th
96c0: 61 74 20 6c 6f 61 64 73 20 61 20 73 68 61 72 65  at loads a share
96d0: 64 2d 6c 69 62 72 61 72 79 20 65 78 74 65 6e 73  d-library extens
96e0: 69 6f 6e 20 74 68 65 6e 20 72 65 74 75 72 6e 73  ion then returns
96f0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
9700: 20 76 6f 69 64 20 6c 6f 61 64 45 78 74 28 73 71   void loadExt(sq
9710: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
9720: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
9730: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
9740: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
9750: 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28   char *zFile = (
9760: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
9770: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
9780: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73  argv[0]);.  cons
9790: 74 20 63 68 61 72 20 2a 7a 50 72 6f 63 3b 0a 20  t char *zProc;. 
97a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
97b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
97c0: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
97d0: 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  );.  char *zErrM
97e0: 73 67 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61  sg = 0;..  if( a
97f0: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50  rgc==2 ){.    zP
9800: 72 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  roc = (const cha
9810: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
9820: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b  e_text(argv[1]);
9830: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50  .  }else{.    zP
9840: 72 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  roc = 0;.  }.  i
9850: 66 28 20 7a 46 69 6c 65 20 26 26 20 73 71 6c 69  f( zFile && sqli
9860: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
9870: 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50  on(db, zFile, zP
9880: 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 20 29  roc, &zErrMsg) )
9890: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
98a0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
98b0: 78 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d 31 29  xt, zErrMsg, -1)
98c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
98d0: 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  ee(zErrMsg);.  }
98e0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
98f0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
9900: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
9910: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74  tructure holds t
9920: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a  he context of a.
9930: 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67 28  ** sum() or avg(
9940: 29 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d 70  ) aggregate comp
9950: 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  utation..*/.type
9960: 64 65 66 20 73 74 72 75 63 74 20 53 75 6d 43 74  def struct SumCt
9970: 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63 74  x SumCtx;.struct
9980: 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62   SumCtx {.  doub
9990: 6c 65 20 72 53 75 6d 3b 20 20 20 20 20 20 2f 2a  le rSum;      /*
99a0: 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   Floating point 
99b0: 73 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53 75  sum */.  i64 iSu
99c0: 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  m;         /* In
99d0: 74 65 67 65 72 20 73 75 6d 20 2a 2f 20 20 20 0a  teger sum */   .
99e0: 20 20 69 36 34 20 63 6e 74 3b 20 20 20 20 20 20    i64 cnt;      
99f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9a00: 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64   elements summed
9a10: 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c 6f   */.  u8 overflo
9a20: 77 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  w;      /* True 
9a30: 69 66 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  if integer overf
9a40: 6c 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75 38  low seen */.  u8
9a50: 20 61 70 70 72 6f 78 3b 20 20 20 20 20 20 20 20   approx;        
9a60: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d 69  /* True if non-i
9a70: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77 61 73  nteger value was
9a80: 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 73 75   input to the su
9a90: 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  m */.};../*.** R
9aa0: 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f 20  outines used to 
9ab0: 63 6f 6d 70 75 74 65 20 74 68 65 20 73 75 6d 2c  compute the sum,
9ac0: 20 61 76 65 72 61 67 65 2c 20 61 6e 64 20 74 6f   average, and to
9ad0: 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  tal..**.** The S
9ae0: 55 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  UM() function fo
9af0: 6c 6c 6f 77 73 20 74 68 65 20 28 62 72 6f 6b 65  llows the (broke
9b00: 6e 29 20 53 51 4c 20 73 74 61 6e 64 61 72 64 20  n) SQL standard 
9b10: 77 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20 74  which means.** t
9b20: 68 61 74 20 69 74 20 72 65 74 75 72 6e 73 20 4e  hat it returns N
9b30: 55 4c 4c 20 69 66 20 69 74 20 73 75 6d 73 20 6f  ULL if it sums o
9b40: 76 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20 20  ver no inputs.  
9b50: 54 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a 2a  TOTAL returns.**
9b60: 20 30 2e 30 20 69 6e 20 74 68 61 74 20 63 61 73   0.0 in that cas
9b70: 65 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c  e.  In addition,
9b80: 20 54 4f 54 41 4c 20 61 6c 77 61 79 73 20 72 65   TOTAL always re
9b90: 74 75 72 6e 73 20 61 20 66 6c 6f 61 74 20 77 68  turns a float wh
9ba0: 65 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68 74  ere.** SUM might
9bb0: 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   return an integ
9bc0: 65 72 20 69 66 20 69 74 20 6e 65 76 65 72 20 65  er if it never e
9bd0: 6e 63 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f 61  ncounters a floa
9be0: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
9bf0: 6c 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76 65  lue.  TOTAL neve
9c00: 72 20 66 61 69 6c 73 2c 20 62 75 74 20 53 55 4d  r fails, but SUM
9c10: 20 6d 69 67 68 74 20 74 68 72 6f 75 67 68 20 61   might through a
9c20: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 0a 2a  n exception if.*
9c30: 2a 20 69 74 20 6f 76 65 72 66 6c 6f 77 73 20 61  * it overflows a
9c40: 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  n integer..*/.st
9c50: 61 74 69 63 20 76 6f 69 64 20 73 75 6d 53 74 65  atic void sumSte
9c60: 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  p(sqlite3_contex
9c70: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
9c80: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
9c90: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53  lue **argv){.  S
9ca0: 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20  umCtx *p;.  int 
9cb0: 74 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28 20  type;.  assert( 
9cc0: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55  argc==1 );.  UNU
9cd0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
9ce0: 67 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  gc);.  p = sqlit
9cf0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
9d00: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
9d10: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79 70  zeof(*p));.  typ
9d20: 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
9d30: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61  e_numeric_type(a
9d40: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70  rgv[0]);.  if( p
9d50: 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54 45   && type!=SQLITE
9d60: 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d 3e  _NULL ){.    p->
9d70: 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 74  cnt++;.    if( t
9d80: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
9d90: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 69 36 34  GER ){.      i64
9da0: 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   v = sqlite3_val
9db0: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d  ue_int64(argv[0]
9dc0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d  );.      p->rSum
9dd0: 20 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69 66 28   += v;.      if(
9de0: 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f   (p->approx|p->o
9df0: 76 65 72 66 6c 6f 77 29 3d 3d 30 20 26 26 20 73  verflow)==0 && s
9e00: 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 26  qlite3AddInt64(&
9e10: 70 2d 3e 69 53 75 6d 2c 20 76 29 20 29 7b 0a 20  p->iSum, v) ){. 
9e20: 20 20 20 20 20 20 20 70 2d 3e 6f 76 65 72 66 6c         p->overfl
9e30: 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ow = 1;.      }.
9e40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9e50: 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 73 71 6c 69   p->rSum += sqli
9e60: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
9e70: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
9e80: 20 70 2d 3e 61 70 70 72 6f 78 20 3d 20 31 3b 0a   p->approx = 1;.
9e90: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
9ea0: 69 63 20 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c  ic void sumFinal
9eb0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
9ec0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
9ed0: 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20   SumCtx *p;.  p 
9ee0: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
9ef0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
9f00: 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ext, 0);.  if( p
9f10: 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a   && p->cnt>0 ){.
9f20: 20 20 20 20 69 66 28 20 70 2d 3e 6f 76 65 72 66      if( p->overf
9f30: 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  low ){.      sql
9f40: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
9f50: 72 28 63 6f 6e 74 65 78 74 2c 22 69 6e 74 65 67  r(context,"integ
9f60: 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c 2d 31 29  er overflow",-1)
9f70: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9f80: 70 2d 3e 61 70 70 72 6f 78 20 29 7b 0a 20 20 20  p->approx ){.   
9f90: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9fa0: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
9fb0: 2c 20 70 2d 3e 72 53 75 6d 29 3b 0a 20 20 20 20  , p->rSum);.    
9fc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
9fd0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
9fe0: 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 69 53  4(context, p->iS
9ff0: 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  um);.    }.  }.}
a000: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 76 67  .static void avg
a010: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
a020: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
a030: 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b  t){.  SumCtx *p;
a040: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
a050: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
a060: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
a070: 69 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e  if( p && p->cnt>
a080: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
a090: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
a0a0: 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53 75 6d 2f  ontext, p->rSum/
a0b0: 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e 74 29 3b  (double)p->cnt);
a0c0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
a0d0: 69 64 20 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65  id totalFinalize
a0e0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
a0f0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75   *context){.  Su
a100: 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  mCtx *p;.  p = s
a110: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
a120: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
a130: 2c 20 30 29 3b 0a 20 20 2f 2a 20 28 64 6f 75 62  , 0);.  /* (doub
a140: 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20  le)0 In case of 
a150: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
a160: 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
a170: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
a180: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
a190: 2c 20 70 20 3f 20 70 2d 3e 72 53 75 6d 20 3a 20  , p ? p->rSum : 
a1a0: 28 64 6f 75 62 6c 65 29 30 29 3b 0a 7d 0a 0a 2f  (double)0);.}../
a1b0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
a1c0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
a1d0: 70 73 20 74 72 61 63 6b 20 6f 66 20 73 74 61 74  ps track of stat
a1e0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  e information fo
a1f0: 72 20 74 68 65 0a 2a 2a 20 63 6f 75 6e 74 28 29  r the.** count()
a200: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
a210: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
a220: 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20  struct CountCtx 
a230: 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74  CountCtx;.struct
a240: 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 36   CountCtx {.  i6
a250: 34 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  4 n;.};../*.** R
a260: 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65  outines to imple
a270: 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 28 29  ment the count()
a280: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
a290: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
a2a0: 6f 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73 71  oid countStep(sq
a2b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
a2c0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
a2d0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
a2e0: 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74  **argv){.  Count
a2f0: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
a300: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
a310: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
a320: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
a330: 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20  if( (argc==0 || 
a340: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
a350: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
a360: 61 72 67 76 5b 30 5d 29 29 20 26 26 20 70 20 29  argv[0])) && p )
a370: 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20  {.    p->n++;.  
a380: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
a390: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
a3a0: 44 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  D.  /* The sqlit
a3b0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75  e3_aggregate_cou
a3c0: 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  nt() function is
a3d0: 20 64 65 70 72 65 63 61 74 65 64 2e 20 20 42 75   deprecated.  Bu
a3e0: 74 20 6a 75 73 74 20 74 6f 20 6d 61 6b 65 0a 20  t just to make. 
a3f0: 20 2a 2a 20 73 75 72 65 20 69 74 20 73 74 69 6c   ** sure it stil
a400: 6c 20 6f 70 65 72 61 74 65 73 20 63 6f 72 72 65  l operates corre
a410: 63 74 6c 79 2c 20 76 65 72 69 66 79 20 74 68 61  ctly, verify tha
a420: 74 20 69 74 73 20 63 6f 75 6e 74 20 61 67 72 65  t its count agre
a430: 65 73 20 77 69 74 68 20 6f 75 72 20 0a 20 20 2a  es with our .  *
a440: 2a 20 69 6e 74 65 72 6e 61 6c 20 63 6f 75 6e 74  * internal count
a450: 20 77 68 65 6e 20 75 73 69 6e 67 20 63 6f 75 6e   when using coun
a460: 74 28 2a 29 20 61 6e 64 20 77 68 65 6e 20 74 68  t(*) and when th
a470: 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 63 61  e total count ca
a480: 6e 20 62 65 0a 20 20 2a 2a 20 65 78 70 72 65 73  n be.  ** expres
a490: 73 65 64 20 61 73 20 61 20 33 32 2d 62 69 74 20  sed as a 32-bit 
a4a0: 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 61 73  integer. */.  as
a4b0: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c  sert( argc==1 ||
a4c0: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 3e 30 78   p==0 || p->n>0x
a4d0: 37 66 66 66 66 66 66 66 0a 20 20 20 20 20 20 20  7fffffff.       
a4e0: 20 20 20 7c 7c 20 70 2d 3e 6e 3d 3d 73 71 6c 69     || p->n==sqli
a4f0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
a500: 75 6e 74 28 63 6f 6e 74 65 78 74 29 20 29 3b 0a  unt(context) );.
a510: 23 65 6e 64 69 66 0a 7d 20 20 20 0a 73 74 61 74  #endif.}   .stat
a520: 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e  ic void countFin
a530: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
a540: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
a550: 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a  .  CountCtx *p;.
a560: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
a570: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
a580: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 73  context, 0);.  s
a590: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
a5a0: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f  t64(context, p ?
a5b0: 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f   p->n : 0);.}../
a5c0: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
a5d0: 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e 28 29   implement min()
a5e0: 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65   and max() aggre
a5f0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  gate functions..
a600: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
a610: 69 6e 6d 61 78 53 74 65 70 28 0a 20 20 73 71 6c  inmaxStep(.  sql
a620: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
a630: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 4e 6f  ntext, .  int No
a640: 74 55 73 65 64 2c 20 0a 20 20 73 71 6c 69 74 65  tUsed, .  sqlite
a650: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
a660: 7b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 20 20 3d  {.  Mem *pArg  =
a670: 20 28 4d 65 6d 20 2a 29 61 72 67 76 5b 30 5d 3b   (Mem *)argv[0];
a680: 0a 20 20 4d 65 6d 20 2a 70 42 65 73 74 3b 0a 20  .  Mem *pBest;. 
a690: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
a6a0: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 0a 20 20 70  R(NotUsed);..  p
a6b0: 42 65 73 74 20 3d 20 28 4d 65 6d 20 2a 29 73 71  Best = (Mem *)sq
a6c0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
a6d0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
a6e0: 20 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29 29   sizeof(*pBest))
a6f0: 3b 0a 20 20 69 66 28 20 21 70 42 65 73 74 20 29  ;.  if( !pBest )
a700: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
a710: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
a720: 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c  pe(argv[0])==SQL
a730: 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
a740: 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73  if( pBest->flags
a750: 20 29 20 73 71 6c 69 74 65 33 53 6b 69 70 41 63   ) sqlite3SkipAc
a760: 63 75 6d 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f  cumulatorLoad(co
a770: 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 20  ntext);.  }else 
a780: 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73  if( pBest->flags
a790: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78 3b   ){.    int max;
a7a0: 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20 20  .    int cmp;.  
a7b0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
a7c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e   = sqlite3GetFun
a7d0: 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74  cCollSeq(context
a7e0: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 73  );.    /* This s
a7f0: 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  tep function is 
a800: 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
a810: 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28  e min() and max(
a820: 29 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20 20  ) aggregates,.  
a830: 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64 69    ** the only di
a840: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
a850: 20 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20 74   the two being t
a860: 68 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f 66  hat the sense of
a870: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70   the.    ** comp
a880: 61 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72 74  arison is invert
a890: 65 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78 28  ed. For the max(
a8a0: 29 20 61 67 67 72 65 67 61 74 65 2c 20 74 68 65  ) aggregate, the
a8b0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
a8c0: 75 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e 63  user_data() func
a8d0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76 6f  tion returns (vo
a8e0: 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69 6e  id *)-1. For min
a8f0: 28 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 74  () it.    ** ret
a900: 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62 2c  urns (void *)db,
a910: 20 77 68 65 72 65 20 64 62 20 69 73 20 74 68 65   where db is the
a920: 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61   sqlite3* databa
a930: 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20  se pointer..    
a940: 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68 65  ** Therefore the
a950: 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
a960: 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 27 6d  sets variable 'm
a970: 61 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68 65  ax' to 1 for the
a980: 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61 67   max().    ** ag
a990: 67 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66 6f  gregate, or 0 fo
a9a0: 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a  r min()..    */.
a9b0: 20 20 20 20 6d 61 78 20 3d 20 73 71 6c 69 74 65      max = sqlite
a9c0: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
a9d0: 65 78 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d 70  ext)!=0;.    cmp
a9e0: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
a9f0: 70 61 72 65 28 70 42 65 73 74 2c 20 70 41 72 67  pare(pBest, pArg
aa00: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66  , pColl);.    if
aa10: 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30 29  ( (max && cmp<0)
aa20: 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d 70   || (!max && cmp
aa30: 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >0) ){.      sql
aa40: 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
aa50: 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20  pBest, pArg);.  
aa60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
aa70: 71 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d 75  qlite3SkipAccumu
aa80: 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65 78  latorLoad(contex
aa90: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
aaa0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
aab0: 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74 2c  beMemCopy(pBest,
aac0: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74   pArg);.  }.}.st
aad0: 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78  atic void minMax
aae0: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
aaf0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
ab00: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  t){.  sqlite3_va
ab10: 6c 75 65 20 2a 70 52 65 73 3b 0a 20 20 70 52 65  lue *pRes;.  pRe
ab20: 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 61 6c  s = (sqlite3_val
ab30: 75 65 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  ue *)sqlite3_agg
ab40: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
ab50: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66  ontext, 0);.  if
ab60: 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 69 66  ( pRes ){.    if
ab70: 28 20 70 52 65 73 2d 3e 66 6c 61 67 73 20 29 7b  ( pRes->flags ){
ab80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
ab90: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74  esult_value(cont
aba0: 65 78 74 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  ext, pRes);.    
abb0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
abc0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 65 73  eMemRelease(pRes
abd0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
abe0: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 45 58 50  group_concat(EXP
abf0: 52 2c 20 3f 53 45 50 41 52 41 54 4f 52 3f 29 0a  R, ?SEPARATOR?).
ac00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
ac10: 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 28 0a  roupConcatStep(.
ac20: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
ac30: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
ac40: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
ac50: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
ac60: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
ac70: 7a 56 61 6c 3b 0a 20 20 53 74 72 41 63 63 75 6d  zVal;.  StrAccum
ac80: 20 2a 70 41 63 63 75 6d 3b 0a 20 20 63 6f 6e 73   *pAccum;.  cons
ac90: 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20  t char *zSep;.  
aca0: 69 6e 74 20 6e 56 61 6c 2c 20 6e 53 65 70 3b 0a  int nVal, nSep;.
acb0: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
acc0: 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a  1 || argc==2 );.
acd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
ace0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
acf0: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
ad00: 20 72 65 74 75 72 6e 3b 0a 20 20 70 41 63 63 75   return;.  pAccu
ad10: 6d 20 3d 20 28 53 74 72 41 63 63 75 6d 2a 29 73  m = (StrAccum*)s
ad20: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
ad30: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
ad40: 2c 20 73 69 7a 65 6f 66 28 2a 70 41 63 63 75 6d  , sizeof(*pAccum
ad50: 29 29 3b 0a 0a 20 20 69 66 28 20 70 41 63 63 75  ));..  if( pAccu
ad60: 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  m ){.    sqlite3
ad70: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
ad80: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
ad90: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 69  (context);.    i
ada0: 6e 74 20 66 69 72 73 74 54 65 72 6d 20 3d 20 70  nt firstTerm = p
adb0: 41 63 63 75 6d 2d 3e 75 73 65 4d 61 6c 6c 6f 63  Accum->useMalloc
adc0: 3d 3d 30 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d  ==0;.    pAccum-
add0: 3e 75 73 65 4d 61 6c 6c 6f 63 20 3d 20 32 3b 0a  >useMalloc = 2;.
ade0: 20 20 20 20 70 41 63 63 75 6d 2d 3e 6d 78 41 6c      pAccum->mxAl
adf0: 6c 6f 63 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  loc = db->aLimit
ae00: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
ae10: 4e 47 54 48 5d 3b 0a 20 20 20 20 69 66 28 20 21  NGTH];.    if( !
ae20: 66 69 72 73 74 54 65 72 6d 20 29 7b 0a 20 20 20  firstTerm ){.   
ae30: 20 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29     if( argc==2 )
ae40: 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  {.        zSep =
ae50: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
ae60: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
ae70: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 53 65  1]);.        nSe
ae80: 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  p = sqlite3_valu
ae90: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29  e_bytes(argv[1])
aea0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
aeb0: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c         zSep = ",
aec0: 22 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 70 20  ";.        nSep 
aed0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
aee0: 20 20 20 69 66 28 20 6e 53 65 70 20 29 20 73 71     if( nSep ) sq
aef0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
af00: 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a 53 65 70  end(pAccum, zSep
af10: 2c 20 6e 53 65 70 29 3b 0a 20 20 20 20 7d 0a 20  , nSep);.    }. 
af20: 20 20 20 7a 56 61 6c 20 3d 20 28 63 68 61 72 2a     zVal = (char*
af30: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
af40: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
af50: 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    nVal = sqlite3
af60: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
af70: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  v[0]);.    if( n
af80: 56 61 6c 20 29 20 73 71 6c 69 74 65 33 53 74 72  Val ) sqlite3Str
af90: 41 63 63 75 6d 41 70 70 65 6e 64 28 70 41 63 63  AccumAppend(pAcc
afa0: 75 6d 2c 20 7a 56 61 6c 2c 20 6e 56 61 6c 29 3b  um, zVal, nVal);
afb0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
afc0: 69 64 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69  id groupConcatFi
afd0: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
afe0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
aff0: 7b 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 41  {.  StrAccum *pA
b000: 63 63 75 6d 3b 0a 20 20 70 41 63 63 75 6d 20 3d  ccum;.  pAccum =
b010: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
b020: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
b030: 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 41  xt, 0);.  if( pA
b040: 63 63 75 6d 20 29 7b 0a 20 20 20 20 69 66 28 20  ccum ){.    if( 
b050: 70 41 63 63 75 6d 2d 3e 61 63 63 45 72 72 6f 72  pAccum->accError
b060: 3d 3d 53 54 52 41 43 43 55 4d 5f 54 4f 4f 42 49  ==STRACCUM_TOOBI
b070: 47 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  G ){.      sqlit
b080: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
b090: 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b  toobig(context);
b0a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
b0b0: 41 63 63 75 6d 2d 3e 61 63 63 45 72 72 6f 72 3d  Accum->accError=
b0c0: 3d 53 54 52 41 43 43 55 4d 5f 4e 4f 4d 45 4d 20  =STRACCUM_NOMEM 
b0d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b0e0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
b0f0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
b100: 20 20 7d 65 6c 73 65 7b 20 20 20 20 0a 20 20 20    }else{    .   
b110: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
b120: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
b130: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
b140: 69 6e 69 73 68 28 70 41 63 63 75 6d 29 2c 20 2d  inish(pAccum), -
b150: 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
b170: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
b180: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
b190: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
b1a0: 73 20 70 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e  s per-connection
b1b0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74   function regist
b1c0: 72 61 74 69 6f 6e 2e 20 20 4d 6f 73 74 0a 2a 2a  ration.  Most.**
b1d0: 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
b1e0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 62 6f 76 65   functions above
b1f0: 20 61 72 65 20 70 61 72 74 20 6f 66 20 74 68 65   are part of the
b200: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
b210: 20 73 65 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f   set..** This ro
b220: 75 74 69 6e 65 20 6f 6e 6c 79 20 64 65 61 6c 73  utine only deals
b230: 20 77 69 74 68 20 74 68 6f 73 65 20 74 68 61 74   with those that
b240: 20 61 72 65 20 6e 6f 74 20 67 6c 6f 62 61 6c 2e   are not global.
b250: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b260: 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46  RegisterBuiltinF
b270: 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33  unctions(sqlite3
b280: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20   *db){.  int rc 
b290: 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f  = sqlite3_overlo
b2a0: 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ad_function(db, 
b2b0: 22 4d 41 54 43 48 22 2c 20 32 29 3b 0a 20 20 61  "MATCH", 2);.  a
b2c0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
b2d0: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53  E_NOMEM || rc==S
b2e0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
b2f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
b300: 45 4d 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  EM ){.    db->ma
b310: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
b320: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
b330: 20 74 68 65 20 4c 49 4b 45 4f 50 54 20 66 6c 61   the LIKEOPT fla
b340: 67 20 6f 6e 20 74 68 65 20 32 2d 61 72 67 75 6d  g on the 2-argum
b350: 65 6e 74 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ent function wit
b360: 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65  h the given name
b370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b380: 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28   setLikeOptFlag(
b390: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
b3a0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
b3b0: 75 38 20 66 6c 61 67 56 61 6c 29 7b 0a 20 20 46  u8 flagVal){.  F
b3c0: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
b3d0: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
b3e0: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
b3f0: 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
b400: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 0a 20 20  len30(zName),.  
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b420: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 53 51             2, SQ
b430: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
b440: 20 69 66 28 20 41 4c 57 41 59 53 28 70 44 65 66   if( ALWAYS(pDef
b450: 29 20 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66  ) ){.    pDef->f
b460: 75 6e 63 46 6c 61 67 73 20 7c 3d 20 66 6c 61 67  uncFlags |= flag
b470: 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Val;.  }.}../*.*
b480: 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 62  * Register the b
b490: 75 69 6c 74 2d 69 6e 20 4c 49 4b 45 20 61 6e 64  uilt-in LIKE and
b4a0: 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e   GLOB functions.
b4b0: 20 20 54 68 65 20 63 61 73 65 53 65 6e 73 69 74    The caseSensit
b4c0: 69 76 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ive.** parameter
b4d0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
b4e0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 4c  her or not the L
b4f0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20  IKE operator is 
b500: 63 61 73 65 0a 2a 2a 20 73 65 6e 73 69 74 69 76  case.** sensitiv
b510: 65 2e 20 20 47 4c 4f 42 20 69 73 20 61 6c 77 61  e.  GLOB is alwa
b520: 79 73 20 63 61 73 65 20 73 65 6e 73 69 74 69 76  ys case sensitiv
b530: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
b540: 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75  e3RegisterLikeFu
b550: 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20  nctions(sqlite3 
b560: 2a 64 62 2c 20 69 6e 74 20 63 61 73 65 53 65 6e  *db, int caseSen
b570: 73 69 74 69 76 65 29 7b 0a 20 20 73 74 72 75 63  sitive){.  struc
b580: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70  t compareInfo *p
b590: 49 6e 66 6f 3b 0a 20 20 69 66 28 20 63 61 73 65  Info;.  if( case
b5a0: 53 65 6e 73 69 74 69 76 65 20 29 7b 0a 20 20 20  Sensitive ){.   
b5b0: 20 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63 74   pInfo = (struct
b5c0: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c   compareInfo*)&l
b5d0: 69 6b 65 49 6e 66 6f 41 6c 74 3b 0a 20 20 7d 65  ikeInfoAlt;.  }e
b5e0: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d  lse{.    pInfo =
b5f0: 20 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65   (struct compare
b600: 49 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 4e  Info*)&likeInfoN
b610: 6f 72 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  orm;.  }.  sqlit
b620: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
b630: 20 22 6c 69 6b 65 22 2c 20 32 2c 20 53 51 4c 49   "like", 2, SQLI
b640: 54 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20  TE_UTF8, pInfo, 
b650: 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20  likeFunc, 0, 0, 
b660: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 72 65  0);.  sqlite3Cre
b670: 61 74 65 46 75 6e 63 28 64 62 2c 20 22 6c 69 6b  ateFunc(db, "lik
b680: 65 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54  e", 3, SQLITE_UT
b690: 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46  F8, pInfo, likeF
b6a0: 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  unc, 0, 0, 0);. 
b6b0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
b6c0: 6e 63 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20 32  nc(db, "glob", 2
b6d0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a  , SQLITE_UTF8, .
b6e0: 20 20 20 20 20 20 28 73 74 72 75 63 74 20 63 6f        (struct co
b6f0: 6d 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c 6f 62  mpareInfo*)&glob
b700: 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20  Info, likeFunc, 
b710: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 65 74 4c  0, 0, 0);.  setL
b720: 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22  ikeOptFlag(db, "
b730: 67 6c 6f 62 22 2c 20 53 51 4c 49 54 45 5f 46 55  glob", SQLITE_FU
b740: 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45  NC_LIKE | SQLITE
b750: 5f 46 55 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73  _FUNC_CASE);.  s
b760: 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62  etLikeOptFlag(db
b770: 2c 20 22 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20  , "like", .     
b780: 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 20 3f   caseSensitive ?
b790: 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49   (SQLITE_FUNC_LI
b7a0: 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43  KE | SQLITE_FUNC
b7b0: 5f 43 41 53 45 29 20 3a 20 53 51 4c 49 54 45 5f  _CASE) : SQLITE_
b7c0: 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f  FUNC_LIKE);.}../
b7d0: 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f 69 6e 74  *.** pExpr point
b7e0: 73 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  s to an expressi
b7f0: 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c 65 6d 65  on which impleme
b800: 6e 74 73 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20  nts a function. 
b810: 20 49 66 0a 2a 2a 20 69 74 20 69 73 20 61 70 70   If.** it is app
b820: 72 6f 70 72 69 61 74 65 20 74 6f 20 61 70 70 6c  ropriate to appl
b830: 79 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  y the LIKE optim
b840: 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68 61 74 20  ization to that 
b850: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e  function.** then
b860: 20 73 65 74 20 61 57 63 5b 30 5d 20 74 68 72 6f   set aWc[0] thro
b870: 75 67 68 20 61 57 63 5b 32 5d 20 74 6f 20 74 68  ugh aWc[2] to th
b880: 65 20 77 69 6c 64 63 61 72 64 20 63 68 61 72 61  e wildcard chara
b890: 63 74 65 72 73 20 61 6e 64 0a 2a 2a 20 72 65 74  cters and.** ret
b8a0: 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 74 68  urn TRUE.  If th
b8b0: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  e function is no
b8c0: 74 20 61 20 4c 49 4b 45 2d 73 74 79 6c 65 20 66  t a LIKE-style f
b8d0: 75 6e 63 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20  unction then.** 
b8e0: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
b8f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 4c 69  .int sqlite3IsLi
b900: 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74  keFunction(sqlit
b910: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 45  e3 *db, Expr *pE
b920: 78 70 72 2c 20 69 6e 74 20 2a 70 49 73 4e 6f 63  xpr, int *pIsNoc
b930: 61 73 65 2c 20 63 68 61 72 20 2a 61 57 63 29 7b  ase, char *aWc){
b940: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66  .  FuncDef *pDef
b950: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
b960: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 0a  p!=TK_FUNCTION .
b970: 20 20 20 7c 7c 20 21 70 45 78 70 72 2d 3e 78 2e     || !pExpr->x.
b980: 70 4c 69 73 74 20 0a 20 20 20 7c 7c 20 70 45 78  pList .   || pEx
b990: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
b9a0: 70 72 21 3d 32 0a 20 20 29 7b 0a 20 20 20 20 72  pr!=2.  ){.    r
b9b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
b9c0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
b9d0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
b9e0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
b9f0: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
ba00: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
ba10: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
ba20: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
ba50: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
ba60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
ba80: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
ba90: 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  );.  if( NEVER(p
baa0: 44 65 66 3d 3d 30 29 20 7c 7c 20 28 70 44 65 66  Def==0) || (pDef
bab0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
bac0: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3d  LITE_FUNC_LIKE)=
bad0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
bae0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
baf0: 65 20 6d 65 6d 63 70 79 28 29 20 73 74 61 74 65  e memcpy() state
bb00: 6d 65 6e 74 20 61 73 73 75 6d 65 73 20 74 68 61  ment assumes tha
bb10: 74 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63  t the wildcard c
bb20: 68 61 72 61 63 74 65 72 73 20 61 72 65 0a 20 20  haracters are.  
bb30: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ** the first thr
bb40: 65 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ee statements in
bb50: 20 74 68 65 20 63 6f 6d 70 61 72 65 49 6e 66 6f   the compareInfo
bb60: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
bb70: 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 28 29 20  .  ** asserts() 
bb80: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72 69  that follow veri
bb90: 66 79 20 74 68 61 74 20 61 73 73 75 6d 70 74 69  fy that assumpti
bba0: 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  on.  */.  memcpy
bbb0: 28 61 57 63 2c 20 70 44 65 66 2d 3e 70 55 73 65  (aWc, pDef->pUse
bbc0: 72 44 61 74 61 2c 20 33 29 3b 0a 20 20 61 73 73  rData, 3);.  ass
bbd0: 65 72 74 28 20 28 63 68 61 72 2a 29 26 6c 69 6b  ert( (char*)&lik
bbe0: 65 49 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68 61  eInfoAlt == (cha
bbf0: 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e  r*)&likeInfoAlt.
bc00: 6d 61 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61 73  matchAll );.  as
bc10: 73 65 72 74 28 20 26 28 28 63 68 61 72 2a 29 26  sert( &((char*)&
bc20: 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d 20  likeInfoAlt)[1] 
bc30: 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49  == (char*)&likeI
bc40: 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65 20  nfoAlt.matchOne 
bc50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28 28  );.  assert( &((
bc60: 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41  char*)&likeInfoA
bc70: 6c 74 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72 2a  lt)[2] == (char*
bc80: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61  )&likeInfoAlt.ma
bc90: 74 63 68 53 65 74 20 29 3b 0a 20 20 2a 70 49 73  tchSet );.  *pIs
bca0: 4e 6f 63 61 73 65 20 3d 20 28 70 44 65 66 2d 3e  Nocase = (pDef->
bcb0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
bcc0: 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3d 3d 30  TE_FUNC_CASE)==0
bcd0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
bce0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 61 6c 6c 20 6f  ./*.** All all o
bcf0: 66 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74  f the FuncDef st
bd00: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
bd10: 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 61  aBuiltinFunc[] a
bd20: 72 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  rray above.** to
bd30: 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63   the global func
bd40: 74 69 6f 6e 20 68 61 73 68 20 74 61 62 6c 65 2e  tion hash table.
bd50: 20 20 54 68 69 73 20 6f 63 63 75 72 73 20 61 74    This occurs at
bd60: 20 73 74 61 72 74 2d 74 69 6d 65 20 28 61 73 0a   start-time (as.
bd70: 2a 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e 63 65  ** a consequence
bd80: 20 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   of calling sqli
bd90: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
bda0: 29 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  )..**.** After t
bdb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
bdc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bdd0: 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75  RegisterGlobalFu
bde0: 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  nctions(void){. 
bdf0: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c   /*.  ** The fol
be00: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
be10: 64 73 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ds FuncDef struc
be20: 74 75 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66  tures for all of
be30: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20   the functions. 
be40: 20 2a 2a 20 64 65 66 69 6e 65 64 20 69 6e 20 74   ** defined in t
be50: 68 69 73 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20  his file..  **. 
be60: 20 2a 2a 20 54 68 65 20 61 72 72 61 79 20 63 61   ** The array ca
be70: 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  nnot be constant
be80: 20 73 69 6e 63 65 20 63 68 61 6e 67 65 73 20 61   since changes a
be90: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 0a 20  re made to the. 
bea0: 20 2a 2a 20 46 75 6e 63 44 65 66 2e 70 48 61 73   ** FuncDef.pHas
beb0: 68 20 65 6c 65 6d 65 6e 74 73 20 61 74 20 73 74  h elements at st
bec0: 61 72 74 2d 74 69 6d 65 2e 20 20 54 68 65 20 65  art-time.  The e
bed0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 69 73 20  lements of this 
bee0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 72 65 20 72  array.  ** are r
bef0: 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 69  ead-only after i
bf00: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69 73  nitialization is
bf10: 20 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a 2f 0a   complete..  */.
bf20: 20 20 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f    static SQLITE_
bf30: 57 53 44 20 46 75 6e 63 44 65 66 20 61 42 75 69  WSD FuncDef aBui
bf40: 6c 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20  ltinFunc[] = {. 
bf50: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69     FUNCTION(ltri
bf60: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
bf70: 31 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e  1, 1, 0, trimFun
bf80: 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  c         ),.   
bf90: 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c   FUNCTION(ltrim,
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c                2,
bfb0: 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20   1, 0, trimFunc 
bfc0: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
bfd0: 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20  UNCTION(rtrim,  
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 32              1, 2
bff0: 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20  , 0, trimFunc   
c000: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
c010: 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20  CTION(rtrim,    
c020: 20 20 20 20 20 20 20 20 20 20 32 2c 20 32 2c 20            2, 2, 
c030: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
c040: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
c050: 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20  ION(trim,       
c060: 20 20 20 20 20 20 20 20 31 2c 20 33 2c 20 30 2c          1, 3, 0,
c070: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
c080: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
c090: 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20  N(trim,         
c0a0: 20 20 20 20 20 20 32 2c 20 33 2c 20 30 2c 20 74        2, 3, 0, t
c0b0: 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20  rimFunc         
c0c0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
c0d0: 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  min,            
c0e0: 20 20 20 2d 31 2c 20 30 2c 20 31 2c 20 6d 69 6e     -1, 0, 1, min
c0f0: 6d 61 78 46 75 6e 63 20 20 20 20 20 20 20 29 2c  maxFunc       ),
c100: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69  .    FUNCTION(mi
c110: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
c120: 20 20 30 2c 20 30 2c 20 31 2c 20 30 20 20 20 20    0, 0, 1, 0    
c130: 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20              ),. 
c140: 20 20 20 41 47 47 52 45 47 41 54 45 28 6d 69 6e     AGGREGATE(min
c150: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c160: 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 53  1, 0, 1, minmaxS
c170: 74 65 70 2c 20 20 20 20 20 20 6d 69 6e 4d 61 78  tep,      minMax
c180: 46 69 6e 61 6c 69 7a 65 20 29 2c 0a 20 20 20 20  Finalize ),.    
c190: 46 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20  FUNCTION(max,   
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
c1b0: 31 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63  1, 1, minmaxFunc
c1c0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
c1d0: 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20  NCTION(max,     
c1e0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c             0, 1,
c1f0: 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20 20   1, 0           
c200: 20 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52       ),.    AGGR
c210: 45 47 41 54 45 28 6d 61 78 2c 20 20 20 20 20 20  EGATE(max,      
c220: 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20 31           1, 1, 1
c230: 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20 20  , minmaxStep,   
c240: 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a     minMaxFinaliz
c250: 65 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f  e ),.    FUNCTIO
c260: 4e 32 28 74 79 70 65 6f 66 2c 20 20 20 20 20 20  N2(typeof,      
c270: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 74        1, 0, 0, t
c280: 79 70 65 6f 66 46 75 6e 63 2c 20 20 53 51 4c 49  ypeofFunc,  SQLI
c290: 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 2c  TE_FUNC_TYPEOF),
c2a0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 6c  .    FUNCTION2(l
c2b0: 65 6e 67 74 68 2c 20 20 20 20 20 20 20 20 20 20  ength,          
c2c0: 20 20 31 2c 20 30 2c 20 30 2c 20 6c 65 6e 67 74    1, 0, 0, lengt
c2d0: 68 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46  hFunc,  SQLITE_F
c2e0: 55 4e 43 5f 4c 45 4e 47 54 48 29 2c 0a 20 20 20  UNC_LENGTH),.   
c2f0: 20 46 55 4e 43 54 49 4f 4e 28 69 6e 73 74 72 2c   FUNCTION(instr,
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c                2,
c310: 20 30 2c 20 30 2c 20 69 6e 73 74 72 46 75 6e 63   0, 0, instrFunc
c320: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
c330: 55 4e 43 54 49 4f 4e 28 73 75 62 73 74 72 2c 20  UNCTION(substr, 
c340: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
c350: 2c 20 30 2c 20 73 75 62 73 74 72 46 75 6e 63 20  , 0, substrFunc 
c360: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
c370: 43 54 49 4f 4e 28 73 75 62 73 74 72 2c 20 20 20  CTION(substr,   
c380: 20 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c 20            3, 0, 
c390: 30 2c 20 73 75 62 73 74 72 46 75 6e 63 20 20 20  0, substrFunc   
c3a0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
c3b0: 49 4f 4e 28 70 72 69 6e 74 66 2c 20 20 20 20 20  ION(printf,     
c3c0: 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c         -1, 0, 0,
c3d0: 20 70 72 69 6e 74 66 46 75 6e 63 20 20 20 20 20   printfFunc     
c3e0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
c3f0: 4e 28 75 6e 69 63 6f 64 65 2c 20 20 20 20 20 20  N(unicode,      
c400: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 75        1, 0, 0, u
c410: 6e 69 63 6f 64 65 46 75 6e 63 20 20 20 20 20 20  nicodeFunc      
c420: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
c430: 63 68 61 72 2c 20 20 20 20 20 20 20 20 20 20 20  char,           
c440: 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 63 68 61     -1, 0, 0, cha
c450: 72 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c  rFunc         ),
c460: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 61 62  .    FUNCTION(ab
c470: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
c480: 20 20 31 2c 20 30 2c 20 30 2c 20 61 62 73 46 75    1, 0, 0, absFu
c490: 6e 63 20 20 20 20 20 20 20 20 20 20 29 2c 0a 23  nc          ),.#
c4a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c4b0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
c4c0: 54 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72  T.    FUNCTION(r
c4d0: 6f 75 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  ound,           
c4e0: 20 20 20 31 2c 20 30 2c 20 30 2c 20 72 6f 75 6e     1, 0, 0, roun
c4f0: 64 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a  dFunc        ),.
c500: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75      FUNCTION(rou
c510: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
c520: 20 32 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46   2, 0, 0, roundF
c530: 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 23 65  unc        ),.#e
c540: 6e 64 69 66 0a 20 20 20 20 46 55 4e 43 54 49 4f  ndif.    FUNCTIO
c550: 4e 28 75 70 70 65 72 2c 20 20 20 20 20 20 20 20  N(upper,        
c560: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 75        1, 0, 0, u
c570: 70 70 65 72 46 75 6e 63 20 20 20 20 20 20 20 20  pperFunc        
c580: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
c590: 6c 6f 77 65 72 2c 20 20 20 20 20 20 20 20 20 20  lower,          
c5a0: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 77      1, 0, 0, low
c5b0: 65 72 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c  erFunc        ),
c5c0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f  .    FUNCTION(co
c5d0: 61 6c 65 73 63 65 2c 20 20 20 20 20 20 20 20 20  alesce,         
c5e0: 20 20 31 2c 20 30 2c 20 30 2c 20 30 20 20 20 20    1, 0, 0, 0    
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20              ),. 
c600: 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c     FUNCTION(coal
c610: 65 73 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  esce,           
c620: 30 2c 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20  0, 0, 0, 0      
c630: 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20            ),.   
c640: 20 46 55 4e 43 54 49 4f 4e 32 28 63 6f 61 6c 65   FUNCTION2(coale
c650: 73 63 65 2c 20 20 20 20 20 20 20 20 20 2d 31 2c  sce,         -1,
c660: 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c   0, 0, noopFunc,
c670: 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f    SQLITE_FUNC_CO
c680: 41 4c 45 53 43 45 29 2c 0a 20 20 20 20 46 55 4e  ALESCE),.    FUN
c690: 43 54 49 4f 4e 28 68 65 78 2c 20 20 20 20 20 20  CTION(hex,      
c6a0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
c6b0: 30 2c 20 68 65 78 46 75 6e 63 20 20 20 20 20 20  0, hexFunc      
c6c0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
c6d0: 49 4f 4e 32 28 69 66 6e 75 6c 6c 2c 20 20 20 20  ION2(ifnull,    
c6e0: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c          2, 0, 0,
c6f0: 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49   noopFunc,  SQLI
c700: 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45  TE_FUNC_COALESCE
c710: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32  ),.    FUNCTION2
c720: 28 75 6e 6c 69 6b 65 6c 79 2c 20 20 20 20 20 20  (unlikely,      
c730: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6e 6f 6f      1, 0, 0, noo
c740: 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46  pFunc,  SQLITE_F
c750: 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29 2c 0a 20  UNC_UNLIKELY),. 
c760: 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 6c 69 6b     FUNCTION2(lik
c770: 65 6c 69 68 6f 6f 64 2c 20 20 20 20 20 20 20 20  elihood,        
c780: 32 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e  2, 0, 0, noopFun
c790: 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  c,  SQLITE_FUNC_
c7a0: 55 4e 4c 49 4b 45 4c 59 29 2c 0a 20 20 20 20 56  UNLIKELY),.    V
c7b0: 46 55 4e 43 54 49 4f 4e 28 72 61 6e 64 6f 6d 2c  FUNCTION(random,
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
c7d0: 2c 20 30 2c 20 72 61 6e 64 6f 6d 46 75 6e 63 20  , 0, randomFunc 
c7e0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 56 46 55        ),.    VFU
c7f0: 4e 43 54 49 4f 4e 28 72 61 6e 64 6f 6d 62 6c 6f  NCTION(randomblo
c800: 62 2c 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20  b,        1, 0, 
c810: 30 2c 20 72 61 6e 64 6f 6d 42 6c 6f 62 20 20 20  0, randomBlob   
c820: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
c830: 49 4f 4e 28 6e 75 6c 6c 69 66 2c 20 20 20 20 20  ION(nullif,     
c840: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 31 2c          2, 0, 1,
c850: 20 6e 75 6c 6c 69 66 46 75 6e 63 20 20 20 20 20   nullifFunc     
c860: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
c870: 4e 28 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e  N(sqlite_version
c880: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 76  ,     0, 0, 0, v
c890: 65 72 73 69 6f 6e 46 75 6e 63 20 20 20 20 20 20  ersionFunc      
c8a0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
c8b0: 73 71 6c 69 74 65 5f 73 6f 75 72 63 65 5f 69 64  sqlite_source_id
c8c0: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 73 6f 75  ,   0, 0, 0, sou
c8d0: 72 63 65 69 64 46 75 6e 63 20 20 20 20 20 29 2c  rceidFunc     ),
c8e0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71  .    FUNCTION(sq
c8f0: 6c 69 74 65 5f 6c 6f 67 2c 20 20 20 20 20 20 20  lite_log,       
c900: 20 20 32 2c 20 30 2c 20 30 2c 20 65 72 72 6c 6f    2, 0, 0, errlo
c910: 67 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 23  gFunc       ),.#
c920: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c930: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
c940: 5f 44 49 41 47 53 0a 20 20 20 20 46 55 4e 43 54  _DIAGS.    FUNCT
c950: 49 4f 4e 28 73 71 6c 69 74 65 5f 63 6f 6d 70 69  ION(sqlite_compi
c960: 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 2c 31 2c  leoption_used,1,
c970: 20 30 2c 20 30 2c 20 63 6f 6d 70 69 6c 65 6f 70   0, 0, compileop
c980: 74 69 6f 6e 75 73 65 64 46 75 6e 63 20 20 29 2c  tionusedFunc  ),
c990: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71  .    FUNCTION(sq
c9a0: 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  lite_compileopti
c9b0: 6f 6e 5f 67 65 74 2c 20 31 2c 20 30 2c 20 30 2c  on_get, 1, 0, 0,
c9c0: 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 67 65   compileoptionge
c9d0: 74 46 75 6e 63 20 20 29 2c 0a 23 65 6e 64 69 66  tFunc  ),.#endif
c9e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
c9f0: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
ca00: 41 47 53 20 2a 2f 0a 20 20 20 20 46 55 4e 43 54  AGS */.    FUNCT
ca10: 49 4f 4e 28 71 75 6f 74 65 2c 20 20 20 20 20 20  ION(quote,      
ca20: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
ca30: 20 71 75 6f 74 65 46 75 6e 63 20 20 20 20 20 20   quoteFunc      
ca40: 20 20 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49    ),.    VFUNCTI
ca50: 4f 4e 28 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  ON(last_insert_r
ca60: 6f 77 69 64 2c 20 30 2c 20 30 2c 20 30 2c 20 6c  owid, 0, 0, 0, l
ca70: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
ca80: 29 2c 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e  ),.    VFUNCTION
ca90: 28 63 68 61 6e 67 65 73 2c 20 20 20 20 20 20 20  (changes,       
caa0: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 63 68 61      0, 0, 0, cha
cab0: 6e 67 65 73 20 20 20 20 20 20 20 20 20 20 29 2c  nges          ),
cac0: 0a 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 74  .    VFUNCTION(t
cad0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 2c 20 20 20  otal_changes,   
cae0: 20 20 30 2c 20 30 2c 20 30 2c 20 74 6f 74 61 6c    0, 0, 0, total
caf0: 5f 63 68 61 6e 67 65 73 20 20 20 20 29 2c 0a 20  _changes    ),. 
cb00: 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 65 70 6c     FUNCTION(repl
cb10: 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
cb20: 33 2c 20 30 2c 20 30 2c 20 72 65 70 6c 61 63 65  3, 0, 0, replace
cb30: 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20  Func      ),.   
cb40: 20 46 55 4e 43 54 49 4f 4e 28 7a 65 72 6f 62 6c   FUNCTION(zerobl
cb50: 6f 62 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c  ob,           1,
cb60: 20 30 2c 20 30 2c 20 7a 65 72 6f 62 6c 6f 62 46   0, 0, zeroblobF
cb70: 75 6e 63 20 20 20 20 20 29 2c 0a 20 20 23 69 66  unc     ),.  #if
cb80: 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44  def SQLITE_SOUND
cb90: 45 58 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  EX.    FUNCTION(
cba0: 73 6f 75 6e 64 65 78 2c 20 20 20 20 20 20 20 20  soundex,        
cbb0: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 6f 75      1, 0, 0, sou
cbc0: 6e 64 65 78 46 75 6e 63 20 20 20 20 20 20 29 2c  ndexFunc      ),
cbd0: 0a 20 20 23 65 6e 64 69 66 0a 20 20 23 69 66 6e  .  #endif.  #ifn
cbe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cbf0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
cc00: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64     FUNCTION(load
cc10: 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20  _extension,     
cc20: 31 2c 20 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74  1, 0, 0, loadExt
cc30: 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20            ),.   
cc40: 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65   FUNCTION(load_e
cc50: 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 32 2c  xtension,     2,
cc60: 20 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20   0, 0, loadExt  
cc70: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 23 65 6e          ),.  #en
cc80: 64 69 66 0a 20 20 20 20 41 47 47 52 45 47 41 54  dif.    AGGREGAT
cc90: 45 28 73 75 6d 2c 20 20 20 20 20 20 20 20 20 20  E(sum,          
cca0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 75       1, 0, 0, su
ccb0: 6d 53 74 65 70 2c 20 20 20 20 20 20 20 20 20 73  mStep,         s
ccc0: 75 6d 46 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c  umFinalize    ),
ccd0: 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28 74  .    AGGREGATE(t
cce0: 6f 74 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20  otal,           
ccf0: 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74    1, 0, 0, sumSt
cd00: 65 70 2c 20 20 20 20 20 20 20 20 20 74 6f 74 61  ep,         tota
cd10: 6c 46 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a  lFinalize    ),.
cd20: 20 20 20 20 41 47 47 52 45 47 41 54 45 28 61 76      AGGREGATE(av
cd30: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
cd40: 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65   1, 0, 0, sumSte
cd50: 70 2c 20 20 20 20 20 20 20 20 20 61 76 67 46 69  p,         avgFi
cd60: 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 2f 2a  nalize    ),. /*
cd70: 20 41 47 47 52 45 47 41 54 45 28 63 6f 75 6e 74   AGGREGATE(count
cd80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  ,             0,
cd90: 20 30 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65 70   0, 0, countStep
cda0: 2c 20 20 20 20 20 20 20 63 6f 75 6e 74 46 69 6e  ,       countFin
cdb0: 61 6c 69 7a 65 20 20 29 2c 20 2a 2f 0a 20 20 20  alize  ), */.   
cdc0: 20 7b 30 2c 53 51 4c 49 54 45 5f 55 54 46 38 7c   {0,SQLITE_UTF8|
cdd0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
cde0: 54 2c 30 2c 30 2c 30 2c 63 6f 75 6e 74 53 74 65  T,0,0,0,countSte
cdf0: 70 2c 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c  p,countFinalize,
ce00: 22 63 6f 75 6e 74 22 2c 30 2c 30 7d 2c 0a 20 20  "count",0,0},.  
ce10: 20 20 41 47 47 52 45 47 41 54 45 28 63 6f 75 6e    AGGREGATE(coun
ce20: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31  t,             1
ce30: 2c 20 30 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65  , 0, 0, countSte
ce40: 70 2c 20 20 20 20 20 20 20 63 6f 75 6e 74 46 69  p,       countFi
ce50: 6e 61 6c 69 7a 65 20 20 29 2c 0a 20 20 20 20 41  nalize  ),.    A
ce60: 47 47 52 45 47 41 54 45 28 67 72 6f 75 70 5f 63  GGREGATE(group_c
ce70: 6f 6e 63 61 74 2c 20 20 20 20 20 20 31 2c 20 30  oncat,      1, 0
ce80: 2c 20 30 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74  , 0, groupConcat
ce90: 53 74 65 70 2c 20 67 72 6f 75 70 43 6f 6e 63 61  Step, groupConca
cea0: 74 46 69 6e 61 6c 69 7a 65 29 2c 0a 20 20 20 20  tFinalize),.    
ceb0: 41 47 47 52 45 47 41 54 45 28 67 72 6f 75 70 5f  AGGREGATE(group_
cec0: 63 6f 6e 63 61 74 2c 20 20 20 20 20 20 32 2c 20  concat,      2, 
ced0: 30 2c 20 30 2c 20 67 72 6f 75 70 43 6f 6e 63 61  0, 0, groupConca
cee0: 74 53 74 65 70 2c 20 67 72 6f 75 70 43 6f 6e 63  tStep, groupConc
cef0: 61 74 46 69 6e 61 6c 69 7a 65 29 2c 0a 20 20 0a  atFinalize),.  .
cf00: 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 67 6c 6f      LIKEFUNC(glo
cf10: 62 2c 20 32 2c 20 26 67 6c 6f 62 49 6e 66 6f 2c  b, 2, &globInfo,
cf20: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
cf30: 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  E|SQLITE_FUNC_CA
cf40: 53 45 29 2c 0a 20 20 23 69 66 64 65 66 20 53 51  SE),.  #ifdef SQ
cf50: 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49 54  LITE_CASE_SENSIT
cf60: 49 56 45 5f 4c 49 4b 45 0a 20 20 20 20 4c 49 4b  IVE_LIKE.    LIK
cf70: 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c 20 26  EFUNC(like, 2, &
cf80: 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20 53 51 4c  likeInfoAlt, SQL
cf90: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51  ITE_FUNC_LIKE|SQ
cfa0: 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c  LITE_FUNC_CASE),
cfb0: 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69  .    LIKEFUNC(li
cfc0: 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49 6e 66 6f  ke, 3, &likeInfo
cfd0: 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  Alt, SQLITE_FUNC
cfe0: 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e  _LIKE|SQLITE_FUN
cff0: 43 5f 43 41 53 45 29 2c 0a 20 20 23 65 6c 73 65  C_CASE),.  #else
d000: 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c 69  .    LIKEFUNC(li
d010: 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e 66 6f  ke, 2, &likeInfo
d020: 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55 4e  Norm, SQLITE_FUN
d030: 43 5f 4c 49 4b 45 29 2c 0a 20 20 20 20 4c 49 4b  C_LIKE),.    LIK
d040: 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c 20 26  EFUNC(like, 3, &
d050: 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51  likeInfoNorm, SQ
d060: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c  LITE_FUNC_LIKE),
d070: 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 0a  .  #endif.  };..
d080: 20 20 69 6e 74 20 69 3b 0a 20 20 46 75 6e 63 44    int i;.  FuncD
d090: 65 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  efHash *pHash = 
d0a0: 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48  &GLOBAL(FuncDefH
d0b0: 61 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  ash, sqlite3Glob
d0c0: 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20  alFunctions);.  
d0d0: 46 75 6e 63 44 65 66 20 2a 61 46 75 6e 63 20 3d  FuncDef *aFunc =
d0e0: 20 28 46 75 6e 63 44 65 66 2a 29 26 47 4c 4f 42   (FuncDef*)&GLOB
d0f0: 41 4c 28 46 75 6e 63 44 65 66 2c 20 61 42 75 69  AL(FuncDef, aBui
d100: 6c 74 69 6e 46 75 6e 63 29 3b 0a 0a 20 20 66 6f  ltinFunc);..  fo
d110: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
d120: 7a 65 28 61 42 75 69 6c 74 69 6e 46 75 6e 63 29  ze(aBuiltinFunc)
d130: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
d140: 74 65 33 46 75 6e 63 44 65 66 49 6e 73 65 72 74  te3FuncDefInsert
d150: 28 70 48 61 73 68 2c 20 26 61 46 75 6e 63 5b 69  (pHash, &aFunc[i
d160: 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
d170: 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  3RegisterDateTim
d180: 65 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 69  eFunctions();.#i
d190: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d1a0: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 73  T_ALTERTABLE.  s
d1b0: 71 6c 69 74 65 33 41 6c 74 65 72 46 75 6e 63 74  qlite3AlterFunct
d1c0: 69 6f 6e 73 28 29 3b 0a 23 65 6e 64 69 66 0a 23  ions();.#endif.#
d1d0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
d1e0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20  E_ENABLE_STAT3) 
d1f0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
d200: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 0a  E_ENABLE_STAT4).
d210: 20 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65    sqlite3Analyze
d220: 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 65 6e  Functions();.#en
d230: 64 69 66 0a 7d 0a                                dif.}.