/ Hex Artifact Content
Login

Artifact 1b7ac915eb83255eba90906cc2e317b1f29ae5c9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 32 20 46 65 62 72 75  /*.** 2002 Febru
0010: 61 72 79 20 32 33 0a 2a 2a 0a 2a 2a 20 54 68 65  ary 23.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
0190: 43 2d 6c 61 6e 67 75 61 67 65 20 69 6d 70 6c 65  C-language imple
01a0: 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 6d  mentations for m
01b0: 61 6e 79 20 6f 66 20 74 68 65 20 53 51 4c 0a 2a  any of the SQL.*
01c0: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6f 66 20 53  * functions of S
01d0: 51 4c 69 74 65 2e 20 20 28 53 6f 6d 65 20 66 75  QLite.  (Some fu
01e0: 6e 63 74 69 6f 6e 2c 20 61 6e 64 20 69 6e 20 70  nction, and in p
01f0: 61 72 74 69 63 75 6c 61 72 20 74 68 65 20 64 61  articular the da
0200: 74 65 20 61 6e 64 0a 2a 2a 20 74 69 6d 65 20 66  te and.** time f
0210: 75 6e 63 74 69 6f 6e 73 2c 20 61 72 65 20 69 6d  unctions, are im
0220: 70 6c 65 6d 65 6e 74 65 64 20 73 65 70 61 72 61  plemented separa
0230: 74 65 6c 79 2e 29 0a 2a 2f 0a 23 69 6e 63 6c 75  tely.).*/.#inclu
0240: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0250: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
0260: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61  b.h>.#include <a
0270: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0280: 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 2f  e "vdbeInt.h"../
0290: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
02a0: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
02b0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
02c0: 74 68 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  th a function..*
02d0: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
02e0: 20 2a 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63   *sqlite3GetFunc
02f0: 43 6f 6c 6c 53 65 71 28 73 71 6c 69 74 65 33 5f  CollSeq(sqlite3_
0300: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0310: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 6f 6e 74  ){.  return cont
0320: 65 78 74 2d 3e 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  ext->pColl;.}../
0330: 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
0340: 61 74 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  at the accumulat
0350: 6f 72 20 6c 6f 61 64 20 73 68 6f 75 6c 64 20 62  or load should b
0360: 65 20 73 6b 69 70 70 65 64 20 6f 6e 20 74 68 69  e skipped on thi
0370: 73 0a 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f  s.** iteration o
0380: 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
0390: 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  loop..*/.static 
03a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 6b 69 70  void sqlite3Skip
03b0: 41 63 63 75 6d 75 6c 61 74 6f 72 4c 6f 61 64 28  AccumulatorLoad(
03c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
03d0: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 63 6f 6e  *context){.  con
03e0: 74 65 78 74 2d 3e 73 6b 69 70 46 6c 61 67 20 3d  text->skipFlag =
03f0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70   1;.}../*.** Imp
0400: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0410: 68 65 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  he non-aggregate
0420: 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29   min() and max()
0430: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2f 0a 73 74   functions.*/.st
0440: 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61 78  atic void minmax
0450: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
0460: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0470: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
0480: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0490: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  argv.){.  int i;
04a0: 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 20 20 20 20  .  int mask;    
04b0: 2f 2a 20 30 20 66 6f 72 20 6d 69 6e 28 29 20 6f  /* 0 for min() o
04c0: 72 20 30 78 66 66 66 66 66 66 66 66 20 66 6f 72  r 0xffffffff for
04d0: 20 6d 61 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20   max() */.  int 
04e0: 69 42 65 73 74 3b 0a 20 20 43 6f 6c 6c 53 65 71  iBest;.  CollSeq
04f0: 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 61 73 73 65   *pColl;..  asse
0500: 72 74 28 20 61 72 67 63 3e 31 20 29 3b 0a 20 20  rt( argc>1 );.  
0510: 6d 61 73 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75  mask = sqlite3_u
0520: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
0530: 29 3d 3d 30 20 3f 20 30 20 3a 20 2d 31 3b 0a 20  )==0 ? 0 : -1;. 
0540: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
0550: 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63  GetFuncCollSeq(c
0560: 6f 6e 74 65 78 74 29 3b 0a 20 20 61 73 73 65 72  ontext);.  asser
0570: 74 28 20 70 43 6f 6c 6c 20 29 3b 0a 20 20 61 73  t( pColl );.  as
0580: 73 65 72 74 28 20 6d 61 73 6b 3d 3d 2d 31 20 7c  sert( mask==-1 |
0590: 7c 20 6d 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 69  | mask==0 );.  i
05a0: 42 65 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Best = 0;.  if( 
05b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
05c0: 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c  pe(argv[0])==SQL
05d0: 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72  ITE_NULL ) retur
05e0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  n;.  for(i=1; i<
05f0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
0600: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
0610: 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 3d  e_type(argv[i])=
0620: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72  =SQLITE_NULL ) r
0630: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 28  eturn;.    if( (
0640: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
0650: 65 28 61 72 67 76 5b 69 42 65 73 74 5d 2c 20 61  e(argv[iBest], a
0660: 72 67 76 5b 69 5d 2c 20 70 43 6f 6c 6c 29 5e 6d  rgv[i], pColl)^m
0670: 61 73 6b 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ask)>=0 ){.     
0680: 20 74 65 73 74 63 61 73 65 28 20 6d 61 73 6b 3d   testcase( mask=
0690: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 42 65 73  =0 );.      iBes
06a0: 74 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = i;.    }.  }
06b0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
06c0: 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  t_value(context,
06d0: 20 61 72 67 76 5b 69 42 65 73 74 5d 29 3b 0a 7d   argv[iBest]);.}
06e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
06f0: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 61  he type of the a
0700: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
0710: 69 63 20 76 6f 69 64 20 74 79 70 65 6f 66 46 75  ic void typeofFu
0720: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
0730: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
0740: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
0750: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0760: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
0770: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
0780: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
0790: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 73 77 69  (NotUsed);.  swi
07a0: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c  tch( sqlite3_val
07b0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
07c0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
07d0: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7a 20 3d  ITE_INTEGER: z =
07e0: 20 22 69 6e 74 65 67 65 72 22 3b 20 62 72 65 61   "integer"; brea
07f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0800: 54 45 5f 54 45 58 54 3a 20 20 20 20 7a 20 3d 20  TE_TEXT:    z = 
0810: 22 74 65 78 74 22 3b 20 20 20 20 62 72 65 61 6b  "text";    break
0820: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0830: 45 5f 46 4c 4f 41 54 3a 20 20 20 7a 20 3d 20 22  E_FLOAT:   z = "
0840: 72 65 61 6c 22 3b 20 20 20 20 62 72 65 61 6b 3b  real";    break;
0850: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0860: 5f 42 4c 4f 42 3a 20 20 20 20 7a 20 3d 20 22 62  _BLOB:    z = "b
0870: 6c 6f 62 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  lob";    break;.
0880: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
0890: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 6e 75           z = "nu
08a0: 6c 6c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ll";    break;. 
08b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
08c0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
08d0: 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
08e0: 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  STATIC);.}.../*.
08f0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
0900: 6e 20 6f 66 20 74 68 65 20 6c 65 6e 67 74 68 28  n of the length(
0910: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74  ) function.*/.st
0920: 61 74 69 63 20 76 6f 69 64 20 6c 65 6e 67 74 68  atic void length
0930: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
0940: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
0950: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
0960: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0970: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6c 65  argv.){.  int le
0980: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72  n;..  assert( ar
0990: 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45  gc==1 );.  UNUSE
09a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
09b0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c  );.  switch( sql
09c0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
09d0: 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20  argv[0]) ){.    
09e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
09f0: 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
0a00: 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  E_INTEGER:.    c
0a10: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
0a20: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
0a30: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
0a40: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
0a50: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
0a60: 5d 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ]));.      break
0a70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
0a80: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a   SQLITE_TEXT: {.
0a90: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
0aa0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73  gned char *z = s
0ab0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
0ac0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
0ad0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
0ae0: 75 72 6e 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d  urn;.      len =
0af0: 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
0b00: 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 6c   *z ){.        l
0b10: 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 53 51  en++;.        SQ
0b20: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
0b30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
0b40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0b50: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6c 65 6e  int(context, len
0b60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
0b70: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
0b80: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
0b90: 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63  e3_result_null(c
0ba0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 62  ontext);.      b
0bb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
0bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
0bd0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61  ntation of the a
0be0: 62 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  bs() function..*
0bf0: 2a 0a 2a 2a 20 49 4d 50 3a 20 52 2d 32 33 39 37  *.** IMP: R-2397
0c00: 39 2d 32 36 38 35 35 20 54 68 65 20 61 62 73 28  9-26855 The abs(
0c10: 58 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  X) function retu
0c20: 72 6e 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65  rns the absolute
0c30: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
0c40: 20 6e 75 6d 65 72 69 63 20 61 72 67 75 6d 65 6e   numeric argumen
0c50: 74 20 58 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  t X. .*/.static 
0c60: 76 6f 69 64 20 61 62 73 46 75 6e 63 28 73 71 6c  void absFunc(sql
0c70: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
0c80: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
0c90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0ca0: 2a 61 72 67 76 29 7b 0a 20 20 61 73 73 65 72 74  *argv){.  assert
0cb0: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55  ( argc==1 );.  U
0cc0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0cd0: 61 72 67 63 29 3b 0a 20 20 73 77 69 74 63 68 28  argc);.  switch(
0ce0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
0cf0: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a  ype(argv[0]) ){.
0d00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0d10: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
0d20: 20 69 36 34 20 69 56 61 6c 20 3d 20 73 71 6c 69   i64 iVal = sqli
0d30: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
0d40: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
0d50: 69 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20  if( iVal<0 ){.  
0d60: 20 20 20 20 20 20 69 66 28 20 69 56 61 6c 3d 3d        if( iVal==
0d70: 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29  SMALLEST_INT64 )
0d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
0d90: 4d 50 3a 20 52 2d 33 31 36 37 36 2d 34 35 35 30  MP: R-31676-4550
0da0: 39 20 49 66 20 58 20 69 73 20 74 68 65 20 69 6e  9 If X is the in
0db0: 74 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33  teger -922337203
0dc0: 36 38 35 34 37 37 35 38 30 38 0a 20 20 20 20 20  6854775808.     
0dd0: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 62 73       ** then abs
0de0: 28 58 29 20 74 68 72 6f 77 73 20 61 6e 20 69 6e  (X) throws an in
0df0: 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 65  teger overflow e
0e00: 72 72 6f 72 20 73 69 6e 63 65 20 74 68 65 72 65  rror since there
0e10: 20 69 73 20 6e 6f 0a 20 20 20 20 20 20 20 20 20   is no.         
0e20: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 70   ** equivalent p
0e30: 6f 73 69 74 69 76 65 20 36 34 2d 62 69 74 20 74  ositive 64-bit t
0e40: 77 6f 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 76 61  wo complement va
0e50: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lue. */.        
0e60: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0e70: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
0e80: 22 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f  "integer overflo
0e90: 77 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  w", -1);.       
0ea0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
0eb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 56 61     }.        iVa
0ec0: 6c 20 3d 20 2d 69 56 61 6c 3b 0a 20 20 20 20 20  l = -iVal;.     
0ed0: 20 7d 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65   } .      sqlite
0ee0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
0ef0: 6f 6e 74 65 78 74 2c 20 69 56 61 6c 29 3b 0a 20  ontext, iVal);. 
0f00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0f10: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
0f20: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
0f30: 2f 2a 20 49 4d 50 3a 20 52 2d 33 37 34 33 34 2d  /* IMP: R-37434-
0f40: 31 39 39 32 39 20 41 62 73 28 58 29 20 72 65 74  19929 Abs(X) ret
0f50: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 58 20 69  urns NULL if X i
0f60: 73 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20  s NULL. */.     
0f70: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0f80: 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20  null(context);. 
0f90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0fa0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
0fb0: 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73  .      /* Becaus
0fc0: 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  e sqlite3_value_
0fd0: 64 6f 75 62 6c 65 28 29 20 72 65 74 75 72 6e 73  double() returns
0fe0: 20 30 2e 30 20 69 66 20 74 68 65 20 61 72 67 75   0.0 if the argu
0ff0: 6d 65 6e 74 20 69 73 20 6e 6f 74 0a 20 20 20 20  ment is not.    
1000: 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 74    ** something t
1010: 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6e 76 65  hat can be conve
1020: 72 74 65 64 20 69 6e 74 6f 20 61 20 6e 75 6d 62  rted into a numb
1030: 65 72 2c 20 77 65 20 68 61 76 65 3a 0a 20 20 20  er, we have:.   
1040: 20 20 20 2a 2a 20 49 4d 50 3a 20 52 2d 35 37 33     ** IMP: R-573
1050: 32 36 2d 33 31 35 34 31 20 41 62 73 28 58 29 20  26-31541 Abs(X) 
1060: 72 65 74 75 72 6e 20 30 2e 30 20 69 66 20 58 20  return 0.0 if X 
1070: 69 73 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62  is a string or b
1080: 6c 6f 62 20 74 68 61 74 0a 20 20 20 20 20 20 2a  lob that.      *
1090: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76  * cannot be conv
10a0: 65 72 74 65 64 20 74 6f 20 61 20 6e 75 6d 65 72  erted to a numer
10b0: 69 63 20 76 61 6c 75 65 2e 20 0a 20 20 20 20 20  ic value. .     
10c0: 20 2a 2f 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   */.      double
10d0: 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   rVal = sqlite3_
10e0: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
10f0: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[0]);.      if(
1100: 20 72 56 61 6c 3c 30 20 29 20 72 56 61 6c 20 3d   rVal<0 ) rVal =
1110: 20 2d 72 56 61 6c 3b 0a 20 20 20 20 20 20 73 71   -rVal;.      sq
1120: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
1130: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 56 61  ble(context, rVa
1140: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1150: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1160: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1170: 6f 6e 20 6f 66 20 74 68 65 20 69 6e 73 74 72 28  on of the instr(
1180: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ) function..**.*
1190: 2a 20 69 6e 73 74 72 28 68 61 79 73 74 61 63 6b  * instr(haystack
11a0: 2c 6e 65 65 64 6c 65 29 20 66 69 6e 64 73 20 74  ,needle) finds t
11b0: 68 65 20 66 69 72 73 74 20 6f 63 63 75 72 72 65  he first occurre
11c0: 6e 63 65 20 6f 66 20 6e 65 65 64 6c 65 0a 2a 2a  nce of needle.**
11d0: 20 69 6e 20 68 61 79 73 74 61 63 6b 20 61 6e 64   in haystack and
11e0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
11f0: 62 65 72 20 6f 66 20 70 72 65 76 69 6f 75 73 20  ber of previous 
1200: 63 68 61 72 61 63 74 65 72 73 20 70 6c 75 73 20  characters plus 
1210: 31 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 6e 65  1,.** or 0 if ne
1220: 65 64 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  edle does not oc
1230: 63 75 72 20 77 69 74 68 69 6e 20 68 61 79 73 74  cur within hayst
1240: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f  ack..**.** If bo
1250: 74 68 20 68 61 79 73 74 61 63 6b 20 61 6e 64 20  th haystack and 
1260: 6e 65 65 64 6c 65 20 61 72 65 20 42 4c 4f 42 73  needle are BLOBs
1270: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
1280: 74 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t is one more th
1290: 61 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  an.** the number
12a0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 61 79   of bytes in hay
12b0: 73 74 61 63 6b 20 70 72 69 6f 72 20 74 6f 20 74  stack prior to t
12c0: 68 65 20 66 69 72 73 74 20 6f 63 63 75 72 72 65  he first occurre
12d0: 6e 63 65 20 6f 66 20 6e 65 65 64 6c 65 2c 0a 2a  nce of needle,.*
12e0: 2a 20 6f 72 20 30 20 69 66 20 6e 65 65 64 6c 65  * or 0 if needle
12f0: 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 69 6e   never occurs in
1300: 20 68 61 79 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74   haystack..*/.st
1310: 61 74 69 63 20 76 6f 69 64 20 69 6e 73 74 72 46  atic void instrF
1320: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1330: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1340: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
1350: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1360: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgv.){.  const u
1370: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 48  nsigned char *zH
1380: 61 79 73 74 61 63 6b 3b 0a 20 20 63 6f 6e 73 74  aystack;.  const
1390: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13a0: 7a 4e 65 65 64 6c 65 3b 0a 20 20 69 6e 74 20 6e  zNeedle;.  int n
13b0: 48 61 79 73 74 61 63 6b 3b 0a 20 20 69 6e 74 20  Haystack;.  int 
13c0: 6e 4e 65 65 64 6c 65 3b 0a 20 20 69 6e 74 20 74  nNeedle;.  int t
13d0: 79 70 65 48 61 79 73 74 61 63 6b 2c 20 74 79 70  ypeHaystack, typ
13e0: 65 4e 65 65 64 6c 65 3b 0a 20 20 69 6e 74 20 4e  eNeedle;.  int N
13f0: 20 3d 20 31 3b 0a 20 20 69 6e 74 20 69 73 54 65   = 1;.  int isTe
1400: 78 74 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  xt;..  UNUSED_PA
1410: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
1420: 20 74 79 70 65 48 61 79 73 74 61 63 6b 20 3d 20   typeHaystack = 
1430: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
1440: 70 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 74  pe(argv[0]);.  t
1450: 79 70 65 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69  ypeNeedle = sqli
1460: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
1470: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 74  rgv[1]);.  if( t
1480: 79 70 65 48 61 79 73 74 61 63 6b 3d 3d 53 51 4c  ypeHaystack==SQL
1490: 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 74 79 70 65  ITE_NULL || type
14a0: 4e 65 65 64 6c 65 3d 3d 53 51 4c 49 54 45 5f 4e  Needle==SQLITE_N
14b0: 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ULL ) return;.  
14c0: 6e 48 61 79 73 74 61 63 6b 20 3d 20 73 71 6c 69  nHaystack = sqli
14d0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
14e0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 4e 65 65  argv[0]);.  nNee
14f0: 64 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  dle = sqlite3_va
1500: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31  lue_bytes(argv[1
1510: 5d 29 3b 0a 20 20 69 66 28 20 74 79 70 65 48 61  ]);.  if( typeHa
1520: 79 73 74 61 63 6b 3d 3d 53 51 4c 49 54 45 5f 42  ystack==SQLITE_B
1530: 4c 4f 42 20 26 26 20 74 79 70 65 4e 65 65 64 6c  LOB && typeNeedl
1540: 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
1550: 7b 0a 20 20 20 20 7a 48 61 79 73 74 61 63 6b 20  {.    zHaystack 
1560: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1570: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
1580: 20 20 20 7a 4e 65 65 64 6c 65 20 3d 20 73 71 6c     zNeedle = sql
1590: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
15a0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 73  argv[1]);.    is
15b0: 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Text = 0;.  }els
15c0: 65 7b 0a 20 20 20 20 7a 48 61 79 73 74 61 63 6b  e{.    zHaystack
15d0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
15e0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
15f0: 20 20 20 20 7a 4e 65 65 64 6c 65 20 3d 20 73 71      zNeedle = sq
1600: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1610: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
1620: 73 54 65 78 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sText = 1;.  }. 
1630: 20 77 68 69 6c 65 28 20 6e 4e 65 65 64 6c 65 3c   while( nNeedle<
1640: 3d 6e 48 61 79 73 74 61 63 6b 20 26 26 20 6d 65  =nHaystack && me
1650: 6d 63 6d 70 28 7a 48 61 79 73 74 61 63 6b 2c 20  mcmp(zHaystack, 
1660: 7a 4e 65 65 64 6c 65 2c 20 6e 4e 65 65 64 6c 65  zNeedle, nNeedle
1670: 29 21 3d 30 20 29 7b 0a 20 20 20 20 4e 2b 2b 3b  )!=0 ){.    N++;
1680: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
1690: 48 61 79 73 74 61 63 6b 2d 2d 3b 0a 20 20 20 20  Haystack--;.    
16a0: 20 20 7a 48 61 79 73 74 61 63 6b 2b 2b 3b 0a 20    zHaystack++;. 
16b0: 20 20 20 7d 77 68 69 6c 65 28 20 69 73 54 65 78     }while( isTex
16c0: 74 20 26 26 20 28 7a 48 61 79 73 74 61 63 6b 5b  t && (zHaystack[
16d0: 30 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29  0]&0xc0)==0x80 )
16e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4e 65 65  ;.  }.  if( nNee
16f0: 64 6c 65 3e 6e 48 61 79 73 74 61 63 6b 20 29 20  dle>nHaystack ) 
1700: 4e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  N = 0;.  sqlite3
1710: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
1720: 65 78 74 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ext, N);.}../*.*
1730: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1740: 20 6f 66 20 74 68 65 20 70 72 69 6e 74 66 28 29   of the printf()
1750: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
1760: 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 66  atic void printf
1770: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1780: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1790: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
17a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
17b0: 61 72 67 76 0a 29 7b 0a 20 20 50 72 69 6e 74 66  argv.){.  Printf
17c0: 41 72 67 75 6d 65 6e 74 73 20 78 3b 0a 20 20 53  Arguments x;.  S
17d0: 74 72 41 63 63 75 6d 20 73 74 72 3b 0a 20 20 63  trAccum str;.  c
17e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
17f0: 61 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  at;.  int n;..  
1800: 69 66 28 20 61 72 67 63 3e 3d 31 20 26 26 20 28  if( argc>=1 && (
1810: 7a 46 6f 72 6d 61 74 20 3d 20 28 63 6f 6e 73 74  zFormat = (const
1820: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
1830: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
1840: 5d 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 78 2e  ]))!=0 ){.    x.
1850: 6e 41 72 67 20 3d 20 61 72 67 63 2d 31 3b 0a 20  nArg = argc-1;. 
1860: 20 20 20 78 2e 6e 55 73 65 64 20 3d 20 30 3b 0a     x.nUsed = 0;.
1870: 20 20 20 20 78 2e 61 70 41 72 67 20 3d 20 61 72      x.apArg = ar
1880: 67 76 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  gv+1;.    sqlite
1890: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 73  3StrAccumInit(&s
18a0: 74 72 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45  tr, 0, 0, SQLITE
18b0: 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20  _MAX_LENGTH);.  
18c0: 20 20 73 74 72 2e 64 62 20 3d 20 73 71 6c 69 74    str.db = sqlit
18d0: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
18e0: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
18f0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
1900: 66 28 26 73 74 72 2c 20 53 51 4c 49 54 45 5f 50  f(&str, SQLITE_P
1910: 52 49 4e 54 46 5f 53 51 4c 46 55 4e 43 2c 20 7a  RINTF_SQLFUNC, z
1920: 46 6f 72 6d 61 74 2c 20 26 78 29 3b 0a 20 20 20  Format, &x);.   
1930: 20 6e 20 3d 20 73 74 72 2e 6e 43 68 61 72 3b 0a   n = str.nChar;.
1940: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1950: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
1960: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1970: 46 69 6e 69 73 68 28 26 73 74 72 29 2c 20 6e 2c  Finish(&str), n,
1980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1990: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
19a0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
19b0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
19c0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ation of the sub
19d0: 73 74 72 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  str() function..
19e0: 2a 2a 0a 2a 2a 20 73 75 62 73 74 72 28 78 2c 70  **.** substr(x,p
19f0: 31 2c 70 32 29 20 20 72 65 74 75 72 6e 73 20 70  1,p2)  returns p
1a00: 32 20 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  2 characters of 
1a10: 78 5b 5d 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  x[] beginning wi
1a20: 74 68 20 70 31 2e 0a 2a 2a 20 70 31 20 69 73 20  th p1..** p1 is 
1a30: 31 2d 69 6e 64 65 78 65 64 2e 20 20 53 6f 20 73  1-indexed.  So s
1a40: 75 62 73 74 72 28 78 2c 31 2c 31 29 20 72 65 74  ubstr(x,1,1) ret
1a50: 75 72 6e 73 20 74 68 65 20 66 69 72 73 74 20 63  urns the first c
1a60: 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 78  haracter.** of x
1a70: 2e 20 20 49 66 20 78 20 69 73 20 74 65 78 74 2c  .  If x is text,
1a80: 20 74 68 65 6e 20 77 65 20 61 63 74 75 61 6c 6c   then we actuall
1a90: 79 20 63 6f 75 6e 74 20 55 54 46 2d 38 20 63 68  y count UTF-8 ch
1aa0: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 20 49 66 20  aracters..** If 
1ab0: 78 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65  x is a blob, the
1ac0: 6e 20 77 65 20 63 6f 75 6e 74 20 62 79 74 65 73  n we count bytes
1ad0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 31 20 69 73  ..**.** If p1 is
1ae0: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
1af0: 77 65 20 62 65 67 69 6e 20 61 62 73 28 70 31 29  we begin abs(p1)
1b00: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
1b10: 20 78 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   x[]..**.** If p
1b20: 32 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 72  2 is negative, r
1b30: 65 74 75 72 6e 20 74 68 65 20 70 32 20 63 68 61  eturn the p2 cha
1b40: 72 61 63 74 65 72 73 20 70 72 65 63 65 64 69 6e  racters precedin
1b50: 67 20 70 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  g p1..*/.static 
1b60: 76 6f 69 64 20 73 75 62 73 74 72 46 75 6e 63 28  void substrFunc(
1b70: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1b80: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
1b90: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
1ba0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1bb0: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
1bc0: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63  ned char *z;.  c
1bd0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1be0: 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 6c 65  ar *z2;.  int le
1bf0: 6e 3b 0a 20 20 69 6e 74 20 70 30 74 79 70 65 3b  n;.  int p0type;
1c00: 0a 20 20 69 36 34 20 70 31 2c 20 70 32 3b 0a 20  .  i64 p1, p2;. 
1c10: 20 69 6e 74 20 6e 65 67 50 32 20 3d 20 30 3b 0a   int negP2 = 0;.
1c20: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
1c30: 3d 33 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =3 || argc==2 );
1c40: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
1c50: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31  alue_type(argv[1
1c60: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a  ])==SQLITE_NULL.
1c70: 20 20 20 7c 7c 20 28 61 72 67 63 3d 3d 33 20 26     || (argc==3 &
1c80: 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
1c90: 74 79 70 65 28 61 72 67 76 5b 32 5d 29 3d 3d 53  type(argv[2])==S
1ca0: 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 20 20 29 7b  QLITE_NULL).  ){
1cb0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1cc0: 0a 20 20 70 30 74 79 70 65 20 3d 20 73 71 6c 69  .  p0type = sqli
1cd0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
1ce0: 72 67 76 5b 30 5d 29 3b 0a 20 20 70 31 20 3d 20  rgv[0]);.  p1 = 
1cf0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
1d00: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66  t(argv[1]);.  if
1d10: 28 20 70 30 74 79 70 65 3d 3d 53 51 4c 49 54 45  ( p0type==SQLITE
1d20: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 6c 65 6e  _BLOB ){.    len
1d30: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1d40: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
1d50: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
1d60: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
1d70: 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  [0]);.    if( z=
1d80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
1d90: 20 61 73 73 65 72 74 28 20 6c 65 6e 3d 3d 73 71   assert( len==sq
1da0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
1db0: 73 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20  s(argv[0]) );.  
1dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
1dd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1de0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
1df0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
1e00: 6e 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a  n;.    len = 0;.
1e10: 20 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a      if( p1<0 ){.
1e20: 20 20 20 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20        for(z2=z; 
1e30: 2a 7a 32 3b 20 6c 65 6e 2b 2b 29 7b 0a 20 20 20  *z2; len++){.   
1e40: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50       SQLITE_SKIP
1e50: 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 20  _UTF8(z2);.     
1e60: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
1e70: 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20  f( argc==3 ){.  
1e80: 20 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 76    p2 = sqlite3_v
1e90: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d  alue_int(argv[2]
1ea0: 29 3b 0a 20 20 20 20 69 66 28 20 70 32 3c 30 20  );.    if( p2<0 
1eb0: 29 7b 0a 20 20 20 20 20 20 70 32 20 3d 20 2d 70  ){.      p2 = -p
1ec0: 32 3b 0a 20 20 20 20 20 20 6e 65 67 50 32 20 3d  2;.      negP2 =
1ed0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
1ee0: 65 7b 0a 20 20 20 20 70 32 20 3d 20 73 71 6c 69  e{.    p2 = sqli
1ef0: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
1f00: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 2d 3e  andle(context)->
1f10: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
1f20: 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 7d  MIT_LENGTH];.  }
1f30: 0a 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20  .  if( p1<0 ){. 
1f40: 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b 0a 20 20     p1 += len;.  
1f50: 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20 20    if( p1<0 ){.  
1f60: 20 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a 20 20      p2 += p1;.  
1f70: 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 20 70      if( p2<0 ) p
1f80: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 31 20  2 = 0;.      p1 
1f90: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
1fa0: 73 65 20 69 66 28 20 70 31 3e 30 20 29 7b 0a 20  se if( p1>0 ){. 
1fb0: 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 65 6c 73 65     p1--;.  }else
1fc0: 20 69 66 28 20 70 32 3e 30 20 29 7b 0a 20 20 20   if( p2>0 ){.   
1fd0: 20 70 32 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28   p2--;.  }.  if(
1fe0: 20 6e 65 67 50 32 20 29 7b 0a 20 20 20 20 70 31   negP2 ){.    p1
1ff0: 20 2d 3d 20 70 32 3b 0a 20 20 20 20 69 66 28 20   -= p2;.    if( 
2000: 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32  p1<0 ){.      p2
2010: 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20 70 31   += p1;.      p1
2020: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2030: 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20    assert( p1>=0 
2040: 26 26 20 70 32 3e 3d 30 20 29 3b 0a 20 20 69 66  && p2>=0 );.  if
2050: 28 20 70 30 74 79 70 65 21 3d 53 51 4c 49 54 45  ( p0type!=SQLITE
2060: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 77 68 69  _BLOB ){.    whi
2070: 6c 65 28 20 2a 7a 20 26 26 20 70 31 20 29 7b 0a  le( *z && p1 ){.
2080: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
2090: 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 20  P_UTF8(z);.     
20a0: 20 70 31 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20   p1--;.    }.   
20b0: 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32 20 26   for(z2=z; *z2 &
20c0: 26 20 70 32 3b 20 70 32 2d 2d 29 7b 0a 20 20 20  & p2; p2--){.   
20d0: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
20e0: 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 7d 0a 20  TF8(z2);.    }. 
20f0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2100: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
2110: 28 63 68 61 72 2a 29 7a 2c 20 28 69 6e 74 29 28  (char*)z, (int)(
2120: 7a 32 2d 7a 29 2c 20 53 51 4c 49 54 45 5f 54 52  z2-z), SQLITE_TR
2130: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73  ANSIENT);.  }els
2140: 65 7b 0a 20 20 20 20 69 66 28 20 70 31 2b 70 32  e{.    if( p1+p2
2150: 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20 70 32  >len ){.      p2
2160: 20 3d 20 6c 65 6e 2d 70 31 3b 0a 20 20 20 20 20   = len-p1;.     
2170: 20 69 66 28 20 70 32 3c 30 20 29 20 70 32 20 3d   if( p2<0 ) p2 =
2180: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
2190: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
21a0: 62 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  b(context, (char
21b0: 2a 29 26 7a 5b 70 31 5d 2c 20 28 69 6e 74 29 70  *)&z[p1], (int)p
21c0: 32 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  2, SQLITE_TRANSI
21d0: 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ENT);.  }.}../*.
21e0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
21f0: 6e 20 6f 66 20 74 68 65 20 72 6f 75 6e 64 28 29  n of the round()
2200: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 23 69 66   function.*/.#if
2210: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2220: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
2230: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 75 6e  static void roun
2240: 64 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  dFunc(sqlite3_co
2250: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
2260: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
2270: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
2280: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
2290: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72  double r;.  char
22a0: 20 2a 7a 42 75 66 3b 0a 20 20 61 73 73 65 72 74   *zBuf;.  assert
22b0: 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67  ( argc==1 || arg
22c0: 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 61 72  c==2 );.  if( ar
22d0: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  gc==2 ){.    if(
22e0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71   SQLITE_NULL==sq
22f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2300: 28 61 72 67 76 5b 31 5d 29 20 29 20 72 65 74 75  (argv[1]) ) retu
2310: 72 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69  rn;.    n = sqli
2320: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
2330: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[1]);.    if( 
2340: 6e 3e 33 30 20 29 20 6e 20 3d 20 33 30 3b 0a 20  n>30 ) n = 30;. 
2350: 20 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d     if( n<0 ) n =
2360: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
2370: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2380: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
2390: 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b  E_NULL ) return;
23a0: 0a 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  r = sqlite3_v
23b0: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
23c0: 5b 30 5d 29 3b 0a 20 20 2f 2a 20 49 66 20 59 3d  [0]);.  /* If Y=
23d0: 3d 30 20 61 6e 64 20 58 20 77 69 6c 6c 20 66 69  =0 and X will fi
23e0: 74 20 69 6e 20 61 20 36 34 2d 62 69 74 20 69 6e  t in a 64-bit in
23f0: 74 2c 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  t,.  ** handle t
2400: 68 65 20 72 6f 75 6e 64 69 6e 67 20 64 69 72 65  he rounding dire
2410: 63 74 6c 79 2c 0a 20 20 2a 2a 20 6f 74 68 65 72  ctly,.  ** other
2420: 77 69 73 65 20 75 73 65 20 70 72 69 6e 74 66 2e  wise use printf.
2430: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 3d 3d 30  .  */.  if( n==0
2440: 20 26 26 20 72 3e 3d 30 20 26 26 20 72 3c 4c 41   && r>=0 && r<LA
2450: 52 47 45 53 54 5f 49 4e 54 36 34 2d 31 20 29 7b  RGEST_INT64-1 ){
2460: 0a 20 20 20 20 72 20 3d 20 28 64 6f 75 62 6c 65  .    r = (double
2470: 29 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 29  )((sqlite_int64)
2480: 28 72 2b 30 2e 35 29 29 3b 0a 20 20 7d 65 6c 73  (r+0.5));.  }els
2490: 65 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 72 3c  e if( n==0 && r<
24a0: 30 20 26 26 20 28 2d 72 29 3c 4c 41 52 47 45 53  0 && (-r)<LARGES
24b0: 54 5f 49 4e 54 36 34 2d 31 20 29 7b 0a 20 20 20  T_INT64-1 ){.   
24c0: 20 72 20 3d 20 2d 28 64 6f 75 62 6c 65 29 28 28   r = -(double)((
24d0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 28 28 2d  sqlite_int64)((-
24e0: 72 29 2b 30 2e 35 29 29 3b 0a 20 20 7d 65 6c 73  r)+0.5));.  }els
24f0: 65 7b 0a 20 20 20 20 7a 42 75 66 20 3d 20 73 71  e{.    zBuf = sq
2500: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2510: 2e 2a 66 22 2c 6e 2c 72 29 3b 0a 20 20 20 20 69  .*f",n,r);.    i
2520: 66 28 20 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( zBuf==0 ){.  
2530: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2540: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
2550: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 72  ontext);.      r
2560: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
2570: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 42 75   sqlite3AtoF(zBu
2580: 66 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53 74  f, &r, sqlite3St
2590: 72 6c 65 6e 33 30 28 7a 42 75 66 29 2c 20 53 51  rlen30(zBuf), SQ
25a0: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
25b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
25c0: 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  f);.  }.  sqlite
25d0: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
25e0: 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 7d 0a 23  context, r);.}.#
25f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  endif../*.** All
2600: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
2610: 73 20 6f 66 20 73 70 61 63 65 20 75 73 69 6e 67  s of space using
2620: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2630: 29 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 6c 6c  ). If the.** all
2640: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 63  ocation fails, c
2650: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 72 65 73 75  all sqlite3_resu
2660: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 29  lt_error_nomem()
2670: 20 74 6f 20 6e 6f 74 69 66 79 0a 2a 2a 20 74 68   to notify.** th
2680: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
2690: 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 28 29 20  e that malloc() 
26a0: 68 61 73 20 66 61 69 6c 65 64 20 61 6e 64 20 72  has failed and r
26b0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20 49  eturn NULL..** I
26c0: 66 20 6e 42 79 74 65 20 69 73 20 6c 61 72 67 65  f nByte is large
26d0: 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d  r than the maxim
26e0: 75 6d 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f  um string or blo
26f0: 62 20 6c 65 6e 67 74 68 2c 20 74 68 65 6e 0a 2a  b length, then.*
2700: 2a 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49 54  * raise an SQLIT
2710: 45 5f 54 4f 4f 42 49 47 20 65 78 63 65 70 74 69  E_TOOBIG excepti
2720: 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  on and return NU
2730: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
2740: 69 64 20 2a 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  id *contextMallo
2750: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
2760: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 36 34 20  t *context, i64 
2770: 6e 42 79 74 65 29 7b 0a 20 20 63 68 61 72 20 2a  nByte){.  char *
2780: 7a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  z;.  sqlite3 *db
2790: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
27a0: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
27b0: 74 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28  text);.  assert(
27c0: 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20 74 65   nByte>0 );.  te
27d0: 73 74 63 61 73 65 28 20 6e 42 79 74 65 3d 3d 64  stcase( nByte==d
27e0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
27f0: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
2800: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 42  ;.  testcase( nB
2810: 79 74 65 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  yte==db->aLimit[
2820: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
2830: 47 54 48 5d 2b 31 20 29 3b 0a 20 20 69 66 28 20  GTH]+1 );.  if( 
2840: 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74  nByte>db->aLimit
2850: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
2860: 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c  NGTH] ){.    sql
2870: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2880: 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74  r_toobig(context
2890: 29 3b 0a 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20  );.    z = 0;.  
28a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
28b0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e  qlite3Malloc((in
28c0: 74 29 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  t)nByte);.    if
28d0: 28 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  ( !z ){.      sq
28e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
28f0: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
2900: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2910: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
2920: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2930: 20 6f 66 20 74 68 65 20 75 70 70 65 72 28 29 20   of the upper() 
2940: 61 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c 20  and lower() SQL 
2950: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  functions..*/.st
2960: 61 74 69 63 20 76 6f 69 64 20 75 70 70 65 72 46  atic void upperF
2970: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
2980: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
2990: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
29a0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
29b0: 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e   char *z1;.  con
29c0: 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69  st char *z2;.  i
29d0: 6e 74 20 69 2c 20 6e 3b 0a 20 20 55 4e 55 53 45  nt i, n;.  UNUSE
29e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
29f0: 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72 2a  );.  z2 = (char*
2a00: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
2a10: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
2a20: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
2a30: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
2a40: 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  ;.  /* Verify th
2a50: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f  at the call to _
2a60: 62 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f 74  bytes() does not
2a70: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
2a80: 5f 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72 20  _text() pointer 
2a90: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32 3d  */.  assert( z2=
2aa0: 3d 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  =(char*)sqlite3_
2ab0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
2ac0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32 20  0]) );.  if( z2 
2ad0: 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74  ){.    z1 = cont
2ae0: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
2af0: 74 2c 20 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a  t, ((i64)n)+1);.
2b00: 20 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20 20      if( z1 ){.  
2b10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2b20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2b30: 7a 31 5b 69 5d 20 3d 20 28 63 68 61 72 29 73 71  z1[i] = (char)sq
2b40: 6c 69 74 65 33 54 6f 75 70 70 65 72 28 7a 32 5b  lite3Toupper(z2[
2b50: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
2b60: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2b70: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
2b80: 7a 31 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66  z1, n, sqlite3_f
2b90: 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ree);.    }.  }.
2ba0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f  }.static void lo
2bb0: 77 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  werFunc(sqlite3_
2bc0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
2bd0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
2be0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
2bf0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31 3b 0a 20  ){.  char *z1;. 
2c00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b   const char *z2;
2c10: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 55  .  int i, n;.  U
2c20: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2c30: 61 72 67 63 29 3b 0a 20 20 7a 32 20 3d 20 28 63  argc);.  z2 = (c
2c40: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
2c50: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
2c60: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  n = sqlite3_
2c70: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
2c80: 5b 30 5d 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66  [0]);.  /* Verif
2c90: 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  y that the call 
2ca0: 74 6f 20 5f 62 79 74 65 73 28 29 20 64 6f 65 73  to _bytes() does
2cb0: 20 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20   not invalidate 
2cc0: 74 68 65 20 5f 74 65 78 74 28 29 20 70 6f 69 6e  the _text() poin
2cd0: 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ter */.  assert(
2ce0: 20 7a 32 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69   z2==(char*)sqli
2cf0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
2d00: 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  rgv[0]) );.  if(
2d10: 20 7a 32 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20   z2 ){.    z1 = 
2d20: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
2d30: 6e 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2b  ntext, ((i64)n)+
2d40: 31 29 3b 0a 20 20 20 20 69 66 28 20 7a 31 20 29  1);.    if( z1 )
2d50: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
2d60: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
2d70: 20 20 20 20 7a 31 5b 69 5d 20 3d 20 73 71 6c 69      z1[i] = sqli
2d80: 74 65 33 54 6f 6c 6f 77 65 72 28 7a 32 5b 69 5d  te3Tolower(z2[i]
2d90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2da0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2db0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 31  text(context, z1
2dc0: 2c 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  , n, sqlite3_fre
2dd0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
2de0: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 66 75 6e 63  ./*.** Some func
2df0: 74 69 6f 6e 73 20 6c 69 6b 65 20 43 4f 41 4c 45  tions like COALE
2e00: 53 43 45 28 29 20 61 6e 64 20 49 46 4e 55 4c 4c  SCE() and IFNULL
2e10: 28 29 20 61 6e 64 20 55 4e 4c 49 4b 45 4c 59 28  () and UNLIKELY(
2e20: 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
2e30: 64 0a 2a 2a 20 61 73 20 56 44 42 45 20 63 6f 64  d.** as VDBE cod
2e40: 65 20 73 6f 20 74 68 61 74 20 75 6e 75 73 65 64  e so that unused
2e50: 20 61 72 67 75 6d 65 6e 74 20 76 61 6c 75 65 73   argument values
2e60: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
2e70: 62 65 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2a 20  be computed..** 
2e80: 48 6f 77 65 76 65 72 2c 20 77 65 20 73 74 69 6c  However, we stil
2e90: 6c 20 6e 65 65 64 20 73 6f 6d 65 20 6b 69 6e 64  l need some kind
2ea0: 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70   of function imp
2eb0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20  lementation for 
2ec0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  this.** routines
2ed0: 20 69 6e 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   in the function
2ee0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6e 6f 6f   table.  The noo
2ef0: 70 46 75 6e 63 20 6d 61 63 72 6f 20 70 72 6f 76  pFunc macro prov
2f00: 69 64 65 73 20 74 68 69 73 2e 0a 2a 2a 20 6e 6f  ides this..** no
2f10: 6f 70 46 75 6e 63 20 77 69 6c 6c 20 6e 65 76 65  opFunc will neve
2f20: 72 20 62 65 20 63 61 6c 6c 65 64 20 73 6f 20 69  r be called so i
2f30: 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  t doesn't matter
2f40: 20 77 68 61 74 20 74 68 65 20 69 6d 70 6c 65 6d   what the implem
2f50: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 69 73 2e 20  entation.** is. 
2f60: 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c   We might as wel
2f70: 6c 20 75 73 65 20 74 68 65 20 22 76 65 72 73 69  l use the "versi
2f80: 6f 6e 28 29 22 20 66 75 6e 63 74 69 6f 6e 20 61  on()" function a
2f90: 73 20 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a  s a substitute..
2fa0: 2a 2f 0a 23 64 65 66 69 6e 65 20 6e 6f 6f 70 46  */.#define noopF
2fb0: 75 6e 63 20 76 65 72 73 69 6f 6e 46 75 6e 63 20  unc versionFunc 
2fc0: 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
2fd0: 66 75 6e 63 74 69 6f 6e 20 2d 20 6e 65 76 65 72  function - never
2fe0: 20 63 61 6c 6c 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a   called */../*.*
2ff0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3000: 20 6f 66 20 72 61 6e 64 6f 6d 28 29 2e 20 20 52   of random().  R
3010: 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 69  eturn a random i
3020: 6e 74 65 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61  nteger.  .*/.sta
3030: 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 46  tic void randomF
3040: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
3050: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
3060: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
3070: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3080: 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20  **NotUsed2.){.  
3090: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 3b 0a  sqlite_int64 r;.
30a0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
30b0: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
30c0: 55 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74 65  Used2);.  sqlite
30d0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
30e0: 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 69  eof(r), &r);.  i
30f0: 66 28 20 72 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  f( r<0 ){.    /*
3100: 20 57 65 20 6e 65 65 64 20 74 6f 20 70 72 65 76   We need to prev
3110: 65 6e 74 20 61 20 72 61 6e 64 6f 6d 20 6e 75 6d  ent a random num
3120: 62 65 72 20 6f 66 20 30 78 38 30 30 30 30 30 30  ber of 0x8000000
3130: 30 30 30 30 30 30 30 30 30 20 0a 20 20 20 20 2a  000000000 .    *
3140: 2a 20 28 6f 72 20 2d 39 32 32 33 33 37 32 30 33  * (or -922337203
3150: 36 38 35 34 37 37 35 38 30 38 29 20 73 69 6e 63  6854775808) sinc
3160: 65 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 61 62  e when you do ab
3170: 73 28 29 20 6f 66 20 74 68 61 74 0a 20 20 20 20  s() of that.    
3180: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 79 6f 75  ** number of you
3190: 20 67 65 74 20 74 68 65 20 73 61 6d 65 20 76 61   get the same va
31a0: 6c 75 65 20 62 61 63 6b 20 61 67 61 69 6e 2e 20  lue back again. 
31b0: 20 54 6f 20 64 6f 20 74 68 69 73 0a 20 20 20 20   To do this.    
31c0: 2a 2a 20 69 6e 20 61 20 77 61 79 20 74 68 61 74  ** in a way that
31d0: 20 69 73 20 74 65 73 74 61 62 6c 65 2c 20 6d 61   is testable, ma
31e0: 73 6b 20 74 68 65 20 73 69 67 6e 20 62 69 74 20  sk the sign bit 
31f0: 6f 66 66 20 6f 66 20 6e 65 67 61 74 69 76 65 0a  off of negative.
3200: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 2c 20 72      ** values, r
3210: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 70 6f  esulting in a po
3220: 73 69 74 69 76 65 20 76 61 6c 75 65 2e 20 20 54  sitive value.  T
3230: 68 65 6e 20 74 61 6b 65 20 74 68 65 20 0a 20 20  hen take the .  
3240: 20 20 2a 2a 20 32 73 20 63 6f 6d 70 6c 65 6d 65    ** 2s compleme
3250: 6e 74 20 6f 66 20 74 68 61 74 20 70 6f 73 69 74  nt of that posit
3260: 69 76 65 20 76 61 6c 75 65 2e 20 20 54 68 65 20  ive value.  The 
3270: 65 6e 64 20 72 65 73 75 6c 74 20 63 61 6e 0a 20  end result can. 
3280: 20 20 20 2a 2a 20 74 68 65 72 65 66 6f 72 65 20     ** therefore 
3290: 62 65 20 6e 6f 20 6c 65 73 73 20 74 68 61 6e 20  be no less than 
32a0: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
32b0: 35 38 30 37 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  5807..    */.   
32c0: 20 72 20 3d 20 2d 28 72 20 26 20 4c 41 52 47 45   r = -(r & LARGE
32d0: 53 54 5f 49 4e 54 36 34 29 3b 0a 20 20 7d 0a 20  ST_INT64);.  }. 
32e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
32f0: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 72  int64(context, r
3300: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
3310: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61  ementation of ra
3320: 6e 64 6f 6d 62 6c 6f 62 28 4e 29 2e 20 20 52 65  ndomblob(N).  Re
3330: 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 62 6c  turn a random bl
3340: 6f 62 0a 2a 2a 20 74 68 61 74 20 69 73 20 4e 20  ob.** that is N 
3350: 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73  bytes long..*/.s
3360: 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f  tatic void rando
3370: 6d 42 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33  mBlob(.  sqlite3
3380: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
3390: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
33a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
33b0: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e  *argv.){.  int n
33c0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
33d0: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
33e0: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55  argc==1 );.  UNU
33f0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
3400: 67 63 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  gc);.  n = sqlit
3410: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
3420: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3c 31  v[0]);.  if( n<1
3430: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 31 3b 0a 20   ){.    n = 1;. 
3440: 20 7d 0a 20 20 70 20 3d 20 63 6f 6e 74 65 78 74   }.  p = context
3450: 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20  Malloc(context, 
3460: 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  n);.  if( p ){. 
3470: 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
3480: 6d 6e 65 73 73 28 6e 2c 20 70 29 3b 0a 20 20 20  mness(n, p);.   
3490: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
34a0: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28 63  blob(context, (c
34b0: 68 61 72 2a 29 70 2c 20 6e 2c 20 73 71 6c 69 74  har*)p, n, sqlit
34c0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a  e3_free);.  }.}.
34d0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
34e0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 73  ation of the las
34f0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
3500: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
3510: 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61  The return.** va
3520: 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  lue is the same 
3530: 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c  as the sqlite3_l
3540: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
3550: 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  () API function.
3560: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3570: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
3580: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  d(.  sqlite3_con
3590: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
35a0: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20 0a    int NotUsed, .
35b0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
35c0: 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20  **NotUsed2.){.  
35d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
35e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
35f0: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
3600: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
3610: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
3620: 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49  otUsed2);.  /* I
3630: 4d 50 3a 20 52 2d 35 31 35 31 33 2d 31 32 30 32  MP: R-51513-1202
3640: 36 20 54 68 65 20 6c 61 73 74 5f 69 6e 73 65 72  6 The last_inser
3650: 74 5f 72 6f 77 69 64 28 29 20 53 51 4c 20 66 75  t_rowid() SQL fu
3660: 6e 63 74 69 6f 6e 20 69 73 20 61 0a 20 20 2a 2a  nction is a.  **
3670: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
3680: 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  the sqlite3_last
3690: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20  _insert_rowid() 
36a0: 43 2f 43 2b 2b 20 69 6e 74 65 72 66 61 63 65 0a  C/C++ interface.
36b0: 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 2a    ** function. *
36c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  /.  sqlite3_resu
36d0: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
36e0: 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  , sqlite3_last_i
36f0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62 29 29  nsert_rowid(db))
3700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
3710: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
3720: 20 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66   changes() SQL f
3730: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
3740: 4d 50 3a 20 52 2d 36 32 30 37 33 2d 31 31 32 30  MP: R-62073-1120
3750: 39 20 54 68 65 20 63 68 61 6e 67 65 73 28 29 20  9 The changes() 
3760: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  SQL function is 
3770: 61 20 77 72 61 70 70 65 72 0a 2a 2a 20 61 72 6f  a wrapper.** aro
3780: 75 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f  und the sqlite3_
3790: 63 68 61 6e 67 65 73 28 29 20 43 2f 43 2b 2b 20  changes() C/C++ 
37a0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 68 65 6e  function and hen
37b0: 63 65 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 73  ce follows the s
37c0: 61 6d 65 0a 2a 2a 20 72 75 6c 65 73 20 66 6f 72  ame.** rules for
37d0: 20 63 6f 75 6e 74 69 6e 67 20 63 68 61 6e 67 65   counting change
37e0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
37f0: 64 20 63 68 61 6e 67 65 73 28 0a 20 20 73 71 6c  d changes(.  sql
3800: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
3810: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74  ntext,.  int Not
3820: 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f  Used,.  sqlite3_
3830: 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32  value **NotUsed2
3840: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
3850: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
3860: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
3870: 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44  ntext);.  UNUSED
3880: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
3890: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
38a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
38b0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
38c0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62  lite3_changes(db
38d0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  ));.}../*.** Imp
38e0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
38f0: 68 65 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  he total_changes
3900: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  () SQL function.
3910: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
3920: 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d  ue is.** the sam
3930: 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33  e as the sqlite3
3940: 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29  _total_changes()
3950: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
3960: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f  /.static void to
3970: 74 61 6c 5f 63 68 61 6e 67 65 73 28 0a 20 20 73  tal_changes(.  s
3980: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3990: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e  context,.  int N
39a0: 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65  otUsed,.  sqlite
39b0: 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65  3_value **NotUse
39c0: 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  d2.){.  sqlite3 
39d0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
39e0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
39f0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53  context);.  UNUS
3a00: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
3a10: 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
3a20: 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32  ;.  /* IMP: R-52
3a30: 37 35 36 2d 34 31 39 39 33 20 54 68 69 73 20 66  756-41993 This f
3a40: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61  unction is a wra
3a50: 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 0a  pper around the.
3a60: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 6f 74    ** sqlite3_tot
3a70: 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 43 2f 43  al_changes() C/C
3a80: 2b 2b 20 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f  ++ interface. */
3a90: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
3aa0: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
3ab0: 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61  qlite3_total_cha
3ac0: 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a  nges(db));.}../*
3ad0: 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20  .** A structure 
3ae0: 64 65 66 69 6e 69 6e 67 20 68 6f 77 20 74 6f 20  defining how to 
3af0: 64 6f 20 47 4c 4f 42 2d 73 74 79 6c 65 20 63 6f  do GLOB-style co
3b00: 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2f 0a 73 74  mparisons..*/.st
3b10: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
3b20: 20 7b 0a 20 20 75 38 20 6d 61 74 63 68 41 6c 6c   {.  u8 matchAll
3b30: 3b 0a 20 20 75 38 20 6d 61 74 63 68 4f 6e 65 3b  ;.  u8 matchOne;
3b40: 0a 20 20 75 38 20 6d 61 74 63 68 53 65 74 3b 0a  .  u8 matchSet;.
3b50: 20 20 75 38 20 6e 6f 43 61 73 65 3b 0a 7d 3b 0a    u8 noCase;.};.
3b60: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 4c 49 4b 45 20  ./*.** For LIKE 
3b70: 61 6e 64 20 47 4c 4f 42 20 6d 61 74 63 68 69 6e  and GLOB matchin
3b80: 67 20 6f 6e 20 45 42 43 44 49 43 20 6d 61 63 68  g on EBCDIC mach
3b90: 69 6e 65 73 2c 20 61 73 73 75 6d 65 20 74 68 61  ines, assume tha
3ba0: 74 20 65 76 65 72 79 0a 2a 2a 20 63 68 61 72 61  t every.** chara
3bb0: 63 74 65 72 20 69 73 20 65 78 61 63 74 6c 79 20  cter is exactly 
3bc0: 6f 6e 65 20 62 79 74 65 20 69 6e 20 73 69 7a 65  one byte in size
3bd0: 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20 63 68 61  .  Also, all cha
3be0: 72 61 63 74 65 72 73 20 61 72 65 0a 2a 2a 20 61  racters are.** a
3bf0: 62 6c 65 20 74 6f 20 70 61 72 74 69 63 69 70 61  ble to participa
3c00: 74 65 20 69 6e 20 75 70 70 65 72 2d 63 61 73 65  te in upper-case
3c10: 2d 74 6f 2d 6c 6f 77 65 72 2d 63 61 73 65 20 6d  -to-lower-case m
3c20: 61 70 70 69 6e 67 73 20 69 6e 20 45 42 43 44 49  appings in EBCDI
3c30: 43 0a 2a 2a 20 77 68 65 72 65 61 73 20 6f 6e 6c  C.** whereas onl
3c40: 79 20 63 68 61 72 61 63 74 65 72 73 20 6c 65 73  y characters les
3c50: 73 20 74 68 61 6e 20 30 78 38 30 20 64 6f 20 69  s than 0x80 do i
3c60: 6e 20 41 53 43 49 49 2e 0a 2a 2f 0a 23 69 66 20  n ASCII..*/.#if 
3c70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
3c80: 42 43 44 49 43 29 0a 23 20 64 65 66 69 6e 65 20  BCDIC).# define 
3c90: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
3ca0: 41 29 20 20 20 20 28 2a 28 28 2a 41 29 2b 2b 29  A)    (*((*A)++)
3cb0: 29 0a 23 20 64 65 66 69 6e 65 20 47 6c 6f 62 55  ).# define GlobU
3cc0: 70 70 65 72 54 6f 4c 6f 77 65 72 28 41 29 20 20  pperToLower(A)  
3cd0: 20 41 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65   A = sqlite3Uppe
3ce0: 72 54 6f 4c 6f 77 65 72 5b 41 5d 0a 23 65 6c 73  rToLower[A].#els
3cf0: 65 0a 23 20 64 65 66 69 6e 65 20 47 6c 6f 62 55  e.# define GlobU
3d00: 70 70 65 72 54 6f 4c 6f 77 65 72 28 41 29 20 20  pperToLower(A)  
3d10: 20 69 66 28 20 21 28 28 41 29 26 7e 30 78 37 66   if( !((A)&~0x7f
3d20: 29 20 29 7b 20 41 20 3d 20 73 71 6c 69 74 65 33  ) ){ A = sqlite3
3d30: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 41 5d 3b  UpperToLower[A];
3d40: 20 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69   }.#endif..stati
3d50: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63  c const struct c
3d60: 6f 6d 70 61 72 65 49 6e 66 6f 20 67 6c 6f 62 49  ompareInfo globI
3d70: 6e 66 6f 20 3d 20 7b 20 27 2a 27 2c 20 27 3f 27  nfo = { '*', '?'
3d80: 2c 20 27 5b 27 2c 20 30 20 7d 3b 0a 2f 2a 20 54  , '[', 0 };./* T
3d90: 68 65 20 63 6f 72 72 65 63 74 20 53 51 4c 2d 39  he correct SQL-9
3da0: 32 20 62 65 68 61 76 69 6f 72 20 69 73 20 66 6f  2 behavior is fo
3db0: 72 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  r the LIKE opera
3dc0: 74 6f 72 20 74 6f 20 69 67 6e 6f 72 65 0a 2a 2a  tor to ignore.**
3dd0: 20 63 61 73 65 2e 20 20 54 68 75 73 20 20 27 61   case.  Thus  'a
3de0: 27 20 4c 49 4b 45 20 27 41 27 20 77 6f 75 6c 64  ' LIKE 'A' would
3df0: 20 62 65 20 74 72 75 65 2e 20 2a 2f 0a 73 74 61   be true. */.sta
3e00: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
3e10: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 6c 69 6b   compareInfo lik
3e20: 65 49 6e 66 6f 4e 6f 72 6d 20 3d 20 7b 20 27 25  eInfoNorm = { '%
3e30: 27 2c 20 27 5f 27 2c 20 20 20 30 2c 20 31 20 7d  ', '_',   0, 1 }
3e40: 3b 0a 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  ;./* If SQLITE_C
3e50: 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49  ASE_SENSITIVE_LI
3e60: 4b 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  KE is defined, t
3e70: 68 65 6e 20 74 68 65 20 4c 49 4b 45 20 6f 70 65  hen the LIKE ope
3e80: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 63 61 73 65  rator.** is case
3e90: 20 73 65 6e 73 69 74 69 76 65 20 63 61 75 73 69   sensitive causi
3ea0: 6e 67 20 27 61 27 20 4c 49 4b 45 20 27 41 27 20  ng 'a' LIKE 'A' 
3eb0: 74 6f 20 62 65 20 66 61 6c 73 65 20 2a 2f 0a 73  to be false */.s
3ec0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
3ed0: 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 6c  ct compareInfo l
3ee0: 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 20 7b 20 27  ikeInfoAlt = { '
3ef0: 25 27 2c 20 27 5f 27 2c 20 20 20 30 2c 20 30 20  %', '_',   0, 0 
3f00: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  };../*.** Compar
3f10: 65 20 74 77 6f 20 55 54 46 2d 38 20 73 74 72 69  e two UTF-8 stri
3f20: 6e 67 73 20 66 6f 72 20 65 71 75 61 6c 69 74 79  ngs for equality
3f30: 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
3f40: 20 73 74 72 69 6e 67 20 63 61 6e 0a 2a 2a 20 70   string can.** p
3f50: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 61 20  otentially be a 
3f60: 22 67 6c 6f 62 22 20 65 78 70 72 65 73 73 69 6f  "glob" expressio
3f70: 6e 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  n.  Return true 
3f80: 28 31 29 20 69 66 20 74 68 65 79 0a 2a 2a 20 61  (1) if they.** a
3f90: 72 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64 20  re the same and 
3fa0: 66 61 6c 73 65 20 28 30 29 20 69 66 20 74 68 65  false (0) if the
3fb0: 79 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  y are different.
3fc0: 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20  .**.** Globbing 
3fd0: 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  rules:.**.**    
3fe0: 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63    '*'       Matc
3ff0: 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65  hes any sequence
4000: 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
4010: 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
4020: 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20 20  **      '?'     
4030: 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c    Matches exactl
4040: 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e  y one character.
4050: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d  .**.**     [...]
4060: 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e        Matches on
4070: 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d  e character from
4080: 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69   the enclosed li
4090: 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  st of.**        
40a0: 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65          characte
40b0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e  rs..**.**     [^
40c0: 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73  ...]     Matches
40d0: 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e   one character n
40e0: 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73  ot in the enclos
40f0: 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57  ed list..**.** W
4100: 69 74 68 20 74 68 65 20 5b 2e 2e 2e 5d 20 61 6e  ith the [...] an
4110: 64 20 5b 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69 6e  d [^...] matchin
4120: 67 2c 20 61 20 27 5d 27 20 63 68 61 72 61 63 74  g, a ']' charact
4130: 65 72 20 63 61 6e 20 62 65 20 69 6e 63 6c 75 64  er can be includ
4140: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73  ed.** in the lis
4150: 74 20 62 79 20 6d 61 6b 69 6e 67 20 69 74 20 74  t by making it t
4160: 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
4170: 65 72 20 61 66 74 65 72 20 27 5b 27 20 6f 72 20  er after '[' or 
4180: 27 5e 27 2e 20 20 41 0a 2a 2a 20 72 61 6e 67 65  '^'.  A.** range
4190: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 63   of characters c
41a0: 61 6e 20 62 65 20 73 70 65 63 69 66 69 65 64 20  an be specified 
41b0: 75 73 69 6e 67 20 27 2d 27 2e 20 20 45 78 61 6d  using '-'.  Exam
41c0: 70 6c 65 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22 20  ple:.** "[a-z]" 
41d0: 6d 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67  matches any sing
41e0: 6c 65 20 6c 6f 77 65 72 2d 63 61 73 65 20 6c 65  le lower-case le
41f0: 74 74 65 72 2e 20 20 54 6f 20 6d 61 74 63 68 20  tter.  To match 
4200: 61 20 27 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20 69  a '-', make.** i
4210: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
4220: 63 74 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74  cter in the list
4230: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4240: 74 69 6e 65 20 69 73 20 75 73 75 61 6c 6c 79 20  tine is usually 
4250: 71 75 69 63 6b 2c 20 62 75 74 20 63 61 6e 20 62  quick, but can b
4260: 65 20 4e 2a 2a 32 20 69 6e 20 74 68 65 20 77 6f  e N**2 in the wo
4270: 72 73 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  rst case..**.** 
4280: 48 69 6e 74 73 3a 20 74 6f 20 6d 61 74 63 68 20  Hints: to match 
4290: 27 2a 27 20 6f 72 20 27 3f 27 2c 20 70 75 74 20  '*' or '?', put 
42a0: 74 68 65 6d 20 69 6e 20 22 5b 5d 22 2e 20 20 4c  them in "[]".  L
42b0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
42c0: 20 20 20 20 20 20 20 20 61 62 63 5b 2a 5d 78 79          abc[*]xy
42d0: 7a 20 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  z        Matches
42e0: 20 22 61 62 63 2a 78 79 7a 22 20 6f 6e 6c 79 0a   "abc*xyz" only.
42f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4300: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 0a 20 20  tternCompare(.  
4310: 63 6f 6e 73 74 20 75 38 20 2a 7a 50 61 74 74 65  const u8 *zPatte
4320: 72 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rn,             
4330: 20 2f 2a 20 54 68 65 20 67 6c 6f 62 20 70 61 74   /* The glob pat
4340: 74 65 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tern */.  const 
4350: 75 38 20 2a 7a 53 74 72 69 6e 67 2c 20 20 20 20  u8 *zString,    
4360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4370: 65 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70  e string to comp
4380: 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 65 20  are against the 
4390: 67 6c 6f 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  glob */.  const 
43a0: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
43b0: 66 6f 20 2a 70 49 6e 66 6f 2c 20 2f 2a 20 49 6e  fo *pInfo, /* In
43c0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
43d0: 68 6f 77 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  how to do the co
43e0: 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 65  mpare */.  u32 e
43f0: 73 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  sc              
4400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4410: 68 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63  he escape charac
4420: 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  ter */.){.  u32 
4430: 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e 76  c, c2;.  int inv
4440: 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 3b  ert;.  int seen;
4450: 0a 20 20 75 38 20 6d 61 74 63 68 4f 6e 65 20 3d  .  u8 matchOne =
4460: 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 4f 6e 65   pInfo->matchOne
4470: 3b 0a 20 20 75 38 20 6d 61 74 63 68 41 6c 6c 20  ;.  u8 matchAll 
4480: 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 41 6c  = pInfo->matchAl
4490: 6c 3b 0a 20 20 75 38 20 6d 61 74 63 68 53 65 74  l;.  u8 matchSet
44a0: 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 53   = pInfo->matchS
44b0: 65 74 3b 0a 20 20 75 38 20 6e 6f 43 61 73 65 20  et;.  u8 noCase 
44c0: 3d 20 70 49 6e 66 6f 2d 3e 6e 6f 43 61 73 65 3b  = pInfo->noCase;
44d0: 20 0a 20 20 69 6e 74 20 70 72 65 76 45 73 63 61   .  int prevEsca
44e0: 70 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  pe = 0;     /* T
44f0: 72 75 65 20 69 66 20 74 68 65 20 70 72 65 76 69  rue if the previ
4500: 6f 75 73 20 63 68 61 72 61 63 74 65 72 20 77 61  ous character wa
4510: 73 20 27 65 73 63 61 70 65 27 20 2a 2f 0a 0a 20  s 'escape' */.. 
4520: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 73 71 6c   while( (c = sql
4530: 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 50  ite3Utf8Read(&zP
4540: 61 74 74 65 72 6e 29 29 21 3d 30 20 29 7b 0a 20  attern))!=0 ){. 
4550: 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 41     if( c==matchA
4560: 6c 6c 20 26 26 20 21 70 72 65 76 45 73 63 61 70  ll && !prevEscap
4570: 65 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  e ){.      while
4580: 28 20 28 63 3d 73 71 6c 69 74 65 33 55 74 66 38  ( (c=sqlite3Utf8
4590: 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29 29  Read(&zPattern))
45a0: 20 3d 3d 20 6d 61 74 63 68 41 6c 6c 0a 20 20 20   == matchAll.   
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 63              || c
45c0: 20 3d 3d 20 6d 61 74 63 68 4f 6e 65 20 29 7b 0a   == matchOne ){.
45d0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 6d          if( c==m
45e0: 61 74 63 68 4f 6e 65 20 26 26 20 73 71 6c 69 74  atchOne && sqlit
45f0: 65 33 55 74 66 38 52 65 61 64 28 26 7a 53 74 72  e3Utf8Read(&zStr
4600: 69 6e 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ing)==0 ){.     
4610: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
4620: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4630: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
4640: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4650: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
4660: 20 69 66 28 20 63 3d 3d 65 73 63 20 29 7b 0a 20   if( c==esc ){. 
4670: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
4680: 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74  e3Utf8Read(&zPat
4690: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  tern);.        i
46a0: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
46b0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
46c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
46d0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 6d 61 74 63  else if( c==matc
46e0: 68 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  hSet ){.        
46f0: 61 73 73 65 72 74 28 20 65 73 63 3d 3d 30 20 29  assert( esc==0 )
4700: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  ;         /* Thi
4710: 73 20 69 73 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c  s is GLOB, not L
4720: 49 4b 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  IKE */.        a
4730: 73 73 65 72 74 28 20 6d 61 74 63 68 53 65 74 3c  ssert( matchSet<
4740: 30 78 38 30 20 29 3b 20 20 2f 2a 20 27 5b 27 20  0x80 );  /* '[' 
4750: 69 73 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65  is a single-byte
4760: 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20   character */.  
4770: 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 53        while( *zS
4780: 74 72 69 6e 67 20 26 26 20 70 61 74 74 65 72 6e  tring && pattern
4790: 43 6f 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72  Compare(&zPatter
47a0: 6e 5b 2d 31 5d 2c 7a 53 74 72 69 6e 67 2c 70 49  n[-1],zString,pI
47b0: 6e 66 6f 2c 65 73 63 29 3d 3d 30 20 29 7b 0a 20  nfo,esc)==0 ){. 
47c0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
47d0: 53 4b 49 50 5f 55 54 46 38 28 7a 53 74 72 69 6e  SKIP_UTF8(zStrin
47e0: 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
47f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2a 7a 53        return *zS
4800: 74 72 69 6e 67 21 3d 30 3b 0a 20 20 20 20 20 20  tring!=0;.      
4810: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  }.      while( (
4820: 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  c2 = sqlite3Utf8
4830: 52 65 61 64 28 26 7a 53 74 72 69 6e 67 29 29 21  Read(&zString))!
4840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
4850: 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20  ( noCase ){.    
4860: 20 20 20 20 20 20 47 6c 6f 62 55 70 70 65 72 54        GlobUpperT
4870: 6f 4c 6f 77 65 72 28 63 32 29 3b 0a 20 20 20 20  oLower(c2);.    
4880: 20 20 20 20 20 20 47 6c 6f 62 55 70 70 65 72 54        GlobUpperT
4890: 6f 4c 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 20  oLower(c);.     
48a0: 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 21       while( c2 !
48b0: 3d 20 30 20 26 26 20 63 32 20 21 3d 20 63 20 29  = 0 && c2 != c )
48c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 32  {.            c2
48d0: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
48e0: 61 64 28 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20  ad(&zString);.  
48f0: 20 20 20 20 20 20 20 20 20 20 47 6c 6f 62 55 70            GlobUp
4900: 70 65 72 54 6f 4c 6f 77 65 72 28 63 32 29 3b 0a  perToLower(c2);.
4910: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4920: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4930: 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 21       while( c2 !
4940: 3d 20 30 20 26 26 20 63 32 20 21 3d 20 63 20 29  = 0 && c2 != c )
4950: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 32  {.            c2
4960: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
4970: 61 64 28 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20  ad(&zString);.  
4980: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4990: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
49a0: 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  c2==0 ) return 0
49b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 61  ;.        if( pa
49c0: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a 50 61  tternCompare(zPa
49d0: 74 74 65 72 6e 2c 7a 53 74 72 69 6e 67 2c 70 49  ttern,zString,pI
49e0: 6e 66 6f 2c 65 73 63 29 20 29 20 72 65 74 75 72  nfo,esc) ) retur
49f0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
4a00: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
4a10: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 6d 61   }else if( c==ma
4a20: 74 63 68 4f 6e 65 20 26 26 20 21 70 72 65 76 45  tchOne && !prevE
4a30: 73 63 61 70 65 20 29 7b 0a 20 20 20 20 20 20 69  scape ){.      i
4a40: 66 28 20 73 71 6c 69 74 65 33 55 74 66 38 52 65  f( sqlite3Utf8Re
4a50: 61 64 28 26 7a 53 74 72 69 6e 67 29 3d 3d 30 20  ad(&zString)==0 
4a60: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4a70: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
4a80: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 6d 61   }else if( c==ma
4a90: 74 63 68 53 65 74 20 29 7b 0a 20 20 20 20 20 20  tchSet ){.      
4aa0: 75 33 32 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b  u32 prior_c = 0;
4ab0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
4ac0: 73 63 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 54  sc==0 );    /* T
4ad0: 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  his only occurs 
4ae0: 66 6f 72 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c 49  for GLOB, not LI
4af0: 4b 45 20 2a 2f 0a 20 20 20 20 20 20 73 65 65 6e  KE */.      seen
4b00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 76 65   = 0;.      inve
4b10: 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20  rt = 0;.      c 
4b20: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
4b30: 64 28 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  d(&zString);.   
4b40: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65     if( c==0 ) re
4b50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63 32  turn 0;.      c2
4b60: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
4b70: 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  ad(&zPattern);. 
4b80: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27       if( c2=='^'
4b90: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 65   ){.        inve
4ba0: 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
4bb0: 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  c2 = sqlite3Utf8
4bc0: 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b  Read(&zPattern);
4bd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4be0: 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20  f( c2==']' ){.  
4bf0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27        if( c==']'
4c00: 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
4c10: 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65       c2 = sqlite
4c20: 33 55 74 66 38 52 65 61 64 28 26 7a 50 61 74 74  3Utf8Read(&zPatt
4c30: 65 72 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ern);.      }.  
4c40: 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 26 26      while( c2 &&
4c50: 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20   c2!=']' ){.    
4c60: 20 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20      if( c2=='-' 
4c70: 26 26 20 7a 50 61 74 74 65 72 6e 5b 30 5d 21 3d  && zPattern[0]!=
4c80: 27 5d 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b  ']' && zPattern[
4c90: 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63  0]!=0 && prior_c
4ca0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
4cb0: 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  c2 = sqlite3Utf8
4cc0: 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b  Read(&zPattern);
4cd0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
4ce0: 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d  >=prior_c && c<=
4cf0: 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20  c2 ) seen = 1;. 
4d00: 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
4d10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
4d20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
4d30: 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20  f( c==c2 ){.    
4d40: 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31          seen = 1
4d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4d60: 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20          prior_c 
4d70: 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = c2;.        }.
4d80: 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c          c2 = sql
4d90: 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 50  ite3Utf8Read(&zP
4da0: 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 7d  attern);.      }
4db0: 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30  .      if( c2==0
4dc0: 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65   || (seen ^ inve
4dd0: 72 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rt)==0 ){.      
4de0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
4df0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
4e00: 28 20 65 73 63 3d 3d 63 20 26 26 20 21 70 72 65  ( esc==c && !pre
4e10: 76 45 73 63 61 70 65 20 29 7b 0a 20 20 20 20 20  vEscape ){.     
4e20: 20 70 72 65 76 45 73 63 61 70 65 20 3d 20 31 3b   prevEscape = 1;
4e30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4e40: 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74    c2 = sqlite3Ut
4e50: 66 38 52 65 61 64 28 26 7a 53 74 72 69 6e 67 29  f8Read(&zString)
4e60: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61  ;.      if( noCa
4e70: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 47 6c  se ){.        Gl
4e80: 6f 62 55 70 70 65 72 54 6f 4c 6f 77 65 72 28 63  obUpperToLower(c
4e90: 29 3b 0a 20 20 20 20 20 20 20 20 47 6c 6f 62 55  );.        GlobU
4ea0: 70 70 65 72 54 6f 4c 6f 77 65 72 28 63 32 29 3b  pperToLower(c2);
4eb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4ec0: 66 28 20 63 21 3d 63 32 20 29 7b 0a 20 20 20 20  f( c!=c2 ){.    
4ed0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4ee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 65 76      }.      prev
4ef0: 45 73 63 61 70 65 20 3d 20 30 3b 0a 20 20 20 20  Escape = 0;.    
4f00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a  }.  }.  return *
4f10: 7a 53 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f  zString==0;.}../
4f20: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
4f30: 5f 73 74 72 67 6c 6f 62 28 29 20 69 6e 74 65 72  _strglob() inter
4f40: 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  face..*/.int sql
4f50: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 63 6f 6e  ite3_strglob(con
4f60: 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 50 61  st char *zGlobPa
4f70: 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 63 68 61  ttern, const cha
4f80: 72 20 2a 7a 53 74 72 69 6e 67 29 7b 0a 20 20 72  r *zString){.  r
4f90: 65 74 75 72 6e 20 70 61 74 74 65 72 6e 43 6f 6d  eturn patternCom
4fa0: 70 61 72 65 28 28 75 38 2a 29 7a 47 6c 6f 62 50  pare((u8*)zGlobP
4fb0: 61 74 74 65 72 6e 2c 20 28 75 38 2a 29 7a 53 74  attern, (u8*)zSt
4fc0: 72 69 6e 67 2c 20 26 67 6c 6f 62 49 6e 66 6f 2c  ring, &globInfo,
4fd0: 20 30 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0)==0;.}../*.**
4fe0: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
4ff0: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
5000: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
5010: 72 20 28 6f 72 20 47 4c 4f 42 20 77 68 69 63 68  r (or GLOB which
5020: 20 69 73 0a 2a 2a 20 6a 75 73 74 20 61 20 76 61   is.** just a va
5030: 72 69 61 74 69 6f 6e 20 6f 66 20 4c 49 4b 45 29  riation of LIKE)
5040: 20 67 65 74 73 20 63 61 6c 6c 65 64 2e 20 20 54   gets called.  T
5050: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
5060: 74 65 73 74 69 6e 67 0a 2a 2a 20 6f 6e 6c 79 2e  testing.** only.
5070: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5080: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
5090: 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 3d 20  e3_like_count = 
50a0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0;.#endif.../*.*
50b0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
50c0: 20 6f 66 20 74 68 65 20 6c 69 6b 65 28 29 20 53   of the like() S
50d0: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  QL function.  Th
50e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  is function impl
50f0: 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 62 75  ements.** the bu
5100: 69 6c 64 2d 69 6e 20 4c 49 4b 45 20 6f 70 65 72  ild-in LIKE oper
5110: 61 74 6f 72 2e 20 20 54 68 65 20 66 69 72 73 74  ator.  The first
5120: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
5130: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
5140: 0a 2a 2a 20 70 61 74 74 65 72 6e 20 61 6e 64 20  .** pattern and 
5150: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
5160: 65 6e 74 20 69 73 20 74 68 65 20 73 74 72 69 6e  ent is the strin
5170: 67 2e 20 20 53 6f 2c 20 74 68 65 20 53 51 4c 20  g.  So, the SQL 
5180: 73 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  statements:.**.*
5190: 2a 20 20 20 20 20 20 20 41 20 4c 49 4b 45 20 42  *       A LIKE B
51a0: 0a 2a 2a 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d  .**.** is implem
51b0: 65 6e 74 65 64 20 61 73 20 6c 69 6b 65 28 42 2c  ented as like(B,
51c0: 41 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  A)..**.** This s
51d0: 61 6d 65 20 66 75 6e 63 74 69 6f 6e 20 28 77 69  ame function (wi
51e0: 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  th a different c
51f0: 6f 6d 70 61 72 65 49 6e 66 6f 20 73 74 72 75 63  ompareInfo struc
5200: 74 75 72 65 29 20 63 6f 6d 70 75 74 65 73 0a 2a  ture) computes.*
5210: 2a 20 74 68 65 20 47 4c 4f 42 20 6f 70 65 72 61  * the GLOB opera
5220: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tor..*/.static v
5230: 6f 69 64 20 6c 69 6b 65 46 75 6e 63 28 0a 20 20  oid likeFunc(.  
5240: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5250: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
5260: 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65   argc, .  sqlite
5270: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5280: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
5290: 65 64 20 63 68 61 72 20 2a 7a 41 2c 20 2a 7a 42  ed char *zA, *zB
52a0: 3b 0a 20 20 75 33 32 20 65 73 63 61 70 65 20 3d  ;.  u32 escape =
52b0: 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 3b 0a   0;.  int nPat;.
52c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
52d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
52e0: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
52f0: 74 29 3b 0a 0a 20 20 7a 42 20 3d 20 73 71 6c 69  t);..  zB = sqli
5300: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5310: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 41 20 3d 20  rgv[0]);.  zA = 
5320: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
5330: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20  xt(argv[1]);..  
5340: 2f 2a 20 4c 69 6d 69 74 20 74 68 65 20 6c 65 6e  /* Limit the len
5350: 67 74 68 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  gth of the LIKE 
5360: 6f 72 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20  or GLOB pattern 
5370: 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
5380: 73 0a 20 20 2a 2a 20 6f 66 20 64 65 65 70 20 72  s.  ** of deep r
5390: 65 63 75 72 73 69 6f 6e 20 61 6e 64 20 4e 2a 4e  ecursion and N*N
53a0: 20 62 65 68 61 76 69 6f 72 20 69 6e 20 70 61 74   behavior in pat
53b0: 74 65 72 6e 43 6f 6d 70 61 72 65 28 29 2e 0a 20  ternCompare().. 
53c0: 20 2a 2f 0a 20 20 6e 50 61 74 20 3d 20 73 71 6c   */.  nPat = sql
53d0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
53e0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 74 65 73  (argv[0]);.  tes
53f0: 74 63 61 73 65 28 20 6e 50 61 74 3d 3d 64 62 2d  tcase( nPat==db-
5400: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
5410: 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
5420: 4e 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 74  N_LENGTH] );.  t
5430: 65 73 74 63 61 73 65 28 20 6e 50 61 74 3d 3d 64  estcase( nPat==d
5440: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
5450: 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
5460: 45 52 4e 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b  ERN_LENGTH]+1 );
5470: 0a 20 20 69 66 28 20 6e 50 61 74 20 3e 20 64 62  .  if( nPat > db
5480: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
5490: 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45  LIMIT_LIKE_PATTE
54a0: 52 4e 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  RN_LENGTH] ){.  
54b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
54c0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
54d0: 22 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61  "LIKE or GLOB pa
54e0: 74 74 65 72 6e 20 74 6f 6f 20 63 6f 6d 70 6c 65  ttern too comple
54f0: 78 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  x", -1);.    ret
5500: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
5510: 74 28 20 7a 42 3d 3d 73 71 6c 69 74 65 33 5f 76  t( zB==sqlite3_v
5520: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
5530: 5d 29 20 29 3b 20 20 2f 2a 20 45 6e 63 6f 64 69  ]) );  /* Encodi
5540: 6e 67 20 64 69 64 20 6e 6f 74 20 63 68 61 6e 67  ng did not chang
5550: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 61 72 67 63  e */..  if( argc
5560: 3d 3d 33 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==3 ){.    /* Th
5570: 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74  e escape charact
5580: 65 72 20 73 74 72 69 6e 67 20 6d 75 73 74 20 63  er string must c
5590: 6f 6e 73 69 73 74 20 6f 66 20 61 20 73 69 6e 67  onsist of a sing
55a0: 6c 65 20 55 54 46 2d 38 20 63 68 61 72 61 63 74  le UTF-8 charact
55b0: 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72  er..    ** Other
55c0: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
55d0: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
55e0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
55f0: 20 63 68 61 72 20 2a 7a 45 73 63 20 3d 20 73 71   char *zEsc = sq
5600: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5610: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69  (argv[2]);.    i
5620: 66 28 20 7a 45 73 63 3d 3d 30 20 29 20 72 65 74  f( zEsc==0 ) ret
5630: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  urn;.    if( sql
5640: 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
5650: 28 63 68 61 72 2a 29 7a 45 73 63 2c 20 2d 31 29  (char*)zEsc, -1)
5660: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
5670: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5680: 72 28 63 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20  r(context, .    
5690: 20 20 20 20 20 20 22 45 53 43 41 50 45 20 65 78        "ESCAPE ex
56a0: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
56b0: 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63   a single charac
56c0: 74 65 72 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20  ter", -1);.     
56d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
56e0: 20 20 20 65 73 63 61 70 65 20 3d 20 73 71 6c 69     escape = sqli
56f0: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 45 73  te3Utf8Read(&zEs
5700: 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41  c);.  }.  if( zA
5710: 20 26 26 20 7a 42 20 29 7b 0a 20 20 20 20 73 74   && zB ){.    st
5720: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
5730: 20 2a 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   *pInfo = sqlite
5740: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
5750: 65 78 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ext);.#ifdef SQL
5760: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c  ITE_TEST.    sql
5770: 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2b  ite3_like_count+
5780: 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  +;.#endif.    . 
5790: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
57a0: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
57b0: 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a 42  atternCompare(zB
57c0: 2c 20 7a 41 2c 20 70 49 6e 66 6f 2c 20 65 73 63  , zA, pInfo, esc
57d0: 61 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ape));.  }.}../*
57e0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
57f0: 6f 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c 49 46  on of the NULLIF
5800: 28 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e 2e 20  (x,y) function. 
5810: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
5820: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
5830: 6d 65 6e 74 20 69 66 20 74 68 65 20 61 72 67 75  ment if the argu
5840: 6d 65 6e 74 73 20 61 72 65 20 64 69 66 66 65 72  ments are differ
5850: 65 6e 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ent.  The result
5860: 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a   is NULL if the.
5870: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ** arguments are
5880: 20 65 71 75 61 6c 20 74 6f 20 65 61 63 68 20 6f   equal to each o
5890: 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
58a0: 76 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e 63 28  void nullifFunc(
58b0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
58c0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
58d0: 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71  nt NotUsed,.  sq
58e0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
58f0: 67 76 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  gv.){.  CollSeq 
5900: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
5910: 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63  GetFuncCollSeq(c
5920: 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45  ontext);.  UNUSE
5930: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
5940: 73 65 64 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  sed);.  if( sqli
5950: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72  te3MemCompare(ar
5960: 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 2c 20  gv[0], argv[1], 
5970: 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20  pColl)!=0 ){.   
5980: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5990: 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61  value(context, a
59a0: 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a  rgv[0]);.  }.}..
59b0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
59c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
59d0: 74 65 5f 76 65 72 73 69 6f 6e 28 29 20 66 75 6e  te_version() fun
59e0: 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 73 75  ction.  The resu
59f0: 6c 74 20 69 73 20 74 68 65 20 76 65 72 73 69 6f  lt is the versio
5a00: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 53 51 4c 69  n.** of the SQLi
5a10: 74 65 20 6c 69 62 72 61 72 79 20 74 68 61 74 20  te library that 
5a20: 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73  is running..*/.s
5a30: 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 73 69  tatic void versi
5a40: 6f 6e 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  onFunc(.  sqlite
5a50: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
5a60: 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  xt,.  int NotUse
5a70: 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  d,.  sqlite3_val
5a80: 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b  ue **NotUsed2.){
5a90: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
5aa0: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
5ab0: 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d  tUsed2);.  /* IM
5ac0: 50 3a 20 52 2d 34 38 36 39 39 2d 34 38 36 31 37  P: R-48699-48617
5ad0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
5ae0: 73 20 61 6e 20 53 51 4c 20 77 72 61 70 70 65 72  s an SQL wrapper
5af0: 20 61 72 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a   around the.  **
5b00: 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
5b10: 69 6f 6e 28 29 20 43 2d 69 6e 74 65 72 66 61 63  ion() C-interfac
5b20: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  e. */.  sqlite3_
5b30: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
5b40: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62  ext, sqlite3_lib
5b50: 76 65 72 73 69 6f 6e 28 29 2c 20 2d 31 2c 20 53  version(), -1, S
5b60: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d  QLITE_STATIC);.}
5b70: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
5b80: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  tation of the sq
5b90: 6c 69 74 65 5f 73 6f 75 72 63 65 5f 69 64 28 29  lite_source_id()
5ba0: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 72   function. The r
5bb0: 65 73 75 6c 74 20 69 73 20 61 20 73 74 72 69 6e  esult is a strin
5bc0: 67 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  g.** that identi
5bd0: 66 69 65 73 20 74 68 65 20 70 61 72 74 69 63 75  fies the particu
5be0: 6c 61 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  lar version of t
5bf0: 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 75  he source code u
5c00: 73 65 64 20 74 6f 20 62 75 69 6c 64 0a 2a 2a 20  sed to build.** 
5c10: 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  SQLite..*/.stati
5c20: 63 20 76 6f 69 64 20 73 6f 75 72 63 65 69 64 46  c void sourceidF
5c30: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
5c40: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5c50: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
5c60: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
5c70: 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20  **NotUsed2.){.  
5c80: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5c90: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
5ca0: 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20  ed2);.  /* IMP: 
5cb0: 52 2d 32 34 34 37 30 2d 33 31 31 33 36 20 54 68  R-24470-31136 Th
5cc0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
5cd0: 6e 20 53 51 4c 20 77 72 61 70 70 65 72 20 61 72  n SQL wrapper ar
5ce0: 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71  ound the.  ** sq
5cf0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
5d00: 20 43 20 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f   C interface. */
5d10: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5d20: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
5d30: 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
5d40: 28 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  (), -1, SQLITE_S
5d50: 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TATIC);.}../*.**
5d60: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5d70: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6c 6f  of the sqlite_lo
5d80: 67 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  g() function.  T
5d90: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
5da0: 20 61 72 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74   around.** sqlit
5db0: 65 33 5f 6c 6f 67 28 29 2e 20 20 54 68 65 20 72  e3_log().  The r
5dc0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 4e  eturn value is N
5dd0: 55 4c 4c 2e 20 20 54 68 65 20 66 75 6e 63 74 69  ULL.  The functi
5de0: 6f 6e 20 65 78 69 73 74 73 20 70 75 72 65 6c 79  on exists purely
5df0: 20 66 6f 72 0a 2a 2a 20 69 74 73 20 73 69 64 65   for.** its side
5e00: 2d 65 66 66 65 63 74 73 2e 0a 2a 2f 0a 73 74 61  -effects..*/.sta
5e10: 74 69 63 20 76 6f 69 64 20 65 72 72 6c 6f 67 46  tic void errlogF
5e20: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
5e30: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5e40: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
5e50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5e60: 72 67 76 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  rgv.){.  UNUSED_
5e70: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
5e80: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
5e90: 54 45 52 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  TER(context);.  
5ea0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 73 71 6c 69  sqlite3_log(sqli
5eb0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
5ec0: 67 76 5b 30 5d 29 2c 20 22 25 73 22 2c 20 73 71  gv[0]), "%s", sq
5ed0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5ee0: 28 61 72 67 76 5b 31 5d 29 29 3b 0a 7d 0a 0a 2f  (argv[1]));.}../
5ef0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
5f00: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
5f10: 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  e_compileoption_
5f20: 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e  used() function.
5f30: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
5f40: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  s an integer tha
5f50: 74 20 69 64 65 6e 74 69 66 69 65 73 20 69 66 20  t identifies if 
5f60: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  the compiler opt
5f70: 69 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64 20  ion.** was used 
5f80: 74 6f 20 62 75 69 6c 64 20 53 51 4c 69 74 65 2e  to build SQLite.
5f90: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
5fa0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
5fb0: 50 54 49 4f 4e 5f 44 49 41 47 53 0a 73 74 61 74  PTION_DIAGS.stat
5fc0: 69 63 20 76 6f 69 64 20 63 6f 6d 70 69 6c 65 6f  ic void compileo
5fd0: 70 74 69 6f 6e 75 73 65 64 46 75 6e 63 28 0a 20  ptionusedFunc(. 
5fe0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
5ff0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
6000: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
6010: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
6020: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6030: 4f 70 74 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  OptName;.  asser
6040: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
6050: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6060: 28 61 72 67 63 29 3b 0a 20 20 2f 2a 20 49 4d 50  (argc);.  /* IMP
6070: 3a 20 52 2d 33 39 35 36 34 2d 33 36 33 30 35 20  : R-39564-36305 
6080: 54 68 65 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69  The sqlite_compi
6090: 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 29 20  leoption_used() 
60a0: 53 51 4c 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  SQL.  ** functio
60b0: 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
60c0: 72 6f 75 6e 64 20 74 68 65 20 73 71 6c 69 74 65  round the sqlite
60d0: 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
60e0: 75 73 65 64 28 29 20 43 2f 43 2b 2b 0a 20 20 2a  used() C/C++.  *
60f0: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  * function..  */
6100: 0a 20 20 69 66 28 20 28 7a 4f 70 74 4e 61 6d 65  .  if( (zOptName
6110: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
6120: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6130: 78 74 28 61 72 67 76 5b 30 5d 29 29 21 3d 30 20  xt(argv[0]))!=0 
6140: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
6150: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
6160: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69  t, sqlite3_compi
6170: 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 7a 4f  leoption_used(zO
6180: 70 74 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a  ptName));.  }.}.
6190: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
61a0: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
61b0: 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 2f 2a  ION_DIAGS */../*
61c0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
61d0: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
61e0: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67  _compileoption_g
61f0: 65 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  et() function. .
6200: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
6210: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
6220: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 63 6f  dentifies the co
6230: 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 20 0a  mpiler options .
6240: 2a 2a 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  ** used to build
6250: 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e   SQLite..*/.#ifn
6260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6270: 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
6280: 41 47 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AGS.static void 
6290: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74  compileoptionget
62a0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
62b0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
62c0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
62d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
62e0: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  argv.){.  int n;
62f0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
6300: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
6310: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
6320: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 39 32    /* IMP: R-0492
6330: 32 2d 32 34 30 37 36 20 54 68 65 20 73 71 6c 69  2-24076 The sqli
6340: 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  te_compileoption
6350: 5f 67 65 74 28 29 20 53 51 4c 20 66 75 6e 63 74  _get() SQL funct
6360: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 77 72  ion.  ** is a wr
6370: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65  apper around the
6380: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65   sqlite3_compile
6390: 6f 70 74 69 6f 6e 5f 67 65 74 28 29 20 43 2f 43  option_get() C/C
63a0: 2b 2b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  ++ function..  *
63b0: 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  /.  n = sqlite3_
63c0: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30  value_int(argv[0
63d0: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ]);.  sqlite3_re
63e0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
63f0: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69  t, sqlite3_compi
6400: 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 6e 29 2c  leoption_get(n),
6410: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
6420: 49 43 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  IC);.}.#endif /*
6430: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
6440: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
6450: 20 2a 2f 0a 0a 2f 2a 20 41 72 72 61 79 20 66 6f   */../* Array fo
6460: 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f  r converting fro
6470: 6d 20 68 61 6c 66 2d 62 79 74 65 73 20 28 6e 79  m half-bytes (ny
6480: 62 62 6c 65 73 29 20 69 6e 74 6f 20 41 53 43 49  bbles) into ASCI
6490: 49 20 68 65 78 0a 2a 2a 20 64 69 67 69 74 73 2e  I hex.** digits.
64a0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
64b0: 20 63 68 61 72 20 68 65 78 64 69 67 69 74 73 5b   char hexdigits[
64c0: 5d 20 3d 20 7b 0a 20 20 27 30 27 2c 20 27 31 27  ] = {.  '0', '1'
64d0: 2c 20 27 32 27 2c 20 27 33 27 2c 20 27 34 27 2c  , '2', '3', '4',
64e0: 20 27 35 27 2c 20 27 36 27 2c 20 27 37 27 2c 0a   '5', '6', '7',.
64f0: 20 20 27 38 27 2c 20 27 39 27 2c 20 27 41 27 2c    '8', '9', 'A',
6500: 20 27 42 27 2c 20 27 43 27 2c 20 27 44 27 2c 20   'B', 'C', 'D', 
6510: 27 45 27 2c 20 27 46 27 20 0a 7d 3b 0a 0a 2f 2a  'E', 'F' .};../*
6520: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
6530: 6f 6e 20 6f 66 20 74 68 65 20 51 55 4f 54 45 28  on of the QUOTE(
6540: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  ) function.  Thi
6550: 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  s function takes
6560: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 61 72 67   a single.** arg
6570: 75 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61  ument.  If the a
6580: 72 67 75 6d 65 6e 74 20 69 73 20 6e 75 6d 65 72  rgument is numer
6590: 69 63 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  ic, the return v
65a0: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
65b0: 20 61 73 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d   as.** the argum
65c0: 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72 67  ent.  If the arg
65d0: 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
65e0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
65f0: 69 73 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  is the string.**
6600: 20 22 4e 55 4c 4c 22 2e 20 20 4f 74 68 65 72 77   "NULL".  Otherw
6610: 69 73 65 2c 20 74 68 65 20 61 72 67 75 6d 65 6e  ise, the argumen
6620: 74 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e  t is enclosed in
6630: 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 77   single quotes w
6640: 69 74 68 0a 2a 2a 20 73 69 6e 67 6c 65 2d 71 75  ith.** single-qu
6650: 6f 74 65 20 65 73 63 61 70 65 73 2e 0a 2a 2f 0a  ote escapes..*/.
6660: 73 74 61 74 69 63 20 76 6f 69 64 20 71 75 6f 74  static void quot
6670: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
6680: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
6690: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
66a0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
66b0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
66c0: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
66d0: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
66e0: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
66f0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
6700: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
6710: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
6720: 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  {.      double r
6730: 31 2c 20 72 32 3b 0a 20 20 20 20 20 20 63 68 61  1, r2;.      cha
6740: 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20  r zBuf[50];.    
6750: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 5f 76    r1 = sqlite3_v
6760: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
6770: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  [0]);.      sqli
6780: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
6790: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
67a0: 20 22 25 21 2e 31 35 67 22 2c 20 72 31 29 3b 0a   "%!.15g", r1);.
67b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f        sqlite3Ato
67c0: 46 28 7a 42 75 66 2c 20 26 72 32 2c 20 32 30 2c  F(zBuf, &r2, 20,
67d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
67e0: 20 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20       if( r1!=r2 
67f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6800: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
6810: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
6820: 22 25 21 2e 32 30 65 22 2c 20 72 31 29 3b 0a 20  "%!.20e", r1);. 
6830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
6840: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
6850: 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20  (context, zBuf, 
6860: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
6870: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65  IENT);.      bre
6880: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6890: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
68a0: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
68b0: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
68c0: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
68d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
68e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
68f0: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
6900: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20      char *zText 
6910: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
6920: 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73  const *zBlob = s
6930: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
6940: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  b(argv[0]);.    
6950: 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71    int nBlob = sq
6960: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6970: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  s(argv[0]);.    
6980: 20 20 61 73 73 65 72 74 28 20 7a 42 6c 6f 62 3d    assert( zBlob=
6990: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  =sqlite3_value_b
69a0: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20  lob(argv[0]) ); 
69b0: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
69c0: 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 7a  hange */.      z
69d0: 54 65 78 74 20 3d 20 28 63 68 61 72 20 2a 29 63  Text = (char *)c
69e0: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
69f0: 74 65 78 74 2c 20 28 32 2a 28 69 36 34 29 6e 42  text, (2*(i64)nB
6a00: 6c 6f 62 29 2b 34 29 3b 20 0a 20 20 20 20 20 20  lob)+4); .      
6a10: 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20  if( zText ){.   
6a20: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
6a30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
6a40: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Blob; i++){.    
6a50: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32        zText[(i*2
6a60: 29 2b 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73  )+2] = hexdigits
6a70: 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30  [(zBlob[i]>>4)&0
6a80: 78 30 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  x0F];.          
6a90: 7a 54 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d  zText[(i*2)+3] =
6aa0: 20 68 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f   hexdigits[(zBlo
6ab0: 62 5b 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20  b[i])&0x0F];.   
6ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
6ad0: 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32  Text[(nBlob*2)+2
6ae0: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20  ] = '\'';.      
6af0: 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32    zText[(nBlob*2
6b00: 29 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  )+3] = '\0';.   
6b10: 20 20 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20       zText[0] = 
6b20: 27 58 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  'X';.        zTe
6b30: 78 74 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  xt[1] = '\'';.  
6b40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
6b50: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
6b60: 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51  t, zText, -1, SQ
6b70: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
6b80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6b90: 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
6ba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6bb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6bc0: 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
6bd0: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 6a 3b 0a  .      int i,j;.
6be0: 20 20 20 20 20 20 75 36 34 20 6e 3b 0a 20 20 20        u64 n;.   
6bf0: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
6c00: 64 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 73  d char *zArg = s
6c10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6c20: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
6c30: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20    char *z;..    
6c40: 20 20 69 66 28 20 7a 41 72 67 3d 3d 30 20 29 20    if( zArg==0 ) 
6c50: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f  return;.      fo
6c60: 72 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a 41 72 67  r(i=0, n=0; zArg
6c70: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a  [i]; i++){ if( z
6c80: 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e  Arg[i]=='\'' ) n
6c90: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20  ++; }.      z = 
6ca0: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
6cb0: 6e 74 65 78 74 2c 20 28 28 69 36 34 29 69 29 2b  ntext, ((i64)i)+
6cc0: 28 28 69 36 34 29 6e 29 2b 33 29 3b 0a 20 20 20  ((i64)n)+3);.   
6cd0: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
6ce0: 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c 27 27 3b      z[0] = '\'';
6cf0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
6d00: 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d 3b 20  , j=1; zArg[i]; 
6d10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
6d20: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b 69 5d  z[j++] = zArg[i]
6d30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6d40: 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  zArg[i]=='\'' ){
6d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  .            z[j
6d60: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  ++] = '\'';.    
6d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6d80: 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  }.        z[j++]
6d90: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
6da0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[j] = 0;.     
6db0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6dc0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6dd0: 7a 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72  z, j, sqlite3_fr
6de0: 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ee);.      }.   
6df0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6e00: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
6e10: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
6e20: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
6e30: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
6e40: 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  _NULL );.      s
6e50: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6e60: 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c  xt(context, "NUL
6e70: 4c 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54  L", 4, SQLITE_ST
6e80: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
6e90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
6ea0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 63 6f  ./*.** The unico
6eb0: 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  de() function.  
6ec0: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67  Return the integ
6ed0: 65 72 20 75 6e 69 63 6f 64 65 20 63 6f 64 65 2d  er unicode code-
6ee0: 70 6f 69 6e 74 20 76 61 6c 75 65 0a 2a 2a 20 66  point value.** f
6ef0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 68 61  or the first cha
6f00: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e  racter of the in
6f10: 70 75 74 20 73 74 72 69 6e 67 2e 20 0a 2a 2f 0a  put string. .*/.
6f20: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 63  static void unic
6f30: 6f 64 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  odeFunc(.  sqlit
6f40: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
6f50: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
6f60: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
6f70: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
6f80: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
6f90: 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   *z = sqlite3_va
6fa0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
6fb0: 29 3b 0a 20 20 28 76 6f 69 64 29 61 72 67 63 3b  );.  (void)argc;
6fc0: 0a 20 20 69 66 28 20 7a 20 26 26 20 7a 5b 30 5d  .  if( z && z[0]
6fd0: 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c   ) sqlite3_resul
6fe0: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
6ff0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26  qlite3Utf8Read(&
7000: 7a 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  z));.}../*.** Th
7010: 65 20 63 68 61 72 28 29 20 66 75 6e 63 74 69 6f  e char() functio
7020: 6e 20 74 61 6b 65 73 20 7a 65 72 6f 20 6f 72 20  n takes zero or 
7030: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2c 20  more arguments, 
7040: 65 61 63 68 20 6f 66 20 77 68 69 63 68 20 69 73  each of which is
7050: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e 20  .** an integer. 
7060: 20 49 74 20 63 6f 6e 73 74 72 75 63 74 73 20 61   It constructs a
7070: 20 73 74 72 69 6e 67 20 77 68 65 72 65 20 65 61   string where ea
7080: 63 68 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  ch character of 
7090: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  the string.** is
70a0: 20 74 68 65 20 75 6e 69 63 6f 64 65 20 63 68 61   the unicode cha
70b0: 72 61 63 74 65 72 20 66 6f 72 20 74 68 65 20 63  racter for the c
70c0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 74  orresponding int
70d0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  eger argument..*
70e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
70f0: 61 72 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  arFunc(.  sqlite
7100: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7110: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
7120: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
7130: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 75 6e 73 69  **argv.){.  unsi
7140: 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 2a 7a  gned char *z, *z
7150: 4f 75 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Out;.  int i;.  
7160: 7a 4f 75 74 20 3d 20 7a 20 3d 20 73 71 6c 69 74  zOut = z = sqlit
7170: 65 33 5f 6d 61 6c 6c 6f 63 28 20 61 72 67 63 2a  e3_malloc( argc*
7180: 34 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  4+1 );.  if( z==
7190: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
71a0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
71b0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
71c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
71d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
71e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
71f0: 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20 20 20  e3_int64 x;.    
7200: 75 6e 73 69 67 6e 65 64 20 63 3b 0a 20 20 20 20  unsigned c;.    
7210: 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  x = sqlite3_valu
7220: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 69 5d 29  e_int64(argv[i])
7230: 3b 0a 20 20 20 20 69 66 28 20 78 3c 30 20 7c 7c  ;.    if( x<0 ||
7240: 20 78 3e 30 78 31 30 66 66 66 66 20 29 20 78 20   x>0x10ffff ) x 
7250: 3d 20 30 78 66 66 66 64 3b 0a 20 20 20 20 63 20  = 0xfffd;.    c 
7260: 3d 20 28 75 6e 73 69 67 6e 65 64 29 28 78 20 26  = (unsigned)(x &
7270: 20 30 78 31 66 66 66 66 66 29 3b 0a 20 20 20 20   0x1fffff);.    
7280: 69 66 28 20 63 3c 30 78 30 30 30 38 30 20 29 7b  if( c<0x00080 ){
7290: 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d  .      *zOut++ =
72a0: 20 28 75 38 29 28 63 26 30 78 46 46 29 3b 0a 20   (u8)(c&0xFF);. 
72b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c 30     }else if( c<0
72c0: 78 30 30 38 30 30 20 29 7b 0a 20 20 20 20 20 20  x00800 ){.      
72d0: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 43 30 20 2b  *zOut++ = 0xC0 +
72e0: 20 28 75 38 29 28 28 63 3e 3e 36 29 26 30 78 31   (u8)((c>>6)&0x1
72f0: 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b  F);.      *zOut+
7300: 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28  + = 0x80 + (u8)(
7310: 63 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 7d  c & 0x3F);.    }
7320: 65 6c 73 65 20 69 66 28 20 63 3c 30 78 31 30 30  else if( c<0x100
7330: 30 30 20 29 7b 0a 20 20 20 20 20 20 2a 7a 4f 75  00 ){.      *zOu
7340: 74 2b 2b 20 3d 20 30 78 45 30 20 2b 20 28 75 38  t++ = 0xE0 + (u8
7350: 29 28 28 63 3e 3e 31 32 29 26 30 78 30 46 29 3b  )((c>>12)&0x0F);
7360: 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d  .      *zOut++ =
7370: 20 30 78 38 30 20 2b 20 28 75 38 29 28 28 63 3e   0x80 + (u8)((c>
7380: 3e 36 29 20 26 20 30 78 33 46 29 3b 0a 20 20 20  >6) & 0x3F);.   
7390: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38     *zOut++ = 0x8
73a0: 30 20 2b 20 28 75 38 29 28 63 20 26 20 30 78 33  0 + (u8)(c & 0x3
73b0: 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  F);.    }else{. 
73c0: 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30       *zOut++ = 0
73d0: 78 46 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 31  xF0 + (u8)((c>>1
73e0: 38 29 20 26 20 30 78 30 37 29 3b 0a 20 20 20 20  8) & 0x07);.    
73f0: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30    *zOut++ = 0x80
7400: 20 2b 20 28 75 38 29 28 28 63 3e 3e 31 32 29 20   + (u8)((c>>12) 
7410: 26 20 30 78 33 46 29 3b 0a 20 20 20 20 20 20 2a  & 0x3F);.      *
7420: 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20  zOut++ = 0x80 + 
7430: 28 75 38 29 28 28 63 3e 3e 36 29 20 26 20 30 78  (u8)((c>>6) & 0x
7440: 33 46 29 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74  3F);.      *zOut
7450: 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29  ++ = 0x80 + (u8)
7460: 28 63 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20  (c & 0x3F);.    
7470: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 20 20 20 5c 0a 20 20 7d 0a 20 20 73 71 6c       \.  }.  sql
74b0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
74c0: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a  (context, (char*
74d0: 29 7a 2c 20 28 69 6e 74 29 28 7a 4f 75 74 2d 7a  )z, (int)(zOut-z
74e0: 29 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  ), sqlite3_free)
74f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68  ;.}../*.** The h
7500: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ex() function.  
7510: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 61 72  Interpret the ar
7520: 67 75 6d 65 6e 74 20 61 73 20 61 20 62 6c 6f 62  gument as a blob
7530: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 68  .  Return.** a h
7540: 65 78 61 64 65 63 69 6d 61 6c 20 72 65 6e 64 65  exadecimal rende
7550: 72 69 6e 67 20 61 73 20 74 65 78 74 2e 0a 2a 2f  ring as text..*/
7560: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 78  .static void hex
7570: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
7580: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
7590: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
75a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
75b0: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  argv.){.  int i,
75c0: 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   n;.  const unsi
75d0: 67 6e 65 64 20 63 68 61 72 20 2a 70 42 6c 6f 62  gned char *pBlob
75e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 78 2c 20  ;.  char *zHex, 
75f0: 2a 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72  *z;.  assert( ar
7600: 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45  gc==1 );.  UNUSE
7610: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
7620: 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c  );.  pBlob = sql
7630: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
7640: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20  argv[0]);.  n = 
7650: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
7660: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
7670: 61 73 73 65 72 74 28 20 70 42 6c 6f 62 3d 3d 73  assert( pBlob==s
7680: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
7690: 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f  b(argv[0]) );  /
76a0: 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68  * No encoding ch
76b0: 61 6e 67 65 20 2a 2f 0a 20 20 7a 20 3d 20 7a 48  ange */.  z = zH
76c0: 65 78 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c  ex = contextMall
76d0: 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36  oc(context, ((i6
76e0: 34 29 6e 29 2a 32 20 2b 20 31 29 3b 0a 20 20 69  4)n)*2 + 1);.  i
76f0: 66 28 20 7a 48 65 78 20 29 7b 0a 20 20 20 20 66  f( zHex ){.    f
7700: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
7710: 2c 20 70 42 6c 6f 62 2b 2b 29 7b 0a 20 20 20 20  , pBlob++){.    
7720: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7730: 63 20 3d 20 2a 70 42 6c 6f 62 3b 0a 20 20 20 20  c = *pBlob;.    
7740: 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69    *(z++) = hexdi
7750: 67 69 74 73 5b 28 63 3e 3e 34 29 26 30 78 66 5d  gits[(c>>4)&0xf]
7760: 3b 0a 20 20 20 20 20 20 2a 28 7a 2b 2b 29 20 3d  ;.      *(z++) =
7770: 20 68 65 78 64 69 67 69 74 73 5b 63 26 30 78 66   hexdigits[c&0xf
7780: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 20  ];.    }.    *z 
7790: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
77a0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
77b0: 74 65 78 74 2c 20 7a 48 65 78 2c 20 6e 2a 32 2c  text, zHex, n*2,
77c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
77d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
77e0: 20 7a 65 72 6f 62 6c 6f 62 28 4e 29 20 66 75 6e   zeroblob(N) fun
77f0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
7800: 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 62 6c 6f 62  zero-filled blob
7810: 20 6f 66 20 73 69 7a 65 20 4e 20 62 79 74 65 73   of size N bytes
7820: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7830: 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63 28 0a 20   zeroblobFunc(. 
7840: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7850: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
7860: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
7870: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
7880: 0a 20 20 69 36 34 20 6e 3b 0a 20 20 73 71 6c 69  .  i64 n;.  sqli
7890: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
78a0: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
78b0: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
78c0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
78d0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
78e0: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6e  METER(argc);.  n
78f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7900: 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b  _int64(argv[0]);
7910: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
7920: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7930: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
7940: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
7950: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
7960: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
7970: 5d 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 64  ]+1 );.  if( n>d
7980: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
7990: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
79a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
79b0: 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69  sult_error_toobi
79c0: 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  g(context);.  }e
79d0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
79e0: 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62 6c 6f 62  _result_zeroblob
79f0: 28 63 6f 6e 74 65 78 74 2c 20 28 69 6e 74 29 6e  (context, (int)n
7a00: 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 30 32  ); /* IMP: R-002
7a10: 39 33 2d 36 34 39 39 34 20 2a 2f 0a 20 20 7d 0a  93-64994 */.  }.
7a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 70  }../*.** The rep
7a30: 6c 61 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  lace() function.
7a40: 20 20 54 68 72 65 65 20 61 72 67 75 6d 65 6e 74    Three argument
7a50: 73 20 61 72 65 20 61 6c 6c 20 73 74 72 69 6e 67  s are all string
7a60: 73 3a 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 6d 20  s: call.** them 
7a70: 41 2c 20 42 2c 20 61 6e 64 20 43 2e 20 54 68 65  A, B, and C. The
7a80: 20 72 65 73 75 6c 74 20 69 73 20 61 6c 73 6f 20   result is also 
7a90: 61 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69  a string which i
7aa0: 73 20 64 65 72 69 76 65 64 0a 2a 2a 20 66 72 6f  s derived.** fro
7ab0: 6d 20 41 20 62 79 20 72 65 70 6c 61 63 69 6e 67  m A by replacing
7ac0: 20 65 76 65 72 79 20 6f 63 63 75 72 72 65 6e 63   every occurrenc
7ad0: 65 20 6f 66 20 42 20 77 69 74 68 20 43 2e 20 20  e of B with C.  
7ae0: 54 68 65 20 6d 61 74 63 68 0a 2a 2a 20 6d 75 73  The match.** mus
7af0: 74 20 62 65 20 65 78 61 63 74 2e 20 20 43 6f 6c  t be exact.  Col
7b00: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
7b10: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 2e 0a 2a   are not used..*
7b20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
7b30: 70 6c 61 63 65 46 75 6e 63 28 0a 20 20 73 71 6c  placeFunc(.  sql
7b40: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
7b50: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
7b60: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
7b70: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
7b80: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
7b90: 61 72 20 2a 7a 53 74 72 3b 20 20 20 20 20 20 20  ar *zStr;       
7ba0: 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 73 74   /* The input st
7bb0: 72 69 6e 67 20 41 20 2a 2f 0a 20 20 63 6f 6e 73  ring A */.  cons
7bc0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
7bd0: 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20 20 2f 2a  *zPattern;    /*
7be0: 20 54 68 65 20 70 61 74 74 65 72 6e 20 73 74 72   The pattern str
7bf0: 69 6e 67 20 42 20 2a 2f 0a 20 20 63 6f 6e 73 74  ing B */.  const
7c00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7c10: 7a 52 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  zRep;        /* 
7c20: 54 68 65 20 72 65 70 6c 61 63 65 6d 65 6e 74 20  The replacement 
7c30: 73 74 72 69 6e 67 20 43 20 2a 2f 0a 20 20 75 6e  string C */.  un
7c40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75  signed char *zOu
7c50: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
7c60: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 2a 2f  /* The output */
7c70: 0a 20 20 69 6e 74 20 6e 53 74 72 3b 20 20 20 20  .  int nStr;    
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7c90: 69 7a 65 20 6f 66 20 7a 53 74 72 20 2a 2f 0a 20  ize of zStr */. 
7ca0: 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20 20   int nPattern;  
7cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
7cc0: 65 20 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f  e of zPattern */
7cd0: 0a 20 20 69 6e 74 20 6e 52 65 70 3b 20 20 20 20  .  int nRep;    
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7cf0: 69 7a 65 20 6f 66 20 7a 52 65 70 20 2a 2f 0a 20  ize of zRep */. 
7d00: 20 69 36 34 20 6e 4f 75 74 3b 20 20 20 20 20 20   i64 nOut;      
7d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
7d20: 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 7a 4f 75  imum size of zOu
7d30: 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6f 70 4c  t */.  int loopL
7d40: 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
7d50: 2f 2a 20 4c 61 73 74 20 7a 53 74 72 5b 5d 20 74  /* Last zStr[] t
7d60: 68 61 74 20 6d 69 67 68 74 20 6d 61 74 63 68 20  hat might match 
7d70: 7a 50 61 74 74 65 72 6e 5b 5d 20 2a 2f 0a 20 20  zPattern[] */.  
7d80: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
7d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
7da0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 0a 20 20   counters */..  
7db0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20  assert( argc==3 
7dc0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
7dd0: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 7a  METER(argc);.  z
7de0: 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Str = sqlite3_va
7df0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
7e00: 29 3b 0a 20 20 69 66 28 20 7a 53 74 72 3d 3d 30  );.  if( zStr==0
7e10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 53 74   ) return;.  nSt
7e20: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
7e30: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
7e40: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53 74 72  ;.  assert( zStr
7e50: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
7e60: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b  text(argv[0]) );
7e70: 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67    /* No encoding
7e80: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 50 61   change */.  zPa
7e90: 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ttern = sqlite3_
7ea0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
7eb0: 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 74  1]);.  if( zPatt
7ec0: 65 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ern==0 ){.    as
7ed0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61  sert( sqlite3_va
7ee0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d  lue_type(argv[1]
7ef0: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20  )==SQLITE_NULL. 
7f00: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
7f10: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
7f20: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
7f30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7f40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
7f50: 7d 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e  }.  if( zPattern
7f60: 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  [0]==0 ){.    as
7f70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61  sert( sqlite3_va
7f80: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d  lue_type(argv[1]
7f90: 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )!=SQLITE_NULL )
7fa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
7fb0: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
7fc0: 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt, argv[0]);.  
7fd0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7fe0: 6e 50 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74  nPattern = sqlit
7ff0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
8000: 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72  rgv[1]);.  asser
8010: 74 28 20 7a 50 61 74 74 65 72 6e 3d 3d 73 71 6c  t( zPattern==sql
8020: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8030: 61 72 67 76 5b 31 5d 29 20 29 3b 20 20 2f 2a 20  argv[1]) );  /* 
8040: 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e  No encoding chan
8050: 67 65 20 2a 2f 0a 20 20 7a 52 65 70 20 3d 20 73  ge */.  zRep = s
8060: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8070: 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66  t(argv[2]);.  if
8080: 28 20 7a 52 65 70 3d 3d 30 20 29 20 72 65 74 75  ( zRep==0 ) retu
8090: 72 6e 3b 0a 20 20 6e 52 65 70 20 3d 20 73 71 6c  rn;.  nRep = sql
80a0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
80b0: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 61 73 73  (argv[2]);.  ass
80c0: 65 72 74 28 20 7a 52 65 70 3d 3d 73 71 6c 69 74  ert( zRep==sqlit
80d0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
80e0: 67 76 5b 32 5d 29 20 29 3b 0a 20 20 6e 4f 75 74  gv[2]) );.  nOut
80f0: 20 3d 20 6e 53 74 72 20 2b 20 31 3b 0a 20 20 61   = nStr + 1;.  a
8100: 73 73 65 72 74 28 20 6e 4f 75 74 3c 53 51 4c 49  ssert( nOut<SQLI
8110: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b  TE_MAX_LENGTH );
8120: 0a 20 20 7a 4f 75 74 20 3d 20 63 6f 6e 74 65 78  .  zOut = contex
8130: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
8140: 20 28 69 36 34 29 6e 4f 75 74 29 3b 0a 20 20 69   (i64)nOut);.  i
8150: 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  f( zOut==0 ){.  
8160: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8170: 6c 6f 6f 70 4c 69 6d 69 74 20 3d 20 6e 53 74 72  loopLimit = nStr
8180: 20 2d 20 6e 50 61 74 74 65 72 6e 3b 20 20 0a 20   - nPattern;  . 
8190: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 3d 6c   for(i=j=0; i<=l
81a0: 6f 6f 70 4c 69 6d 69 74 3b 20 69 2b 2b 29 7b 0a  oopLimit; i++){.
81b0: 20 20 20 20 69 66 28 20 7a 53 74 72 5b 69 5d 21      if( zStr[i]!
81c0: 3d 7a 50 61 74 74 65 72 6e 5b 30 5d 20 7c 7c 20  =zPattern[0] || 
81d0: 6d 65 6d 63 6d 70 28 26 7a 53 74 72 5b 69 5d 2c  memcmp(&zStr[i],
81e0: 20 7a 50 61 74 74 65 72 6e 2c 20 6e 50 61 74 74   zPattern, nPatt
81f0: 65 72 6e 29 20 29 7b 0a 20 20 20 20 20 20 7a 4f  ern) ){.      zO
8200: 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 53 74 72 5b 69  ut[j++] = zStr[i
8210: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
8220: 20 20 20 20 75 38 20 2a 7a 4f 6c 64 3b 0a 20 20      u8 *zOld;.  
8230: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
8240: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
8250: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
8260: 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74  ext);.      nOut
8270: 20 2b 3d 20 6e 52 65 70 20 2d 20 6e 50 61 74 74   += nRep - nPatt
8280: 65 72 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ern;.      testc
8290: 61 73 65 28 20 6e 4f 75 74 2d 31 3d 3d 64 62 2d  ase( nOut-1==db-
82a0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
82b0: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a  IMIT_LENGTH] );.
82c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
82d0: 6e 4f 75 74 2d 32 3d 3d 64 62 2d 3e 61 4c 69 6d  nOut-2==db->aLim
82e0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
82f0: 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20 20 20  LENGTH] );.     
8300: 20 69 66 28 20 6e 4f 75 74 2d 31 3e 64 62 2d 3e   if( nOut-1>db->
8310: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8320: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
8330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
8340: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62  esult_error_toob
8350: 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ig(context);.   
8360: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
8370: 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  e(zOut);.       
8380: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
8390: 0a 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 7a 4f  .      zOld = zO
83a0: 75 74 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ut;.      zOut =
83b0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
83c0: 28 7a 4f 75 74 2c 20 28 69 6e 74 29 6e 4f 75 74  (zOut, (int)nOut
83d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 75  );.      if( zOu
83e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
83f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8400: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
8410: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  xt);.        sql
8420: 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b  ite3_free(zOld);
8430: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
8440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
8450: 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20  emcpy(&zOut[j], 
8460: 7a 52 65 70 2c 20 6e 52 65 70 29 3b 0a 20 20 20  zRep, nRep);.   
8470: 20 20 20 6a 20 2b 3d 20 6e 52 65 70 3b 0a 20 20     j += nRep;.  
8480: 20 20 20 20 69 20 2b 3d 20 6e 50 61 74 74 65 72      i += nPatter
8490: 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n-1;.    }.  }. 
84a0: 20 61 73 73 65 72 74 28 20 6a 2b 6e 53 74 72 2d   assert( j+nStr-
84b0: 69 2b 31 3d 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d  i+1==nOut );.  m
84c0: 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20  emcpy(&zOut[j], 
84d0: 26 7a 53 74 72 5b 69 5d 2c 20 6e 53 74 72 2d 69  &zStr[i], nStr-i
84e0: 29 3b 0a 20 20 6a 20 2b 3d 20 6e 53 74 72 20 2d  );.  j += nStr -
84f0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   i;.  assert( j<
8500: 3d 6e 4f 75 74 20 29 3b 0a 20 20 7a 4f 75 74 5b  =nOut );.  zOut[
8510: 6a 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  j] = 0;.  sqlite
8520: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
8530: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f  ntext, (char*)zO
8540: 75 74 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66  ut, j, sqlite3_f
8550: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ree);.}../*.** I
8560: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
8570: 20 74 68 65 20 54 52 49 4d 28 29 2c 20 4c 54 52   the TRIM(), LTR
8580: 49 4d 28 29 2c 20 61 6e 64 20 52 54 52 49 4d 28  IM(), and RTRIM(
8590: 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20  ) functions..** 
85a0: 54 68 65 20 75 73 65 72 64 61 74 61 20 69 73 20  The userdata is 
85b0: 30 78 31 20 66 6f 72 20 6c 65 66 74 20 74 72 69  0x1 for left tri
85c0: 6d 2c 20 30 78 32 20 66 6f 72 20 72 69 67 68 74  m, 0x2 for right
85d0: 20 74 72 69 6d 2c 20 30 78 33 20 66 6f 72 20 62   trim, 0x3 for b
85e0: 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oth..*/.static v
85f0: 6f 69 64 20 74 72 69 6d 46 75 6e 63 28 0a 20 20  oid trimFunc(.  
8600: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8610: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
8620: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
8630: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
8640: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
8650: 20 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20   char *zIn;     
8660: 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 73 74 72      /* Input str
8670: 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ing */.  const u
8680: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 43  nsigned char *zC
8690: 68 61 72 53 65 74 3b 20 20 20 20 2f 2a 20 53 65  harSet;    /* Se
86a0: 74 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  t of characters 
86b0: 74 6f 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74  to trim */.  int
86c0: 20 6e 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20   nIn;           
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
86e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
86f0: 73 20 69 6e 20 69 6e 70 75 74 20 2a 2f 0a 20 20  s in input */.  
8700: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 20 2f 2a 20 31 3a 20 74 72 69 6d 6c 65 66 74    /* 1: trimleft
8730: 20 20 32 3a 20 74 72 69 6d 72 69 67 68 74 20 20    2: trimright  
8740: 33 3a 20 74 72 69 6d 20 2a 2f 0a 20 20 69 6e 74  3: trim */.  int
8750: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8770: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
8780: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8790: 72 20 2a 61 4c 65 6e 20 3d 20 30 3b 20 20 20 20  r *aLen = 0;    
87a0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
87b0: 6f 66 20 65 61 63 68 20 63 68 61 72 61 63 74 65  of each characte
87c0: 72 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f  r in zCharSet */
87d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
87e0: 20 2a 2a 61 7a 43 68 61 72 20 3d 20 30 3b 20 20   **azChar = 0;  
87f0: 20 20 20 20 20 2f 2a 20 49 6e 64 69 76 69 64 75       /* Individu
8800: 61 6c 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  al characters in
8810: 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20 69   zCharSet */.  i
8820: 6e 74 20 6e 43 68 61 72 3b 20 20 20 20 20 20 20  nt nChar;       
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
8850: 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43 68 61  aracters in zCha
8860: 72 53 65 74 20 2a 2f 0a 0a 20 20 69 66 28 20 73  rSet */..  if( s
8870: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8880: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
8890: 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_NULL ){.    r
88a0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e  eturn;.  }.  zIn
88b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
88c0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
88d0: 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72    if( zIn==0 ) r
88e0: 65 74 75 72 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73  eturn;.  nIn = s
88f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
8900: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61  es(argv[0]);.  a
8910: 73 73 65 72 74 28 20 7a 49 6e 3d 3d 73 71 6c 69  ssert( zIn==sqli
8920: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
8930: 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  rgv[0]) );.  if(
8940: 20 61 72 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20   argc==1 ){.    
8950: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
8960: 69 67 6e 65 64 20 63 68 61 72 20 6c 65 6e 4f 6e  igned char lenOn
8970: 65 5b 5d 20 3d 20 7b 20 31 20 7d 3b 0a 20 20 20  e[] = { 1 };.   
8980: 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64   static unsigned
8990: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
89a0: 4f 6e 65 5b 5d 20 3d 20 7b 20 28 75 38 2a 29 22  One[] = { (u8*)"
89b0: 20 22 20 7d 3b 0a 20 20 20 20 6e 43 68 61 72 20   " };.    nChar 
89c0: 3d 20 31 3b 0a 20 20 20 20 61 4c 65 6e 20 3d 20  = 1;.    aLen = 
89d0: 28 75 38 2a 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20  (u8*)lenOne;.   
89e0: 20 61 7a 43 68 61 72 20 3d 20 28 75 6e 73 69 67   azChar = (unsig
89f0: 6e 65 64 20 63 68 61 72 20 2a 2a 29 61 7a 4f 6e  ned char **)azOn
8a00: 65 3b 0a 20 20 20 20 7a 43 68 61 72 53 65 74 20  e;.    zCharSet 
8a10: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
8a20: 20 28 7a 43 68 61 72 53 65 74 20 3d 20 73 71 6c   (zCharSet = sql
8a30: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8a40: 61 72 67 76 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a  argv[1]))==0 ){.
8a50: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
8a60: 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  lse{.    const u
8a70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b  nsigned char *z;
8a80: 0a 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72  .    for(z=zChar
8a90: 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a  Set, nChar=0; *z
8aa0: 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20  ; nChar++){.    
8ab0: 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54    SQLITE_SKIP_UT
8ac0: 46 38 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  F8(z);.    }.   
8ad0: 20 69 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a   if( nChar>0 ){.
8ae0: 20 20 20 20 20 20 61 7a 43 68 61 72 20 3d 20 63        azChar = c
8af0: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
8b00: 74 65 78 74 2c 20 28 28 69 36 34 29 6e 43 68 61  text, ((i64)nCha
8b10: 72 29 2a 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  r)*(sizeof(char*
8b20: 29 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28  )+1));.      if(
8b30: 20 61 7a 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20   azChar==0 ){.  
8b40: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8b50: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4c 65 6e      }.      aLen
8b60: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
8b70: 72 2a 29 26 61 7a 43 68 61 72 5b 6e 43 68 61 72  r*)&azChar[nChar
8b80: 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 7a 3d 7a  ];.      for(z=z
8b90: 43 68 61 72 53 65 74 2c 20 6e 43 68 61 72 3d 30  CharSet, nChar=0
8ba0: 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a  ; *z; nChar++){.
8bb0: 20 20 20 20 20 20 20 20 61 7a 43 68 61 72 5b 6e          azChar[n
8bc0: 43 68 61 72 5d 20 3d 20 28 75 6e 73 69 67 6e 65  Char] = (unsigne
8bd0: 64 20 63 68 61 72 20 2a 29 7a 3b 0a 20 20 20 20  d char *)z;.    
8be0: 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f      SQLITE_SKIP_
8bf0: 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 20 20 20  UTF8(z);.       
8c00: 20 61 4c 65 6e 5b 6e 43 68 61 72 5d 20 3d 20 28   aLen[nChar] = (
8c10: 75 38 29 28 7a 20 2d 20 61 7a 43 68 61 72 5b 6e  u8)(z - azChar[n
8c20: 43 68 61 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Char]);.      }.
8c30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
8c40: 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20 20 66  nChar>0 ){.    f
8c50: 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 50 54  lags = SQLITE_PT
8c60: 52 5f 54 4f 5f 49 4e 54 28 73 71 6c 69 74 65 33  R_TO_INT(sqlite3
8c70: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
8c80: 78 74 29 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  xt));.    if( fl
8c90: 61 67 73 20 26 20 31 20 29 7b 0a 20 20 20 20 20  ags & 1 ){.     
8ca0: 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b   while( nIn>0 ){
8cb0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  .        int len
8cc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
8cd0: 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20  r(i=0; i<nChar; 
8ce0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
8cf0: 6c 65 6e 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20  len = aLen[i];. 
8d00: 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e           if( len
8d10: 3c 3d 6e 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28  <=nIn && memcmp(
8d20: 7a 49 6e 2c 20 61 7a 43 68 61 72 5b 69 5d 2c 20  zIn, azChar[i], 
8d30: 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  len)==0 ) break;
8d40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8d50: 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20     if( i>=nChar 
8d60: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
8d70: 20 7a 49 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20   zIn += len;.   
8d80: 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b       nIn -= len;
8d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8da0: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 32     if( flags & 2
8db0: 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
8dc0: 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   nIn>0 ){.      
8dd0: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20    int len = 0;. 
8de0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
8df0: 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20  i<nChar; i++){. 
8e00: 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 61           len = a
8e10: 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Len[i];.        
8e20: 20 20 69 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26    if( len<=nIn &
8e30: 26 20 6d 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49  & memcmp(&zIn[nI
8e40: 6e 2d 6c 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d  n-len],azChar[i]
8e50: 2c 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,len)==0 ) break
8e60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8e70: 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 61 72      if( i>=nChar
8e80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
8e90: 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20    nIn -= len;.  
8ea0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8eb0: 69 66 28 20 7a 43 68 61 72 53 65 74 20 29 7b 0a  if( zCharSet ){.
8ec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
8ed0: 65 65 28 61 7a 43 68 61 72 29 3b 0a 20 20 20 20  ee(azChar);.    
8ee0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
8ef0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
8f00: 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c  ext, (char*)zIn,
8f10: 20 6e 49 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41   nIn, SQLITE_TRA
8f20: 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 0a 2f 2a 20  NSIENT);.}.../* 
8f30: 49 4d 50 3a 20 52 2d 32 35 33 36 31 2d 31 36 31  IMP: R-25361-161
8f40: 35 30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  50 This function
8f50: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
8f60: 20 53 51 4c 69 74 65 20 62 79 20 64 65 66 61 75   SQLite by defau
8f70: 6c 74 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c  lt. It.** is onl
8f80: 79 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20 74  y available if t
8f90: 68 65 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45  he SQLITE_SOUNDE
8fa0: 58 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  X compile-time o
8fb0: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 0a 2a 2a  ption is used.**
8fc0: 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20   when SQLite is 
8fd0: 62 75 69 6c 74 2e 0a 2a 2f 0a 23 69 66 64 65 66  built..*/.#ifdef
8fe0: 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a   SQLITE_SOUNDEX.
8ff0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
9000: 65 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69  e soundex encodi
9010: 6e 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a 2a  ng of a word..**
9020: 0a 2a 2a 20 49 4d 50 3a 20 52 2d 35 39 37 38 32  .** IMP: R-59782
9030: 2d 30 30 30 37 32 20 54 68 65 20 73 6f 75 6e 64  -00072 The sound
9040: 65 78 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 72  ex(X) function r
9050: 65 74 75 72 6e 73 20 61 20 73 74 72 69 6e 67 20  eturns a string 
9060: 74 68 61 74 20 69 73 20 74 68 65 0a 2a 2a 20 73  that is the.** s
9070: 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e 67 20  oundex encoding 
9080: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 58 2e  of the string X.
9090: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
90a0: 20 73 6f 75 6e 64 65 78 46 75 6e 63 28 0a 20 20   soundexFunc(.  
90b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
90c0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
90d0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
90e0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
90f0: 20 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b 38    char zResult[8
9100: 5d 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  ];.  const u8 *z
9110: 49 6e 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  In;.  int i, j;.
9120: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
9130: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 43 6f  nsigned char iCo
9140: 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20  de[] = {.    0, 
9150: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9160: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9170: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
9180: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
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: 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
91c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 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 0a 20 20 20 20 30 2c 20 30 2c 20 30  , 0,.    0, 0, 0
91f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 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 0a 20 20 20 20 30 2c 20  0, 0, 0,.    0, 
9220: 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31  0, 1, 2, 3, 0, 1
9230: 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c  , 2, 0, 0, 2, 2,
9240: 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20   4, 5, 5, 0,.   
9250: 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20   1, 2, 6, 2, 3, 
9260: 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32  0, 1, 0, 2, 0, 2
9270: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9280: 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c  .    0, 0, 1, 2,
9290: 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20   3, 0, 1, 2, 0, 
92a0: 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35  0, 2, 2, 4, 5, 5
92b0: 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36  , 0,.    1, 2, 6
92c0: 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c  , 2, 3, 0, 1, 0,
92d0: 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20   2, 0, 2, 0, 0, 
92e0: 30 2c 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20  0, 0, 0,.  };.  
92f0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
9300: 29 3b 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a 29  );.  zIn = (u8*)
9310: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
9320: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
9330: 66 28 20 7a 49 6e 3d 3d 30 20 29 20 7a 49 6e 20  f( zIn==0 ) zIn 
9340: 3d 20 28 75 38 2a 29 22 22 3b 0a 20 20 66 6f 72  = (u8*)"";.  for
9350: 28 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26 26 20  (i=0; zIn[i] && 
9360: 21 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28  !sqlite3Isalpha(
9370: 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  zIn[i]); i++){}.
9380: 20 20 69 66 28 20 7a 49 6e 5b 69 5d 20 29 7b 0a    if( zIn[i] ){.
9390: 20 20 20 20 75 38 20 70 72 65 76 63 6f 64 65 20      u8 prevcode 
93a0: 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30  = iCode[zIn[i]&0
93b0: 78 37 66 5d 3b 0a 20 20 20 20 7a 52 65 73 75 6c  x7f];.    zResul
93c0: 74 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f  t[0] = sqlite3To
93d0: 75 70 70 65 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20  upper(zIn[i]);. 
93e0: 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20     for(j=1; j<4 
93f0: 26 26 20 7a 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b  && zIn[i]; i++){
9400: 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20  .      int code 
9410: 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30  = iCode[zIn[i]&0
9420: 78 37 66 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f];.      if( 
9430: 63 6f 64 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  code>0 ){.      
9440: 20 20 69 66 28 20 63 6f 64 65 21 3d 70 72 65 76    if( code!=prev
9450: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  code ){.        
9460: 20 20 70 72 65 76 63 6f 64 65 20 3d 20 63 6f 64    prevcode = cod
9470: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65  e;.          zRe
9480: 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63 6f 64 65  sult[j++] = code
9490: 20 2b 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   + '0';.        
94a0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
94b0: 20 20 20 20 20 20 20 70 72 65 76 63 6f 64 65 20         prevcode 
94c0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
94d0: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c   }.    while( j<
94e0: 34 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 73 75  4 ){.      zResu
94f0: 6c 74 5b 6a 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20  lt[j++] = '0';. 
9500: 20 20 20 7d 0a 20 20 20 20 7a 52 65 73 75 6c 74     }.    zResult
9510: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
9520: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
9530: 28 63 6f 6e 74 65 78 74 2c 20 7a 52 65 73 75 6c  (context, zResul
9540: 74 2c 20 34 2c 20 53 51 4c 49 54 45 5f 54 52 41  t, 4, SQLITE_TRA
9550: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
9560: 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  {.    /* IMP: R-
9570: 36 34 38 39 34 2d 35 30 33 32 31 20 54 68 65 20  64894-50321 The 
9580: 73 74 72 69 6e 67 20 22 3f 30 30 30 22 20 69 73  string "?000" is
9590: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
95a0: 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a   argument.    **
95b0: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 74   is NULL or cont
95c0: 61 69 6e 73 20 6e 6f 20 41 53 43 49 49 20 61 6c  ains no ASCII al
95d0: 70 68 61 62 65 74 69 63 20 63 68 61 72 61 63 74  phabetic charact
95e0: 65 72 73 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ers. */.    sqli
95f0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
9600: 63 6f 6e 74 65 78 74 2c 20 22 3f 30 30 30 22 2c  context, "?000",
9610: 20 34 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   4, SQLITE_STATI
9620: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
9630: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44   /* SQLITE_SOUND
9640: 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EX */..#ifndef S
9650: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
9660: 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
9670: 41 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  A function that 
9680: 6c 6f 61 64 73 20 61 20 73 68 61 72 65 64 2d 6c  loads a shared-l
9690: 69 62 72 61 72 79 20 65 78 74 65 6e 73 69 6f 6e  ibrary extension
96a0: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 4e 55   then returns NU
96b0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
96c0: 69 64 20 6c 6f 61 64 45 78 74 28 73 71 6c 69 74  id loadExt(sqlit
96d0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
96e0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
96f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
9700: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  rgv){.  const ch
9710: 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28 63 6f 6e  ar *zFile = (con
9720: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
9730: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
9740: 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63  v[0]);.  const c
9750: 68 61 72 20 2a 7a 50 72 6f 63 3b 0a 20 20 73 71  har *zProc;.  sq
9760: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
9770: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
9780: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
9790: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
97a0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  = 0;..  if( argc
97b0: 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63  ==2 ){.    zProc
97c0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
97d0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
97e0: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
97f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 63  }else{.    zProc
9800: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
9810: 7a 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33  zFile && sqlite3
9820: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
9830: 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63  db, zFile, zProc
9840: 2c 20 26 7a 45 72 72 4d 73 67 29 20 29 7b 0a 20  , &zErrMsg) ){. 
9850: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9860: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
9870: 20 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b 0a 20   zErrMsg, -1);. 
9880: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9890: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a  zErrMsg);.  }.}.
98a0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
98b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
98c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
98d0: 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20  cture holds the 
98e0: 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20  context of a.** 
98f0: 73 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20 61  sum() or avg() a
9900: 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74 61  ggregate computa
9910: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
9920: 20 73 74 72 75 63 74 20 53 75 6d 43 74 78 20 53   struct SumCtx S
9930: 75 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53 75  umCtx;.struct Su
9940: 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20  mCtx {.  double 
9950: 72 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20 46 6c  rSum;      /* Fl
9960: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 73 75 6d  oating point sum
9970: 20 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d 3b 20   */.  i64 iSum; 
9980: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
9990: 65 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20 20 69  er sum */   .  i
99a0: 36 34 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  64 cnt;         
99b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
99c0: 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a 2f  ements summed */
99d0: 0a 20 20 75 38 20 6f 76 65 72 66 6c 6f 77 3b 20  .  u8 overflow; 
99e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
99f0: 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77  integer overflow
9a00: 20 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20 61 70   seen */.  u8 ap
9a10: 70 72 6f 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  prox;        /* 
9a20: 54 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e 74 65  True if non-inte
9a30: 67 65 72 20 76 61 6c 75 65 20 77 61 73 20 69 6e  ger value was in
9a40: 70 75 74 20 74 6f 20 74 68 65 20 73 75 6d 20 2a  put to the sum *
9a50: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  /.};../*.** Rout
9a60: 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ines used to com
9a70: 70 75 74 65 20 74 68 65 20 73 75 6d 2c 20 61 76  pute the sum, av
9a80: 65 72 61 67 65 2c 20 61 6e 64 20 74 6f 74 61 6c  erage, and total
9a90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55 4d 28  ..**.** The SUM(
9aa0: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c 6c 6f  ) function follo
9ab0: 77 73 20 74 68 65 20 28 62 72 6f 6b 65 6e 29 20  ws the (broken) 
9ac0: 53 51 4c 20 73 74 61 6e 64 61 72 64 20 77 68 69  SQL standard whi
9ad0: 63 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ch means.** that
9ae0: 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c   it returns NULL
9af0: 20 69 66 20 69 74 20 73 75 6d 73 20 6f 76 65 72   if it sums over
9b00: 20 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54 4f 54   no inputs.  TOT
9b10: 41 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30 2e  AL returns.** 0.
9b20: 30 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20  0 in that case. 
9b30: 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20 54 4f   In addition, TO
9b40: 54 41 4c 20 61 6c 77 61 79 73 20 72 65 74 75 72  TAL always retur
9b50: 6e 73 20 61 20 66 6c 6f 61 74 20 77 68 65 72 65  ns a float where
9b60: 0a 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20 72 65  .** SUM might re
9b70: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
9b80: 69 66 20 69 74 20 6e 65 76 65 72 20 65 6e 63 6f  if it never enco
9b90: 75 6e 74 65 72 73 20 61 20 66 6c 6f 61 74 69 6e  unters a floatin
9ba0: 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
9bb0: 2e 20 20 54 4f 54 41 4c 20 6e 65 76 65 72 20 66  .  TOTAL never f
9bc0: 61 69 6c 73 2c 20 62 75 74 20 53 55 4d 20 6d 69  ails, but SUM mi
9bd0: 67 68 74 20 74 68 72 6f 75 67 68 20 61 6e 20 65  ght through an e
9be0: 78 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a 20 69  xception if.** i
9bf0: 74 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e 20 69  t overflows an i
9c00: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nteger..*/.stati
9c10: 63 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28 73  c void sumStep(s
9c20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9c30: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
9c40: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
9c50: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43   **argv){.  SumC
9c60: 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79 70  tx *p;.  int typ
9c70: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  e;.  assert( arg
9c80: 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==1 );.  UNUSED
9c90: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
9ca0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
9cb0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
9cc0: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
9cd0: 66 28 2a 70 29 29 3b 0a 20 20 74 79 70 65 20 3d  f(*p));.  type =
9ce0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e   sqlite3_value_n
9cf0: 75 6d 65 72 69 63 5f 74 79 70 65 28 61 72 67 76  umeric_type(argv
9d00: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 20 26 26  [0]);.  if( p &&
9d10: 20 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e 55   type!=SQLITE_NU
9d20: 4c 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6e 74  LL ){.    p->cnt
9d30: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 74 79 70 65  ++;.    if( type
9d40: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
9d50: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 20   ){.      i64 v 
9d60: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
9d70: 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a  int64(argv[0]);.
9d80: 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d        p->rSum +=
9d90: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   v;.      if( (p
9da0: 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f 76 65 72  ->approx|p->over
9db0: 66 6c 6f 77 29 3d 3d 30 20 26 26 20 73 71 6c 69  flow)==0 && sqli
9dc0: 74 65 33 41 64 64 49 6e 74 36 34 28 26 70 2d 3e  te3AddInt64(&p->
9dd0: 69 53 75 6d 2c 20 76 29 20 29 7b 0a 20 20 20 20  iSum, v) ){.    
9de0: 20 20 20 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20      p->overflow 
9df0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
9e00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
9e10: 3e 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33  >rSum += sqlite3
9e20: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
9e30: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d  gv[0]);.      p-
9e40: 3e 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20 20 20  >approx = 1;.   
9e50: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
9e60: 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69 7a 65  void sumFinalize
9e70: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
9e80: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75   *context){.  Su
9e90: 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  mCtx *p;.  p = s
9ea0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
9eb0: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
9ec0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26  , 0);.  if( p &&
9ed0: 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20   p->cnt>0 ){.   
9ee0: 20 69 66 28 20 70 2d 3e 6f 76 65 72 66 6c 6f 77   if( p->overflow
9ef0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9f00: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
9f10: 6f 6e 74 65 78 74 2c 22 69 6e 74 65 67 65 72 20  ontext,"integer 
9f20: 6f 76 65 72 66 6c 6f 77 22 2c 2d 31 29 3b 0a 20  overflow",-1);. 
9f30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
9f40: 61 70 70 72 6f 78 20 29 7b 0a 20 20 20 20 20 20  approx ){.      
9f50: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
9f60: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70  ouble(context, p
9f70: 2d 3e 72 53 75 6d 29 3b 0a 20 20 20 20 7d 65 6c  ->rSum);.    }el
9f80: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
9f90: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
9fa0: 6f 6e 74 65 78 74 2c 20 70 2d 3e 69 53 75 6d 29  ontext, p->iSum)
9fb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
9fc0: 61 74 69 63 20 76 6f 69 64 20 61 76 67 46 69 6e  atic void avgFin
9fd0: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
9fe0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
9ff0: 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20  .  SumCtx *p;.  
a000: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
a010: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
a020: 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28  ntext, 0);.  if(
a030: 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29   p && p->cnt>0 )
a040: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
a050: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
a060: 65 78 74 2c 20 70 2d 3e 72 53 75 6d 2f 28 64 6f  ext, p->rSum/(do
a070: 75 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20  uble)p->cnt);.  
a080: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
a090: 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 28 73 71  totalFinalize(sq
a0a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
a0b0: 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74  ontext){.  SumCt
a0c0: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
a0d0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
a0e0: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
a0f0: 29 3b 0a 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29  );.  /* (double)
a100: 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c  0 In case of SQL
a110: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
a120: 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20  G_POINT... */.  
a130: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
a140: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70  ouble(context, p
a150: 20 3f 20 70 2d 3e 72 53 75 6d 20 3a 20 28 64 6f   ? p->rSum : (do
a160: 75 62 6c 65 29 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  uble)0);.}../*.*
a170: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
a180: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
a190: 74 72 61 63 6b 20 6f 66 20 73 74 61 74 65 20 69  track of state i
a1a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
a1b0: 68 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20 61 67  he.** count() ag
a1c0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
a1d0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
a1e0: 75 63 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75  uct CountCtx Cou
a1f0: 6e 74 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f  ntCtx;.struct Co
a200: 75 6e 74 43 74 78 20 7b 0a 20 20 69 36 34 20 6e  untCtx {.  i64 n
a210: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ;.};../*.** Rout
a220: 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ines to implemen
a230: 74 20 74 68 65 20 63 6f 75 6e 74 28 29 20 61 67  t the count() ag
a240: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
a250: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a260: 20 63 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74   countStep(sqlit
a270: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
a280: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
a290: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
a2a0: 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78  rgv){.  CountCtx
a2b0: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
a2c0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
a2d0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
a2e0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
a2f0: 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c   (argc==0 || SQL
a300: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
a310: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
a320: 76 5b 30 5d 29 29 20 26 26 20 70 20 29 7b 0a 20  v[0])) && p ){. 
a330: 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 0a     p->n++;.  }..
a340: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a350: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
a360: 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f   /* The sqlite3_
a370: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
a380: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65  ) function is de
a390: 70 72 65 63 61 74 65 64 2e 20 20 42 75 74 20 6a  precated.  But j
a3a0: 75 73 74 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  ust to make.  **
a3b0: 20 73 75 72 65 20 69 74 20 73 74 69 6c 6c 20 6f   sure it still o
a3c0: 70 65 72 61 74 65 73 20 63 6f 72 72 65 63 74 6c  perates correctl
a3d0: 79 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 69  y, verify that i
a3e0: 74 73 20 63 6f 75 6e 74 20 61 67 72 65 65 73 20  ts count agrees 
a3f0: 77 69 74 68 20 6f 75 72 20 0a 20 20 2a 2a 20 69  with our .  ** i
a400: 6e 74 65 72 6e 61 6c 20 63 6f 75 6e 74 20 77 68  nternal count wh
a410: 65 6e 20 75 73 69 6e 67 20 63 6f 75 6e 74 28 2a  en using count(*
a420: 29 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 74  ) and when the t
a430: 6f 74 61 6c 20 63 6f 75 6e 74 20 63 61 6e 20 62  otal count can b
a440: 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 65 64  e.  ** expressed
a450: 20 61 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74   as a 32-bit int
a460: 65 67 65 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72  eger. */.  asser
a470: 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 70 3d  t( argc==1 || p=
a480: 3d 30 20 7c 7c 20 70 2d 3e 6e 3e 30 78 37 66 66  =0 || p->n>0x7ff
a490: 66 66 66 66 66 0a 20 20 20 20 20 20 20 20 20 20  fffff.          
a4a0: 7c 7c 20 70 2d 3e 6e 3d 3d 73 71 6c 69 74 65 33  || p->n==sqlite3
a4b0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74  _aggregate_count
a4c0: 28 63 6f 6e 74 65 78 74 29 20 29 3b 0a 23 65 6e  (context) );.#en
a4d0: 64 69 66 0a 7d 20 20 20 0a 73 74 61 74 69 63 20  dif.}   .static 
a4e0: 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69  void countFinali
a4f0: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
a500: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
a510: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
a520: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
a530: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
a540: 74 65 78 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  text, 0);.  sqli
a550: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
a560: 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d  (context, p ? p-
a570: 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >n : 0);.}../*.*
a580: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d  * Routines to im
a590: 70 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e  plement min() an
a5a0: 64 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74  d max() aggregat
a5b0: 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  e functions..*/.
a5c0: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d  static void minm
a5d0: 61 78 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  axStep(.  sqlite
a5e0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
a5f0: 78 74 2c 20 0a 20 20 69 6e 74 20 4e 6f 74 55 73  xt, .  int NotUs
a600: 65 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  ed, .  sqlite3_v
a610: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
a620: 20 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20 28 4d   Mem *pArg  = (M
a630: 65 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a 20 20  em *)argv[0];.  
a640: 4d 65 6d 20 2a 70 42 65 73 74 3b 0a 20 20 55 4e  Mem *pBest;.  UN
a650: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
a660: 6f 74 55 73 65 64 29 3b 0a 0a 20 20 70 42 65 73  otUsed);..  pBes
a670: 74 20 3d 20 28 4d 65 6d 20 2a 29 73 71 6c 69 74  t = (Mem *)sqlit
a680: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
a690: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
a6a0: 7a 65 6f 66 28 2a 70 42 65 73 74 29 29 3b 0a 20  zeof(*pBest));. 
a6b0: 20 69 66 28 20 21 70 42 65 73 74 20 29 20 72 65   if( !pBest ) re
a6c0: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c  turn;..  if( sql
a6d0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
a6e0: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
a6f0: 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _NULL ){.    if(
a700: 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 20   pBest->flags ) 
a710: 73 71 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d  sqlite3SkipAccum
a720: 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65  ulatorLoad(conte
a730: 78 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  xt);.  }else if(
a740: 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 7b   pBest->flags ){
a750: 0a 20 20 20 20 69 6e 74 20 6d 61 78 3b 0a 20 20  .    int max;.  
a760: 20 20 69 6e 74 20 63 6d 70 3b 0a 20 20 20 20 43    int cmp;.    C
a770: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
a780: 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f  sqlite3GetFuncCo
a790: 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a  llSeq(context);.
a7a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 65 70      /* This step
a7b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
a7c0: 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 6d  d for both the m
a7d0: 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61  in() and max() a
a7e0: 67 67 72 65 67 61 74 65 73 2c 0a 20 20 20 20 2a  ggregates,.    *
a7f0: 2a 20 74 68 65 20 6f 6e 6c 79 20 64 69 66 66 65  * the only diffe
a800: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
a810: 65 20 74 77 6f 20 62 65 69 6e 67 20 74 68 61 74  e two being that
a820: 20 74 68 65 20 73 65 6e 73 65 20 6f 66 20 74 68   the sense of th
a830: 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69  e.    ** compari
a840: 73 6f 6e 20 69 73 20 69 6e 76 65 72 74 65 64 2e  son is inverted.
a850: 20 46 6f 72 20 74 68 65 20 6d 61 78 28 29 20 61   For the max() a
a860: 67 67 72 65 67 61 74 65 2c 20 74 68 65 0a 20 20  ggregate, the.  
a870: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 73 65    ** sqlite3_use
a880: 72 5f 64 61 74 61 28 29 20 66 75 6e 63 74 69 6f  r_data() functio
a890: 6e 20 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20  n returns (void 
a8a0: 2a 29 2d 31 2e 20 46 6f 72 20 6d 69 6e 28 29 20  *)-1. For min() 
a8b0: 69 74 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  it.    ** return
a8c0: 73 20 28 76 6f 69 64 20 2a 29 64 62 2c 20 77 68  s (void *)db, wh
a8d0: 65 72 65 20 64 62 20 69 73 20 74 68 65 20 73 71  ere db is the sq
a8e0: 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73 65 20  lite3* database 
a8f0: 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20 2a 2a 20  pointer..    ** 
a900: 54 68 65 72 65 66 6f 72 65 20 74 68 65 20 6e 65  Therefore the ne
a910: 78 74 20 73 74 61 74 65 6d 65 6e 74 20 73 65 74  xt statement set
a920: 73 20 76 61 72 69 61 62 6c 65 20 27 6d 61 78 27  s variable 'max'
a930: 20 74 6f 20 31 20 66 6f 72 20 74 68 65 20 6d 61   to 1 for the ma
a940: 78 28 29 0a 20 20 20 20 2a 2a 20 61 67 67 72 65  x().    ** aggre
a950: 67 61 74 65 2c 20 6f 72 20 30 20 66 6f 72 20 6d  gate, or 0 for m
a960: 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  in()..    */.   
a970: 20 6d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 75   max = sqlite3_u
a980: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
a990: 29 21 3d 30 3b 0a 20 20 20 20 63 6d 70 20 3d 20  )!=0;.    cmp = 
a9a0: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
a9b0: 65 28 70 42 65 73 74 2c 20 70 41 72 67 2c 20 70  e(pBest, pArg, p
a9c0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 28  Coll);.    if( (
a9d0: 6d 61 78 20 26 26 20 63 6d 70 3c 30 29 20 7c 7c  max && cmp<0) ||
a9e0: 20 28 21 6d 61 78 20 26 26 20 63 6d 70 3e 30 29   (!max && cmp>0)
a9f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
aa00: 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65  3VdbeMemCopy(pBe
aa10: 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d  st, pArg);.    }
aa20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
aa30: 74 65 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74  te3SkipAccumulat
aa40: 6f 72 4c 6f 61 64 28 63 6f 6e 74 65 78 74 29 3b  orLoad(context);
aa50: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
aa60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
aa70: 65 6d 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41  emCopy(pBest, pA
aa80: 72 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  rg);.  }.}.stati
aa90: 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78 46 69 6e  c void minMaxFin
aaa0: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
aab0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
aac0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
aad0: 20 2a 70 52 65 73 3b 0a 20 20 70 52 65 73 20 3d   *pRes;.  pRes =
aae0: 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20   (sqlite3_value 
aaf0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
ab00: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
ab10: 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ext, 0);.  if( p
ab20: 52 65 73 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Res ){.    if( p
ab30: 52 65 73 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20  Res->flags ){.  
ab40: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
ab50: 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74  lt_value(context
ab60: 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20  , pRes);.    }. 
ab70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
ab80: 6d 52 65 6c 65 61 73 65 28 70 52 65 73 29 3b 0a  mRelease(pRes);.
ab90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67 72 6f    }.}../*.** gro
aba0: 75 70 5f 63 6f 6e 63 61 74 28 45 58 50 52 2c 20  up_concat(EXPR, 
abb0: 3f 53 45 50 41 52 41 54 4f 52 3f 29 0a 2a 2f 0a  ?SEPARATOR?).*/.
abc0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 72 6f 75  static void grou
abd0: 70 43 6f 6e 63 61 74 53 74 65 70 28 0a 20 20 73  pConcatStep(.  s
abe0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
abf0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
ac00: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
ac10: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
ac20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
ac30: 6c 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70  l;.  StrAccum *p
ac40: 41 63 63 75 6d 3b 0a 20 20 63 6f 6e 73 74 20 63  Accum;.  const c
ac50: 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 69 6e 74  har *zSep;.  int
ac60: 20 6e 56 61 6c 2c 20 6e 53 65 70 3b 0a 20 20 61   nVal, nSep;.  a
ac70: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c  ssert( argc==1 |
ac80: 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69  | argc==2 );.  i
ac90: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
aca0: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
acb0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65  SQLITE_NULL ) re
acc0: 74 75 72 6e 3b 0a 20 20 70 41 63 63 75 6d 20 3d  turn;.  pAccum =
acd0: 20 28 53 74 72 41 63 63 75 6d 2a 29 73 71 6c 69   (StrAccum*)sqli
ace0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
acf0: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
ad00: 69 7a 65 6f 66 28 2a 70 41 63 63 75 6d 29 29 3b  izeof(*pAccum));
ad10: 0a 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20 29  ..  if( pAccum )
ad20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
ad30: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
ad40: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
ad50: 6e 74 65 78 74 29 3b 0a 20 20 20 20 69 6e 74 20  ntext);.    int 
ad60: 66 69 72 73 74 54 65 72 6d 20 3d 20 70 41 63 63  firstTerm = pAcc
ad70: 75 6d 2d 3e 75 73 65 4d 61 6c 6c 6f 63 3d 3d 30  um->useMalloc==0
ad80: 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e 75 73  ;.    pAccum->us
ad90: 65 4d 61 6c 6c 6f 63 20 3d 20 32 3b 0a 20 20 20  eMalloc = 2;.   
ada0: 20 70 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63   pAccum->mxAlloc
adb0: 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   = db->aLimit[SQ
adc0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
add0: 48 5d 3b 0a 20 20 20 20 69 66 28 20 21 66 69 72  H];.    if( !fir
ade0: 73 74 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  stTerm ){.      
adf0: 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20  if( argc==2 ){. 
ae00: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 28 63         zSep = (c
ae10: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
ae20: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
ae30: 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 70 20 3d  ;.        nSep =
ae40: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
ae50: 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ytes(argv[1]);. 
ae60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ae70: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a      zSep = ",";.
ae80: 20 20 20 20 20 20 20 20 6e 53 65 70 20 3d 20 31          nSep = 1
ae90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
aea0: 69 66 28 20 6e 53 65 70 20 29 20 73 71 6c 69 74  if( nSep ) sqlit
aeb0: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
aec0: 28 70 41 63 63 75 6d 2c 20 7a 53 65 70 2c 20 6e  (pAccum, zSep, n
aed0: 53 65 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sep);.    }.    
aee0: 7a 56 61 6c 20 3d 20 28 63 68 61 72 2a 29 73 71  zVal = (char*)sq
aef0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
af00: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e  (argv[0]);.    n
af10: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
af20: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
af30: 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 6c  ]);.    if( zVal
af40: 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
af50: 75 6d 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c  umAppend(pAccum,
af60: 20 7a 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20   zVal, nVal);.  
af70: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
af80: 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c  groupConcatFinal
af90: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
afa0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
afb0: 20 53 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75   StrAccum *pAccu
afc0: 6d 3b 0a 20 20 70 41 63 63 75 6d 20 3d 20 73 71  m;.  pAccum = sq
afd0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
afe0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
aff0: 20 30 29 3b 0a 20 20 69 66 28 20 70 41 63 63 75   0);.  if( pAccu
b000: 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 63  m ){.    if( pAc
b010: 63 75 6d 2d 3e 61 63 63 45 72 72 6f 72 3d 3d 53  cum->accError==S
b020: 54 52 41 43 43 55 4d 5f 54 4f 4f 42 49 47 20 29  TRACCUM_TOOBIG )
b030: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b040: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f  result_error_too
b050: 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  big(context);.  
b060: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 63 63    }else if( pAcc
b070: 75 6d 2d 3e 61 63 63 45 72 72 6f 72 3d 3d 53 54  um->accError==ST
b080: 52 41 43 43 55 4d 5f 4e 4f 4d 45 4d 20 29 7b 0a  RACCUM_NOMEM ){.
b090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
b0a0: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
b0b0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  (context);.    }
b0c0: 65 6c 73 65 7b 20 20 20 20 0a 20 20 20 20 20 20  else{    .      
b0d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
b0e0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  ext(context, sql
b0f0: 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
b100: 73 68 28 70 41 63 63 75 6d 29 2c 20 2d 31 2c 20  sh(pAccum), -1, 
b110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b120: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b130: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a  e3_free);.    }.
b140: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
b150: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 70  s routine does p
b160: 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 75  er-connection fu
b170: 6e 63 74 69 6f 6e 20 72 65 67 69 73 74 72 61 74  nction registrat
b180: 69 6f 6e 2e 20 20 4d 6f 73 74 0a 2a 2a 20 6f 66  ion.  Most.** of
b190: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 75   the built-in fu
b1a0: 6e 63 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72  nctions above ar
b1b0: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 67 6c  e part of the gl
b1c0: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 65  obal function se
b1d0: 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  t..** This routi
b1e0: 6e 65 20 6f 6e 6c 79 20 64 65 61 6c 73 20 77 69  ne only deals wi
b1f0: 74 68 20 74 68 6f 73 65 20 74 68 61 74 20 61 72  th those that ar
b200: 65 20 6e 6f 74 20 67 6c 6f 62 61 6c 2e 0a 2a 2f  e not global..*/
b210: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67  .void sqlite3Reg
b220: 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63  isterBuiltinFunc
b230: 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64  tions(sqlite3 *d
b240: 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  b){.  int rc = s
b250: 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
b260: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 4d 41  function(db, "MA
b270: 54 43 48 22 2c 20 32 29 3b 0a 20 20 61 73 73 65  TCH", 2);.  asse
b280: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
b290: 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  OMEM || rc==SQLI
b2a0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72  TE_OK );.  if( r
b2b0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
b2c0: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  ){.    db->mallo
b2d0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
b2e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
b2f0: 65 20 4c 49 4b 45 4f 50 54 20 66 6c 61 67 20 6f  e LIKEOPT flag o
b300: 6e 20 74 68 65 20 32 2d 61 72 67 75 6d 65 6e 74  n the 2-argument
b310: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
b320: 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 0a 2a  he given name..*
b330: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
b340: 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 73 71 6c  tLikeOptFlag(sql
b350: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
b360: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 75 38 20  char *zName, u8 
b370: 66 6c 61 67 56 61 6c 29 7b 0a 20 20 46 75 6e 63  flagVal){.  Func
b380: 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 70 44 65  Def *pDef;.  pDe
b390: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
b3a0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  unction(db, zNam
b3b0: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
b3c0: 33 30 28 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  30(zName),.     
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3e0: 20 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54          2, SQLIT
b3f0: 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69 66  E_UTF8, 0);.  if
b400: 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 29  ( ALWAYS(pDef) )
b410: 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63  {.    pDef->func
b420: 46 6c 61 67 73 20 7c 3d 20 66 6c 61 67 56 61 6c  Flags |= flagVal
b430: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
b440: 65 67 69 73 74 65 72 20 74 68 65 20 62 75 69 6c  egister the buil
b450: 74 2d 69 6e 20 4c 49 4b 45 20 61 6e 64 20 47 4c  t-in LIKE and GL
b460: 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  OB functions.  T
b470: 68 65 20 63 61 73 65 53 65 6e 73 69 74 69 76 65  he caseSensitive
b480: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 64 65  .** parameter de
b490: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
b4a0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 4c 49 4b 45   or not the LIKE
b4b0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63 61 73   operator is cas
b4c0: 65 0a 2a 2a 20 73 65 6e 73 69 74 69 76 65 2e 20  e.** sensitive. 
b4d0: 20 47 4c 4f 42 20 69 73 20 61 6c 77 61 79 73 20   GLOB is always 
b4e0: 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 2e 0a  case sensitive..
b4f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
b500: 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74  egisterLikeFunct
b510: 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ions(sqlite3 *db
b520: 2c 20 69 6e 74 20 63 61 73 65 53 65 6e 73 69 74  , int caseSensit
b530: 69 76 65 29 7b 0a 20 20 73 74 72 75 63 74 20 63  ive){.  struct c
b540: 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66  ompareInfo *pInf
b550: 6f 3b 0a 20 20 69 66 28 20 63 61 73 65 53 65 6e  o;.  if( caseSen
b560: 73 69 74 69 76 65 20 29 7b 0a 20 20 20 20 70 49  sitive ){.    pI
b570: 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f  nfo = (struct co
b580: 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65  mpareInfo*)&like
b590: 49 6e 66 6f 41 6c 74 3b 0a 20 20 7d 65 6c 73 65  InfoAlt;.  }else
b5a0: 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73  {.    pInfo = (s
b5b0: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
b5c0: 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d  o*)&likeInfoNorm
b5d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  ;.  }.  sqlite3C
b5e0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22 6c  reateFunc(db, "l
b5f0: 69 6b 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ike", 2, SQLITE_
b600: 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b  UTF8, pInfo, lik
b610: 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b  eFunc, 0, 0, 0);
b620: 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  .  sqlite3Create
b630: 46 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c  Func(db, "like",
b640: 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   3, SQLITE_UTF8,
b650: 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63   pInfo, likeFunc
b660: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , 0, 0, 0);.  sq
b670: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
b680: 64 62 2c 20 22 67 6c 6f 62 22 2c 20 32 2c 20 53  db, "glob", 2, S
b690: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
b6a0: 20 20 20 28 73 74 72 75 63 74 20 63 6f 6d 70 61     (struct compa
b6b0: 72 65 49 6e 66 6f 2a 29 26 67 6c 6f 62 49 6e 66  reInfo*)&globInf
b6c0: 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20  o, likeFunc, 0, 
b6d0: 30 2c 20 30 29 3b 0a 20 20 73 65 74 4c 69 6b 65  0, 0);.  setLike
b6e0: 4f 70 74 46 6c 61 67 28 64 62 2c 20 22 67 6c 6f  OptFlag(db, "glo
b6f0: 62 22 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  b", SQLITE_FUNC_
b700: 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55  LIKE | SQLITE_FU
b710: 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73 65 74 4c  NC_CASE);.  setL
b720: 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22  ikeOptFlag(db, "
b730: 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20 20 63 61  like", .      ca
b740: 73 65 53 65 6e 73 69 74 69 76 65 20 3f 20 28 53  seSensitive ? (S
b750: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 20  QLITE_FUNC_LIKE 
b760: 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  | SQLITE_FUNC_CA
b770: 53 45 29 20 3a 20 53 51 4c 49 54 45 5f 46 55 4e  SE) : SQLITE_FUN
b780: 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  C_LIKE);.}../*.*
b790: 2a 20 70 45 78 70 72 20 70 6f 69 6e 74 73 20 74  * pExpr points t
b7a0: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
b7b0: 77 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e 74 73  which implements
b7c0: 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66   a function.  If
b7d0: 0a 2a 2a 20 69 74 20 69 73 20 61 70 70 72 6f 70  .** it is approp
b7e0: 72 69 61 74 65 20 74 6f 20 61 70 70 6c 79 20 74  riate to apply t
b7f0: 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61  he LIKE optimiza
b800: 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 66 75 6e  tion to that fun
b810: 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 73 65  ction.** then se
b820: 74 20 61 57 63 5b 30 5d 20 74 68 72 6f 75 67 68  t aWc[0] through
b830: 20 61 57 63 5b 32 5d 20 74 6f 20 74 68 65 20 77   aWc[2] to the w
b840: 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65  ildcard characte
b850: 72 73 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  rs and.** return
b860: 20 54 52 55 45 2e 20 20 49 66 20 74 68 65 20 66   TRUE.  If the f
b870: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  unction is not a
b880: 20 4c 49 4b 45 2d 73 74 79 6c 65 20 66 75 6e 63   LIKE-style func
b890: 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20 72 65 74  tion then.** ret
b8a0: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e  urn FALSE..*/.in
b8b0: 74 20 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46  t sqlite3IsLikeF
b8c0: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
b8d0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 45 78 70 72  *db, Expr *pExpr
b8e0: 2c 20 69 6e 74 20 2a 70 49 73 4e 6f 63 61 73 65  , int *pIsNocase
b8f0: 2c 20 63 68 61 72 20 2a 61 57 63 29 7b 0a 20 20  , char *aWc){.  
b900: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
b910: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
b920: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 0a 20 20 20  TK_FUNCTION .   
b930: 7c 7c 20 21 70 45 78 70 72 2d 3e 78 2e 70 4c 69  || !pExpr->x.pLi
b940: 73 74 20 0a 20 20 20 7c 7c 20 70 45 78 70 72 2d  st .   || pExpr-
b950: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
b960: 3d 32 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =2.  ){.    retu
b970: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 0;.  }.  asse
b980: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
b990: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
b9a0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70  IsSelect) );.  p
b9b0: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
b9c0: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45  dFunction(db, pE
b9d0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a  xpr->u.zToken, .
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
ba00: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78  ite3Strlen30(pEx
ba10: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20  pr->u.zToken),. 
ba20: 20 20 20 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 32 2c 20 53              2, S
ba40: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a  QLITE_UTF8, 0);.
ba50: 20 20 69 66 28 20 4e 45 56 45 52 28 70 44 65 66    if( NEVER(pDef
ba60: 3d 3d 30 29 20 7c 7c 20 28 70 44 65 66 2d 3e 66  ==0) || (pDef->f
ba70: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
ba80: 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3d 3d 30 20  E_FUNC_LIKE)==0 
ba90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
baa0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  .  }..  /* The m
bab0: 65 6d 63 70 79 28 29 20 73 74 61 74 65 6d 65 6e  emcpy() statemen
bac0: 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  t assumes that t
bad0: 68 65 20 77 69 6c 64 63 61 72 64 20 63 68 61 72  he wildcard char
bae0: 61 63 74 65 72 73 20 61 72 65 0a 20 20 2a 2a 20  acters are.  ** 
baf0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
bb00: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
bb10: 65 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 73 74  e compareInfo st
bb20: 72 75 63 74 75 72 65 2e 20 20 54 68 65 0a 20 20  ructure.  The.  
bb30: 2a 2a 20 61 73 73 65 72 74 73 28 29 20 74 68 61  ** asserts() tha
bb40: 74 20 66 6f 6c 6c 6f 77 20 76 65 72 69 66 79 20  t follow verify 
bb50: 74 68 61 74 20 61 73 73 75 6d 70 74 69 6f 6e 0a  that assumption.
bb60: 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 61 57    */.  memcpy(aW
bb70: 63 2c 20 70 44 65 66 2d 3e 70 55 73 65 72 44 61  c, pDef->pUserDa
bb80: 74 61 2c 20 33 29 3b 0a 20 20 61 73 73 65 72 74  ta, 3);.  assert
bb90: 28 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  ( (char*)&likeIn
bba0: 66 6f 41 6c 74 20 3d 3d 20 28 63 68 61 72 2a 29  foAlt == (char*)
bbb0: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74  &likeInfoAlt.mat
bbc0: 63 68 41 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  chAll );.  asser
bbd0: 74 28 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b  t( &((char*)&lik
bbe0: 65 49 6e 66 6f 41 6c 74 29 5b 31 5d 20 3d 3d 20  eInfoAlt)[1] == 
bbf0: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
bc00: 41 6c 74 2e 6d 61 74 63 68 4f 6e 65 20 29 3b 0a  Alt.matchOne );.
bc10: 20 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61    assert( &((cha
bc20: 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29  r*)&likeInfoAlt)
bc30: 5b 32 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c  [2] == (char*)&l
bc40: 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68  ikeInfoAlt.match
bc50: 53 65 74 20 29 3b 0a 20 20 2a 70 49 73 4e 6f 63  Set );.  *pIsNoc
bc60: 61 73 65 20 3d 20 28 70 44 65 66 2d 3e 66 75 6e  ase = (pDef->fun
bc70: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
bc80: 46 55 4e 43 5f 43 41 53 45 29 3d 3d 30 3b 0a 20  FUNC_CASE)==0;. 
bc90: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
bca0: 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 46  .** All of the F
bcb0: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
bcc0: 73 20 69 6e 20 74 68 65 20 61 42 75 69 6c 74 69  s in the aBuilti
bcd0: 6e 46 75 6e 63 5b 5d 20 61 72 72 61 79 20 61 62  nFunc[] array ab
bce0: 6f 76 65 0a 2a 2a 20 74 6f 20 74 68 65 20 67 6c  ove.** to the gl
bcf0: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 68 61  obal function ha
bd00: 73 68 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  sh table.  This 
bd10: 6f 63 63 75 72 73 20 61 74 20 73 74 61 72 74 2d  occurs at start-
bd20: 74 69 6d 65 20 28 61 73 0a 2a 2a 20 61 20 63 6f  time (as.** a co
bd30: 6e 73 65 71 75 65 6e 63 65 20 6f 66 20 63 61 6c  nsequence of cal
bd40: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6e 69  ling sqlite3_ini
bd50: 74 69 61 6c 69 7a 65 28 29 29 2e 0a 2a 2a 0a 2a  tialize())..**.*
bd60: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
bd70: 74 69 6e 65 20 72 75 6e 73 0a 2a 2f 0a 76 6f 69  tine runs.*/.voi
bd80: 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  d sqlite3Registe
bd90: 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  rGlobalFunctions
bda0: 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 0a 20 20 2a  (void){.  /*.  *
bdb0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
bdc0: 61 72 72 61 79 20 68 6f 6c 64 73 20 46 75 6e 63  array holds Func
bdd0: 44 65 66 20 73 74 72 75 63 74 75 72 65 73 20 66  Def structures f
bde0: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 75  or all of the fu
bdf0: 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 64 65 66  nctions.  ** def
be00: 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c  ined in this fil
be10: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
be20: 20 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62 65   array cannot be
be30: 20 63 6f 6e 73 74 61 6e 74 20 73 69 6e 63 65 20   constant since 
be40: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
be50: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 75 6e   to the.  ** Fun
be60: 63 44 65 66 2e 70 48 61 73 68 20 65 6c 65 6d 65  cDef.pHash eleme
be70: 6e 74 73 20 61 74 20 73 74 61 72 74 2d 74 69 6d  nts at start-tim
be80: 65 2e 20 20 54 68 65 20 65 6c 65 6d 65 6e 74 73  e.  The elements
be90: 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 0a 20   of this array. 
bea0: 20 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c   ** are read-onl
beb0: 79 20 61 66 74 65 72 20 69 6e 69 74 69 61 6c 69  y after initiali
bec0: 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  zation is comple
bed0: 74 65 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69  te..  */.  stati
bee0: 63 20 53 51 4c 49 54 45 5f 57 53 44 20 46 75 6e  c SQLITE_WSD Fun
bef0: 63 44 65 66 20 61 42 75 69 6c 74 69 6e 46 75 6e  cDef aBuiltinFun
bf00: 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 46 55 4e 43  c[] = {.    FUNC
bf10: 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20 20  TION(ltrim,     
bf20: 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20 30           1, 1, 0
bf30: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
bf40: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
bf50: 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20 20 20 20  ON(ltrim,       
bf60: 20 20 20 20 20 20 20 32 2c 20 31 2c 20 30 2c 20         2, 1, 0, 
bf70: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
bf80: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
bf90: 28 72 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20  (rtrim,         
bfa0: 20 20 20 20 20 31 2c 20 32 2c 20 30 2c 20 74 72       1, 2, 0, tr
bfb0: 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29  imFunc         )
bfc0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72  ,.    FUNCTION(r
bfd0: 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20  trim,           
bfe0: 20 20 20 32 2c 20 32 2c 20 30 2c 20 74 72 69 6d     2, 2, 0, trim
bff0: 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a  Func         ),.
c000: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 72 69      FUNCTION(tri
c010: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
c020: 20 31 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46 75   1, 3, 0, trimFu
c030: 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  nc         ),.  
c040: 20 20 46 55 4e 43 54 49 4f 4e 28 74 72 69 6d 2c    FUNCTION(trim,
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
c060: 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 3, 0, trimFunc
c070: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
c080: 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20 20  FUNCTION(min,   
c090: 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
c0a0: 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63  0, 1, minmaxFunc
c0b0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
c0c0: 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20 20 20 20  NCTION(min,     
c0d0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
c0e0: 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20 20   1, 0           
c0f0: 20 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52       ),.    AGGR
c100: 45 47 41 54 45 28 6d 69 6e 2c 20 20 20 20 20 20  EGATE(min,      
c110: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 31           1, 0, 1
c120: 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20 20  , minmaxStep,   
c130: 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a     minMaxFinaliz
c140: 65 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f  e ),.    FUNCTIO
c150: 4e 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20 20  N(max,          
c160: 20 20 20 20 20 2d 31 2c 20 31 2c 20 31 2c 20 6d       -1, 1, 1, m
c170: 69 6e 6d 61 78 46 75 6e 63 20 20 20 20 20 20 20  inmaxFunc       
c180: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
c190: 6d 61 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  max,            
c1a0: 20 20 20 20 30 2c 20 31 2c 20 31 2c 20 30 20 20      0, 1, 1, 0  
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 2c                ),
c1c0: 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28 6d  .    AGGREGATE(m
c1d0: 61 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ax,             
c1e0: 20 20 31 2c 20 31 2c 20 31 2c 20 6d 69 6e 6d 61    1, 1, 1, minma
c1f0: 78 53 74 65 70 2c 20 20 20 20 20 20 6d 69 6e 4d  xStep,      minM
c200: 61 78 46 69 6e 61 6c 69 7a 65 20 29 2c 0a 20 20  axFinalize ),.  
c210: 20 20 46 55 4e 43 54 49 4f 4e 32 28 74 79 70 65    FUNCTION2(type
c220: 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  of,            1
c230: 2c 20 30 2c 20 30 2c 20 74 79 70 65 6f 66 46 75  , 0, 0, typeofFu
c240: 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43  nc,  SQLITE_FUNC
c250: 5f 54 59 50 45 4f 46 29 2c 0a 20 20 20 20 46 55  _TYPEOF),.    FU
c260: 4e 43 54 49 4f 4e 32 28 6c 65 6e 67 74 68 2c 20  NCTION2(length, 
c270: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
c280: 20 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63 2c 20   0, lengthFunc, 
c290: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e   SQLITE_FUNC_LEN
c2a0: 47 54 48 29 2c 0a 20 20 20 20 46 55 4e 43 54 49  GTH),.    FUNCTI
c2b0: 4f 4e 28 69 6e 73 74 72 2c 20 20 20 20 20 20 20  ON(instr,       
c2c0: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20         2, 0, 0, 
c2d0: 69 6e 73 74 72 46 75 6e 63 20 20 20 20 20 20 20  instrFunc       
c2e0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
c2f0: 28 73 75 62 73 74 72 2c 20 20 20 20 20 20 20 20  (substr,        
c300: 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 73 75       2, 0, 0, su
c310: 62 73 74 72 46 75 6e 63 20 20 20 20 20 20 20 29  bstrFunc       )
c320: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73  ,.    FUNCTION(s
c330: 75 62 73 74 72 2c 20 20 20 20 20 20 20 20 20 20  ubstr,          
c340: 20 20 20 33 2c 20 30 2c 20 30 2c 20 73 75 62 73     3, 0, 0, subs
c350: 74 72 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  trFunc       ),.
c360: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 70 72 69      FUNCTION(pri
c370: 6e 74 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  ntf,            
c380: 2d 31 2c 20 30 2c 20 30 2c 20 70 72 69 6e 74 66  -1, 0, 0, printf
c390: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20  Func       ),.  
c3a0: 20 20 46 55 4e 43 54 49 4f 4e 28 75 6e 69 63 6f    FUNCTION(unico
c3b0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  de,            1
c3c0: 2c 20 30 2c 20 30 2c 20 75 6e 69 63 6f 64 65 46  , 0, 0, unicodeF
c3d0: 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20  unc      ),.    
c3e0: 46 55 4e 43 54 49 4f 4e 28 63 68 61 72 2c 20 20  FUNCTION(char,  
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
c400: 30 2c 20 30 2c 20 63 68 61 72 46 75 6e 63 20 20  0, 0, charFunc  
c410: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
c420: 4e 43 54 49 4f 4e 28 61 62 73 2c 20 20 20 20 20  NCTION(abs,     
c430: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
c440: 20 30 2c 20 61 62 73 46 75 6e 63 20 20 20 20 20   0, absFunc     
c450: 20 20 20 20 20 29 2c 0a 23 69 66 6e 64 65 66 20       ),.#ifndef 
c460: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
c470: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 46  TING_POINT.    F
c480: 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20  UNCTION(round,  
c490: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
c4a0: 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20  , 0, roundFunc  
c4b0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
c4c0: 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20 20 20  CTION(round,    
c4d0: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
c4e0: 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 20 20  0, roundFunc    
c4f0: 20 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20      ),.#endif.  
c500: 20 20 46 55 4e 43 54 49 4f 4e 28 75 70 70 65 72    FUNCTION(upper
c510: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
c520: 2c 20 30 2c 20 30 2c 20 75 70 70 65 72 46 75 6e  , 0, 0, upperFun
c530: 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  c        ),.    
c540: 46 55 4e 43 54 49 4f 4e 28 6c 6f 77 65 72 2c 20  FUNCTION(lower, 
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
c560: 30 2c 20 30 2c 20 6c 6f 77 65 72 46 75 6e 63 20  0, 0, lowerFunc 
c570: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
c580: 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c  NCTION(coalesce,
c590: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
c5a0: 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20   0, 0           
c5b0: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
c5c0: 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20  TION(coalesce,  
c5d0: 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30           0, 0, 0
c5e0: 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  , 0             
c5f0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
c600: 4f 4e 32 28 63 6f 61 6c 65 73 63 65 2c 20 20 20  ON2(coalesce,   
c610: 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20        -1, 0, 0, 
c620: 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54  noopFunc,  SQLIT
c630: 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 29  E_FUNC_COALESCE)
c640: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 68  ,.    FUNCTION(h
c650: 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ex,             
c660: 20 20 20 31 2c 20 30 2c 20 30 2c 20 68 65 78 46     1, 0, 0, hexF
c670: 75 6e 63 20 20 20 20 20 20 20 20 20 20 29 2c 0a  unc          ),.
c680: 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28 69 66      FUNCTION2(if
c690: 6e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  null,           
c6a0: 20 32 2c 20 30 2c 20 30 2c 20 6e 6f 6f 70 46 75   2, 0, 0, noopFu
c6b0: 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43  nc,  SQLITE_FUNC
c6c0: 5f 43 4f 41 4c 45 53 43 45 29 2c 0a 20 20 20 20  _COALESCE),.    
c6d0: 46 55 4e 43 54 49 4f 4e 32 28 75 6e 6c 69 6b 65  FUNCTION2(unlike
c6e0: 6c 79 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20  ly,          1, 
c6f0: 30 2c 20 30 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20  0, 0, noopFunc, 
c700: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c   SQLITE_FUNC_UNL
c710: 49 4b 45 4c 59 29 2c 0a 20 20 20 20 46 55 4e 43  IKELY),.    FUNC
c720: 54 49 4f 4e 32 28 6c 69 6b 65 6c 69 68 6f 6f 64  TION2(likelihood
c730: 2c 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30  ,        2, 0, 0
c740: 2c 20 6e 6f 6f 70 46 75 6e 63 2c 20 20 53 51 4c  , noopFunc,  SQL
c750: 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
c760: 59 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e  Y),.    FUNCTION
c770: 32 28 6c 69 6b 65 6c 79 2c 20 20 20 20 20 20 20  2(likely,       
c780: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6e 6f       1, 0, 0, no
c790: 6f 70 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f  opFunc,  SQLITE_
c7a0: 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 29 2c 0a  FUNC_UNLIKELY),.
c7b0: 20 20 20 20 56 46 55 4e 43 54 49 4f 4e 28 72 61      VFUNCTION(ra
c7c0: 6e 64 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  ndom,           
c7d0: 20 30 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d   0, 0, 0, random
c7e0: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20  Func       ),.  
c7f0: 20 20 56 46 55 4e 43 54 49 4f 4e 28 72 61 6e 64    VFUNCTION(rand
c800: 6f 6d 62 6c 6f 62 2c 20 20 20 20 20 20 20 20 31  omblob,        1
c810: 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d 42 6c  , 0, 0, randomBl
c820: 6f 62 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  ob       ),.    
c830: 46 55 4e 43 54 49 4f 4e 28 6e 75 6c 6c 69 66 2c  FUNCTION(nullif,
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
c850: 30 2c 20 31 2c 20 6e 75 6c 6c 69 66 46 75 6e 63  0, 1, nullifFunc
c860: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
c870: 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 76 65  NCTION(sqlite_ve
c880: 72 73 69 6f 6e 2c 20 20 20 20 20 30 2c 20 30 2c  rsion,     0, 0,
c890: 20 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63 20   0, versionFunc 
c8a0: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
c8b0: 54 49 4f 4e 28 73 71 6c 69 74 65 5f 73 6f 75 72  TION(sqlite_sour
c8c0: 63 65 5f 69 64 2c 20 20 20 30 2c 20 30 2c 20 30  ce_id,   0, 0, 0
c8d0: 2c 20 73 6f 75 72 63 65 69 64 46 75 6e 63 20 20  , sourceidFunc  
c8e0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
c8f0: 4f 4e 28 73 71 6c 69 74 65 5f 6c 6f 67 2c 20 20  ON(sqlite_log,  
c900: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20         2, 0, 0, 
c910: 65 72 72 6c 6f 67 46 75 6e 63 20 20 20 20 20 20  errlogFunc      
c920: 20 29 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f 55   ),.#if SQLITE_U
c930: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
c940: 4f 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ON.    FUNCTION(
c950: 73 71 6c 69 74 65 5f 63 72 79 70 74 2c 20 20 20  sqlite_crypt,   
c960: 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 73 71 6c      2, 0, 0, sql
c970: 69 74 65 33 43 72 79 70 74 46 75 6e 63 20 29 2c  ite3CryptFunc ),
c980: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
c990: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
c9a0: 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a  ILEOPTION_DIAGS.
c9b0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c      FUNCTION(sql
c9c0: 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  ite_compileoptio
c9d0: 6e 5f 75 73 65 64 2c 31 2c 20 30 2c 20 30 2c 20  n_used,1, 0, 0, 
c9e0: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 75 73 65  compileoptionuse
c9f0: 64 46 75 6e 63 20 20 29 2c 0a 20 20 20 20 46 55  dFunc  ),.    FU
ca00: 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63 6f  NCTION(sqlite_co
ca10: 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 2c  mpileoption_get,
ca20: 20 31 2c 20 30 2c 20 30 2c 20 63 6f 6d 70 69 6c   1, 0, 0, compil
ca30: 65 6f 70 74 69 6f 6e 67 65 74 46 75 6e 63 20 20  eoptiongetFunc  
ca40: 29 2c 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ),.#endif /* SQL
ca50: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45  ITE_OMIT_COMPILE
ca60: 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a  OPTION_DIAGS */.
ca70: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 71 75 6f      FUNCTION(quo
ca80: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
ca90: 20 31 2c 20 30 2c 20 30 2c 20 71 75 6f 74 65 46   1, 0, 0, quoteF
caa0: 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20  unc        ),.  
cab0: 20 20 56 46 55 4e 43 54 49 4f 4e 28 6c 61 73 74    VFUNCTION(last
cac0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 2c 20 30  _insert_rowid, 0
cad0: 2c 20 30 2c 20 30 2c 20 6c 61 73 74 5f 69 6e 73  , 0, 0, last_ins
cae0: 65 72 74 5f 72 6f 77 69 64 29 2c 0a 20 20 20 20  ert_rowid),.    
caf0: 56 46 55 4e 43 54 49 4f 4e 28 63 68 61 6e 67 65  VFUNCTION(change
cb00: 73 2c 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  s,           0, 
cb10: 30 2c 20 30 2c 20 63 68 61 6e 67 65 73 20 20 20  0, 0, changes   
cb20: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 56 46         ),.    VF
cb30: 55 4e 43 54 49 4f 4e 28 74 6f 74 61 6c 5f 63 68  UNCTION(total_ch
cb40: 61 6e 67 65 73 2c 20 20 20 20 20 30 2c 20 30 2c  anges,     0, 0,
cb50: 20 30 2c 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65   0, total_change
cb60: 73 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43  s    ),.    FUNC
cb70: 54 49 4f 4e 28 72 65 70 6c 61 63 65 2c 20 20 20  TION(replace,   
cb80: 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c 20 30           3, 0, 0
cb90: 2c 20 72 65 70 6c 61 63 65 46 75 6e 63 20 20 20  , replaceFunc   
cba0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
cbb0: 4f 4e 28 7a 65 72 6f 62 6c 6f 62 2c 20 20 20 20  ON(zeroblob,    
cbc0: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
cbd0: 7a 65 72 6f 62 6c 6f 62 46 75 6e 63 20 20 20 20  zeroblobFunc    
cbe0: 20 29 2c 0a 20 20 23 69 66 64 65 66 20 53 51 4c   ),.  #ifdef SQL
cbf0: 49 54 45 5f 53 4f 55 4e 44 45 58 0a 20 20 20 20  ITE_SOUNDEX.    
cc00: 46 55 4e 43 54 49 4f 4e 28 73 6f 75 6e 64 65 78  FUNCTION(soundex
cc10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ,            1, 
cc20: 30 2c 20 30 2c 20 73 6f 75 6e 64 65 78 46 75 6e  0, 0, soundexFun
cc30: 63 20 20 20 20 20 20 29 2c 0a 20 20 23 65 6e 64  c      ),.  #end
cc40: 69 66 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c  if.  #ifndef SQL
cc50: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
cc60: 54 45 4e 53 49 4f 4e 0a 20 20 20 20 46 55 4e 43  TENSION.    FUNC
cc70: 54 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65 6e 73  TION(load_extens
cc80: 69 6f 6e 2c 20 20 20 20 20 31 2c 20 30 2c 20 30  ion,     1, 0, 0
cc90: 2c 20 6c 6f 61 64 45 78 74 20 20 20 20 20 20 20  , loadExt       
cca0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
ccb0: 4f 4e 28 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  ON(load_extensio
ccc0: 6e 2c 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20  n,     2, 0, 0, 
ccd0: 6c 6f 61 64 45 78 74 20 20 20 20 20 20 20 20 20  loadExt         
cce0: 20 29 2c 0a 20 20 23 65 6e 64 69 66 0a 20 20 20   ),.  #endif.   
ccf0: 20 41 47 47 52 45 47 41 54 45 28 73 75 6d 2c 20   AGGREGATE(sum, 
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
cd10: 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20   0, 0, sumStep, 
cd20: 20 20 20 20 20 20 20 20 73 75 6d 46 69 6e 61 6c          sumFinal
cd30: 69 7a 65 20 20 20 20 29 2c 0a 20 20 20 20 41 47  ize    ),.    AG
cd40: 47 52 45 47 41 54 45 28 74 6f 74 61 6c 2c 20 20  GREGATE(total,  
cd50: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
cd60: 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20   0, sumStep,    
cd70: 20 20 20 20 20 74 6f 74 61 6c 46 69 6e 61 6c 69       totalFinali
cd80: 7a 65 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47  ze    ),.    AGG
cd90: 52 45 47 41 54 45 28 61 76 67 2c 20 20 20 20 20  REGATE(avg,     
cda0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
cdb0: 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20  0, sumStep,     
cdc0: 20 20 20 20 61 76 67 46 69 6e 61 6c 69 7a 65 20      avgFinalize 
cdd0: 20 20 20 29 2c 0a 20 2f 2a 20 41 47 47 52 45 47     ),. /* AGGREG
cde0: 41 54 45 28 63 6f 75 6e 74 2c 20 20 20 20 20 20  ATE(count,      
cdf0: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
ce00: 63 6f 75 6e 74 53 74 65 70 2c 20 20 20 20 20 20  countStep,      
ce10: 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20 20   countFinalize  
ce20: 29 2c 20 2a 2f 0a 20 20 20 20 7b 30 2c 53 51 4c  ), */.    {0,SQL
ce30: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
ce40: 46 55 4e 43 5f 43 4f 55 4e 54 2c 30 2c 30 2c 30  FUNC_COUNT,0,0,0
ce50: 2c 63 6f 75 6e 74 53 74 65 70 2c 63 6f 75 6e 74  ,countStep,count
ce60: 46 69 6e 61 6c 69 7a 65 2c 22 63 6f 75 6e 74 22  Finalize,"count"
ce70: 2c 30 2c 30 7d 2c 0a 20 20 20 20 41 47 47 52 45  ,0,0},.    AGGRE
ce80: 47 41 54 45 28 63 6f 75 6e 74 2c 20 20 20 20 20  GATE(count,     
ce90: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
cea0: 20 63 6f 75 6e 74 53 74 65 70 2c 20 20 20 20 20   countStep,     
ceb0: 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20    countFinalize 
cec0: 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54   ),.    AGGREGAT
ced0: 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 2c 20  E(group_concat, 
cee0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 67 72       1, 0, 0, gr
cef0: 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 2c 20 67  oupConcatStep, g
cf00: 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69  roupConcatFinali
cf10: 7a 65 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41  ze),.    AGGREGA
cf20: 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 2c  TE(group_concat,
cf30: 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 67        2, 0, 0, g
cf40: 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 2c 20  roupConcatStep, 
cf50: 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c  groupConcatFinal
cf60: 69 7a 65 29 2c 0a 20 20 0a 20 20 20 20 4c 49 4b  ize),.  .    LIK
cf70: 45 46 55 4e 43 28 67 6c 6f 62 2c 20 32 2c 20 26  EFUNC(glob, 2, &
cf80: 67 6c 6f 62 49 6e 66 6f 2c 20 53 51 4c 49 54 45  globInfo, SQLITE
cf90: 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54  _FUNC_LIKE|SQLIT
cfa0: 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20  E_FUNC_CASE),.  
cfb0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 41  #ifdef SQLITE_CA
cfc0: 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b  SE_SENSITIVE_LIK
cfd0: 45 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c  E.    LIKEFUNC(l
cfe0: 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e 66  ike, 2, &likeInf
cff0: 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46 55 4e  oAlt, SQLITE_FUN
d000: 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55  C_LIKE|SQLITE_FU
d010: 4e 43 5f 43 41 53 45 29 2c 0a 20 20 20 20 4c 49  NC_CASE),.    LI
d020: 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c 20  KEFUNC(like, 3, 
d030: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20 53 51  &likeInfoAlt, SQ
d040: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53  LITE_FUNC_LIKE|S
d050: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29  QLITE_FUNC_CASE)
d060: 2c 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 4c 49  ,.  #else.    LI
d070: 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c 20  KEFUNC(like, 2, 
d080: 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53  &likeInfoNorm, S
d090: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29  QLITE_FUNC_LIKE)
d0a0: 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c  ,.    LIKEFUNC(l
d0b0: 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49 6e 66  ike, 3, &likeInf
d0c0: 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55  oNorm, SQLITE_FU
d0d0: 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20 23 65 6e 64  NC_LIKE),.  #end
d0e0: 69 66 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 69  if.  };..  int i
d0f0: 3b 0a 20 20 46 75 6e 63 44 65 66 48 61 73 68 20  ;.  FuncDefHash 
d100: 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c  *pHash = &GLOBAL
d110: 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71  (FuncDefHash, sq
d120: 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74  lite3GlobalFunct
d130: 69 6f 6e 73 29 3b 0a 20 20 46 75 6e 63 44 65 66  ions);.  FuncDef
d140: 20 2a 61 46 75 6e 63 20 3d 20 28 46 75 6e 63 44   *aFunc = (FuncD
d150: 65 66 2a 29 26 47 4c 4f 42 41 4c 28 46 75 6e 63  ef*)&GLOBAL(Func
d160: 44 65 66 2c 20 61 42 75 69 6c 74 69 6e 46 75 6e  Def, aBuiltinFun
d170: 63 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  c);..  for(i=0; 
d180: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 42 75 69  i<ArraySize(aBui
d190: 6c 74 69 6e 46 75 6e 63 29 3b 20 69 2b 2b 29 7b  ltinFunc); i++){
d1a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 75 6e 63  .    sqlite3Func
d1b0: 44 65 66 49 6e 73 65 72 74 28 70 48 61 73 68 2c  DefInsert(pHash,
d1c0: 20 26 61 46 75 6e 63 5b 69 5d 29 3b 0a 20 20 7d   &aFunc[i]);.  }
d1d0: 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  .  sqlite3Regist
d1e0: 65 72 44 61 74 65 54 69 6d 65 46 75 6e 63 74 69  erDateTimeFuncti
d1f0: 6f 6e 73 28 29 3b 0a 23 69 66 6e 64 65 66 20 53  ons();.#ifndef S
d200: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
d210: 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 41  TABLE.  sqlite3A
d220: 6c 74 65 72 46 75 6e 63 74 69 6f 6e 73 28 29 3b  lterFunctions();
d230: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
d240: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
d250: 45 5f 53 54 41 54 33 29 20 7c 7c 20 64 65 66 69  E_STAT3) || defi
d260: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
d270: 45 5f 53 54 41 54 34 29 0a 20 20 73 71 6c 69 74  E_STAT4).  sqlit
d280: 65 33 41 6e 61 6c 79 7a 65 46 75 6e 63 74 69 6f  e3AnalyzeFunctio
d290: 6e 73 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a     ns();.#endif.}.