/ Hex Artifact Content
Login

Artifact bf54e1202cbfb28bf4b1fd9b58899009ae76716f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 32 20 46 65 62 72 75  /*.** 2002 Febru
0010: 61 72 79 20 32 33 0a 2a 2a 0a 2a 2a 20 54 68 65  ary 23.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
0190: 43 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  C functions that
01a0: 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
01b0: 75 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74 69  us SQL.** functi
01c0: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 20 20  ons of SQLite.  
01d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
01e0: 6f 6e 6c 79 20 6f 6e 65 20 65 78 70 6f 72 74 65  only one exporte
01f0: 64 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73  d symbol in this
0200: 20 66 69 6c 65 20 2d 20 74 68 65 20 66 75 6e 63   file - the func
0210: 74 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65 52 65  tion.** sqliteRe
0220: 67 69 73 74 65 72 42 75 69 6c 64 69 6e 46 75 6e  gisterBuildinFun
0230: 63 74 69 6f 6e 73 28 29 20 66 6f 75 6e 64 20 61  ctions() found a
0240: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  t the bottom of 
0250: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 41 6c 6c  the file..** All
0260: 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20   other code has 
0270: 66 69 6c 65 20 73 63 6f 70 65 2e 0a 2a 2f 0a 23  file scope..*/.#
0280: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0290: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
02a0: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
02b0: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
02c0: 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e  nclude "vdbeInt.
02d0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  h"../*.** Return
02e0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
02f0: 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  unction associat
0300: 65 64 20 77 69 74 68 20 61 20 66 75 6e 63 74 69  ed with a functi
0310: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  on..*/.static Co
0320: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 47 65  llSeq *sqlite3Ge
0330: 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 73 71 6c  tFuncCollSeq(sql
0340: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
0350: 6e 74 65 78 74 29 7b 0a 20 20 72 65 74 75 72 6e  ntext){.  return
0360: 20 63 6f 6e 74 65 78 74 2d 3e 70 43 6f 6c 6c 3b   context->pColl;
0370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
0380: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0390: 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 6d 69  non-aggregate mi
03a0: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 66 75  n() and max() fu
03b0: 6e 63 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69  nctions.*/.stati
03c0: 63 20 76 6f 69 64 20 6d 69 6e 6d 61 78 46 75 6e  c void minmaxFun
03d0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
03e0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
03f0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
0400: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
0410: 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  v.){.  int i;.  
0420: 69 6e 74 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20  int mask;    /* 
0430: 30 20 66 6f 72 20 6d 69 6e 28 29 20 6f 72 20 30  0 for min() or 0
0440: 78 66 66 66 66 66 66 66 66 20 66 6f 72 20 6d 61  xffffffff for ma
0450: 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 42 65  x() */.  int iBe
0460: 73 74 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  st;.  CollSeq *p
0470: 43 6f 6c 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  Coll;..  assert(
0480: 20 61 72 67 63 3e 31 20 29 3b 0a 20 20 6d 61 73   argc>1 );.  mas
0490: 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  k = sqlite3_user
04a0: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3d 3d  _data(context)==
04b0: 30 20 3f 20 30 20 3a 20 2d 31 3b 0a 20 20 70 43  0 ? 0 : -1;.  pC
04c0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
04d0: 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74  FuncCollSeq(cont
04e0: 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ext);.  assert( 
04f0: 70 43 6f 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  pColl );.  asser
0500: 74 28 20 6d 61 73 6b 3d 3d 2d 31 20 7c 7c 20 6d  t( mask==-1 || m
0510: 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 69 42 65 73  ask==0 );.  iBes
0520: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
0530: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
0540: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
0550: 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a  _NULL ) return;.
0560: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67    for(i=1; i<arg
0570: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
0580: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
0590: 79 70 65 28 61 72 67 76 5b 69 5d 29 3d 3d 53 51  ype(argv[i])==SQ
05a0: 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75  LITE_NULL ) retu
05b0: 72 6e 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c  rn;.    if( (sql
05c0: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61  ite3MemCompare(a
05d0: 72 67 76 5b 69 42 65 73 74 5d 2c 20 61 72 67 76  rgv[iBest], argv
05e0: 5b 69 5d 2c 20 70 43 6f 6c 6c 29 5e 6d 61 73 6b  [i], pColl)^mask
05f0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )>=0 ){.      te
0600: 73 74 63 61 73 65 28 20 6d 61 73 6b 3d 3d 30 20  stcase( mask==0 
0610: 29 3b 0a 20 20 20 20 20 20 69 42 65 73 74 20 3d  );.      iBest =
0620: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   i;.    }.  }.  
0630: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
0640: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
0650: 67 76 5b 69 42 65 73 74 5d 29 3b 0a 7d 0a 0a 2f  gv[iBest]);.}../
0660: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0670: 74 79 70 65 20 6f 66 20 74 68 65 20 61 72 67 75  type of the argu
0680: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
0690: 76 6f 69 64 20 74 79 70 65 6f 66 46 75 6e 63 28  void typeofFunc(
06a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
06b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
06c0: 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71  nt NotUsed,.  sq
06d0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
06e0: 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  gv.){.  const ch
06f0: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 55 4e 55  ar *z = 0;.  UNU
0700: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
0710: 74 55 73 65 64 29 3b 0a 20 20 73 77 69 74 63 68  tUsed);.  switch
0720: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
0730: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b  type(argv[0]) ){
0740: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0750: 5f 49 4e 54 45 47 45 52 3a 20 7a 20 3d 20 22 69  _INTEGER: z = "i
0760: 6e 74 65 67 65 72 22 3b 20 62 72 65 61 6b 3b 0a  nteger"; break;.
0770: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0780: 54 45 58 54 3a 20 20 20 20 7a 20 3d 20 22 74 65  TEXT:    z = "te
0790: 78 74 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  xt";    break;. 
07a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
07b0: 4c 4f 41 54 3a 20 20 20 7a 20 3d 20 22 72 65 61  LOAT:   z = "rea
07c0: 6c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  l";    break;.  
07d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
07e0: 4f 42 3a 20 20 20 20 7a 20 3d 20 22 62 6c 6f 62  OB:    z = "blob
07f0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
0800: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
0810: 20 20 20 20 20 20 7a 20 3d 20 22 6e 75 6c 6c 22        z = "null"
0820: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ;    break;.  }.
0830: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0840: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
0850: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
0860: 54 49 43 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  TIC);.}.../*.** 
0870: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
0880: 66 20 74 68 65 20 6c 65 6e 67 74 68 28 29 20 66  f the length() f
0890: 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  unction.*/.stati
08a0: 63 20 76 6f 69 64 20 6c 65 6e 67 74 68 46 75 6e  c void lengthFun
08b0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
08c0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
08d0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
08e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
08f0: 76 0a 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  v.){.  int len;.
0900: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
0910: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
0920: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
0930: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
0940: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
0950: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
0960: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20  e SQLITE_BLOB:. 
0970: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
0980: 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
0990: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
09a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
09b0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
09c0: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
09d0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 29  _bytes(argv[0]))
09e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
09f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
0a00: 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20  LITE_TEXT: {.   
0a10: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
0a20: 64 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  d char *z = sqli
0a30: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
0a40: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  rgv[0]);.      i
0a50: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
0a60: 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 30 3b  ;.      len = 0;
0a70: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  .      while( *z
0a80: 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 2b   ){.        len+
0a90: 2b 3b 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  +;.        SQLIT
0aa0: 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a  E_SKIP_UTF8(z);.
0ab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
0ac0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
0ad0: 28 63 6f 6e 74 65 78 74 2c 20 6c 65 6e 29 3b 0a  (context, len);.
0ae0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0af0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
0b00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
0b10: 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74  result_null(cont
0b20: 65 78 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ext);.      brea
0b30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
0b40: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
0b50: 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 62 73 28  tion of the abs(
0b60: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74  ) function.*/.st
0b70: 61 74 69 63 20 76 6f 69 64 20 61 62 73 46 75 6e  atic void absFun
0b80: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
0b90: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
0ba0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
0bb0: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 61  lue **argv){.  a
0bc0: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
0bd0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
0be0: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 73 77  ETER(argc);.  sw
0bf0: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
0c00: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
0c10: 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  ) ){.    case SQ
0c20: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
0c30: 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 20 3d        i64 iVal =
0c40: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
0c50: 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
0c60: 20 20 20 20 20 69 66 28 20 69 56 61 6c 3c 30 20       if( iVal<0 
0c70: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
0c80: 69 56 61 6c 3c 3c 31 29 3d 3d 30 20 29 7b 0a 20  iVal<<1)==0 ){. 
0c90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
0ca0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
0cb0: 6e 74 65 78 74 2c 20 22 69 6e 74 65 67 65 72 20  ntext, "integer 
0cc0: 6f 76 65 72 66 6c 6f 77 22 2c 20 2d 31 29 3b 0a  overflow", -1);.
0cd0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0ce0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0cf0: 20 20 20 20 69 56 61 6c 20 3d 20 2d 69 56 61 6c      iVal = -iVal
0d00: 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20  ;.      } .     
0d10: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0d20: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 69  int64(context, i
0d30: 56 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Val);.      brea
0d40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
0d50: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
0d60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
0d70: 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65  esult_null(conte
0d80: 78 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  xt);.      break
0d90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
0da0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75  ult: {.      dou
0db0: 62 6c 65 20 72 56 61 6c 20 3d 20 73 71 6c 69 74  ble rVal = sqlit
0dc0: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
0dd0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
0de0: 69 66 28 20 72 56 61 6c 3c 30 20 29 20 72 56 61  if( rVal<0 ) rVa
0df0: 6c 20 3d 20 2d 72 56 61 6c 3b 0a 20 20 20 20 20  l = -rVal;.     
0e00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0e10: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
0e20: 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  rVal);.      bre
0e30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
0e40: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
0e50: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ation of the sub
0e60: 73 74 72 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  str() function..
0e70: 2a 2a 0a 2a 2a 20 73 75 62 73 74 72 28 78 2c 70  **.** substr(x,p
0e80: 31 2c 70 32 29 20 20 72 65 74 75 72 6e 73 20 70  1,p2)  returns p
0e90: 32 20 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  2 characters of 
0ea0: 78 5b 5d 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  x[] beginning wi
0eb0: 74 68 20 70 31 2e 0a 2a 2a 20 70 31 20 69 73 20  th p1..** p1 is 
0ec0: 31 2d 69 6e 64 65 78 65 64 2e 20 20 53 6f 20 73  1-indexed.  So s
0ed0: 75 62 73 74 72 28 78 2c 31 2c 31 29 20 72 65 74  ubstr(x,1,1) ret
0ee0: 75 72 6e 73 20 74 68 65 20 66 69 72 73 74 20 63  urns the first c
0ef0: 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 78  haracter.** of x
0f00: 2e 20 20 49 66 20 78 20 69 73 20 74 65 78 74 2c  .  If x is text,
0f10: 20 74 68 65 6e 20 77 65 20 61 63 74 75 61 6c 6c   then we actuall
0f20: 79 20 63 6f 75 6e 74 20 55 54 46 2d 38 20 63 68  y count UTF-8 ch
0f30: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 20 49 66 20  aracters..** If 
0f40: 78 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65  x is a blob, the
0f50: 6e 20 77 65 20 63 6f 75 6e 74 20 62 79 74 65 73  n we count bytes
0f60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 31 20 69 73  ..**.** If p1 is
0f70: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
0f80: 77 65 20 62 65 67 69 6e 20 61 62 73 28 70 31 29  we begin abs(p1)
0f90: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
0fa0: 20 78 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   x[]..**.** If p
0fb0: 32 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 72  2 is negative, r
0fc0: 65 74 75 72 6e 20 74 68 65 20 70 32 20 63 68 61  eturn the p2 cha
0fd0: 72 61 63 74 65 72 73 20 70 72 65 63 65 65 64 69  racters preceedi
0fe0: 6e 67 20 70 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  ng p1..*/.static
0ff0: 20 76 6f 69 64 20 73 75 62 73 74 72 46 75 6e 63   void substrFunc
1000: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1010: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
1020: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
1030: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
1040: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
1050: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
1060: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1070: 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 6c  har *z2;.  int l
1080: 65 6e 3b 0a 20 20 69 6e 74 20 70 30 74 79 70 65  en;.  int p0type
1090: 3b 0a 20 20 69 36 34 20 70 31 2c 20 70 32 3b 0a  ;.  i64 p1, p2;.
10a0: 20 20 69 6e 74 20 6e 65 67 50 32 20 3d 20 30 3b    int negP2 = 0;
10b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ..  assert( argc
10c0: 3d 3d 33 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29  ==3 || argc==2 )
10d0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
10e0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
10f0: 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  1])==SQLITE_NULL
1100: 0a 20 20 20 7c 7c 20 28 61 72 67 63 3d 3d 33 20  .   || (argc==3 
1110: 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
1120: 5f 74 79 70 65 28 61 72 67 76 5b 32 5d 29 3d 3d  _type(argv[2])==
1130: 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 20 20 29  SQLITE_NULL).  )
1140: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1150: 7d 0a 20 20 70 30 74 79 70 65 20 3d 20 73 71 6c  }.  p0type = sql
1160: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
1170: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 70 31 20 3d  argv[0]);.  p1 =
1180: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
1190: 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  nt(argv[1]);.  i
11a0: 66 28 20 70 30 74 79 70 65 3d 3d 53 51 4c 49 54  f( p0type==SQLIT
11b0: 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 6c 65  E_BLOB ){.    le
11c0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
11d0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
11e0: 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  ;.    z = sqlite
11f0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
1200: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a  v[0]);.    if( z
1210: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1220: 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3d 3d 73    assert( len==s
1230: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
1240: 65 73 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20  es(argv[0]) );. 
1250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20   }else{.    z = 
1260: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1270: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  xt(argv[0]);.   
1280: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
1290: 72 6e 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b  rn;.    len = 0;
12a0: 0a 20 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b  .    if( p1<0 ){
12b0: 0a 20 20 20 20 20 20 66 6f 72 28 7a 32 3d 7a 3b  .      for(z2=z;
12c0: 20 2a 7a 32 3b 20 6c 65 6e 2b 2b 29 7b 0a 20 20   *z2; len++){.  
12d0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
12e0: 50 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20  P_UTF8(z2);.    
12f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1300: 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20  if( argc==3 ){. 
1310: 20 20 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f     p2 = sqlite3_
1320: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32  value_int(argv[2
1330: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 32 3c 30  ]);.    if( p2<0
1340: 20 29 7b 0a 20 20 20 20 20 20 70 32 20 3d 20 2d   ){.      p2 = -
1350: 70 32 3b 0a 20 20 20 20 20 20 6e 65 67 50 32 20  p2;.      negP2 
1360: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
1370: 73 65 7b 0a 20 20 20 20 70 32 20 3d 20 73 71 6c  se{.    p2 = sql
1380: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
1390: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 2d  handle(context)-
13a0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
13b0: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20  IMIT_LENGTH];.  
13c0: 7d 0a 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a  }.  if( p1<0 ){.
13d0: 20 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b 0a 20      p1 += len;. 
13e0: 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20     if( p1<0 ){. 
13f0: 20 20 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a 20       p2 += p1;. 
1400: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 29 20       if( p2<0 ) 
1410: 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 31  p2 = 0;.      p1
1420: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
1430: 6c 73 65 20 69 66 28 20 70 31 3e 30 20 29 7b 0a  lse if( p1>0 ){.
1440: 20 20 20 20 70 31 2d 2d 3b 0a 20 20 7d 65 6c 73      p1--;.  }els
1450: 65 20 69 66 28 20 70 32 3e 30 20 29 7b 0a 20 20  e if( p2>0 ){.  
1460: 20 20 70 32 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66    p2--;.  }.  if
1470: 28 20 6e 65 67 50 32 20 29 7b 0a 20 20 20 20 70  ( negP2 ){.    p
1480: 31 20 2d 3d 20 70 32 3b 0a 20 20 20 20 69 66 28  1 -= p2;.    if(
1490: 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 70   p1<0 ){.      p
14a0: 32 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20 70  2 += p1;.      p
14b0: 31 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  1 = 0;.    }.  }
14c0: 0a 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30  .  assert( p1>=0
14d0: 20 26 26 20 70 32 3e 3d 30 20 29 3b 0a 20 20 69   && p2>=0 );.  i
14e0: 66 28 20 70 30 74 79 70 65 21 3d 53 51 4c 49 54  f( p0type!=SQLIT
14f0: 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 77 68  E_BLOB ){.    wh
1500: 69 6c 65 28 20 2a 7a 20 26 26 20 70 31 20 29 7b  ile( *z && p1 ){
1510: 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b  .      SQLITE_SK
1520: 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20  IP_UTF8(z);.    
1530: 20 20 70 31 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20    p1--;.    }.  
1540: 20 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32 20    for(z2=z; *z2 
1550: 26 26 20 70 32 3b 20 70 32 2d 2d 29 7b 0a 20 20  && p2; p2--){.  
1560: 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f      SQLITE_SKIP_
1570: 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 7d 0a  UTF8(z2);.    }.
1580: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1590: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
15a0: 20 28 63 68 61 72 2a 29 7a 2c 20 28 69 6e 74 29   (char*)z, (int)
15b0: 28 7a 32 2d 7a 29 2c 20 53 51 4c 49 54 45 5f 54  (z2-z), SQLITE_T
15c0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c  RANSIENT);.  }el
15d0: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 31 2b 70  se{.    if( p1+p
15e0: 32 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20 70  2>len ){.      p
15f0: 32 20 3d 20 6c 65 6e 2d 70 31 3b 0a 20 20 20 20  2 = len-p1;.    
1600: 20 20 69 66 28 20 70 32 3c 30 20 29 20 70 32 20    if( p2<0 ) p2 
1610: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
1620: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
1630: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  ob(context, (cha
1640: 72 2a 29 26 7a 5b 70 31 5d 2c 20 28 69 6e 74 29  r*)&z[p1], (int)
1650: 70 32 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  p2, SQLITE_TRANS
1660: 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  IENT);.  }.}../*
1670: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1680: 6f 6e 20 6f 66 20 74 68 65 20 72 6f 75 6e 64 28  on of the round(
1690: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 23 69  ) function.*/.#i
16a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16b0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
16c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 75  .static void rou
16d0: 6e 64 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ndFunc(sqlite3_c
16e0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
16f0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
1700: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
1710: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
1720: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61   double r;.  cha
1730: 72 20 2a 7a 42 75 66 3b 0a 20 20 61 73 73 65 72  r *zBuf;.  asser
1740: 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72  t( argc==1 || ar
1750: 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 61  gc==2 );.  if( a
1760: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66  rgc==2 ){.    if
1770: 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73  ( SQLITE_NULL==s
1780: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
1790: 65 28 61 72 67 76 5b 31 5d 29 20 29 20 72 65 74  e(argv[1]) ) ret
17a0: 75 72 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  urn;.    n = sql
17b0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
17c0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[1]);.    if(
17d0: 20 6e 3e 33 30 20 29 20 6e 20 3d 20 33 30 3b 0a   n>30 ) n = 30;.
17e0: 20 20 20 20 69 66 28 20 6e 3c 30 20 29 20 6e 20      if( n<0 ) n 
17f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
1800: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
1810: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
1820: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
1830: 3b 0a 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  r = sqlite3_
1840: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
1850: 76 5b 30 5d 29 3b 0a 20 20 7a 42 75 66 20 3d 20  v[0]);.  zBuf = 
1860: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1870: 22 25 2e 2a 66 22 2c 6e 2c 72 29 3b 0a 20 20 69  "%.*f",n,r);.  i
1880: 66 28 20 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( zBuf==0 ){.  
1890: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
18a0: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
18b0: 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  text);.  }else{.
18c0: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28      sqlite3AtoF(
18d0: 7a 42 75 66 2c 20 26 72 29 3b 0a 20 20 20 20 73  zBuf, &r);.    s
18e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
18f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
1900: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
1910: 74 65 78 74 2c 20 72 29 3b 0a 20 20 7d 0a 7d 0a  text, r);.  }.}.
1920: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c  #endif../*.** Al
1930: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
1940: 65 73 20 6f 66 20 73 70 61 63 65 20 75 73 69 6e  es of space usin
1950: 67 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  g sqlite3_malloc
1960: 28 29 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 6c  (). If the.** al
1970: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
1980: 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 72 65 73  call sqlite3_res
1990: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
19a0: 29 20 74 6f 20 6e 6f 74 69 66 79 0a 2a 2a 20 74  ) to notify.** t
19b0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
19c0: 6c 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 28 29  le that malloc()
19d0: 20 68 61 73 20 66 61 69 6c 65 64 20 61 6e 64 20   has failed and 
19e0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20  return NULL..** 
19f0: 49 66 20 6e 42 79 74 65 20 69 73 20 6c 61 72 67  If nByte is larg
1a00: 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69  er than the maxi
1a10: 6d 75 6d 20 73 74 72 69 6e 67 20 6f 72 20 62 6c  mum string or bl
1a20: 6f 62 20 6c 65 6e 67 74 68 2c 20 74 68 65 6e 0a  ob length, then.
1a30: 2a 2a 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49  ** raise an SQLI
1a40: 54 45 5f 54 4f 4f 42 49 47 20 65 78 63 65 70 74  TE_TOOBIG except
1a50: 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ion and return N
1a60: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ULL..*/.static v
1a70: 6f 69 64 20 2a 63 6f 6e 74 65 78 74 4d 61 6c 6c  oid *contextMall
1a80: 6f 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  oc(sqlite3_conte
1a90: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 36 34  xt *context, i64
1aa0: 20 6e 42 79 74 65 29 7b 0a 20 20 63 68 61 72 20   nByte){.  char 
1ab0: 2a 7a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *z;.  sqlite3 *d
1ac0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
1ad0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
1ae0: 6e 74 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74  ntext);.  assert
1af0: 28 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20 74  ( nByte>0 );.  t
1b00: 65 73 74 63 61 73 65 28 20 6e 42 79 74 65 3d 3d  estcase( nByte==
1b10: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
1b20: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
1b30: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
1b40: 42 79 74 65 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  Byte==db->aLimit
1b50: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
1b60: 4e 47 54 48 5d 2b 31 20 29 3b 0a 20 20 69 66 28  NGTH]+1 );.  if(
1b70: 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69   nByte>db->aLimi
1b80: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
1b90: 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 73 71  ENGTH] ){.    sq
1ba0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1bb0: 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78  or_toobig(contex
1bc0: 74 29 3b 0a 20 20 20 20 7a 20 3d 20 30 3b 0a 20  t);.    z = 0;. 
1bd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20   }else{.    z = 
1be0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69  sqlite3Malloc((i
1bf0: 6e 74 29 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  nt)nByte);.    i
1c00: 66 28 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 73  f( !z ){.      s
1c10: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
1c20: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
1c30: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1c40: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a  return z;.}../*.
1c50: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1c60: 6e 20 6f 66 20 74 68 65 20 75 70 70 65 72 28 29  n of the upper()
1c70: 20 61 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c   and lower() SQL
1c80: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   functions..*/.s
1c90: 74 61 74 69 63 20 76 6f 69 64 20 75 70 70 65 72  tatic void upper
1ca0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
1cb0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
1cc0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
1cd0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
1ce0: 20 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f    char *z1;.  co
1cf0: 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  nst char *z2;.  
1d00: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 55 4e 55 53  int i, n;.  UNUS
1d10: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
1d20: 63 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72  c);.  z2 = (char
1d30: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1d40: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
1d50: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
1d60: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
1d70: 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  );.  /* Verify t
1d80: 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
1d90: 5f 62 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f  _bytes() does no
1da0: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  t invalidate the
1db0: 20 5f 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72   _text() pointer
1dc0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32   */.  assert( z2
1dd0: 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  ==(char*)sqlite3
1de0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1df0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32  [0]) );.  if( z2
1e00: 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e   ){.    z1 = con
1e10: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
1e20: 78 74 2c 20 28 28 69 36 34 29 6e 29 2b 31 29 3b  xt, ((i64)n)+1);
1e30: 0a 20 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20  .    if( z1 ){. 
1e40: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 31 2c 20       memcpy(z1, 
1e50: 7a 32 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20  z2, n+1);.      
1e60: 66 6f 72 28 69 3d 30 3b 20 7a 31 5b 69 5d 3b 20  for(i=0; z1[i]; 
1e70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 31  i++){.        z1
1e80: 5b 69 5d 20 3d 20 28 63 68 61 72 29 73 71 6c 69  [i] = (char)sqli
1e90: 74 65 33 54 6f 75 70 70 65 72 28 7a 31 5b 69 5d  te3Toupper(z1[i]
1ea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1eb0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1ec0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 31  text(context, z1
1ed0: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72  , -1, sqlite3_fr
1ee0: 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ee);.    }.  }.}
1ef0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 77  .static void low
1f00: 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  erFunc(sqlite3_c
1f10: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1f20: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
1f30: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
1f40: 7b 0a 20 20 75 38 20 2a 7a 31 3b 0a 20 20 63 6f  {.  u8 *z1;.  co
1f50: 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  nst char *z2;.  
1f60: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 55 4e 55 53  int i, n;.  UNUS
1f70: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
1f80: 63 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72  c);.  z2 = (char
1f90: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1fa0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
1fb0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
1fc0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
1fd0: 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  );.  /* Verify t
1fe0: 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
1ff0: 5f 62 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f  _bytes() does no
2000: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  t invalidate the
2010: 20 5f 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72   _text() pointer
2020: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32   */.  assert( z2
2030: 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  ==(char*)sqlite3
2040: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
2050: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32  [0]) );.  if( z2
2060: 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e   ){.    z1 = con
2070: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
2080: 78 74 2c 20 28 28 69 36 34 29 6e 29 2b 31 29 3b  xt, ((i64)n)+1);
2090: 0a 20 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20  .    if( z1 ){. 
20a0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 31 2c 20       memcpy(z1, 
20b0: 7a 32 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20  z2, n+1);.      
20c0: 66 6f 72 28 69 3d 30 3b 20 7a 31 5b 69 5d 3b 20  for(i=0; z1[i]; 
20d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 31  i++){.        z1
20e0: 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 6c  [i] = sqlite3Tol
20f0: 6f 77 65 72 28 7a 31 5b 69 5d 29 3b 0a 20 20 20  ower(z1[i]);.   
2100: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2110: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
2120: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29  ontext, (char *)
2130: 7a 31 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f  z1, -1, sqlite3_
2140: 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  free);.    }.  }
2150: 0a 7d 0a 0a 0a 23 69 66 20 30 20 20 2f 2a 20 54  .}...#if 0  /* T
2160: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2170: 6e 65 76 65 72 20 75 73 65 64 2e 20 2a 2f 0a 2f  never used. */./
2180: 2a 0a 2a 2a 20 54 68 65 20 43 4f 41 4c 45 53 43  *.** The COALESC
2190: 45 28 29 20 61 6e 64 20 49 46 4e 55 4c 4c 28 29  E() and IFNULL()
21a0: 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20   functions used 
21b0: 74 6f 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65  to be implemente
21c0: 64 20 61 73 20 73 68 6f 77 6e 0a 2a 2a 20 68 65  d as shown.** he
21d0: 72 65 2e 20 20 42 75 74 20 6e 6f 77 20 74 68 65  re.  But now the
21e0: 79 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  y are implemente
21f0: 64 20 61 73 20 56 44 42 45 20 63 6f 64 65 20 73  d as VDBE code s
2200: 6f 20 74 68 61 74 20 75 6e 75 73 65 64 20 61 72  o that unused ar
2210: 67 75 6d 65 6e 74 73 0a 2a 2a 20 64 6f 20 6e 6f  guments.** do no
2220: 74 20 68 61 76 65 20 74 6f 20 62 65 20 63 6f 6d  t have to be com
2230: 70 75 74 65 64 2e 20 20 54 68 69 73 20 6c 65 67  puted.  This leg
2240: 61 63 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  acy implementati
2250: 6f 6e 20 69 73 20 72 65 74 61 69 6e 65 64 20 61  on is retained a
2260: 73 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 2e 0a 2a 2f  s.** comment..*/
2270: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2280: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 46 4e  ation of the IFN
2290: 55 4c 4c 28 29 2c 20 4e 56 4c 28 29 2c 20 61 6e  ULL(), NVL(), an
22a0: 64 20 43 4f 41 4c 45 53 43 45 28 29 20 66 75 6e  d COALESCE() fun
22b0: 63 74 69 6f 6e 73 2e 20 20 0a 2a 2a 20 41 6c 6c  ctions.  .** All
22c0: 20 74 68 72 65 65 20 64 6f 20 74 68 65 20 73 61   three do the sa
22d0: 6d 65 20 74 68 69 6e 67 2e 20 20 54 68 65 79 20  me thing.  They 
22e0: 72 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74  return the first
22f0: 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 61 72 67   non-NULL.** arg
2300: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
2310: 20 76 6f 69 64 20 69 66 6e 75 6c 6c 46 75 6e 63   void ifnullFunc
2320: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
2330: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
2340: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
2350: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
2360: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
2370: 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
2380: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51  i++){.    if( SQ
2390: 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74  LITE_NULL!=sqlit
23a0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
23b0: 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  gv[i]) ){.      
23c0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
23d0: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
23e0: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 62 72  gv[i]);.      br
23f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
2400: 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 4f 54 20 55  .#endif /* NOT U
2410: 53 45 44 20 2a 2f 0a 23 64 65 66 69 6e 65 20 69  SED */.#define i
2420: 66 6e 75 6c 6c 46 75 6e 63 20 76 65 72 73 69 6f  fnullFunc versio
2430: 6e 46 75 6e 63 20 20 20 2f 2a 20 53 75 62 73 74  nFunc   /* Subst
2440: 69 74 75 74 65 20 66 75 6e 63 74 69 6f 6e 20 2d  itute function -
2450: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 2a 2f   never called */
2460: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2470: 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d  tation of random
2480: 28 29 2e 20 20 52 65 74 75 72 6e 20 61 20 72 61  ().  Return a ra
2490: 6e 64 6f 6d 20 69 6e 74 65 67 65 72 2e 20 20 0a  ndom integer.  .
24a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
24b0: 61 6e 64 6f 6d 46 75 6e 63 28 0a 20 20 73 71 6c  andomFunc(.  sql
24c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
24d0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74  ntext,.  int Not
24e0: 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f  Used,.  sqlite3_
24f0: 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32  value **NotUsed2
2500: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  .){.  sqlite_int
2510: 36 34 20 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50  64 r;.  UNUSED_P
2520: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
2530: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
2540: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2550: 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72  ss(sizeof(r), &r
2560: 29 3b 0a 20 20 69 66 28 20 72 3c 30 20 29 7b 0a  );.  if( r<0 ){.
2570: 20 20 20 20 2f 2a 20 57 65 20 6e 65 65 64 20 74      /* We need t
2580: 6f 20 70 72 65 76 65 6e 74 20 61 20 72 61 6e 64  o prevent a rand
2590: 6f 6d 20 6e 75 6d 62 65 72 20 6f 66 20 30 78 38  om number of 0x8
25a0: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 20  000000000000000 
25b0: 0a 20 20 20 20 2a 2a 20 28 6f 72 20 2d 39 32 32  .    ** (or -922
25c0: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
25d0: 29 20 73 69 6e 63 65 20 77 68 65 6e 20 79 6f 75  ) since when you
25e0: 20 64 6f 20 61 62 73 28 29 20 6f 66 20 74 68 61   do abs() of tha
25f0: 74 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  t.    ** number 
2600: 6f 66 20 79 6f 75 20 67 65 74 20 74 68 65 20 73  of you get the s
2610: 61 6d 65 20 76 61 6c 75 65 20 62 61 63 6b 20 61  ame value back a
2620: 67 61 69 6e 2e 20 20 54 6f 20 64 6f 20 74 68 69  gain.  To do thi
2630: 73 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20 77 61  s.    ** in a wa
2640: 79 20 74 68 61 74 20 69 73 20 74 65 73 74 61 62  y that is testab
2650: 6c 65 2c 20 6d 61 73 6b 20 74 68 65 20 73 69 67  le, mask the sig
2660: 6e 20 62 69 74 20 6f 66 66 20 6f 66 20 6e 65 67  n bit off of neg
2670: 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 76 61 6c  ative.    ** val
2680: 75 65 73 2c 20 72 65 73 75 6c 74 69 6e 67 20 69  ues, resulting i
2690: 6e 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  n a positive val
26a0: 75 65 2e 20 20 54 68 65 6e 20 74 61 6b 65 20 74  ue.  Then take t
26b0: 68 65 20 0a 20 20 20 20 2a 2a 20 32 73 20 63 6f  he .    ** 2s co
26c0: 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 61 74  mplement of that
26d0: 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2e   positive value.
26e0: 20 20 54 68 65 20 65 6e 64 20 72 65 73 75 6c 74    The end result
26f0: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72   can.    ** ther
2700: 65 66 6f 72 65 20 62 65 20 6e 6f 20 6c 65 73 73  efore be no less
2710: 20 74 68 61 6e 20 2d 39 32 32 33 33 37 32 30 33   than -922337203
2720: 36 38 35 34 37 37 35 38 30 37 2e 0a 20 20 20 20  6854775807..    
2730: 2a 2f 0a 20 20 20 20 72 20 3d 20 2d 28 72 20 5e  */.    r = -(r ^
2740: 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   (((sqlite3_int6
2750: 34 29 31 29 3c 3c 36 33 29 29 3b 0a 20 20 7d 0a  4)1)<<63));.  }.
2760: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2770: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
2780: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  r);.}../*.** Imp
2790: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72  lementation of r
27a0: 61 6e 64 6f 6d 62 6c 6f 62 28 4e 29 2e 20 20 52  andomblob(N).  R
27b0: 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 62  eturn a random b
27c0: 6c 6f 62 0a 2a 2a 20 74 68 61 74 20 69 73 20 4e  lob.** that is N
27d0: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a   bytes long..*/.
27e0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64  static void rand
27f0: 6f 6d 42 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65  omBlob(.  sqlite
2800: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
2810: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
2820: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2830: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
2840: 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  n;.  unsigned ch
2850: 61 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  ar *p;.  assert(
2860: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
2870: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
2880: 72 67 63 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  rgc);.  n = sqli
2890: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
28a0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3c  gv[0]);.  if( n<
28b0: 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 31 3b 0a  1 ){.    n = 1;.
28c0: 20 20 7d 0a 20 20 70 20 3d 20 63 6f 6e 74 65 78    }.  p = contex
28d0: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
28e0: 20 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   n);.  if( p ){.
28f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
2900: 6f 6d 6e 65 73 73 28 6e 2c 20 70 29 3b 0a 20 20  omness(n, p);.  
2910: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2920: 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28  _blob(context, (
2930: 63 68 61 72 2a 29 70 2c 20 6e 2c 20 73 71 6c 69  char*)p, n, sqli
2940: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d  te3_free);.  }.}
2950: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2960: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
2970: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
2980: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
2990: 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76   The return.** v
29a0: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
29b0: 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f   as the sqlite3_
29c0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
29d0: 64 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  d() API function
29e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29f0: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
2a00: 69 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  id(.  sqlite3_co
2a10: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
2a20: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20  .  int NotUsed, 
2a30: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2a40: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
2a50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
2a60: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
2a70: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
2a80: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2a90: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
2aa0: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c  NotUsed2);.  sql
2ab0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
2ac0: 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  4(context, sqlit
2ad0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
2ae0: 6f 77 69 64 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a  owid(db));.}../*
2af0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2b00: 6f 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  on of the change
2b10: 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  s() SQL function
2b20: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
2b30: 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61  lue is the.** sa
2b40: 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  me as the sqlite
2b50: 33 5f 63 68 61 6e 67 65 73 28 29 20 41 50 49 20  3_changes() API 
2b60: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2b70: 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 73  tic void changes
2b80: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
2b90: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
2ba0: 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73  int NotUsed,.  s
2bb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e  qlite3_value **N
2bc0: 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c  otUsed2.){.  sql
2bd0: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
2be0: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
2bf0: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
2c00: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2c10: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
2c20: 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  sed2);.  sqlite3
2c30: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
2c40: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61  ext, sqlite3_cha
2c50: 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a  nges(db));.}../*
2c60: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2c70: 6f 6e 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 5f  on of the total_
2c80: 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75  changes() SQL fu
2c90: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74  nction.  The ret
2ca0: 75 72 6e 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  urn value is.** 
2cb0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
2cc0: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
2cd0: 61 6e 67 65 73 28 29 20 41 50 49 20 66 75 6e 63  anges() API func
2ce0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2cf0: 76 6f 69 64 20 74 6f 74 61 6c 5f 63 68 61 6e 67  void total_chang
2d00: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  es(.  sqlite3_co
2d10: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
2d20: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
2d30: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2d40: 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73  *NotUsed2.){.  s
2d50: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
2d60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
2d70: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
2d80: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d90: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
2da0: 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74  tUsed2);.  sqlit
2db0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
2dc0: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 74  ntext, sqlite3_t
2dd0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 64 62 29  otal_changes(db)
2de0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  );.}../*.** A st
2df0: 72 75 63 74 75 72 65 20 64 65 66 69 6e 69 6e 67  ructure defining
2e00: 20 68 6f 77 20 74 6f 20 64 6f 20 47 4c 4f 42 2d   how to do GLOB-
2e10: 73 74 79 6c 65 20 63 6f 6d 70 61 72 69 73 6f 6e  style comparison
2e20: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6d  s..*/.struct com
2e30: 70 61 72 65 49 6e 66 6f 20 7b 0a 20 20 75 38 20  pareInfo {.  u8 
2e40: 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d  matchAll;.  u8 m
2e50: 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61  atchOne;.  u8 ma
2e60: 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f 43  tchSet;.  u8 noC
2e70: 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46  ase;.};../*.** F
2e80: 6f 72 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  or LIKE and GLOB
2e90: 20 6d 61 74 63 68 69 6e 67 20 6f 6e 20 45 42 43   matching on EBC
2ea0: 44 49 43 20 6d 61 63 68 69 6e 65 73 2c 20 61 73  DIC machines, as
2eb0: 73 75 6d 65 20 74 68 61 74 20 65 76 65 72 79 0a  sume that every.
2ec0: 2a 2a 20 63 68 61 72 61 63 74 65 72 20 69 73 20  ** character is 
2ed0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 62 79 74 65  exactly one byte
2ee0: 20 69 6e 20 73 69 7a 65 2e 20 20 41 6c 73 6f 2c   in size.  Also,
2ef0: 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
2f00: 61 72 65 0a 2a 2a 20 61 62 6c 65 20 74 6f 20 70  are.** able to p
2f10: 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 75 70  articipate in up
2f20: 70 65 72 2d 63 61 73 65 2d 74 6f 2d 6c 6f 77 65  per-case-to-lowe
2f30: 72 2d 63 61 73 65 20 6d 61 70 70 69 6e 67 73 20  r-case mappings 
2f40: 69 6e 20 45 42 43 44 49 43 0a 2a 2a 20 77 68 65  in EBCDIC.** whe
2f50: 72 65 61 73 20 6f 6e 6c 79 20 63 68 61 72 61 63  reas only charac
2f60: 74 65 72 73 20 6c 65 73 73 20 74 68 61 6e 20 30  ters less than 0
2f70: 78 38 30 20 64 6f 20 69 6e 20 41 53 43 49 49 2e  x80 do in ASCII.
2f80: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
2f90: 53 51 4c 49 54 45 5f 45 42 43 44 49 43 29 0a 23  SQLITE_EBCDIC).#
2fa0: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 55   define sqlite3U
2fb0: 74 66 38 52 65 61 64 28 41 2c 43 29 20 20 20 20  tf8Read(A,C)    
2fc0: 28 2a 28 41 2b 2b 29 29 0a 23 20 64 65 66 69 6e  (*(A++)).# defin
2fd0: 65 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77  e GlogUpperToLow
2fe0: 65 72 28 41 29 20 20 20 20 20 41 20 3d 20 73 71  er(A)     A = sq
2ff0: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
3000: 72 5b 41 5d 0a 23 65 6c 73 65 0a 23 20 64 65 66  r[A].#else.# def
3010: 69 6e 65 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c  ine GlogUpperToL
3020: 6f 77 65 72 28 41 29 20 20 20 20 20 69 66 28 20  ower(A)     if( 
3030: 41 3c 30 78 38 30 20 29 7b 20 41 20 3d 20 73 71  A<0x80 ){ A = sq
3040: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
3050: 72 5b 41 5d 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a  r[A]; }.#endif..
3060: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
3070: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
3080: 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b 20 27 2a 27  globInfo = { '*'
3090: 2c 20 27 3f 27 2c 20 27 5b 27 2c 20 30 20 7d 3b  , '?', '[', 0 };
30a0: 0a 2f 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20  ./* The correct 
30b0: 53 51 4c 2d 39 32 20 62 65 68 61 76 69 6f 72 20  SQL-92 behavior 
30c0: 69 73 20 66 6f 72 20 74 68 65 20 4c 49 4b 45 20  is for the LIKE 
30d0: 6f 70 65 72 61 74 6f 72 20 74 6f 20 69 67 6e 6f  operator to igno
30e0: 72 65 0a 2a 2a 20 63 61 73 65 2e 20 20 54 68 75  re.** case.  Thu
30f0: 73 20 20 27 61 27 20 4c 49 4b 45 20 27 41 27 20  s  'a' LIKE 'A' 
3100: 77 6f 75 6c 64 20 62 65 20 74 72 75 65 2e 20 2a  would be true. *
3110: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
3120: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
3130: 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 20 3d  o likeInfoNorm =
3140: 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20 30   { '%', '_',   0
3150: 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66 20 53 51 4c  , 1 };./* If SQL
3160: 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49  ITE_CASE_SENSITI
3170: 56 45 5f 4c 49 4b 45 20 69 73 20 64 65 66 69 6e  VE_LIKE is defin
3180: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 4c 49 4b  ed, then the LIK
3190: 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  E operator.** is
31a0: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 20   case sensitive 
31b0: 63 61 75 73 69 6e 67 20 27 61 27 20 4c 49 4b 45  causing 'a' LIKE
31c0: 20 27 41 27 20 74 6f 20 62 65 20 66 61 6c 73 65   'A' to be false
31d0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
31e0: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
31f0: 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 41 6c 74 20  nfo likeInfoAlt 
3200: 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20  = { '%', '_',   
3210: 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  0, 0 };../*.** C
3220: 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d 38  ompare two UTF-8
3230: 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75   strings for equ
3240: 61 6c 69 74 79 20 77 68 65 72 65 20 74 68 65 20  ality where the 
3250: 66 69 72 73 74 20 73 74 72 69 6e 67 20 63 61 6e  first string can
3260: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
3270: 62 65 20 61 20 22 67 6c 6f 62 22 20 65 78 70 72  be a "glob" expr
3280: 65 73 73 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ession.  Return 
3290: 74 72 75 65 20 28 31 29 20 69 66 20 74 68 65 79  true (1) if they
32a0: 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
32b0: 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69   and false (0) i
32c0: 66 20 74 68 65 79 20 61 72 65 20 64 69 66 66 65  f they are diffe
32d0: 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62  rent..**.** Glob
32e0: 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  bing rules:.**.*
32f0: 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20  *      '*'      
3300: 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
3310: 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72  uence of zero or
3320: 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73   more characters
3330: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27  ..**.**      '?'
3340: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65         Matches e
3350: 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61  xactly one chara
3360: 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  cter..**.**     
3370: 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68  [...]      Match
3380: 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
3390: 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73   from the enclos
33a0: 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20  ed list of.**   
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
33c0: 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
33d0: 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61     [^...]     Ma
33e0: 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
33f0: 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65  ter not in the e
3400: 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  nclosed list..**
3410: 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 5b 2e 2e  .** With the [..
3420: 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61  .] and [^...] ma
3430: 74 63 68 69 6e 67 2c 20 61 20 27 5d 27 20 63 68  tching, a ']' ch
3440: 61 72 61 63 74 65 72 20 63 61 6e 20 62 65 20 69  aracter can be i
3450: 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68  ncluded.** in th
3460: 65 20 6c 69 73 74 20 62 79 20 6d 61 6b 69 6e 67  e list by making
3470: 20 69 74 20 74 68 65 20 66 69 72 73 74 20 63 68   it the first ch
3480: 61 72 61 63 74 65 72 20 61 66 74 65 72 20 27 5b  aracter after '[
3490: 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a 2a 2a 20  ' or '^'.  A.** 
34a0: 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61 63 74  range of charact
34b0: 65 72 73 20 63 61 6e 20 62 65 20 73 70 65 63 69  ers can be speci
34c0: 66 69 65 64 20 75 73 69 6e 67 20 27 2d 27 2e 20  fied using '-'. 
34d0: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61   Example:.** "[a
34e0: 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20 61 6e 79  -z]" matches any
34f0: 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72 2d 63 61   single lower-ca
3500: 73 65 20 6c 65 74 74 65 72 2e 20 20 54 6f 20 6d  se letter.  To m
3510: 61 74 63 68 20 61 20 27 2d 27 2c 20 6d 61 6b 65  atch a '-', make
3520: 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61 73 74 20  .** it the last 
3530: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65  character in the
3540: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   list..**.** Thi
3550: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 75  s routine is usu
3560: 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75 74 20  ally quick, but 
3570: 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e 20 74  can be N**2 in t
3580: 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e 0a 2a  he worst case..*
3590: 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20 74 6f 20 6d  *.** Hints: to m
35a0: 61 74 63 68 20 27 2a 27 20 6f 72 20 27 3f 27 2c  atch '*' or '?',
35b0: 20 70 75 74 20 74 68 65 6d 20 69 6e 20 22 5b 5d   put them in "[]
35c0: 22 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  ".  Like this:.*
35d0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 62 63  *.**         abc
35e0: 5b 2a 5d 78 79 7a 20 20 20 20 20 20 20 20 4d 61  [*]xyz        Ma
35f0: 74 63 68 65 73 20 22 61 62 63 2a 78 79 7a 22 20  tches "abc*xyz" 
3600: 6f 6e 6c 79 0a 2a 2f 0a 73 74 61 74 69 63 20 69  only.*/.static i
3610: 6e 74 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72  nt patternCompar
3620: 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  e(.  const u8 *z
3630: 50 61 74 74 65 72 6e 2c 20 20 20 20 20 20 20 20  Pattern,        
3640: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 6c 6f        /* The glo
3650: 62 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63  b pattern */.  c
3660: 6f 6e 73 74 20 75 38 20 2a 7a 53 74 72 69 6e 67  onst u8 *zString
3670: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3680: 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 20 74 6f  /* The string to
3690: 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
36a0: 20 74 68 65 20 67 6c 6f 62 20 2a 2f 0a 20 20 63   the glob */.  c
36b0: 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70  onst struct comp
36c0: 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 2c 20  areInfo *pInfo, 
36d0: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
36e0: 62 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f 20 74  bout how to do t
36f0: 68 65 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  he compare */.  
3700: 63 6f 6e 73 74 20 69 6e 74 20 65 73 63 20 20 20  const int esc   
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63   /* The escape c
3730: 68 61 72 61 63 74 65 72 20 2a 2f 0a 29 7b 0a 20  haracter */.){. 
3740: 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e   int c, c2;.  in
3750: 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20  t invert;.  int 
3760: 73 65 65 6e 3b 0a 20 20 75 38 20 6d 61 74 63 68  seen;.  u8 match
3770: 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74  One = pInfo->mat
3780: 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61 74 63  chOne;.  u8 matc
3790: 68 41 6c 6c 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61  hAll = pInfo->ma
37a0: 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d 61 74  tchAll;.  u8 mat
37b0: 63 68 53 65 74 20 3d 20 70 49 6e 66 6f 2d 3e 6d  chSet = pInfo->m
37c0: 61 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f  atchSet;.  u8 no
37d0: 43 61 73 65 20 3d 20 70 49 6e 66 6f 2d 3e 6e 6f  Case = pInfo->no
37e0: 43 61 73 65 3b 20 0a 20 20 69 6e 74 20 70 72 65  Case; .  int pre
37f0: 76 45 73 63 61 70 65 20 3d 20 30 3b 20 20 20 20  vEscape = 0;    
3800: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
3810: 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  previous charact
3820: 65 72 20 77 61 73 20 27 65 73 63 61 70 65 27 20  er was 'escape' 
3830: 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20  */..  while( (c 
3840: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
3850: 64 28 7a 50 61 74 74 65 72 6e 2c 26 7a 50 61 74  d(zPattern,&zPat
3860: 74 65 72 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20  tern))!=0 ){.   
3870: 20 69 66 28 20 21 70 72 65 76 45 73 63 61 70 65   if( !prevEscape
3880: 20 26 26 20 63 3d 3d 6d 61 74 63 68 41 6c 6c 20   && c==matchAll 
3890: 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
38a0: 28 63 3d 73 71 6c 69 74 65 33 55 74 66 38 52 65  (c=sqlite3Utf8Re
38b0: 61 64 28 7a 50 61 74 74 65 72 6e 2c 26 7a 50 61  ad(zPattern,&zPa
38c0: 74 74 65 72 6e 29 29 20 3d 3d 20 6d 61 74 63 68  ttern)) == match
38d0: 41 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  All.            
38e0: 20 20 20 7c 7c 20 63 20 3d 3d 20 6d 61 74 63 68     || c == match
38f0: 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  One ){.        i
3900: 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 26  f( c==matchOne &
3910: 26 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  & sqlite3Utf8Rea
3920: 64 28 7a 53 74 72 69 6e 67 2c 20 26 7a 53 74 72  d(zString, &zStr
3930: 69 6e 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ing)==0 ){.     
3940: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
3950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3960: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
3970: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3980: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
3990: 20 69 66 28 20 63 3d 3d 65 73 63 20 29 7b 0a 20   if( c==esc ){. 
39a0: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
39b0: 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  e3Utf8Read(zPatt
39c0: 65 72 6e 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b  ern, &zPattern);
39d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
39e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
39f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
3a00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
3a10: 66 28 20 63 3d 3d 6d 61 74 63 68 53 65 74 20 29  f( c==matchSet )
3a20: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
3a30: 28 20 65 73 63 3d 3d 30 20 29 3b 20 20 20 20 20  ( esc==0 );     
3a40: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 47      /* This is G
3a50: 4c 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45 20 2a 2f  LOB, not LIKE */
3a60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
3a70: 20 6d 61 74 63 68 53 65 74 3c 30 78 38 30 20 29   matchSet<0x80 )
3a80: 3b 20 20 2f 2a 20 27 5b 27 20 69 73 20 61 20 73  ;  /* '[' is a s
3a90: 69 6e 67 6c 65 2d 62 79 74 65 20 63 68 61 72 61  ingle-byte chara
3aa0: 63 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  cter */.        
3ab0: 77 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20  while( *zString 
3ac0: 26 26 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72  && patternCompar
3ad0: 65 28 26 7a 50 61 74 74 65 72 6e 5b 2d 31 5d 2c  e(&zPattern[-1],
3ae0: 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73  zString,pInfo,es
3af0: 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  c)==0 ){.       
3b00: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
3b10: 54 46 38 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  TF8(zString);.  
3b20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b30: 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 21  return *zString!
3b40: 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  =0;.      }.    
3b50: 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 73    while( (c2 = s
3b60: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a  qlite3Utf8Read(z
3b70: 53 74 72 69 6e 67 2c 26 7a 53 74 72 69 6e 67 29  String,&zString)
3b80: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
3b90: 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20  if( noCase ){.  
3ba0: 20 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70 65          GlogUppe
3bb0: 72 54 6f 4c 6f 77 65 72 28 63 32 29 3b 0a 20 20  rToLower(c2);.  
3bc0: 20 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70 65          GlogUppe
3bd0: 72 54 6f 4c 6f 77 65 72 28 63 29 3b 0a 20 20 20  rToLower(c);.   
3be0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32         while( c2
3bf0: 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20 63   != 0 && c2 != c
3c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3c10: 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  c2 = sqlite3Utf8
3c20: 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 20 26 7a  Read(zString, &z
3c30: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  String);.       
3c40: 20 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f       GlogUpperTo
3c50: 4c 6f 77 65 72 28 63 32 29 3b 0a 20 20 20 20 20  Lower(c2);.     
3c60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
3c70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
3c80: 77 68 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26  while( c2 != 0 &
3c90: 26 20 63 32 20 21 3d 20 63 20 29 7b 0a 20 20 20  & c2 != c ){.   
3ca0: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
3cb0: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 53  lite3Utf8Read(zS
3cc0: 74 72 69 6e 67 2c 20 26 7a 53 74 72 69 6e 67 29  tring, &zString)
3cd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3ce0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3cf0: 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75  if( c2==0 ) retu
3d00: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66  rn 0;.        if
3d10: 28 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  ( patternCompare
3d20: 28 7a 50 61 74 74 65 72 6e 2c 7a 53 74 72 69 6e  (zPattern,zStrin
3d30: 67 2c 70 49 6e 66 6f 2c 65 73 63 29 20 29 20 72  g,pInfo,esc) ) r
3d40: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3d50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
3d60: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
3d70: 70 72 65 76 45 73 63 61 70 65 20 26 26 20 63 3d  prevEscape && c=
3d80: 3d 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20 20  =matchOne ){.   
3d90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 55 74     if( sqlite3Ut
3da0: 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 20  f8Read(zString, 
3db0: 26 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a  &zString)==0 ){.
3dc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
3dd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
3de0: 6c 73 65 20 69 66 28 20 63 3d 3d 6d 61 74 63 68  lse if( c==match
3df0: 53 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Set ){.      int
3e00: 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20   prior_c = 0;.  
3e10: 20 20 20 20 61 73 73 65 72 74 28 20 65 73 63 3d      assert( esc=
3e20: 3d 30 20 29 3b 20 20 20 20 2f 2a 20 54 68 69 73  =0 );    /* This
3e30: 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 66 6f 72   only occurs for
3e40: 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45 20   GLOB, not LIKE 
3e50: 2a 2f 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20  */.      seen = 
3e60: 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20  0;.      invert 
3e70: 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 73  = 0;.      c = s
3e80: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a  qlite3Utf8Read(z
3e90: 53 74 72 69 6e 67 2c 20 26 7a 53 74 72 69 6e 67  String, &zString
3ea0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  );.      if( c==
3eb0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3ec0: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
3ed0: 55 74 66 38 52 65 61 64 28 7a 50 61 74 74 65 72  Utf8Read(zPatter
3ee0: 6e 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  n, &zPattern);. 
3ef0: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27       if( c2=='^'
3f00: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 65   ){.        inve
3f10: 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
3f20: 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  c2 = sqlite3Utf8
3f30: 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 26  Read(zPattern, &
3f40: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
3f50: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d   }.      if( c2=
3f60: 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =']' ){.        
3f70: 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65  if( c==']' ) see
3f80: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63  n = 1;.        c
3f90: 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  2 = sqlite3Utf8R
3fa0: 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 26 7a  ead(zPattern, &z
3fb0: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
3fc0: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 63  }.      while( c
3fd0: 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a  2 && c2!=']' ){.
3fe0: 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
3ff0: 27 2d 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b  '-' && zPattern[
4000: 30 5d 21 3d 27 5d 27 20 26 26 20 7a 50 61 74 74  0]!=']' && zPatt
4010: 65 72 6e 5b 30 5d 21 3d 30 20 26 26 20 70 72 69  ern[0]!=0 && pri
4020: 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  or_c>0 ){.      
4030: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
4040: 55 74 66 38 52 65 61 64 28 7a 50 61 74 74 65 72  Utf8Read(zPatter
4050: 6e 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  n, &zPattern);. 
4060: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d           if( c>=
4070: 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32  prior_c && c<=c2
4080: 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
4090: 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
40a0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
40b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
40c0: 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20   c==c2 ){.      
40d0: 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a        seen = 1;.
40e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
40f0: 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
4100: 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
4110: 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74        c2 = sqlit
4120: 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  e3Utf8Read(zPatt
4130: 65 72 6e 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b  ern, &zPattern);
4140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4150: 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65  f( c2==0 || (see
4160: 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20 29  n ^ invert)==0 )
4170: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4180: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
4190: 7d 65 6c 73 65 20 69 66 28 20 65 73 63 3d 3d 63  }else if( esc==c
41a0: 20 26 26 20 21 70 72 65 76 45 73 63 61 70 65 20   && !prevEscape 
41b0: 29 7b 0a 20 20 20 20 20 20 70 72 65 76 45 73 63  ){.      prevEsc
41c0: 61 70 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ape = 1;.    }el
41d0: 73 65 7b 0a 20 20 20 20 20 20 63 32 20 3d 20 73  se{.      c2 = s
41e0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a  qlite3Utf8Read(z
41f0: 53 74 72 69 6e 67 2c 20 26 7a 53 74 72 69 6e 67  String, &zString
4200: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43  );.      if( noC
4210: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 47  ase ){.        G
4220: 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72 28  logUpperToLower(
4230: 63 29 3b 0a 20 20 20 20 20 20 20 20 47 6c 6f 67  c);.        Glog
4240: 55 70 70 65 72 54 6f 4c 6f 77 65 72 28 63 32 29  UpperToLower(c2)
4250: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4260: 69 66 28 20 63 21 3d 63 32 20 29 7b 0a 20 20 20  if( c!=c2 ){.   
4270: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
4280: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 65       }.      pre
4290: 76 45 73 63 61 70 65 20 3d 20 30 3b 0a 20 20 20  vEscape = 0;.   
42a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
42b0: 2a 7a 53 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a  *zString==0;.}..
42c0: 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
42d0: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
42e0: 74 68 61 74 20 74 68 65 20 4c 49 4b 45 20 6f 70  that the LIKE op
42f0: 65 72 61 74 6f 72 20 28 6f 72 20 47 4c 4f 42 20  erator (or GLOB 
4300: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6a 75 73 74  which is.** just
4310: 20 61 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20   a variation of 
4320: 4c 49 4b 45 29 20 67 65 74 73 20 63 61 6c 6c 65  LIKE) gets calle
4330: 64 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  d.  This is used
4340: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
4350: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
4360: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
4370: 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75  sqlite3_like_cou
4380: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
4390: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
43a0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 6b  ation of the lik
43b0: 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  e() SQL function
43c0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
43d0: 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74   implements.** t
43e0: 68 65 20 62 75 69 6c 64 2d 69 6e 20 4c 49 4b 45  he build-in LIKE
43f0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
4400: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
4410: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  o the function i
4420: 73 20 74 68 65 0a 2a 2a 20 70 61 74 74 65 72 6e  s the.** pattern
4430: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
4440: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
4450: 73 74 72 69 6e 67 2e 20 20 53 6f 2c 20 74 68 65  string.  So, the
4460: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a   SQL statements:
4470: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41 20 4c  .**.**       A L
4480: 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69  IKE B.**.** is i
4490: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 6c 69  mplemented as li
44a0: 6b 65 28 42 2c 41 29 2e 0a 2a 2a 0a 2a 2a 20 54  ke(B,A)..**.** T
44b0: 68 69 73 20 73 61 6d 65 20 66 75 6e 63 74 69 6f  his same functio
44c0: 6e 20 28 77 69 74 68 20 61 20 64 69 66 66 65 72  n (with a differ
44d0: 65 6e 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  ent compareInfo 
44e0: 73 74 72 75 63 74 75 72 65 29 20 63 6f 6d 70 75  structure) compu
44f0: 74 65 73 0a 2a 2a 20 74 68 65 20 47 4c 4f 42 20  tes.** the GLOB 
4500: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  operator..*/.sta
4510: 74 69 63 20 76 6f 69 64 20 6c 69 6b 65 46 75 6e  tic void likeFun
4520: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
4530: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
4540: 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73    int argc, .  s
4550: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4560: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgv.){.  const u
4570: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41  nsigned char *zA
4580: 2c 20 2a 7a 42 3b 0a 20 20 69 6e 74 20 65 73 63  , *zB;.  int esc
4590: 61 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ape = 0;.  int n
45a0: 50 61 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Pat;.  sqlite3 *
45b0: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
45c0: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
45d0: 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 7a 42 20 3d  ontext);..  zB =
45e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
45f0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
4600: 7a 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  zA = sqlite3_val
4610: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
4620: 3b 0a 0a 20 20 2f 2a 20 4c 69 6d 69 74 20 74 68  ;..  /* Limit th
4630: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
4640: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61 74  LIKE or GLOB pat
4650: 74 65 72 6e 20 74 6f 20 61 76 6f 69 64 20 70 72  tern to avoid pr
4660: 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 6f 66 20 64  oblems.  ** of d
4670: 65 65 70 20 72 65 63 75 72 73 69 6f 6e 20 61 6e  eep recursion an
4680: 64 20 4e 2a 4e 20 62 65 68 61 76 69 6f 72 20 69  d N*N behavior i
4690: 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  n patternCompare
46a0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 74 20  ()..  */.  nPat 
46b0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
46c0: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
46d0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 74    testcase( nPat
46e0: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
46f0: 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
4700: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 20 29  ATTERN_LENGTH] )
4710: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
4720: 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  at==db->aLimit[S
4730: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
4740: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
4750: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 74  +1 );.  if( nPat
4760: 20 3e 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   > db->aLimit[SQ
4770: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
4780: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 20  PATTERN_LENGTH] 
4790: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
47a0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
47b0: 65 78 74 2c 20 22 4c 49 4b 45 20 6f 72 20 47 4c  ext, "LIKE or GL
47c0: 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 6f 20 63  OB pattern too c
47d0: 6f 6d 70 6c 65 78 22 2c 20 2d 31 29 3b 0a 20 20  omplex", -1);.  
47e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
47f0: 61 73 73 65 72 74 28 20 7a 42 3d 3d 73 71 6c 69  assert( zB==sqli
4800: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
4810: 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 45  rgv[0]) );  /* E
4820: 6e 63 6f 64 69 6e 67 20 64 69 64 20 6e 6f 74 20  ncoding did not 
4830: 63 68 61 6e 67 65 20 2a 2f 0a 0a 20 20 69 66 28  change */..  if(
4840: 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20   argc==3 ){.    
4850: 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63 68  /* The escape ch
4860: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 6d  aracter string m
4870: 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66 20 61  ust consist of a
4880: 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20 63 68   single UTF-8 ch
4890: 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20  aracter..    ** 
48a0: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
48b0: 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
48c0: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  */.    const uns
48d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 73 63  igned char *zEsc
48e0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
48f0: 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a  _text(argv[2]);.
4900: 20 20 20 20 69 66 28 20 7a 45 73 63 3d 3d 30 20      if( zEsc==0 
4910: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
4920: 28 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  ( sqlite3Utf8Cha
4930: 72 4c 65 6e 28 28 63 68 61 72 2a 29 7a 45 73 63  rLen((char*)zEsc
4940: 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20 20 20 20  , -1)!=1 ){.    
4950: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4960: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
4970: 0a 20 20 20 20 20 20 20 20 20 20 22 45 53 43 41  .          "ESCA
4980: 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  PE expression mu
4990: 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
49a0: 68 61 72 61 63 74 65 72 22 2c 20 2d 31 29 3b 0a  haracter", -1);.
49b0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
49c0: 20 20 7d 0a 20 20 20 20 65 73 63 61 70 65 20 3d    }.    escape =
49d0: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
49e0: 28 7a 45 73 63 2c 20 26 7a 45 73 63 29 3b 0a 20  (zEsc, &zEsc);. 
49f0: 20 7d 0a 20 20 69 66 28 20 7a 41 20 26 26 20 7a   }.  if( zA && z
4a00: 42 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  B ){.    struct 
4a10: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e  compareInfo *pIn
4a20: 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  fo = sqlite3_use
4a30: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
4a40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4a50: 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
4a60: 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  like_count++;.#e
4a70: 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20 73 71  ndif.    .    sq
4a80: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
4a90: 28 63 6f 6e 74 65 78 74 2c 20 70 61 74 74 65 72  (context, patter
4aa0: 6e 43 6f 6d 70 61 72 65 28 7a 42 2c 20 7a 41 2c  nCompare(zB, zA,
4ab0: 20 70 49 6e 66 6f 2c 20 65 73 63 61 70 65 29 29   pInfo, escape))
4ac0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
4ad0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
4ae0: 20 74 68 65 20 4e 55 4c 4c 49 46 28 78 2c 79 29   the NULLIF(x,y)
4af0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
4b00: 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69  result is the fi
4b10: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  rst.** argument 
4b20: 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  if the arguments
4b30: 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
4b40: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   The result is N
4b50: 55 4c 4c 20 69 66 20 74 68 65 0a 2a 2a 20 61 72  ULL if the.** ar
4b60: 67 75 6d 65 6e 74 73 20 61 72 65 20 65 71 75 61  guments are equa
4b70: 6c 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 2e  l to each other.
4b80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4b90: 6e 75 6c 6c 69 66 46 75 6e 63 28 0a 20 20 73 71  nullifFunc(.  sq
4ba0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
4bb0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
4bc0: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
4bd0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
4be0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
4bf0: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75  l = sqlite3GetFu
4c00: 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78  ncCollSeq(contex
4c10: 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t);.  UNUSED_PAR
4c20: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
4c30: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 65  .  if( sqlite3Me
4c40: 6d 43 6f 6d 70 61 72 65 28 61 72 67 76 5b 30 5d  mCompare(argv[0]
4c50: 2c 20 61 72 67 76 5b 31 5d 2c 20 70 43 6f 6c 6c  , argv[1], pColl
4c60: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
4c70: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
4c80: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30  (context, argv[0
4c90: 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ]);.  }.}../*.**
4ca0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
4cb0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 76 65  of the sqlite_ve
4cc0: 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e  rsion() function
4cd0: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
4ce0: 20 74 68 65 20 76 65 72 73 69 6f 6e 0a 2a 2a 20   the version.** 
4cf0: 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  of the SQLite li
4d00: 62 72 61 72 79 20 74 68 61 74 20 69 73 20 72 75  brary that is ru
4d10: 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  nning..*/.static
4d20: 20 76 6f 69 64 20 76 65 72 73 69 6f 6e 46 75 6e   void versionFun
4d30: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
4d40: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
4d50: 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20   int NotUsed,.  
4d60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4d70: 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 55 4e  NotUsed2.){.  UN
4d80: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
4d90: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
4da0: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  2);.  sqlite3_re
4db0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
4dc0: 74 2c 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  t, sqlite3_versi
4dd0: 6f 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  on, -1, SQLITE_S
4de0: 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TATIC);.}../*.**
4df0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
4e00: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 6f  of the sqlite_so
4e10: 75 72 63 65 5f 69 64 28 29 20 66 75 6e 63 74 69  urce_id() functi
4e20: 6f 6e 2e 20 54 68 65 20 72 65 73 75 6c 74 20 69  on. The result i
4e30: 73 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68  s a string.** th
4e40: 61 74 20 69 64 65 6e 74 69 66 69 65 73 20 74 68  at identifies th
4e50: 65 20 70 61 72 74 69 63 75 6c 61 72 20 76 65 72  e particular ver
4e60: 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 6f 75 72  sion of the sour
4e70: 63 65 20 63 6f 64 65 20 75 73 65 64 20 74 6f 20  ce code used to 
4e80: 62 75 69 6c 64 0a 2a 2a 20 53 51 4c 69 74 65 2e  build.** SQLite.
4e90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4ea0: 73 6f 75 72 63 65 69 64 46 75 6e 63 28 0a 20 20  sourceidFunc(.  
4eb0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
4ec0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
4ed0: 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74  NotUsed,.  sqlit
4ee0: 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73  e3_value **NotUs
4ef0: 65 64 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ed2.){.  UNUSED_
4f00: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
4f10: 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
4f20: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4f30: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 53 51  text(context, SQ
4f40: 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 2c 20  LITE_SOURCE_ID, 
4f50: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
4f60: 43 29 3b 0a 7d 0a 0a 2f 2a 20 41 72 72 61 79 20  C);.}../* Array 
4f70: 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 66  for converting f
4f80: 72 6f 6d 20 68 61 6c 66 2d 62 79 74 65 73 20 28  rom half-bytes (
4f90: 6e 79 62 62 6c 65 73 29 20 69 6e 74 6f 20 41 53  nybbles) into AS
4fa0: 43 49 49 20 68 65 78 0a 2a 2a 20 64 69 67 69 74  CII hex.** digit
4fb0: 73 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s. */.static con
4fc0: 73 74 20 63 68 61 72 20 68 65 78 64 69 67 69 74  st char hexdigit
4fd0: 73 5b 5d 20 3d 20 7b 0a 20 20 27 30 27 2c 20 27  s[] = {.  '0', '
4fe0: 31 27 2c 20 27 32 27 2c 20 27 33 27 2c 20 27 34  1', '2', '3', '4
4ff0: 27 2c 20 27 35 27 2c 20 27 36 27 2c 20 27 37 27  ', '5', '6', '7'
5000: 2c 0a 20 20 27 38 27 2c 20 27 39 27 2c 20 27 41  ,.  '8', '9', 'A
5010: 27 2c 20 27 42 27 2c 20 27 43 27 2c 20 27 44 27  ', 'B', 'C', 'D'
5020: 2c 20 27 45 27 2c 20 27 46 27 20 0a 7d 3b 0a 0a  , 'E', 'F' .};..
5030: 2f 2a 0a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54  /*.** EXPERIMENT
5040: 41 4c 20 2d 20 54 68 69 73 20 69 73 20 6e 6f 74  AL - This is not
5050: 20 61 6e 20 6f 66 66 69 63 69 61 6c 20 66 75 6e   an official fun
5060: 63 74 69 6f 6e 2e 20 20 54 68 65 20 69 6e 74 65  ction.  The inte
5070: 72 66 61 63 65 20 6d 61 79 0a 2a 2a 20 63 68 61  rface may.** cha
5080: 6e 67 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74  nge.  This funct
5090: 69 6f 6e 20 6d 61 79 20 64 69 73 61 70 70 65 61  ion may disappea
50a0: 72 2e 20 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  r.  Do not write
50b0: 20 63 6f 64 65 20 74 68 61 74 20 64 65 70 65 6e   code that depen
50c0: 64 73 0a 2a 2a 20 6f 6e 20 74 68 69 73 20 66 75  ds.** on this fu
50d0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6d  nction..**.** Im
50e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
50f0: 74 68 65 20 51 55 4f 54 45 28 29 20 66 75 6e 63  the QUOTE() func
5100: 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63  tion.  This func
5110: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
5120: 67 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  gle.** argument.
5130: 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e    If the argumen
5140: 74 20 69 73 20 6e 75 6d 65 72 69 63 2c 20 74 68  t is numeric, th
5150: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
5160: 73 20 74 68 65 20 73 61 6d 65 20 61 73 0a 2a 2a  s the same as.**
5170: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20   the argument.  
5180: 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  If the argument 
5190: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 74  is NULL, the ret
51a0: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
51b0: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 4e 55 4c 4c   string.** "NULL
51c0: 22 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ".  Otherwise, t
51d0: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65  he argument is e
51e0: 6e 63 6c 6f 73 65 64 20 69 6e 20 73 69 6e 67 6c  nclosed in singl
51f0: 65 20 71 75 6f 74 65 73 20 77 69 74 68 0a 2a 2a  e quotes with.**
5200: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 20 65 73   single-quote es
5210: 63 61 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  capes..*/.static
5220: 20 76 6f 69 64 20 71 75 6f 74 65 46 75 6e 63 28   void quoteFunc(
5230: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5240: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
5250: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
5260: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 61 73 73  e **argv){.  ass
5270: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a  ert( argc==1 );.
5280: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
5290: 45 52 28 61 72 67 63 29 3b 0a 20 20 73 77 69 74  ER(argc);.  swit
52a0: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
52b0: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20  e_type(argv[0]) 
52c0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
52d0: 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TE_INTEGER:.    
52e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
52f0: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
5300: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
5310: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
5320: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5330: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
5340: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
5350: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20      char *zText 
5360: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
5370: 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73  const *zBlob = s
5380: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
5390: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  b(argv[0]);.    
53a0: 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71    int nBlob = sq
53b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
53c0: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  s(argv[0]);.    
53d0: 20 20 61 73 73 65 72 74 28 20 7a 42 6c 6f 62 3d    assert( zBlob=
53e0: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  =sqlite3_value_b
53f0: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20  lob(argv[0]) ); 
5400: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
5410: 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 7a  hange */.      z
5420: 54 65 78 74 20 3d 20 28 63 68 61 72 20 2a 29 63  Text = (char *)c
5430: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
5440: 74 65 78 74 2c 20 28 32 2a 28 69 36 34 29 6e 42  text, (2*(i64)nB
5450: 6c 6f 62 29 2b 34 29 3b 20 0a 20 20 20 20 20 20  lob)+4); .      
5460: 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20  if( zText ){.   
5470: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
5480: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
5490: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Blob; i++){.    
54a0: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32        zText[(i*2
54b0: 29 2b 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73  )+2] = hexdigits
54c0: 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30  [(zBlob[i]>>4)&0
54d0: 78 30 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  x0F];.          
54e0: 7a 54 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d  zText[(i*2)+3] =
54f0: 20 68 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f   hexdigits[(zBlo
5500: 62 5b 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20  b[i])&0x0F];.   
5510: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
5520: 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32  Text[(nBlob*2)+2
5530: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20  ] = '\'';.      
5540: 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32    zText[(nBlob*2
5550: 29 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  )+3] = '\0';.   
5560: 20 20 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20       zText[0] = 
5570: 27 58 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  'X';.        zTe
5580: 78 74 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  xt[1] = '\'';.  
5590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
55a0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
55b0: 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51  t, zText, -1, SQ
55c0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
55d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
55e0: 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
55f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5600: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
5610: 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
5620: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 6a 3b 0a  .      int i,j;.
5630: 20 20 20 20 20 20 75 36 34 20 6e 3b 0a 20 20 20        u64 n;.   
5640: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
5650: 64 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 73  d char *zArg = s
5660: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5670: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
5680: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20    char *z;..    
5690: 20 20 69 66 28 20 7a 41 72 67 3d 3d 30 20 29 20    if( zArg==0 ) 
56a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f  return;.      fo
56b0: 72 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a 41 72 67  r(i=0, n=0; zArg
56c0: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a  [i]; i++){ if( z
56d0: 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e  Arg[i]=='\'' ) n
56e0: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20  ++; }.      z = 
56f0: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
5700: 6e 74 65 78 74 2c 20 28 28 69 36 34 29 69 29 2b  ntext, ((i64)i)+
5710: 28 28 69 36 34 29 6e 29 2b 33 29 3b 0a 20 20 20  ((i64)n)+3);.   
5720: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
5730: 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c 27 27 3b      z[0] = '\'';
5740: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
5750: 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d 3b 20  , j=1; zArg[i]; 
5760: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
5770: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b 69 5d  z[j++] = zArg[i]
5780: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5790: 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  zArg[i]=='\'' ){
57a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  .            z[j
57b0: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  ++] = '\'';.    
57c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
57d0: 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  }.        z[j++]
57e0: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
57f0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[j] = 0;.     
5800: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5810: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
5820: 7a 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72  z, j, sqlite3_fr
5830: 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ee);.      }.   
5840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5850: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5860: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
5870: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
5880: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
5890: 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  _NULL );.      s
58a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
58b0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c  xt(context, "NUL
58c0: 4c 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54  L", 4, SQLITE_ST
58d0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
58e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
58f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 78 28 29  ./*.** The hex()
5900: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 6e 74 65   function.  Inte
5910: 72 70 72 65 74 20 74 68 65 20 61 72 67 75 6d 65  rpret the argume
5920: 6e 74 20 61 73 20 61 20 62 6c 6f 62 2e 20 20 52  nt as a blob.  R
5930: 65 74 75 72 6e 0a 2a 2a 20 61 20 68 65 78 61 64  eturn.** a hexad
5940: 65 63 69 6d 61 6c 20 72 65 6e 64 65 72 69 6e 67  ecimal rendering
5950: 20 61 73 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61   as text..*/.sta
5960: 74 69 63 20 76 6f 69 64 20 68 65 78 46 75 6e 63  tic void hexFunc
5970: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
5980: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
5990: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
59a0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
59b0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  .){.  int i, n;.
59c0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
59d0: 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20   char *pBlob;.  
59e0: 63 68 61 72 20 2a 7a 48 65 78 2c 20 2a 7a 3b 0a  char *zHex, *z;.
59f0: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
5a00: 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  1 );.  UNUSED_PA
5a10: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
5a20: 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   pBlob = sqlite3
5a30: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
5a40: 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  [0]);.  n = sqli
5a50: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
5a60: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65  argv[0]);.  asse
5a70: 72 74 28 20 70 42 6c 6f 62 3d 3d 73 71 6c 69 74  rt( pBlob==sqlit
5a80: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
5a90: 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f  gv[0]) );  /* No
5aa0: 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65   encoding change
5ab0: 20 2a 2f 0a 20 20 7a 20 3d 20 7a 48 65 78 20 3d   */.  z = zHex =
5ac0: 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63   contextMalloc(c
5ad0: 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29  ontext, ((i64)n)
5ae0: 2a 32 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 7a  *2 + 1);.  if( z
5af0: 48 65 78 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Hex ){.    for(i
5b00: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 42  =0; i<n; i++, pB
5b10: 6c 6f 62 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e  lob++){.      un
5b20: 73 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20  signed char c = 
5b30: 2a 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 2a 28  *pBlob;.      *(
5b40: 7a 2b 2b 29 20 3d 20 68 65 78 64 69 67 69 74 73  z++) = hexdigits
5b50: 5b 28 63 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20  [(c>>4)&0xf];.  
5b60: 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78      *(z++) = hex
5b70: 64 69 67 69 74 73 5b 63 26 30 78 66 5d 3b 0a 20  digits[c&0xf];. 
5b80: 20 20 20 7d 0a 20 20 20 20 2a 7a 20 3d 20 30 3b     }.    *z = 0;
5b90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
5ba0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
5bb0: 2c 20 7a 48 65 78 2c 20 6e 2a 32 2c 20 73 71 6c  , zHex, n*2, sql
5bc0: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a  ite3_free);.  }.
5bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 7a 65 72  }../*.** The zer
5be0: 6f 62 6c 6f 62 28 4e 29 20 66 75 6e 63 74 69 6f  oblob(N) functio
5bf0: 6e 20 72 65 74 75 72 6e 73 20 61 20 7a 65 72 6f  n returns a zero
5c00: 2d 66 69 6c 6c 65 64 20 62 6c 6f 62 20 6f 66 20  -filled blob of 
5c10: 73 69 7a 65 20 4e 20 62 79 74 65 73 2e 0a 2a 2f  size N bytes..*/
5c20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
5c30: 6f 62 6c 6f 62 46 75 6e 63 28 0a 20 20 73 71 6c  oblobFunc(.  sql
5c40: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
5c50: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
5c60: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
5c70: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
5c80: 36 34 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  64 n;.  sqlite3 
5c90: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
5ca0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
5cb0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 61 73 73 65  context);.  asse
5cc0: 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20  rt( argc==1 );. 
5cd0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
5ce0: 52 28 61 72 67 63 29 3b 0a 20 20 6e 20 3d 20 73  R(argc);.  n = s
5cf0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
5d00: 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 74  64(argv[0]);.  t
5d10: 65 73 74 63 61 73 65 28 20 6e 3d 3d 64 62 2d 3e  estcase( n==db->
5d20: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
5d30: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20  MIT_LENGTH] );. 
5d40: 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 64 62   testcase( n==db
5d50: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
5d60: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 2b 31 20  LIMIT_LENGTH]+1 
5d70: 29 3b 0a 20 20 69 66 28 20 6e 3e 64 62 2d 3e 61  );.  if( n>db->a
5d80: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5d90: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
5da0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5db0: 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f  _error_toobig(co
5dc0: 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  ntext);.  }else{
5dd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
5de0: 75 6c 74 5f 7a 65 72 6f 62 6c 6f 62 28 63 6f 6e  ult_zeroblob(con
5df0: 74 65 78 74 2c 20 28 69 6e 74 29 6e 29 3b 0a 20  text, (int)n);. 
5e00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
5e10: 72 65 70 6c 61 63 65 28 29 20 66 75 6e 63 74 69  replace() functi
5e20: 6f 6e 2e 20 20 54 68 72 65 65 20 61 72 67 75 6d  on.  Three argum
5e30: 65 6e 74 73 20 61 72 65 20 61 6c 6c 20 73 74 72  ents are all str
5e40: 69 6e 67 73 3a 20 63 61 6c 6c 0a 2a 2a 20 74 68  ings: call.** th
5e50: 65 6d 20 41 2c 20 42 2c 20 61 6e 64 20 43 2e 20  em A, B, and C. 
5e60: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  The result is al
5e70: 73 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  so a string whic
5e80: 68 20 69 73 20 64 65 72 69 76 65 64 0a 2a 2a 20  h is derived.** 
5e90: 66 72 6f 6d 20 41 20 62 79 20 72 65 70 6c 61 63  from A by replac
5ea0: 69 6e 67 20 65 76 65 72 79 20 6f 63 63 75 72 61  ing every occura
5eb0: 6e 63 65 20 6f 66 20 42 20 77 69 74 68 20 43 2e  nce of B with C.
5ec0: 20 20 54 68 65 20 6d 61 74 63 68 0a 2a 2a 20 6d    The match.** m
5ed0: 75 73 74 20 62 65 20 65 78 61 63 74 2e 20 20 43  ust be exact.  C
5ee0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
5ef0: 65 73 20 61 72 65 20 6e 6f 74 20 75 73 65 64 2e  es are not used.
5f00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5f10: 72 65 70 6c 61 63 65 46 75 6e 63 28 0a 20 20 73  replaceFunc(.  s
5f20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5f30: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
5f40: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
5f50: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
5f60: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
5f70: 63 68 61 72 20 2a 7a 53 74 72 3b 20 20 20 20 20  char *zStr;     
5f80: 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20     /* The input 
5f90: 73 74 72 69 6e 67 20 41 20 2a 2f 0a 20 20 63 6f  string A */.  co
5fa0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
5fb0: 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20 20  r *zPattern;    
5fc0: 2f 2a 20 54 68 65 20 70 61 74 74 65 72 6e 20 73  /* The pattern s
5fd0: 74 72 69 6e 67 20 42 20 2a 2f 0a 20 20 63 6f 6e  tring B */.  con
5fe0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
5ff0: 20 2a 7a 52 65 70 3b 20 20 20 20 20 20 20 20 2f   *zRep;        /
6000: 2a 20 54 68 65 20 72 65 70 6c 61 63 65 6d 65 6e  * The replacemen
6010: 74 20 73 74 72 69 6e 67 20 43 20 2a 2f 0a 20 20  t string C */.  
6020: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
6030: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
6040: 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
6050: 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 72 3b 20 20  */.  int nStr;  
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6070: 20 53 69 7a 65 20 6f 66 20 7a 53 74 72 20 2a 2f   Size of zStr */
6080: 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b  .  int nPattern;
6090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
60a0: 69 7a 65 20 6f 66 20 7a 50 61 74 74 65 72 6e 20  ize of zPattern 
60b0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 70 3b 20 20  */.  int nRep;  
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
60d0: 20 53 69 7a 65 20 6f 66 20 7a 52 65 70 20 2a 2f   Size of zRep */
60e0: 0a 20 20 69 36 34 20 6e 4f 75 74 3b 20 20 20 20  .  i64 nOut;    
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
6100: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 7a  aximum size of z
6110: 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6f  Out */.  int loo
6120: 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
6130: 20 20 2f 2a 20 4c 61 73 74 20 7a 53 74 72 5b 5d    /* Last zStr[]
6140: 20 74 68 61 74 20 6d 69 67 68 74 20 6d 61 74 63   that might matc
6150: 68 20 7a 50 61 74 74 65 72 6e 5b 5d 20 2a 2f 0a  h zPattern[] */.
6160: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
6170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
6180: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 0a  op counters */..
6190: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
61a0: 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  3 );.  UNUSED_PA
61b0: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
61c0: 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f   zStr = sqlite3_
61d0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
61e0: 30 5d 29 3b 0a 20 20 69 66 28 20 7a 53 74 72 3d  0]);.  if( zStr=
61f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e  =0 ) return;.  n
6200: 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Str = sqlite3_va
6210: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
6220: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53  ]);.  assert( zS
6230: 74 72 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  tr==sqlite3_valu
6240: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20  e_text(argv[0]) 
6250: 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69  );  /* No encodi
6260: 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a  ng change */.  z
6270: 50 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65  Pattern = sqlite
6280: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
6290: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50 61  v[1]);.  if( zPa
62a0: 74 74 65 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ttern==0 ){.    
62b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
62c0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
62d0: 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  1])==SQLITE_NULL
62e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
62f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
6300: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
6310: 74 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  t)->mallocFailed
6320: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
6330: 20 20 7d 0a 20 20 69 66 28 20 7a 50 61 74 74 65    }.  if( zPatte
6340: 72 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  rn[0]==0 ){.    
6350: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6360: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
6370: 31 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  1])!=SQLITE_NULL
6380: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
6390: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
63a0: 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  text, argv[0]);.
63b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
63c0: 20 20 6e 50 61 74 74 65 72 6e 20 3d 20 73 71 6c    nPattern = sql
63d0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
63e0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73 73  (argv[1]);.  ass
63f0: 65 72 74 28 20 7a 50 61 74 74 65 72 6e 3d 3d 73  ert( zPattern==s
6400: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6410: 74 28 61 72 67 76 5b 31 5d 29 20 29 3b 20 20 2f  t(argv[1]) );  /
6420: 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68  * No encoding ch
6430: 61 6e 67 65 20 2a 2f 0a 20 20 7a 52 65 70 20 3d  ange */.  zRep =
6440: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6450: 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ext(argv[2]);.  
6460: 69 66 28 20 7a 52 65 70 3d 3d 30 20 29 20 72 65  if( zRep==0 ) re
6470: 74 75 72 6e 3b 0a 20 20 6e 52 65 70 20 3d 20 73  turn;.  nRep = s
6480: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6490: 65 73 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 61  es(argv[2]);.  a
64a0: 73 73 65 72 74 28 20 7a 52 65 70 3d 3d 73 71 6c  ssert( zRep==sql
64b0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
64c0: 61 72 67 76 5b 32 5d 29 20 29 3b 0a 20 20 6e 4f  argv[2]) );.  nO
64d0: 75 74 20 3d 20 6e 53 74 72 20 2b 20 31 3b 0a 20  ut = nStr + 1;. 
64e0: 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3c 53 51   assert( nOut<SQ
64f0: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
6500: 29 3b 0a 20 20 7a 4f 75 74 20 3d 20 63 6f 6e 74  );.  zOut = cont
6510: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
6520: 74 2c 20 28 69 36 34 29 6e 4f 75 74 29 3b 0a 20  t, (i64)nOut);. 
6530: 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a   if( zOut==0 ){.
6540: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6550: 20 20 6c 6f 6f 70 4c 69 6d 69 74 20 3d 20 6e 53    loopLimit = nS
6560: 74 72 20 2d 20 6e 50 61 74 74 65 72 6e 3b 20 20  tr - nPattern;  
6570: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
6580: 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20 69 2b 2b 29  =loopLimit; i++)
6590: 7b 0a 20 20 20 20 69 66 28 20 7a 53 74 72 5b 69  {.    if( zStr[i
65a0: 5d 21 3d 7a 50 61 74 74 65 72 6e 5b 30 5d 20 7c  ]!=zPattern[0] |
65b0: 7c 20 6d 65 6d 63 6d 70 28 26 7a 53 74 72 5b 69  | memcmp(&zStr[i
65c0: 5d 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e 50 61  ], zPattern, nPa
65d0: 74 74 65 72 6e 29 20 29 7b 0a 20 20 20 20 20 20  ttern) ){.      
65e0: 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 53 74 72  zOut[j++] = zStr
65f0: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
6600: 20 20 20 20 20 20 75 38 20 2a 7a 4f 6c 64 3b 0a        u8 *zOld;.
6610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
6620: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
6630: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
6640: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 4f  ntext);.      nO
6650: 75 74 20 2b 3d 20 6e 52 65 70 20 2d 20 6e 50 61  ut += nRep - nPa
6660: 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 74 65 73  ttern;.      tes
6670: 74 63 61 73 65 28 20 6e 4f 75 74 2d 31 3d 3d 64  tcase( nOut-1==d
6680: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
6690: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
66a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
66b0: 28 20 6e 4f 75 74 2d 32 3d 3d 64 62 2d 3e 61 4c  ( nOut-2==db->aL
66c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
66d0: 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20  T_LENGTH] );.   
66e0: 20 20 20 69 66 28 20 6e 4f 75 74 2d 31 3e 64 62     if( nOut-1>db
66f0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
6700: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
6710: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6720: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f  _result_error_to
6730: 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20  obig(context);. 
6740: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
6750: 46 72 65 65 28 64 62 2c 20 7a 4f 75 74 29 3b 0a  Free(db, zOut);.
6760: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
6770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4f        }.      zO
6780: 6c 64 20 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 20  ld = zOut;.     
6790: 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   zOut = sqlite3_
67a0: 72 65 61 6c 6c 6f 63 28 7a 4f 75 74 2c 20 28 69  realloc(zOut, (i
67b0: 6e 74 29 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  nt)nOut);.      
67c0: 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20  if( zOut==0 ){. 
67d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
67e0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
67f0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
6800: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6810: 65 28 64 62 2c 20 7a 4f 6c 64 29 3b 0a 20 20 20  e(db, zOld);.   
6820: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6830: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
6840: 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a 52 65 70  y(&zOut[j], zRep
6850: 2c 20 6e 52 65 70 29 3b 0a 20 20 20 20 20 20 6a  , nRep);.      j
6860: 20 2b 3d 20 6e 52 65 70 3b 0a 20 20 20 20 20 20   += nRep;.      
6870: 69 20 2b 3d 20 6e 50 61 74 74 65 72 6e 2d 31 3b  i += nPattern-1;
6880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
6890: 65 72 74 28 20 6a 2b 6e 53 74 72 2d 69 2b 31 3d  ert( j+nStr-i+1=
68a0: 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d 65 6d 63 70  =nOut );.  memcp
68b0: 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26 7a 53 74  y(&zOut[j], &zSt
68c0: 72 5b 69 5d 2c 20 6e 53 74 72 2d 69 29 3b 0a 20  r[i], nStr-i);. 
68d0: 20 6a 20 2b 3d 20 6e 53 74 72 20 2d 20 69 3b 0a   j += nStr - i;.
68e0: 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 6e 4f 75    assert( j<=nOu
68f0: 74 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d  t );.  zOut[j] =
6900: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
6910: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
6920: 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20  t, (char*)zOut, 
6930: 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  j, sqlite3_free)
6940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
6950: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
6960: 20 54 52 49 4d 28 29 2c 20 4c 54 52 49 4d 28 29   TRIM(), LTRIM()
6970: 2c 20 61 6e 64 20 52 54 52 49 4d 28 29 20 66 75  , and RTRIM() fu
6980: 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20  nctions..** The 
6990: 75 73 65 72 64 61 74 61 20 69 73 20 30 78 31 20  userdata is 0x1 
69a0: 66 6f 72 20 6c 65 66 74 20 74 72 69 6d 2c 20 30  for left trim, 0
69b0: 78 32 20 66 6f 72 20 72 69 67 68 74 20 74 72 69  x2 for right tri
69c0: 6d 2c 20 30 78 33 20 66 6f 72 20 62 6f 74 68 2e  m, 0x3 for both.
69d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
69e0: 74 72 69 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69  trimFunc(.  sqli
69f0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
6a00: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
6a10: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
6a20: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
6a30: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
6a40: 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20 20 20 20  r *zIn;         
6a50: 2f 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67 20  /* Input string 
6a60: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  */.  const unsig
6a70: 6e 65 64 20 63 68 61 72 20 2a 7a 43 68 61 72 53  ned char *zCharS
6a80: 65 74 3b 20 20 20 20 2f 2a 20 53 65 74 20 6f 66  et;    /* Set of
6a90: 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 74   characters to t
6aa0: 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  rim */.  int nIn
6ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6ad0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
6ae0: 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20   input */.  int 
6af0: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6b10: 20 31 3a 20 74 72 69 6d 6c 65 66 74 20 20 32 3a   1: trimleft  2:
6b20: 20 74 72 69 6d 72 69 67 68 74 20 20 33 3a 20 74   trimright  3: t
6b30: 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  rim */.  int i; 
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
6b60: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
6b70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
6b80: 4c 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Len = 0;        
6b90: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 65    /* Length of e
6ba0: 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e  ach character in
6bb0: 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20 75   zCharSet */.  u
6bc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 61  nsigned char **a
6bd0: 7a 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20  zChar = 0;      
6be0: 20 2f 2a 20 49 6e 64 69 76 69 64 75 61 6c 20 63   /* Individual c
6bf0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43 68  haracters in zCh
6c00: 61 72 53 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  arSet */.  int n
6c10: 43 68 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  Char;           
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c30: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
6c40: 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65 74  ters in zCharSet
6c50: 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   */..  if( sqlit
6c60: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
6c70: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
6c80: 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
6c90: 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20 3d 20 73  n;.  }.  zIn = s
6ca0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6cb0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
6cc0: 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72  ( zIn==0 ) retur
6cd0: 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74  n;.  nIn = sqlit
6ce0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
6cf0: 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72  rgv[0]);.  asser
6d00: 74 28 20 7a 49 6e 3d 3d 73 71 6c 69 74 65 33 5f  t( zIn==sqlite3_
6d10: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6d20: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 61 72 67  0]) );.  if( arg
6d30: 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 74 61 74  c==1 ){.    stat
6d40: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
6d50: 64 20 63 68 61 72 20 6c 65 6e 4f 6e 65 5b 5d 20  d char lenOne[] 
6d60: 3d 20 7b 20 31 20 7d 3b 0a 20 20 20 20 73 74 61  = { 1 };.    sta
6d70: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61  tic unsigned cha
6d80: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4f 6e 65 5b  r * const azOne[
6d90: 5d 20 3d 20 7b 20 28 75 38 2a 29 22 20 22 20 7d  ] = { (u8*)" " }
6da0: 3b 0a 20 20 20 20 6e 43 68 61 72 20 3d 20 31 3b  ;.    nChar = 1;
6db0: 0a 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 38 2a  .    aLen = (u8*
6dc0: 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20 61 7a 43  )lenOne;.    azC
6dd0: 68 61 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  har = (unsigned 
6de0: 63 68 61 72 20 2a 2a 29 61 7a 4f 6e 65 3b 0a 20  char **)azOne;. 
6df0: 20 20 20 7a 43 68 61 72 53 65 74 20 3d 20 30 3b     zCharSet = 0;
6e00: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 43  .  }else if( (zC
6e10: 68 61 72 53 65 74 20 3d 20 73 71 6c 69 74 65 33  harSet = sqlite3
6e20: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
6e30: 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  [1]))==0 ){.    
6e40: 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b  return;.  }else{
6e50: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
6e60: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  ned char *z;.   
6e70: 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74 2c   for(z=zCharSet,
6e80: 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43   nChar=0; *z; nC
6e90: 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 53 51  har++){.      SQ
6ea0: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
6eb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
6ec0: 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20 20   nChar>0 ){.    
6ed0: 20 20 61 7a 43 68 61 72 20 3d 20 63 6f 6e 74 65    azChar = conte
6ee0: 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74  xtMalloc(context
6ef0: 2c 20 28 28 69 36 34 29 6e 43 68 61 72 29 2a 28  , ((i64)nChar)*(
6f00: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 31 29  sizeof(char*)+1)
6f10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 43  );.      if( azC
6f20: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  har==0 ){.      
6f30: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
6f40: 7d 0a 20 20 20 20 20 20 61 4c 65 6e 20 3d 20 28  }.      aLen = (
6f50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
6f60: 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 3b 0a 20  azChar[nChar];. 
6f70: 20 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72       for(z=zChar
6f80: 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a  Set, nChar=0; *z
6f90: 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20  ; nChar++){.    
6fa0: 20 20 20 20 61 7a 43 68 61 72 5b 6e 43 68 61 72      azChar[nChar
6fb0: 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ] = (unsigned ch
6fc0: 61 72 20 2a 29 7a 3b 0a 20 20 20 20 20 20 20 20  ar *)z;.        
6fd0: 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38  SQLITE_SKIP_UTF8
6fe0: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 4c 65  (z);.        aLe
6ff0: 6e 5b 6e 43 68 61 72 5d 20 3d 20 28 75 38 29 28  n[nChar] = (u8)(
7000: 7a 20 2d 20 61 7a 43 68 61 72 5b 6e 43 68 61 72  z - azChar[nChar
7010: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
7020: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 68 61  }.  }.  if( nCha
7030: 72 3e 30 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  r>0 ){.    flags
7040: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
7050: 5f 49 4e 54 28 73 71 6c 69 74 65 33 5f 75 73 65  _INT(sqlite3_use
7060: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 29  r_data(context))
7070: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  ;.    if( flags 
7080: 26 20 31 20 29 7b 0a 20 20 20 20 20 20 77 68 69  & 1 ){.      whi
7090: 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  le( nIn>0 ){.   
70a0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30       int len = 0
70b0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
70c0: 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29  0; i<nChar; i++)
70d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20  {.          len 
70e0: 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20 20  = aLen[i];.     
70f0: 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e 49       if( len<=nI
7100: 6e 20 26 26 20 6d 65 6d 63 6d 70 28 7a 49 6e 2c  n && memcmp(zIn,
7110: 20 61 7a 43 68 61 72 5b 69 5d 2c 20 6c 65 6e 29   azChar[i], len)
7120: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
7130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
7140: 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62 72  f( i>=nChar ) br
7150: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 49 6e  eak;.        zIn
7160: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20   += len;.       
7170: 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20   nIn -= len;.   
7180: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
7190: 66 28 20 66 6c 61 67 73 20 26 20 32 20 29 7b 0a  f( flags & 2 ){.
71a0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49 6e        while( nIn
71b0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  >0 ){.        in
71c0: 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  t len = 0;.     
71d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
71e0: 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  har; i++){.     
71f0: 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b       len = aLen[
7200: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
7210: 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d 65  ( len<=nIn && me
7220: 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d 6c 65  mcmp(&zIn[nIn-le
7230: 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c 65 6e  n],azChar[i],len
7240: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
7250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7260: 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62  if( i>=nChar ) b
7270: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e 49  reak;.        nI
7280: 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  n -= len;.      
7290: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
72a0: 7a 43 68 61 72 53 65 74 20 29 7b 0a 20 20 20 20  zCharSet ){.    
72b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
72c0: 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  zChar);.    }.  
72d0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
72e0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
72f0: 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e 49 6e   (char*)zIn, nIn
7300: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
7310: 4e 54 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  NT);.}...#ifdef 
7320: 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 2f  SQLITE_SOUNDEX./
7330: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
7340: 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e   soundex encodin
7350: 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a 2f 0a  g of a word..*/.
7360: 73 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75 6e  static void soun
7370: 64 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  dexFunc(.  sqlit
7380: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7390: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
73a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
73b0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61   **argv.){.  cha
73c0: 72 20 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20 20  r zResult[8];.  
73d0: 63 6f 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a 20  const u8 *zIn;. 
73e0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61   int i, j;.  sta
73f0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
7400: 65 64 20 63 68 61 72 20 69 43 6f 64 65 5b 5d 20  ed char iCode[] 
7410: 3d 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c  = {.    0, 0, 0,
7420: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
7430: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
7440: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30  , 0, 0,.    0, 0
7450: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
7460: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
7470: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
7480: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
7490: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
74a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
74b0: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
74c0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
74d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
74e0: 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c   0,.    0, 0, 1,
74f0: 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20   2, 3, 0, 1, 2, 
7500: 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35  0, 0, 2, 2, 4, 5
7510: 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32  , 5, 0,.    1, 2
7520: 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c  , 6, 2, 3, 0, 1,
7530: 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20   0, 2, 0, 2, 0, 
7540: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
7550: 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30  0, 0, 1, 2, 3, 0
7560: 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c  , 1, 2, 0, 0, 2,
7570: 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a   2, 4, 5, 5, 0,.
7580: 20 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20      1, 2, 6, 2, 
7590: 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30  3, 0, 1, 0, 2, 0
75a0: 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 2, 0, 0, 0, 0,
75b0: 20 30 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72   0,.  };.  asser
75c0: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
75d0: 7a 49 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69 74  zIn = (u8*)sqlit
75e0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
75f0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49  gv[0]);.  if( zI
7600: 6e 3d 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75 38  n==0 ) zIn = (u8
7610: 2a 29 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  *)"";.  for(i=0;
7620: 20 7a 49 6e 5b 69 5d 20 26 26 20 21 73 71 6c 69   zIn[i] && !sqli
7630: 74 65 33 49 73 61 6c 70 68 61 28 7a 49 6e 5b 69  te3Isalpha(zIn[i
7640: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  ]); i++){}.  if(
7650: 20 7a 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 75   zIn[i] ){.    u
7660: 38 20 70 72 65 76 63 6f 64 65 20 3d 20 69 43 6f  8 prevcode = iCo
7670: 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b  de[zIn[i]&0x7f];
7680: 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 30 5d 20  .    zResult[0] 
7690: 3d 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72  = sqlite3Toupper
76a0: 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66 6f  (zIn[i]);.    fo
76b0: 72 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a 49  r(j=1; j<4 && zI
76c0: 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  n[i]; i++){.    
76d0: 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 69 43 6f    int code = iCo
76e0: 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b  de[zIn[i]&0x7f];
76f0: 0a 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 3e  .      if( code>
7700: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
7710: 20 63 6f 64 65 21 3d 70 72 65 76 63 6f 64 65 20   code!=prevcode 
7720: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65  ){.          pre
7730: 76 63 6f 64 65 20 3d 20 63 6f 64 65 3b 0a 20 20  vcode = code;.  
7740: 20 20 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b          zResult[
7750: 6a 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30  j++] = code + '0
7760: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
7770: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7780: 20 20 70 72 65 76 63 6f 64 65 20 3d 20 30 3b 0a    prevcode = 0;.
7790: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
77a0: 20 20 77 68 69 6c 65 28 20 6a 3c 34 20 29 7b 0a    while( j<4 ){.
77b0: 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b        zResult[j+
77c0: 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 7d 0a  +] = '0';.    }.
77d0: 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 5d 20 3d      zResult[j] =
77e0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
77f0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
7800: 65 78 74 2c 20 7a 52 65 73 75 6c 74 2c 20 34 2c  ext, zResult, 4,
7810: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
7820: 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  T);.  }else{.   
7830: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7840: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 3f  text(context, "?
7850: 30 30 30 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  000", 4, SQLITE_
7860: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
7870: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
7880: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
7890: 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
78a0: 41 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  A function that 
78b0: 6c 6f 61 64 73 20 61 20 73 68 61 72 65 64 2d 6c  loads a shared-l
78c0: 69 62 72 61 72 79 20 65 78 74 65 6e 73 69 6f 6e  ibrary extension
78d0: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 4e 55   then returns NU
78e0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
78f0: 69 64 20 6c 6f 61 64 45 78 74 28 73 71 6c 69 74  id loadExt(sqlit
7900: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7910: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
7920: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7930: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  rgv){.  const ch
7940: 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28 63 6f 6e  ar *zFile = (con
7950: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
7960: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
7970: 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63  v[0]);.  const c
7980: 68 61 72 20 2a 7a 50 72 6f 63 3b 0a 20 20 73 71  har *zProc;.  sq
7990: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
79a0: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
79b0: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
79c0: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
79d0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  = 0;..  if( argc
79e0: 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63  ==2 ){.    zProc
79f0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
7a00: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
7a10: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
7a20: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 63  }else{.    zProc
7a30: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
7a40: 7a 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33  zFile && sqlite3
7a50: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
7a60: 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63  db, zFile, zProc
7a70: 2c 20 26 7a 45 72 72 4d 73 67 29 20 29 7b 0a 20  , &zErrMsg) ){. 
7a80: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7a90: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
7aa0: 20 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b 0a 20   zErrMsg, -1);. 
7ab0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7ac0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a  zErrMsg);.  }.}.
7ad0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
7ae0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
7af0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
7b00: 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20  cture holds the 
7b10: 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20  context of a.** 
7b20: 73 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20 61  sum() or avg() a
7b30: 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74 61  ggregate computa
7b40: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
7b50: 20 73 74 72 75 63 74 20 53 75 6d 43 74 78 20 53   struct SumCtx S
7b60: 75 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53 75  umCtx;.struct Su
7b70: 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20  mCtx {.  double 
7b80: 72 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20 46 6c  rSum;      /* Fl
7b90: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 73 75 6d  oating point sum
7ba0: 20 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d 3b 20   */.  i64 iSum; 
7bb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
7bc0: 65 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20 20 69  er sum */   .  i
7bd0: 36 34 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  64 cnt;         
7be0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
7bf0: 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a 2f  ements summed */
7c00: 0a 20 20 75 38 20 6f 76 65 72 66 6c 6f 77 3b 20  .  u8 overflow; 
7c10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7c20: 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77  integer overflow
7c30: 20 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20 61 70   seen */.  u8 ap
7c40: 70 72 6f 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  prox;        /* 
7c50: 54 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e 74 65  True if non-inte
7c60: 67 65 72 20 76 61 6c 75 65 20 77 61 73 20 69 6e  ger value was in
7c70: 70 75 74 20 74 6f 20 74 68 65 20 73 75 6d 20 2a  put to the sum *
7c80: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  /.};../*.** Rout
7c90: 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ines used to com
7ca0: 70 75 74 65 20 74 68 65 20 73 75 6d 2c 20 61 76  pute the sum, av
7cb0: 65 72 61 67 65 2c 20 61 6e 64 20 74 6f 74 61 6c  erage, and total
7cc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55 4d 28  ..**.** The SUM(
7cd0: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c 6c 6f  ) function follo
7ce0: 77 73 20 74 68 65 20 28 62 72 6f 6b 65 6e 29 20  ws the (broken) 
7cf0: 53 51 4c 20 73 74 61 6e 64 61 72 64 20 77 68 69  SQL standard whi
7d00: 63 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ch means.** that
7d10: 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c   it returns NULL
7d20: 20 69 66 20 69 74 20 73 75 6d 73 20 6f 76 65 72   if it sums over
7d30: 20 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54 4f 54   no inputs.  TOT
7d40: 41 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30 2e  AL returns.** 0.
7d50: 30 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20  0 in that case. 
7d60: 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20 54 4f   In addition, TO
7d70: 54 41 4c 20 61 6c 77 61 79 73 20 72 65 74 75 72  TAL always retur
7d80: 6e 73 20 61 20 66 6c 6f 61 74 20 77 68 65 72 65  ns a float where
7d90: 0a 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20 72 65  .** SUM might re
7da0: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
7db0: 69 66 20 69 74 20 6e 65 76 65 72 20 65 6e 63 6f  if it never enco
7dc0: 75 6e 74 65 72 73 20 61 20 66 6c 6f 61 74 69 6e  unters a floatin
7dd0: 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
7de0: 2e 20 20 54 4f 54 41 4c 20 6e 65 76 65 72 20 66  .  TOTAL never f
7df0: 61 69 6c 73 2c 20 62 75 74 20 53 55 4d 20 6d 69  ails, but SUM mi
7e00: 67 68 74 20 74 68 72 6f 75 67 68 20 61 6e 20 65  ght through an e
7e10: 78 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a 20 69  xception if.** i
7e20: 74 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e 20 69  t overflows an i
7e30: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nteger..*/.stati
7e40: 63 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28 73  c void sumStep(s
7e50: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7e60: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
7e70: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
7e80: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43   **argv){.  SumC
7e90: 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79 70  tx *p;.  int typ
7ea0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  e;.  assert( arg
7eb0: 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==1 );.  UNUSED
7ec0: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
7ed0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
7ee0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
7ef0: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
7f00: 66 28 2a 70 29 29 3b 0a 20 20 74 79 70 65 20 3d  f(*p));.  type =
7f10: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e   sqlite3_value_n
7f20: 75 6d 65 72 69 63 5f 74 79 70 65 28 61 72 67 76  umeric_type(argv
7f30: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 20 26 26  [0]);.  if( p &&
7f40: 20 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e 55   type!=SQLITE_NU
7f50: 4c 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6e 74  LL ){.    p->cnt
7f60: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 74 79 70 65  ++;.    if( type
7f70: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
7f80: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 20   ){.      i64 v 
7f90: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
7fa0: 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a  int64(argv[0]);.
7fb0: 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d        p->rSum +=
7fc0: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   v;.      if( (p
7fd0: 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f 76 65 72  ->approx|p->over
7fe0: 66 6c 6f 77 29 3d 3d 30 20 29 7b 0a 20 20 20 20  flow)==0 ){.    
7ff0: 20 20 20 20 69 36 34 20 69 4e 65 77 53 75 6d 20      i64 iNewSum 
8000: 3d 20 70 2d 3e 69 53 75 6d 20 2b 20 76 3b 0a 20  = p->iSum + v;. 
8010: 20 20 20 20 20 20 20 69 6e 74 20 73 31 20 3d 20         int s1 = 
8020: 28 69 6e 74 29 28 70 2d 3e 69 53 75 6d 20 3e 3e  (int)(p->iSum >>
8030: 20 28 73 69 7a 65 6f 66 28 69 36 34 29 2a 38 2d   (sizeof(i64)*8-
8040: 31 29 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  1));.        int
8050: 20 73 32 20 3d 20 28 69 6e 74 29 28 76 20 20 20   s2 = (int)(v   
8060: 20 20 20 20 3e 3e 20 28 73 69 7a 65 6f 66 28 69      >> (sizeof(i
8070: 36 34 29 2a 38 2d 31 29 29 3b 0a 20 20 20 20 20  64)*8-1));.     
8080: 20 20 20 69 6e 74 20 73 33 20 3d 20 28 69 6e 74     int s3 = (int
8090: 29 28 69 4e 65 77 53 75 6d 20 3e 3e 20 28 73 69  )(iNewSum >> (si
80a0: 7a 65 6f 66 28 69 36 34 29 2a 38 2d 31 29 29 3b  zeof(i64)*8-1));
80b0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 76 65 72  .        p->over
80c0: 66 6c 6f 77 20 3d 20 28 28 73 31 26 73 32 26 7e  flow = ((s1&s2&~
80d0: 73 33 29 20 7c 20 28 7e 73 31 26 7e 73 32 26 73  s3) | (~s1&~s2&s
80e0: 33 29 29 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  3))?1:0;.       
80f0: 20 70 2d 3e 69 53 75 6d 20 3d 20 69 4e 65 77 53   p->iSum = iNewS
8100: 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  um;.      }.    
8110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
8120: 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33 5f  rSum += sqlite3_
8130: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
8140: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  v[0]);.      p->
8150: 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20 20 20 20  approx = 1;.    
8160: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
8170: 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69 7a 65 28  oid sumFinalize(
8180: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8190: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d  *context){.  Sum
81a0: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
81b0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
81c0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
81d0: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
81e0: 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20  p->cnt>0 ){.    
81f0: 69 66 28 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20  if( p->overflow 
8200: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8210: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
8220: 6e 74 65 78 74 2c 22 69 6e 74 65 67 65 72 20 6f  ntext,"integer o
8230: 76 65 72 66 6c 6f 77 22 2c 2d 31 29 3b 0a 20 20  verflow",-1);.  
8240: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 61    }else if( p->a
8250: 70 70 72 6f 78 20 29 7b 0a 20 20 20 20 20 20 73  pprox ){.      s
8260: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
8270: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d  uble(context, p-
8280: 3e 72 53 75 6d 29 3b 0a 20 20 20 20 7d 65 6c 73  >rSum);.    }els
8290: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
82a0: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
82b0: 6e 74 65 78 74 2c 20 70 2d 3e 69 53 75 6d 29 3b  ntext, p->iSum);
82c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
82d0: 74 69 63 20 76 6f 69 64 20 61 76 67 46 69 6e 61  tic void avgFina
82e0: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
82f0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
8300: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70    SumCtx *p;.  p
8310: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
8320: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
8330: 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  text, 0);.  if( 
8340: 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b  p && p->cnt>0 ){
8350: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8360: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
8370: 78 74 2c 20 70 2d 3e 72 53 75 6d 2f 28 64 6f 75  xt, p->rSum/(dou
8380: 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20 7d  ble)p->cnt);.  }
8390: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
83a0: 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 28 73 71 6c  otalFinalize(sql
83b0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
83c0: 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78  ntext){.  SumCtx
83d0: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
83e0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
83f0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
8400: 3b 0a 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30  ;.  /* (double)0
8410: 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49   In case of SQLI
8420: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
8430: 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 73  _POINT... */.  s
8440: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
8450: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 20  uble(context, p 
8460: 3f 20 70 2d 3e 72 53 75 6d 20 3a 20 28 64 6f 75  ? p->rSum : (dou
8470: 62 6c 65 29 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ble)0);.}../*.**
8480: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
8490: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74  tructure keeps t
84a0: 72 61 63 6b 20 6f 66 20 73 74 61 74 65 20 69 6e  rack of state in
84b0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
84c0: 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20 61 67 67  e.** count() agg
84d0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
84e0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
84f0: 63 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e  ct CountCtx Coun
8500: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f 75  tCtx;.struct Cou
8510: 6e 74 43 74 78 20 7b 0a 20 20 69 36 34 20 6e 3b  ntCtx {.  i64 n;
8520: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  .};../*.** Routi
8530: 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  nes to implement
8540: 20 74 68 65 20 63 6f 75 6e 74 28 29 20 61 67 67   the count() agg
8550: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
8560: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8570: 63 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74 65  countStep(sqlite
8580: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
8590: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
85a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
85b0: 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  gv){.  CountCtx 
85c0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
85d0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
85e0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
85f0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
8600: 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49  (argc==0 || SQLI
8610: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
8620: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8630: 5b 30 5d 29 29 20 26 26 20 70 20 29 7b 0a 20 20  [0])) && p ){.  
8640: 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 0a 23    p->n++;.  }..#
8650: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8660: 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
8670: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 61  /* The sqlite3_a
8680: 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29  ggregate_count()
8690: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 70   function is dep
86a0: 72 65 63 61 74 65 64 2e 20 20 42 75 74 20 6a 75  recated.  But ju
86b0: 73 74 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  st to make.  ** 
86c0: 73 75 72 65 20 69 74 20 73 74 69 6c 6c 20 6f 70  sure it still op
86d0: 65 72 61 74 65 73 20 63 6f 72 72 65 63 74 6c 79  erates correctly
86e0: 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 69 74  , verify that it
86f0: 73 20 63 6f 75 6e 74 20 61 67 72 65 65 73 20 77  s count agrees w
8700: 69 74 68 20 6f 75 72 20 0a 20 20 2a 2a 20 69 6e  ith our .  ** in
8710: 74 65 72 6e 61 6c 20 63 6f 75 6e 74 20 77 68 65  ternal count whe
8720: 6e 20 75 73 69 6e 67 20 63 6f 75 6e 74 28 2a 29  n using count(*)
8730: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 74 6f   and when the to
8740: 74 61 6c 20 63 6f 75 6e 74 20 63 61 6e 20 62 65  tal count can be
8750: 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 65 64 20  .  ** expressed 
8760: 61 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  as a 32-bit inte
8770: 67 65 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ger. */.  assert
8780: 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 70 3d 3d  ( argc==1 || p==
8790: 30 20 7c 7c 20 70 2d 3e 6e 3e 30 78 37 66 66 66  0 || p->n>0x7fff
87a0: 66 66 66 66 0a 20 20 20 20 20 20 20 20 20 20 7c  ffff.          |
87b0: 7c 20 70 2d 3e 6e 3d 3d 73 71 6c 69 74 65 33 5f  | p->n==sqlite3_
87c0: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
87d0: 63 6f 6e 74 65 78 74 29 20 29 3b 0a 23 65 6e 64  context) );.#end
87e0: 69 66 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76  if.}   .static v
87f0: 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a  oid countFinaliz
8800: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
8810: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 43  t *context){.  C
8820: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
8830: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
8840: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
8850: 65 78 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ext, 0);.  sqlit
8860: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
8870: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
8880: 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n : 0);.}../*.**
8890: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70   Routines to imp
88a0: 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e 64  lement min() and
88b0: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
88c0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   functions..*/.s
88d0: 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61  tatic void minma
88e0: 78 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  xStep(.  sqlite3
88f0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
8900: 74 2c 20 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  t, .  int NotUse
8910: 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  d, .  sqlite3_va
8920: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
8930: 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20 28 4d 65  Mem *pArg  = (Me
8940: 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a 20 20 4d  m *)argv[0];.  M
8950: 65 6d 20 2a 70 42 65 73 74 3b 0a 20 20 55 4e 55  em *pBest;.  UNU
8960: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
8970: 74 55 73 65 64 29 3b 0a 0a 20 20 69 66 28 20 73  tUsed);..  if( s
8980: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8990: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
89a0: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
89b0: 3b 0a 20 20 70 42 65 73 74 20 3d 20 28 4d 65 6d  ;.  pBest = (Mem
89c0: 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65   *)sqlite3_aggre
89d0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
89e0: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42  text, sizeof(*pB
89f0: 65 73 74 29 29 3b 0a 20 20 69 66 28 20 21 70 42  est));.  if( !pB
8a00: 65 73 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  est ) return;.. 
8a10: 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67   if( pBest->flag
8a20: 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78  s ){.    int max
8a30: 3b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20  ;.    int cmp;. 
8a40: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
8a50: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75  l = sqlite3GetFu
8a60: 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78  ncCollSeq(contex
8a70: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  t);.    /* This 
8a80: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73  step function is
8a90: 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
8aa0: 68 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78  he min() and max
8ab0: 28 29 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20  () aggregates,. 
8ac0: 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64     ** the only d
8ad0: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
8ae0: 6e 20 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20  n the two being 
8af0: 74 68 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f  that the sense o
8b00: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  f the.    ** com
8b10: 70 61 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72  parison is inver
8b20: 74 65 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78  ted. For the max
8b30: 28 29 20 61 67 67 72 65 67 61 74 65 2c 20 74 68  () aggregate, th
8b40: 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
8b50: 5f 75 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e  _user_data() fun
8b60: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76  ction returns (v
8b70: 6f 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69  oid *)-1. For mi
8b80: 6e 28 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65  n() it.    ** re
8b90: 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62  turns (void *)db
8ba0: 2c 20 77 68 65 72 65 20 64 62 20 69 73 20 74 68  , where db is th
8bb0: 65 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62  e sqlite3* datab
8bc0: 61 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20  ase pointer..   
8bd0: 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68   ** Therefore th
8be0: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
8bf0: 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 27   sets variable '
8c00: 6d 61 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68  max' to 1 for th
8c10: 65 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61  e max().    ** a
8c20: 67 67 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66  ggregate, or 0 f
8c30: 6f 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  or min()..    */
8c40: 0a 20 20 20 20 6d 61 78 20 3d 20 73 71 6c 69 74  .    max = sqlit
8c50: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
8c60: 74 65 78 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d  text)!=0;.    cm
8c70: 70 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  p = sqlite3MemCo
8c80: 6d 70 61 72 65 28 70 42 65 73 74 2c 20 70 41 72  mpare(pBest, pAr
8c90: 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  g, pColl);.    i
8ca0: 66 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30  f( (max && cmp<0
8cb0: 29 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d  ) || (!max && cm
8cc0: 70 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  p>0) ){.      sq
8cd0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
8ce0: 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20  (pBest, pArg);. 
8cf0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
8d00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
8d10: 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41 72 67  Copy(pBest, pArg
8d20: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
8d30: 76 6f 69 64 20 6d 69 6e 4d 61 78 46 69 6e 61 6c  void minMaxFinal
8d40: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
8d50: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
8d60: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8d70: 70 52 65 73 3b 0a 20 20 70 52 65 73 20 3d 20 28  pRes;.  pRes = (
8d80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 29  sqlite3_value *)
8d90: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
8da0: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
8db0: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 52 65  t, 0);.  if( pRe
8dc0: 73 20 29 7b 0a 20 20 20 20 69 66 28 20 41 4c 57  s ){.    if( ALW
8dd0: 41 59 53 28 70 52 65 73 2d 3e 66 6c 61 67 73 29  AYS(pRes->flags)
8de0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8df0: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
8e00: 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b 0a 20  ontext, pRes);. 
8e10: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8e20: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
8e30: 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Res);.  }.}../*.
8e40: 2a 2a 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  ** group_concat(
8e50: 45 58 50 52 2c 20 3f 53 45 50 41 52 41 54 4f 52  EXPR, ?SEPARATOR
8e60: 3f 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ?).*/.static voi
8e70: 64 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65  d groupConcatSte
8e80: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p(.  sqlite3_con
8e90: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
8ea0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
8eb0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
8ec0: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  v.){.  const cha
8ed0: 72 20 2a 7a 56 61 6c 3b 0a 20 20 53 74 72 41 63  r *zVal;.  StrAc
8ee0: 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 63  cum *pAccum;.  c
8ef0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b  onst char *zSep;
8f00: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 6e 53 65  .  int nVal, nSe
8f10: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  p;.  assert( arg
8f20: 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20  c==1 || argc==2 
8f30: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
8f40: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8f50: 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
8f60: 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 41  L ) return;.  pA
8f70: 63 63 75 6d 20 3d 20 28 53 74 72 41 63 63 75 6d  ccum = (StrAccum
8f80: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
8f90: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
8fa0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 41 63  ext, sizeof(*pAc
8fb0: 63 75 6d 29 29 3b 0a 0a 20 20 69 66 28 20 70 41  cum));..  if( pA
8fc0: 63 63 75 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69  ccum ){.    sqli
8fd0: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
8fe0: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
8ff0: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
9000: 20 20 69 6e 74 20 66 69 72 73 74 54 65 72 6d 20    int firstTerm 
9010: 3d 20 70 41 63 63 75 6d 2d 3e 75 73 65 4d 61 6c  = pAccum->useMal
9020: 6c 6f 63 3d 3d 30 3b 0a 20 20 20 20 70 41 63 63  loc==0;.    pAcc
9030: 75 6d 2d 3e 75 73 65 4d 61 6c 6c 6f 63 20 3d 20  um->useMalloc = 
9040: 31 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e 6d  1;.    pAccum->m
9050: 78 41 6c 6c 6f 63 20 3d 20 64 62 2d 3e 61 4c 69  xAlloc = db->aLi
9060: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
9070: 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 20 20 69 66  _LENGTH];.    if
9080: 28 20 21 66 69 72 73 74 54 65 72 6d 20 29 7b 0a  ( !firstTerm ){.
9090: 20 20 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d        if( argc==
90a0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65  2 ){.        zSe
90b0: 70 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  p = (char*)sqlit
90c0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
90d0: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  gv[1]);.        
90e0: 6e 53 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76  nSep = sqlite3_v
90f0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
9100: 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1]);.      }else
9110: 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  {.        zSep =
9120: 20 22 2c 22 3b 0a 20 20 20 20 20 20 20 20 6e 53   ",";.        nS
9130: 65 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ep = 1;.      }.
9140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
9150: 41 63 63 75 6d 41 70 70 65 6e 64 28 70 41 63 63  AccumAppend(pAcc
9160: 75 6d 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3b  um, zSep, nSep);
9170: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c 20  .    }.    zVal 
9180: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
9190: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
91a0: 5b 30 5d 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d  [0]);.    nVal =
91b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
91c0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
91d0: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
91e0: 75 6d 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c  umAppend(pAccum,
91f0: 20 7a 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20   zVal, nVal);.  
9200: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
9210: 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c  groupConcatFinal
9220: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
9230: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
9240: 20 53 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75   StrAccum *pAccu
9250: 6d 3b 0a 20 20 70 41 63 63 75 6d 20 3d 20 73 71  m;.  pAccum = sq
9260: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
9270: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
9280: 20 30 29 3b 0a 20 20 69 66 28 20 70 41 63 63 75   0);.  if( pAccu
9290: 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 63  m ){.    if( pAc
92a0: 63 75 6d 2d 3e 74 6f 6f 42 69 67 20 29 7b 0a 20  cum->tooBig ){. 
92b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
92c0: 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67  ult_error_toobig
92d0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  (context);.    }
92e0: 65 6c 73 65 20 69 66 28 20 70 41 63 63 75 6d 2d  else if( pAccum-
92f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
9310: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
9320: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
9330: 7d 65 6c 73 65 7b 20 20 20 20 0a 20 20 20 20 20  }else{    .     
9340: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9350: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  text(context, sq
9360: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
9370: 69 73 68 28 70 41 63 63 75 6d 29 2c 20 2d 31 2c  ish(pAccum), -1,
9380: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
9390: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
93a0: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d  te3_free);.    }
93b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
93c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69  is function regi
93d0: 73 74 65 72 65 64 20 61 6c 6c 20 6f 66 20 74 68  stered all of th
93e0: 65 20 61 62 6f 76 65 20 43 20 66 75 6e 63 74 69  e above C functi
93f0: 6f 6e 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75  ons as SQL.** fu
9400: 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73  nctions.  This s
9410: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c  hould be the onl
9420: 79 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69  y routine in thi
9430: 73 20 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65  s file with.** e
9440: 78 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e  xternal linkage.
9450: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9460: 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46  RegisterBuiltinF
9470: 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33  unctions(sqlite3
9480: 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20 53   *db){.#ifndef S
9490: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
94a0: 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 41  TABLE.  sqlite3A
94b0: 6c 74 65 72 46 75 6e 63 74 69 6f 6e 73 28 64 62  lterFunctions(db
94c0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
94d0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
94e0: 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  d ){.    int rc 
94f0: 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f  = sqlite3_overlo
9500: 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ad_function(db, 
9510: 22 4d 41 54 43 48 22 2c 20 32 29 3b 0a 20 20 20  "MATCH", 2);.   
9520: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
9530: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d  ITE_NOMEM || rc=
9540: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9550: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9560: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
9570: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9580: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
9590: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
95a0: 20 4c 49 4b 45 4f 50 54 20 66 6c 61 67 20 6f 6e   LIKEOPT flag on
95b0: 20 74 68 65 20 32 2d 61 72 67 75 6d 65 6e 74 20   the 2-argument 
95c0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
95d0: 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2f  e given name..*/
95e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
95f0: 4c 69 6b 65 4f 70 74 46 6c 61 67 28 73 71 6c 69  LikeOptFlag(sqli
9600: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
9610: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 75 38 20 66  har *zName, u8 f
9620: 6c 61 67 56 61 6c 29 7b 0a 20 20 46 75 6e 63 44  lagVal){.  FuncD
9630: 65 66 20 2a 70 44 65 66 3b 0a 20 20 70 44 65 66  ef *pDef;.  pDef
9640: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
9650: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  nction(db, zName
9660: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
9670: 30 28 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  0(zName),.      
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45         2, SQLITE
96a0: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69 66 28  _UTF8, 0);.  if(
96b0: 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 29 7b   ALWAYS(pDef) ){
96c0: 0a 20 20 20 20 70 44 65 66 2d 3e 66 6c 61 67 73  .    pDef->flags
96d0: 20 3d 20 66 6c 61 67 56 61 6c 3b 0a 20 20 7d 0a   = flagVal;.  }.
96e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
96f0: 72 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 4c  r the built-in L
9700: 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e  IKE and GLOB fun
9710: 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 63 61 73  ctions.  The cas
9720: 65 53 65 6e 73 69 74 69 76 65 0a 2a 2a 20 70 61  eSensitive.** pa
9730: 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
9740: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
9750: 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  t the LIKE opera
9760: 74 6f 72 20 69 73 20 63 61 73 65 0a 2a 2a 20 73  tor is case.** s
9770: 65 6e 73 69 74 69 76 65 2e 20 20 47 4c 4f 42 20  ensitive.  GLOB 
9780: 69 73 20 61 6c 77 61 79 73 20 63 61 73 65 20 73  is always case s
9790: 65 6e 73 69 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69  ensitive..*/.voi
97a0: 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  d sqlite3Registe
97b0: 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 73  rLikeFunctions(s
97c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
97d0: 63 61 73 65 53 65 6e 73 69 74 69 76 65 29 7b 0a  caseSensitive){.
97e0: 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65    struct compare
97f0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 69  Info *pInfo;.  i
9800: 66 28 20 63 61 73 65 53 65 6e 73 69 74 69 76 65  f( caseSensitive
9810: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20   ){.    pInfo = 
9820: 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49  (struct compareI
9830: 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  nfo*)&likeInfoAl
9840: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
9850: 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20  pInfo = (struct 
9860: 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69  compareInfo*)&li
9870: 6b 65 49 6e 66 6f 4e 6f 72 6d 3b 0a 20 20 7d 0a  keInfoNorm;.  }.
9880: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46    sqlite3CreateF
9890: 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20  unc(db, "like", 
98a0: 32 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 70  2, SQLITE_ANY, p
98b0: 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20  Info, likeFunc, 
98c0: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
98d0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22  CreateFunc(db, "
98e0: 6c 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49 54 45  like", 3, SQLITE
98f0: 5f 41 4e 59 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b  _ANY, pInfo, lik
9900: 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  eFunc, 0, 0);.  
9910: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
9920: 63 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20 32 2c  c(db, "glob", 2,
9930: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 0a 20 20   SQLITE_ANY, .  
9940: 20 20 20 20 28 73 74 72 75 63 74 20 63 6f 6d 70      (struct comp
9950: 61 72 65 49 6e 66 6f 2a 29 26 67 6c 6f 62 49 6e  areInfo*)&globIn
9960: 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c  fo, likeFunc, 0,
9970: 30 29 3b 0a 20 20 73 65 74 4c 69 6b 65 4f 70 74  0);.  setLikeOpt
9980: 46 6c 61 67 28 64 62 2c 20 22 67 6c 6f 62 22 2c  Flag(db, "glob",
9990: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
99a0: 45 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  E | SQLITE_FUNC_
99b0: 43 41 53 45 29 3b 0a 20 20 73 65 74 4c 69 6b 65  CASE);.  setLike
99c0: 4f 70 74 46 6c 61 67 28 64 62 2c 20 22 6c 69 6b  OptFlag(db, "lik
99d0: 65 22 2c 20 0a 20 20 20 20 20 20 63 61 73 65 53  e", .      caseS
99e0: 65 6e 73 69 74 69 76 65 20 3f 20 28 53 51 4c 49  ensitive ? (SQLI
99f0: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53  TE_FUNC_LIKE | S
9a00: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29  QLITE_FUNC_CASE)
9a10: 20 3a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c   : SQLITE_FUNC_L
9a20: 49 4b 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  IKE);.}../*.** p
9a30: 45 78 70 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  Expr points to a
9a40: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68 69  n expression whi
9a50: 63 68 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  ch implements a 
9a60: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 0a 2a 2a  function.  If.**
9a70: 20 69 74 20 69 73 20 61 70 70 72 6f 70 72 69 61   it is appropria
9a80: 74 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20  te to apply the 
9a90: 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
9aa0: 6e 20 74 6f 20 74 68 61 74 20 66 75 6e 63 74 69  n to that functi
9ab0: 6f 6e 0a 2a 2a 20 74 68 65 6e 20 73 65 74 20 61  on.** then set a
9ac0: 57 63 5b 30 5d 20 74 68 72 6f 75 67 68 20 61 57  Wc[0] through aW
9ad0: 63 5b 32 5d 20 74 6f 20 74 68 65 20 77 69 6c 64  c[2] to the wild
9ae0: 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20  card characters 
9af0: 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 54 52  and.** return TR
9b00: 55 45 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63  UE.  If the func
9b10: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20 4c 49  tion is not a LI
9b20: 4b 45 2d 73 74 79 6c 65 20 66 75 6e 63 74 69 6f  KE-style functio
9b30: 6e 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  n then.** return
9b40: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e 74 20 73   FALSE..*/.int s
9b50: 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63  qlite3IsLikeFunc
9b60: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
9b70: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
9b80: 6e 74 20 2a 70 49 73 4e 6f 63 61 73 65 2c 20 63  nt *pIsNocase, c
9b90: 68 61 72 20 2a 61 57 63 29 7b 0a 20 20 46 75 6e  har *aWc){.  Fun
9ba0: 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 69 66  cDef *pDef;.  if
9bb0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
9bc0: 46 55 4e 43 54 49 4f 4e 20 0a 20 20 20 7c 7c 20  FUNCTION .   || 
9bd0: 21 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20  !pExpr->x.pList 
9be0: 0a 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 78 2e  .   || pExpr->x.
9bf0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 0a  pList->nExpr!=2.
9c00: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
9c10: 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
9c20: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9c30: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
9c40: 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 44 65 66  elect) );.  pDef
9c50: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
9c60: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72  nction(db, pExpr
9c70: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20  ->u.zToken, .   
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9ca0: 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d  3Strlen30(pExpr-
9cb0: 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20  >u.zToken),.    
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 20 20 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49           2, SQLI
9ce0: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69  TE_UTF8, 0);.  i
9cf0: 66 28 20 4e 45 56 45 52 28 70 44 65 66 3d 3d 30  f( NEVER(pDef==0
9d00: 29 20 7c 7c 20 28 70 44 65 66 2d 3e 66 6c 61 67  ) || (pDef->flag
9d10: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
9d20: 4c 49 4b 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LIKE)==0 ){.    
9d30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
9d40: 20 2f 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29   /* The memcpy()
9d50: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 75 6d   statement assum
9d60: 65 73 20 74 68 61 74 20 74 68 65 20 77 69 6c 64  es that the wild
9d70: 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20  card characters 
9d80: 61 72 65 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  are.  ** the fir
9d90: 73 74 20 74 68 72 65 65 20 73 74 61 74 65 6d 65  st three stateme
9da0: 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 61  nts in the compa
9db0: 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
9dc0: 2e 20 20 54 68 65 0a 20 20 2a 2a 20 61 73 73 65  .  The.  ** asse
9dd0: 72 74 73 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f  rts() that follo
9de0: 77 20 76 65 72 69 66 79 20 74 68 61 74 20 61 73  w verify that as
9df0: 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  sumption.  */.  
9e00: 6d 65 6d 63 70 79 28 61 57 63 2c 20 70 44 65 66  memcpy(aWc, pDef
9e10: 2d 3e 70 55 73 65 72 44 61 74 61 2c 20 33 29 3b  ->pUserData, 3);
9e20: 0a 20 20 61 73 73 65 72 74 28 20 28 63 68 61 72  .  assert( (char
9e30: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d  *)&likeInfoAlt =
9e40: 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  = (char*)&likeIn
9e50: 66 6f 41 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29  foAlt.matchAll )
9e60: 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28 28 63  ;.  assert( &((c
9e70: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
9e80: 74 29 5b 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29  t)[1] == (char*)
9e90: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74  &likeInfoAlt.mat
9ea0: 63 68 4f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72  chOne );.  asser
9eb0: 74 28 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b  t( &((char*)&lik
9ec0: 65 49 6e 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20  eInfoAlt)[2] == 
9ed0: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
9ee0: 41 6c 74 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a  Alt.matchSet );.
9ef0: 20 20 2a 70 49 73 4e 6f 63 61 73 65 20 3d 20 28    *pIsNocase = (
9f00: 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
9f10: 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3d  LITE_FUNC_CASE)=
9f20: 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  =0;.  return 1;.
9f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 61 6c 6c  }../*.** All all
9f40: 20 6f 66 20 74 68 65 20 46 75 6e 63 44 65 66 20   of the FuncDef 
9f50: 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
9f60: 65 20 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d  e aBuiltinFunc[]
9f70: 20 61 72 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20   array above.** 
9f80: 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75  to the global fu
9f90: 6e 63 74 69 6f 6e 20 68 61 73 68 20 74 61 62 6c  nction hash tabl
9fa0: 65 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 20  e.  This occurs 
9fb0: 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20 28 61  at start-time (a
9fc0: 73 0a 2a 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e  s.** a consequen
9fd0: 63 65 20 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71  ce of calling sq
9fe0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
9ff0: 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ())..**.** After
a000: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
a010: 6e 73 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ns.*/.void sqlit
a020: 65 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c  e3RegisterGlobal
a030: 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b  Functions(void){
a040: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  /*.  ** The f
a050: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68  ollowing array h
a060: 6f 6c 64 73 20 46 75 6e 63 44 65 66 20 73 74 72  olds FuncDef str
a070: 75 63 74 75 72 65 73 20 66 6f 72 20 61 6c 6c 20  uctures for all 
a080: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73  of the functions
a090: 0a 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 69 6e  .  ** defined in
a0a0: 20 74 68 69 73 20 66 69 6c 65 2e 0a 20 20 2a 2a   this file..  **
a0b0: 0a 20 20 2a 2a 20 54 68 65 20 61 72 72 61 79 20  .  ** The array 
a0c0: 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61  cannot be consta
a0d0: 6e 74 20 73 69 6e 63 65 20 63 68 61 6e 67 65 73  nt since changes
a0e0: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
a0f0: 0a 20 20 2a 2a 20 46 75 6e 63 44 65 66 2e 70 48  .  ** FuncDef.pH
a100: 61 73 68 20 65 6c 65 6d 65 6e 74 73 20 61 74 20  ash elements at 
a110: 73 74 61 72 74 2d 74 69 6d 65 2e 20 20 54 68 65  start-time.  The
a120: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 69   elements of thi
a130: 73 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 72 65  s array.  ** are
a140: 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
a150: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
a160: 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a  is complete..  *
a170: 2f 0a 20 20 73 74 61 74 69 63 20 53 51 4c 49 54  /.  static SQLIT
a180: 45 5f 57 53 44 20 46 75 6e 63 44 65 66 20 61 42  E_WSD FuncDef aB
a190: 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b  uiltinFunc[] = {
a1a0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74  .    FUNCTION(lt
a1b0: 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rim,            
a1c0: 20 20 31 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46    1, 1, 0, trimF
a1d0: 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20  unc         ),. 
a1e0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69     FUNCTION(ltri
a1f0: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
a200: 32 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e  2, 1, 0, trimFun
a210: 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  c         ),.   
a220: 20 46 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c   FUNCTION(rtrim,
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
a240: 20 32 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20   2, 0, trimFunc 
a250: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
a260: 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20  UNCTION(rtrim,  
a270: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 32              2, 2
a280: 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20  , 0, trimFunc   
a290: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
a2a0: 43 54 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20  CTION(trim,     
a2b0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 33 2c 20            1, 3, 
a2c0: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
a2d0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
a2e0: 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20  ION(trim,       
a2f0: 20 20 20 20 20 20 20 20 32 2c 20 33 2c 20 30 2c          2, 3, 0,
a300: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
a310: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
a320: 4e 28 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20  N(min,          
a330: 20 20 20 20 20 2d 31 2c 20 30 2c 20 31 2c 20 6d       -1, 0, 1, m
a340: 69 6e 6d 61 78 46 75 6e 63 20 20 20 20 20 20 20  inmaxFunc       
a350: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
a360: 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  min,            
a370: 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 30 20 20      0, 0, 1, 0  
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 2c                ),
a390: 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28 6d  .    AGGREGATE(m
a3a0: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
a3b0: 20 20 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61    1, 0, 1, minma
a3c0: 78 53 74 65 70 2c 20 20 20 20 20 20 6d 69 6e 4d  xStep,      minM
a3d0: 61 78 46 69 6e 61 6c 69 7a 65 20 29 2c 0a 20 20  axFinalize ),.  
a3e0: 20 20 46 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20    FUNCTION(max, 
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31                -1
a400: 2c 20 31 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75  , 1, 1, minmaxFu
a410: 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  nc       ),.    
a420: 46 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20  FUNCTION(max,   
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
a440: 31 2c 20 31 2c 20 30 20 20 20 20 20 20 20 20 20  1, 1, 0         
a450: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 41 47         ),.    AG
a460: 47 52 45 47 41 54 45 28 6d 61 78 2c 20 20 20 20  GREGATE(max,    
a470: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c             1, 1,
a480: 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20   1, minmaxStep, 
a490: 20 20 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c       minMaxFinal
a4a0: 69 7a 65 20 29 2c 0a 20 20 20 20 46 55 4e 43 54  ize ),.    FUNCT
a4b0: 49 4f 4e 28 74 79 70 65 6f 66 2c 20 20 20 20 20  ION(typeof,     
a4c0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
a4d0: 20 74 79 70 65 6f 66 46 75 6e 63 20 20 20 20 20   typeofFunc     
a4e0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
a4f0: 4e 28 6c 65 6e 67 74 68 2c 20 20 20 20 20 20 20  N(length,       
a500: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c        1, 0, 0, l
a510: 65 6e 67 74 68 46 75 6e 63 20 20 20 20 20 20 20  engthFunc       
a520: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
a530: 73 75 62 73 74 72 2c 20 20 20 20 20 20 20 20 20  substr,         
a540: 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 73 75 62      2, 0, 0, sub
a550: 73 74 72 46 75 6e 63 20 20 20 20 20 20 20 29 2c  strFunc       ),
a560: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 75  .    FUNCTION(su
a570: 62 73 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  bstr,           
a580: 20 20 33 2c 20 30 2c 20 30 2c 20 73 75 62 73 74    3, 0, 0, subst
a590: 72 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  rFunc       ),. 
a5a0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 61 62 73 2c     FUNCTION(abs,
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5c0: 31 2c 20 30 2c 20 30 2c 20 61 62 73 46 75 6e 63  1, 0, 0, absFunc
a5d0: 20 20 20 20 20 20 20 20 20 20 29 2c 0a 23 69 66            ),.#if
a5e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a5f0: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
a600: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75      FUNCTION(rou
a610: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
a620: 20 31 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46   1, 0, 0, roundF
a630: 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20  unc        ),.  
a640: 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64    FUNCTION(round
a650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  ,              2
a660: 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e  , 0, 0, roundFun
a670: 63 20 20 20 20 20 20 20 20 29 2c 0a 23 65 6e 64  c        ),.#end
a680: 69 66 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  if.    FUNCTION(
a690: 75 70 70 65 72 2c 20 20 20 20 20 20 20 20 20 20  upper,          
a6a0: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 75 70 70      1, 0, 0, upp
a6b0: 65 72 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c  erFunc        ),
a6c0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f  .    FUNCTION(lo
a6d0: 77 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  wer,            
a6e0: 20 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 77 65 72    1, 0, 0, lower
a6f0: 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20  Func        ),. 
a700: 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c     FUNCTION(coal
a710: 65 73 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  esce,           
a720: 31 2c 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20  1, 0, 0, 0      
a730: 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20            ),.   
a740: 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73   FUNCTION(coales
a750: 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 2c  ce,           0,
a760: 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20   0, 0, 0        
a770: 20 20 20 20 20 20 20 20 29 2c 0a 2f 2a 20 20 46          ),./*  F
a780: 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65  UNCTION(coalesce
a790: 2c 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30  ,          -1, 0
a7a0: 2c 20 30 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20  , 0, ifnullFunc 
a7b0: 20 20 20 20 20 20 29 2c 20 2a 2f 0a 20 20 20 20        ), */.    
a7c0: 7b 2d 31 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c  {-1,SQLITE_UTF8,
a7d0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
a7e0: 45 53 43 45 2c 30 2c 30 2c 69 66 6e 75 6c 6c 46  ESCE,0,0,ifnullF
a7f0: 75 6e 63 2c 30 2c 30 2c 22 63 6f 61 6c 65 73 63  unc,0,0,"coalesc
a800: 65 22 2c 30 7d 2c 0a 20 20 20 20 46 55 4e 43 54  e",0},.    FUNCT
a810: 49 4f 4e 28 68 65 78 2c 20 20 20 20 20 20 20 20  ION(hex,        
a820: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
a830: 20 68 65 78 46 75 6e 63 20 20 20 20 20 20 20 20   hexFunc        
a840: 20 20 29 2c 0a 2f 2a 20 20 46 55 4e 43 54 49 4f    ),./*  FUNCTIO
a850: 4e 28 69 66 6e 75 6c 6c 2c 20 20 20 20 20 20 20  N(ifnull,       
a860: 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 69        2, 0, 0, i
a870: 66 6e 75 6c 6c 46 75 6e 63 20 20 20 20 20 20 20  fnullFunc       
a880: 29 2c 20 2a 2f 0a 20 20 20 20 7b 32 2c 53 51 4c  ), */.    {2,SQL
a890: 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f  ITE_UTF8,SQLITE_
a8a0: 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 2c 30 2c  FUNC_COALESCE,0,
a8b0: 30 2c 69 66 6e 75 6c 6c 46 75 6e 63 2c 30 2c 30  0,ifnullFunc,0,0
a8c0: 2c 22 69 66 6e 75 6c 6c 22 2c 30 7d 2c 0a 20 20  ,"ifnull",0},.  
a8d0: 20 20 46 55 4e 43 54 49 4f 4e 28 72 61 6e 64 6f    FUNCTION(rando
a8e0: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  m,             0
a8f0: 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d 46 75  , 0, 0, randomFu
a900: 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  nc       ),.    
a910: 46 55 4e 43 54 49 4f 4e 28 72 61 6e 64 6f 6d 62  FUNCTION(randomb
a920: 6c 6f 62 2c 20 20 20 20 20 20 20 20 20 31 2c 20  lob,         1, 
a930: 30 2c 20 30 2c 20 72 61 6e 64 6f 6d 42 6c 6f 62  0, 0, randomBlob
a940: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
a950: 4e 43 54 49 4f 4e 28 6e 75 6c 6c 69 66 2c 20 20  NCTION(nullif,  
a960: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
a970: 20 31 2c 20 6e 75 6c 6c 69 66 46 75 6e 63 20 20   1, nullifFunc  
a980: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
a990: 54 49 4f 4e 28 73 71 6c 69 74 65 5f 76 65 72 73  TION(sqlite_vers
a9a0: 69 6f 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  ion,     0, 0, 0
a9b0: 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63 20 20 20  , versionFunc   
a9c0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
a9d0: 4f 4e 28 73 71 6c 69 74 65 5f 73 6f 75 72 63 65  ON(sqlite_source
a9e0: 5f 69 64 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  _id,   0, 0, 0, 
a9f0: 73 6f 75 72 63 65 69 64 46 75 6e 63 20 20 20 20  sourceidFunc    
aa00: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
aa10: 28 71 75 6f 74 65 2c 20 20 20 20 20 20 20 20 20  (quote,         
aa20: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 71 75       1, 0, 0, qu
aa30: 6f 74 65 46 75 6e 63 20 20 20 20 20 20 20 20 29  oteFunc        )
aa40: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c  ,.    FUNCTION(l
aa50: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
aa60: 2c 20 20 30 2c 20 30 2c 20 30 2c 20 6c 61 73 74  ,  0, 0, 0, last
aa70: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 29 2c 0a  _insert_rowid),.
aa80: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 68 61      FUNCTION(cha
aa90: 6e 67 65 73 2c 20 20 20 20 20 20 20 20 20 20 20  nges,           
aaa0: 20 30 2c 20 30 2c 20 30 2c 20 63 68 61 6e 67 65   0, 0, 0, change
aab0: 73 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20  s          ),.  
aac0: 20 20 46 55 4e 43 54 49 4f 4e 28 74 6f 74 61 6c    FUNCTION(total
aad0: 5f 63 68 61 6e 67 65 73 2c 20 20 20 20 20 20 30  _changes,      0
aae0: 2c 20 30 2c 20 30 2c 20 74 6f 74 61 6c 5f 63 68  , 0, 0, total_ch
aaf0: 61 6e 67 65 73 20 20 20 20 29 2c 0a 20 20 20 20  anges    ),.    
ab00: 46 55 4e 43 54 49 4f 4e 28 72 65 70 6c 61 63 65  FUNCTION(replace
ab10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 33 2c 20  ,            3, 
ab20: 30 2c 20 30 2c 20 72 65 70 6c 61 63 65 46 75 6e  0, 0, replaceFun
ab30: 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55  c      ),.    FU
ab40: 4e 43 54 49 4f 4e 28 7a 65 72 6f 62 6c 6f 62 2c  NCTION(zeroblob,
ab50: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
ab60: 20 30 2c 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63   0, zeroblobFunc
ab70: 20 20 20 20 20 29 2c 0a 20 20 23 69 66 64 65 66       ),.  #ifdef
ab80: 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a   SQLITE_SOUNDEX.
ab90: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 6f 75      FUNCTION(sou
aba0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
abb0: 20 31 2c 20 30 2c 20 30 2c 20 73 6f 75 6e 64 65   1, 0, 0, sounde
abc0: 78 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20  xFunc      ),.  
abd0: 23 65 6e 64 69 66 0a 20 20 23 69 66 6e 64 65 66  #endif.  #ifndef
abe0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
abf0: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
ac00: 46 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78  FUNCTION(load_ex
ac10: 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 31 2c 20  tension,     1, 
ac20: 30 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20  0, 0, loadExt   
ac30: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
ac40: 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65  NCTION(load_exte
ac50: 6e 73 69 6f 6e 2c 20 20 20 20 20 32 2c 20 30 2c  nsion,     2, 0,
ac60: 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20 20 20   0, loadExt     
ac70: 20 20 20 20 20 29 2c 0a 20 20 23 65 6e 64 69 66       ),.  #endif
ac80: 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28 73  .    AGGREGATE(s
ac90: 75 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  um,             
aca0: 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74    1, 0, 0, sumSt
acb0: 65 70 2c 20 20 20 20 20 20 20 20 20 73 75 6d 46  ep,         sumF
acc0: 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20  inalize    ),.  
acd0: 20 20 41 47 47 52 45 47 41 54 45 28 74 6f 74 61    AGGREGATE(tota
ace0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31  l,             1
acf0: 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c  , 0, 0, sumStep,
ad00: 20 20 20 20 20 20 20 20 20 74 6f 74 61 6c 46 69           totalFi
ad10: 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20 20  nalize    ),.   
ad20: 20 41 47 47 52 45 47 41 54 45 28 61 76 67 2c 20   AGGREGATE(avg, 
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
ad40: 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20   0, 0, sumStep, 
ad50: 20 20 20 20 20 20 20 20 61 76 67 46 69 6e 61 6c          avgFinal
ad60: 69 7a 65 20 20 20 20 29 2c 0a 20 2f 2a 20 41 47  ize    ),. /* AG
ad70: 47 52 45 47 41 54 45 28 63 6f 75 6e 74 2c 20 20  GREGATE(count,  
ad80: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
ad90: 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20   0, countStep,  
ada0: 20 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69       countFinali
adb0: 7a 65 20 20 29 2c 20 2a 2f 0a 20 20 20 20 7b 30  ze  ), */.    {0
adc0: 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c  ,SQLITE_UTF8,SQL
add0: 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 2c 30  ITE_FUNC_COUNT,0
ade0: 2c 30 2c 30 2c 63 6f 75 6e 74 53 74 65 70 2c 63  ,0,0,countStep,c
adf0: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 22 63 6f  ountFinalize,"co
ae00: 75 6e 74 22 2c 30 7d 2c 0a 20 20 20 20 41 47 47  unt",0},.    AGG
ae10: 52 45 47 41 54 45 28 63 6f 75 6e 74 2c 20 20 20  REGATE(count,   
ae20: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
ae30: 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20 20  0, countStep,   
ae40: 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a      countFinaliz
ae50: 65 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47  e  ),.    AGGREG
ae60: 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ATE(group_concat
ae70: 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20  ,      1, 0, 0, 
ae80: 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 2c  groupConcatStep,
ae90: 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61   groupConcatFina
aea0: 6c 69 7a 65 29 2c 0a 20 20 20 20 41 47 47 52 45  lize),.    AGGRE
aeb0: 47 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61  GATE(group_conca
aec0: 74 2c 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c  t,      2, 0, 0,
aed0: 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70   groupConcatStep
aee0: 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e  , groupConcatFin
aef0: 61 6c 69 7a 65 29 2c 0a 20 20 0a 20 20 20 20 4c  alize),.  .    L
af00: 49 4b 45 46 55 4e 43 28 67 6c 6f 62 2c 20 32 2c  IKEFUNC(glob, 2,
af10: 20 26 67 6c 6f 62 49 6e 66 6f 2c 20 53 51 4c 49   &globInfo, SQLI
af20: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c  TE_FUNC_LIKE|SQL
af30: 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a  ITE_FUNC_CASE),.
af40: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
af50: 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c  CASE_SENSITIVE_L
af60: 49 4b 45 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43  IKE.    LIKEFUNC
af70: 28 6c 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49  (like, 2, &likeI
af80: 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46  nfoAlt, SQLITE_F
af90: 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f  UNC_LIKE|SQLITE_
afa0: 46 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20 20 20  FUNC_CASE),.    
afb0: 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33  LIKEFUNC(like, 3
afc0: 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20  , &likeInfoAlt, 
afd0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
afe0: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53  |SQLITE_FUNC_CAS
aff0: 45 29 2c 0a 20 20 23 65 6c 73 65 0a 20 20 20 20  E),.  #else.    
b000: 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32  LIKEFUNC(like, 2
b010: 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c  , &likeInfoNorm,
b020: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
b030: 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43  E),.    LIKEFUNC
b040: 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49  (like, 3, &likeI
b050: 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f  nfoNorm, SQLITE_
b060: 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20 23 65  FUNC_LIKE),.  #e
b070: 6e 64 69 66 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74  ndif.  };..  int
b080: 20 69 3b 0a 20 20 46 75 6e 63 44 65 66 48 61 73   i;.  FuncDefHas
b090: 68 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42  h *pHash = &GLOB
b0a0: 41 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20  AL(FuncDefHash, 
b0b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e  sqlite3GlobalFun
b0c0: 63 74 69 6f 6e 73 29 3b 0a 20 20 46 75 6e 63 44  ctions);.  FuncD
b0d0: 65 66 20 2a 61 46 75 6e 63 20 3d 20 28 46 75 6e  ef *aFunc = (Fun
b0e0: 63 44 65 66 2a 29 26 47 4c 4f 42 41 4c 28 46 75  cDef*)&GLOBAL(Fu
b0f0: 6e 63 44 65 66 2c 20 61 42 75 69 6c 74 69 6e 46  ncDef, aBuiltinF
b100: 75 6e 63 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  unc);..  for(i=0
b110: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 42  ; i<ArraySize(aB
b120: 75 69 6c 74 69 6e 46 75 6e 63 29 3b 20 69 2b 2b  uiltinFunc); i++
b130: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 75  ){.    sqlite3Fu
b140: 6e 63 44 65 66 49 6e 73 65 72 74 28 70 48 61 73  ncDefInsert(pHas
b150: 68 2c 20 26 61 46 75 6e 63 5b 69 5d 29 3b 0a 20  h, &aFunc[i]);. 
b160: 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69   }.  sqlite3Regi
b170: 73 74 65 72 44 61 74 65 54 69 6d 65 46 75 6e 63  sterDateTimeFunc
b180: 74 69 6f 6e 73 28 29 3b 0a 7d 0a                 tions();.}.