/ Hex Artifact Content
Login

Artifact f829e79fe7c7150659bee6d521b1edbda4a97dc3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 32 20 46 65 62 72 75  /*.** 2002 Febru
0010: 61 72 79 20 32 33 0a 2a 2a 0a 2a 2a 20 54 68 65  ary 23.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
0190: 43 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  C functions that
01a0: 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
01b0: 75 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74 69  us SQL.** functi
01c0: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 20 20  ons of SQLite.  
01d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
01e0: 6f 6e 6c 79 20 6f 6e 65 20 65 78 70 6f 72 74 65  only one exporte
01f0: 64 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73  d symbol in this
0200: 20 66 69 6c 65 20 2d 20 74 68 65 20 66 75 6e 63   file - the func
0210: 74 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65 52 65  tion.** sqliteRe
0220: 67 69 73 74 65 72 42 75 69 6c 64 69 6e 46 75 6e  gisterBuildinFun
0230: 63 74 69 6f 6e 73 28 29 20 66 6f 75 6e 64 20 61  ctions() found a
0240: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  t the bottom of 
0250: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 41 6c 6c  the file..** All
0260: 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20   other code has 
0270: 66 69 6c 65 20 73 63 6f 70 65 2e 0a 2a 2f 0a 23  file scope..*/.#
0280: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0290: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
02a0: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
02b0: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
02c0: 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e  nclude "vdbeInt.
02d0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  h"../*.** Return
02e0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
02f0: 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  unction associat
0300: 65 64 20 77 69 74 68 20 61 20 66 75 6e 63 74 69  ed with a functi
0310: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  on..*/.static Co
0320: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 47 65  llSeq *sqlite3Ge
0330: 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 73 71 6c  tFuncCollSeq(sql
0340: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
0350: 6e 74 65 78 74 29 7b 0a 20 20 72 65 74 75 72 6e  ntext){.  return
0360: 20 63 6f 6e 74 65 78 74 2d 3e 70 43 6f 6c 6c 3b   context->pColl;
0370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
0380: 74 65 20 74 68 61 74 20 74 68 65 20 61 63 63 75  te that the accu
0390: 6d 75 6c 61 74 6f 72 20 6c 6f 61 64 20 73 68 6f  mulator load sho
03a0: 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20 6f  uld be skipped o
03b0: 6e 20 74 68 69 73 0a 2a 2a 20 69 74 65 72 61 74  n this.** iterat
03c0: 69 6f 6e 20 6f 66 20 74 68 65 20 61 67 67 72 65  ion of the aggre
03d0: 67 61 74 65 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74  gate loop..*/.st
03e0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
03f0: 33 53 6b 69 70 41 63 63 75 6d 75 6c 61 74 6f 72  3SkipAccumulator
0400: 4c 6f 61 64 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Load(sqlite3_con
0410: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
0420: 20 20 63 6f 6e 74 65 78 74 2d 3e 73 6b 69 70 46    context->skipF
0430: 6c 61 67 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  lag = 1;.}../*.*
0440: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
0450: 20 6f 66 20 74 68 65 20 6e 6f 6e 2d 61 67 67 72   of the non-aggr
0460: 65 67 61 74 65 20 6d 69 6e 28 29 20 61 6e 64 20  egate min() and 
0470: 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 0a  max() functions.
0480: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
0490: 69 6e 6d 61 78 46 75 6e 63 28 0a 20 20 73 71 6c  inmaxFunc(.  sql
04a0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
04b0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
04c0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
04d0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
04e0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  nt i;.  int mask
04f0: 3b 20 20 20 20 2f 2a 20 30 20 66 6f 72 20 6d 69  ;    /* 0 for mi
0500: 6e 28 29 20 6f 72 20 30 78 66 66 66 66 66 66 66  n() or 0xfffffff
0510: 66 20 66 6f 72 20 6d 61 78 28 29 20 2a 2f 0a 20  f for max() */. 
0520: 20 69 6e 74 20 69 42 65 73 74 3b 0a 20 20 43 6f   int iBest;.  Co
0530: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
0540: 20 61 73 73 65 72 74 28 20 61 72 67 63 3e 31 20   assert( argc>1 
0550: 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 73 71 6c 69  );.  mask = sqli
0560: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
0570: 6e 74 65 78 74 29 3d 3d 30 20 3f 20 30 20 3a 20  ntext)==0 ? 0 : 
0580: 2d 31 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  -1;.  pColl = sq
0590: 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c  lite3GetFuncColl
05a0: 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  Seq(context);.  
05b0: 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 20 29 3b  assert( pColl );
05c0: 0a 20 20 61 73 73 65 72 74 28 20 6d 61 73 6b 3d  .  assert( mask=
05d0: 3d 2d 31 20 7c 7c 20 6d 61 73 6b 3d 3d 30 20 29  =-1 || mask==0 )
05e0: 3b 0a 20 20 69 42 65 73 74 20 3d 20 30 3b 0a 20  ;.  iBest = 0;. 
05f0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
0600: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
0610: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
0620: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
0630: 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
0640: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0650: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
0660: 5b 69 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [i])==SQLITE_NUL
0670: 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  L ) return;.    
0680: 69 66 28 20 28 73 71 6c 69 74 65 33 4d 65 6d 43  if( (sqlite3MemC
0690: 6f 6d 70 61 72 65 28 61 72 67 76 5b 69 42 65 73  ompare(argv[iBes
06a0: 74 5d 2c 20 61 72 67 76 5b 69 5d 2c 20 70 43 6f  t], argv[i], pCo
06b0: 6c 6c 29 5e 6d 61 73 6b 29 3e 3d 30 20 29 7b 0a  ll)^mask)>=0 ){.
06c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
06d0: 6d 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  mask==0 );.     
06e0: 20 69 42 65 73 74 20 3d 20 69 3b 0a 20 20 20 20   iBest = i;.    
06f0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
0700: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
0710: 74 65 78 74 2c 20 61 72 67 76 5b 69 42 65 73 74  text, argv[iBest
0720: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ]);.}../*.** Ret
0730: 75 72 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20  urn the type of 
0740: 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
0750: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 79 70  .static void typ
0760: 65 6f 66 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  eofFunc(.  sqlit
0770: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
0780: 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73  ext,.  int NotUs
0790: 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ed,.  sqlite3_va
07a0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
07b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
07c0: 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
07d0: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
07e0: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
07f0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
0800: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
0810: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
0820: 3a 20 7a 20 3d 20 22 69 6e 74 65 67 65 72 22 3b  : z = "integer";
0830: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0840: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 20 20   SQLITE_TEXT:   
0850: 20 7a 20 3d 20 22 74 65 78 74 22 3b 20 20 20 20   z = "text";    
0860: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0870: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 20 20  SQLITE_FLOAT:   
0880: 7a 20 3d 20 22 72 65 61 6c 22 3b 20 20 20 20 62  z = "real";    b
0890: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
08a0: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 20 20 20 7a  QLITE_BLOB:    z
08b0: 20 3d 20 22 62 6c 6f 62 22 3b 20 20 20 20 62 72   = "blob";    br
08c0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
08d0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  :             z 
08e0: 3d 20 22 6e 75 6c 6c 22 3b 20 20 20 20 62 72 65  = "null";    bre
08f0: 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ak;.  }.  sqlite
0900: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
0910: 6e 74 65 78 74 2c 20 7a 2c 20 2d 31 2c 20 53 51  ntext, z, -1, SQ
0920: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a  LITE_STATIC);.}.
0930: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
0940: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 65  tation of the le
0950: 6e 67 74 68 28 29 20 66 75 6e 63 74 69 6f 6e 0a  ngth() function.
0960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
0970: 65 6e 67 74 68 46 75 6e 63 28 0a 20 20 73 71 6c  engthFunc(.  sql
0980: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
0990: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
09a0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
09b0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
09c0: 6e 74 20 6c 65 6e 3b 0a 0a 20 20 61 73 73 65 72  nt len;..  asser
09d0: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
09e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
09f0: 28 61 72 67 63 29 3b 0a 20 20 73 77 69 74 63 68  (argc);.  switch
0a00: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
0a10: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b  type(argv[0]) ){
0a20: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0a30: 5f 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20  _BLOB:.    case 
0a40: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a  SQLITE_INTEGER:.
0a50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0a60: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73  FLOAT: {.      s
0a70: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
0a80: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
0a90: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
0aa0: 72 67 76 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[0]));.      
0ab0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
0ac0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
0ad0: 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  T: {.      const
0ae0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0af0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
0b00: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
0b10: 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  .      if( z==0 
0b20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
0b30: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  len = 0;.      w
0b40: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
0b50: 20 20 20 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 20      len++;.     
0b60: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
0b70: 54 46 38 28 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  TF8(z);.      }.
0b80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
0b90: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
0ba0: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  , len);.      br
0bb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
0bc0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
0bd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
0be0: 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ull(context);.  
0bf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0c00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  .  }.}../*.** Im
0c10: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
0c20: 74 68 65 20 61 62 73 28 29 20 66 75 6e 63 74 69  the abs() functi
0c30: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52  on..**.** IMP: R
0c40: 2d 32 33 39 37 39 2d 32 36 38 35 35 20 54 68 65  -23979-26855 The
0c50: 20 61 62 73 28 58 29 20 66 75 6e 63 74 69 6f 6e   abs(X) function
0c60: 20 72 65 74 75 72 6e 73 20 74 68 65 20 61 62 73   returns the abs
0c70: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 0a 2a  olute value of.*
0c80: 2a 20 74 68 65 20 6e 75 6d 65 72 69 63 20 61 72  * the numeric ar
0c90: 67 75 6d 65 6e 74 20 58 2e 20 0a 2a 2f 0a 73 74  gument X. .*/.st
0ca0: 61 74 69 63 20 76 6f 69 64 20 61 62 73 46 75 6e  atic void absFun
0cb0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
0cc0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
0cd0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
0ce0: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 61  lue **argv){.  a
0cf0: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
0d00: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
0d10: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 73 77  ETER(argc);.  sw
0d20: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
0d30: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
0d40: 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  ) ){.    case SQ
0d50: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
0d60: 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 20 3d        i64 iVal =
0d70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
0d80: 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
0d90: 20 20 20 20 20 69 66 28 20 69 56 61 6c 3c 30 20       if( iVal<0 
0da0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
0db0: 69 56 61 6c 3c 3c 31 29 3d 3d 30 20 29 7b 0a 20  iVal<<1)==0 ){. 
0dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
0dd0: 20 52 2d 33 35 34 36 30 2d 31 35 30 38 34 20 49   R-35460-15084 I
0de0: 66 20 58 20 69 73 20 74 68 65 20 69 6e 74 65 67  f X is the integ
0df0: 65 72 20 2d 39 32 32 33 33 37 32 30 33 36 38 35  er -922337203685
0e00: 34 37 37 35 38 30 37 20 74 68 65 6e 0a 20 20 20  4775807 then.   
0e10: 20 20 20 20 20 20 20 2a 2a 20 61 62 73 28 58 29         ** abs(X)
0e20: 20 74 68 72 6f 77 73 20 61 6e 20 69 6e 74 65 67   throws an integ
0e30: 65 72 20 6f 76 65 72 66 6c 6f 77 20 65 72 72 6f  er overflow erro
0e40: 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
0e50: 20 6e 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   no.          **
0e60: 20 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 73 69   equivalent posi
0e70: 74 69 76 65 20 36 34 2d 62 69 74 20 74 77 6f 20  tive 64-bit two 
0e80: 63 6f 6d 70 6c 65 6d 65 6e 74 20 76 61 6c 75 65  complement value
0e90: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
0ea0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
0eb0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 69 6e  ror(context, "in
0ec0: 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c  teger overflow",
0ed0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   -1);.          
0ee0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
0ef0: 7d 0a 20 20 20 20 20 20 20 20 69 56 61 6c 20 3d  }.        iVal =
0f00: 20 2d 69 56 61 6c 3b 0a 20 20 20 20 20 20 7d 20   -iVal;.      } 
0f10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
0f20: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
0f30: 65 78 74 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20  ext, iVal);.    
0f40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0f50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
0f60: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ULL: {.      /* 
0f70: 49 4d 50 3a 20 52 2d 33 37 34 33 34 2d 31 39 39  IMP: R-37434-199
0f80: 32 39 20 41 62 73 28 58 29 20 72 65 74 75 72 6e  29 Abs(X) return
0f90: 73 20 4e 55 4c 4c 20 69 66 20 58 20 69 73 20 4e  s NULL if X is N
0fa0: 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ULL. */.      sq
0fb0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
0fc0: 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  l(context);.    
0fd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0fe0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
0ff0: 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 73      /* Because s
1000: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
1010: 62 6c 65 28 29 20 72 65 74 75 72 6e 73 20 30 2e  ble() returns 0.
1020: 30 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  0 if the argumen
1030: 74 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  t is not.      *
1040: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  * something that
1050: 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65   can be converte
1060: 64 20 69 6e 74 6f 20 61 20 6e 75 6d 62 65 72 2c  d into a number,
1070: 20 77 65 20 68 61 76 65 3a 0a 20 20 20 20 20 20   we have:.      
1080: 2a 2a 20 49 4d 50 3a 20 52 2d 35 37 33 32 36 2d  ** IMP: R-57326-
1090: 33 31 35 34 31 20 41 62 73 28 58 29 20 72 65 74  31541 Abs(X) ret
10a0: 75 72 6e 20 30 2e 30 20 69 66 20 58 20 69 73 20  urn 0.0 if X is 
10b0: 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  a string or blob
10c0: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
10d0: 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74  annot be convert
10e0: 65 64 20 74 6f 20 61 20 6e 75 6d 65 72 69 63 20  ed to a numeric 
10f0: 76 61 6c 75 65 2e 20 0a 20 20 20 20 20 20 2a 2f  value. .      */
1100: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 56  .      double rV
1110: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
1120: 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30  ue_double(argv[0
1130: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 56  ]);.      if( rV
1140: 61 6c 3c 30 20 29 20 72 56 61 6c 20 3d 20 2d 72  al<0 ) rVal = -r
1150: 56 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Val;.      sqlit
1160: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
1170: 28 63 6f 6e 74 65 78 74 2c 20 72 56 61 6c 29 3b  (context, rVal);
1180: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1190: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
11a0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
11b0: 6f 66 20 74 68 65 20 69 6e 73 74 72 28 29 20 66  of the instr() f
11c0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69  unction..**.** i
11d0: 6e 73 74 72 28 68 61 79 73 74 61 63 6b 2c 6e 65  nstr(haystack,ne
11e0: 65 64 6c 65 29 20 66 69 6e 64 73 20 74 68 65 20  edle) finds the 
11f0: 66 69 72 73 74 20 6f 63 63 75 72 72 65 6e 63 65  first occurrence
1200: 20 6f 66 20 6e 65 65 64 6c 65 0a 2a 2a 20 69 6e   of needle.** in
1210: 20 68 61 79 73 74 61 63 6b 20 61 6e 64 20 72 65   haystack and re
1220: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
1230: 20 6f 66 20 70 72 65 76 69 6f 75 73 20 63 68 61   of previous cha
1240: 72 61 63 74 65 72 73 20 70 6c 75 73 20 31 2c 0a  racters plus 1,.
1250: 2a 2a 20 6f 72 20 30 20 69 66 20 6e 65 65 64 6c  ** or 0 if needl
1260: 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1270: 20 77 69 74 68 69 6e 20 68 61 79 73 74 61 63 6b   within haystack
1280: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20  ..**.** If both 
1290: 68 61 79 73 74 61 63 6b 20 61 6e 64 20 6e 65 65  haystack and nee
12a0: 64 6c 65 20 61 72 65 20 42 4c 4f 42 73 2c 20 74  dle are BLOBs, t
12b0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
12c0: 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  s one more than.
12d0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
12e0: 20 62 79 74 65 73 20 69 6e 20 68 61 79 73 74 61   bytes in haysta
12f0: 63 6b 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ck prior to the 
1300: 66 69 72 73 74 20 6f 63 63 75 72 72 65 6e 63 65  first occurrence
1310: 20 6f 66 20 6e 65 65 64 6c 65 2c 0a 2a 2a 20 6f   of needle,.** o
1320: 72 20 30 20 69 66 20 6e 65 65 64 6c 65 20 6e 65  r 0 if needle ne
1330: 76 65 72 20 6f 63 63 75 72 73 20 69 6e 20 68 61  ver occurs in ha
1340: 79 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  ystack..*/.stati
1350: 63 20 76 6f 69 64 20 69 6e 73 74 72 46 75 6e 63  c void instrFunc
1360: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1370: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
1380: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
1390: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
13a0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
13b0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 48 61 79 73  gned char *zHays
13c0: 74 61 63 6b 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  tack;.  const un
13d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e 65  signed char *zNe
13e0: 65 64 6c 65 3b 0a 20 20 69 6e 74 20 6e 48 61 79  edle;.  int nHay
13f0: 73 74 61 63 6b 3b 0a 20 20 69 6e 74 20 6e 4e 65  stack;.  int nNe
1400: 65 64 6c 65 3b 0a 20 20 69 6e 74 20 74 79 70 65  edle;.  int type
1410: 48 61 79 73 74 61 63 6b 2c 20 74 79 70 65 4e 65  Haystack, typeNe
1420: 65 64 6c 65 3b 0a 20 20 69 6e 74 20 4e 20 3d 20  edle;.  int N = 
1430: 31 3b 0a 20 20 69 6e 74 20 69 73 54 65 78 74 3b  1;.  int isText;
1440: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
1450: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 74 79  ETER(argc);.  ty
1460: 70 65 48 61 79 73 74 61 63 6b 20 3d 20 73 71 6c  peHaystack = sql
1470: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
1480: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 74 79 70 65  argv[0]);.  type
1490: 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69 74 65 33  Needle = sqlite3
14a0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
14b0: 5b 31 5d 29 3b 0a 20 20 69 66 28 20 74 79 70 65  [1]);.  if( type
14c0: 48 61 79 73 74 61 63 6b 3d 3d 53 51 4c 49 54 45  Haystack==SQLITE
14d0: 5f 4e 55 4c 4c 20 7c 7c 20 74 79 70 65 4e 65 65  _NULL || typeNee
14e0: 64 6c 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  dle==SQLITE_NULL
14f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 48 61   ) return;.  nHa
1500: 79 73 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  ystack = sqlite3
1510: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
1520: 76 5b 30 5d 29 3b 0a 20 20 6e 4e 65 65 64 6c 65  v[0]);.  nNeedle
1530: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1540: 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b  _bytes(argv[1]);
1550: 0a 20 20 69 66 28 20 74 79 70 65 48 61 79 73 74  .  if( typeHayst
1560: 61 63 6b 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ack==SQLITE_BLOB
1570: 20 26 26 20 74 79 70 65 4e 65 65 64 6c 65 3d 3d   && typeNeedle==
1580: 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20  SQLITE_BLOB ){. 
1590: 20 20 20 7a 48 61 79 73 74 61 63 6b 20 3d 20 73     zHaystack = s
15a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
15b0: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  b(argv[0]);.    
15c0: 7a 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69 74 65  zNeedle = sqlite
15d0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
15e0: 76 5b 31 5d 29 3b 0a 20 20 20 20 69 73 54 65 78  v[1]);.    isTex
15f0: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
1600: 20 20 20 20 7a 48 61 79 73 74 61 63 6b 20 3d 20      zHaystack = 
1610: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1620: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  xt(argv[0]);.   
1630: 20 7a 4e 65 65 64 6c 65 20 3d 20 73 71 6c 69 74   zNeedle = sqlit
1640: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
1650: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 73 54 65  gv[1]);.    isTe
1660: 78 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 77 68  xt = 1;.  }.  wh
1670: 69 6c 65 28 20 6e 4e 65 65 64 6c 65 3c 3d 6e 48  ile( nNeedle<=nH
1680: 61 79 73 74 61 63 6b 20 26 26 20 6d 65 6d 63 6d  aystack && memcm
1690: 70 28 7a 48 61 79 73 74 61 63 6b 2c 20 7a 4e 65  p(zHaystack, zNe
16a0: 65 64 6c 65 2c 20 6e 4e 65 65 64 6c 65 29 21 3d  edle, nNeedle)!=
16b0: 30 20 29 7b 0a 20 20 20 20 4e 2b 2b 3b 0a 20 20  0 ){.    N++;.  
16c0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 48 61 79    do{.      nHay
16d0: 73 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 7a  stack--;.      z
16e0: 48 61 79 73 74 61 63 6b 2b 2b 3b 0a 20 20 20 20  Haystack++;.    
16f0: 7d 77 68 69 6c 65 28 20 69 73 54 65 78 74 20 26  }while( isText &
1700: 26 20 28 7a 48 61 79 73 74 61 63 6b 5b 30 5d 26  & (zHaystack[0]&
1710: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b 0a 20  0xc0)==0x80 );. 
1720: 20 7d 0a 20 20 69 66 28 20 6e 4e 65 65 64 6c 65   }.  if( nNeedle
1730: 3e 6e 48 61 79 73 74 61 63 6b 20 29 20 4e 20 3d  >nHaystack ) N =
1740: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
1750: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
1760: 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , N);.}../*.** I
1770: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1780: 20 74 68 65 20 73 75 62 73 74 72 28 29 20 66 75   the substr() fu
1790: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 73 75  nction..**.** su
17a0: 62 73 74 72 28 78 2c 70 31 2c 70 32 29 20 20 72  bstr(x,p1,p2)  r
17b0: 65 74 75 72 6e 73 20 70 32 20 63 68 61 72 61 63  eturns p2 charac
17c0: 74 65 72 73 20 6f 66 20 78 5b 5d 20 62 65 67 69  ters of x[] begi
17d0: 6e 6e 69 6e 67 20 77 69 74 68 20 70 31 2e 0a 2a  nning with p1..*
17e0: 2a 20 70 31 20 69 73 20 31 2d 69 6e 64 65 78 65  * p1 is 1-indexe
17f0: 64 2e 20 20 53 6f 20 73 75 62 73 74 72 28 78 2c  d.  So substr(x,
1800: 31 2c 31 29 20 72 65 74 75 72 6e 73 20 74 68 65  1,1) returns the
1810: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
1820: 0a 2a 2a 20 6f 66 20 78 2e 20 20 49 66 20 78 20  .** of x.  If x 
1830: 69 73 20 74 65 78 74 2c 20 74 68 65 6e 20 77 65  is text, then we
1840: 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 20   actually count 
1850: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 73  UTF-8 characters
1860: 2e 0a 2a 2a 20 49 66 20 78 20 69 73 20 61 20 62  ..** If x is a b
1870: 6c 6f 62 2c 20 74 68 65 6e 20 77 65 20 63 6f 75  lob, then we cou
1880: 6e 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt bytes..**.** 
1890: 49 66 20 70 31 20 69 73 20 6e 65 67 61 74 69 76  If p1 is negativ
18a0: 65 2c 20 74 68 65 6e 20 77 65 20 62 65 67 69 6e  e, then we begin
18b0: 20 61 62 73 28 70 31 29 20 66 72 6f 6d 20 74 68   abs(p1) from th
18c0: 65 20 65 6e 64 20 6f 66 20 78 5b 5d 2e 0a 2a 2a  e end of x[]..**
18d0: 0a 2a 2a 20 49 66 20 70 32 20 69 73 20 6e 65 67  .** If p2 is neg
18e0: 61 74 69 76 65 2c 20 72 65 74 75 72 6e 20 74 68  ative, return th
18f0: 65 20 70 32 20 63 68 61 72 61 63 74 65 72 73 20  e p2 characters 
1900: 70 72 65 63 65 65 64 69 6e 67 20 70 31 2e 0a 2a  preceeding p1..*
1910: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
1920: 62 73 74 72 46 75 6e 63 28 0a 20 20 73 71 6c 69  bstrFunc(.  sqli
1930: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
1940: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
1950: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
1960: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
1970: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1980: 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  r *z;.  const un
1990: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 32 3b  signed char *z2;
19a0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e  .  int len;.  in
19b0: 74 20 70 30 74 79 70 65 3b 0a 20 20 69 36 34 20  t p0type;.  i64 
19c0: 70 31 2c 20 70 32 3b 0a 20 20 69 6e 74 20 6e 65  p1, p2;.  int ne
19d0: 67 50 32 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  gP2 = 0;..  asse
19e0: 72 74 28 20 61 72 67 63 3d 3d 33 20 7c 7c 20 61  rt( argc==3 || a
19f0: 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20  rgc==2 );.  if( 
1a00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
1a10: 70 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c  pe(argv[1])==SQL
1a20: 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 7c 7c 20 28  ITE_NULL.   || (
1a30: 61 72 67 63 3d 3d 33 20 26 26 20 73 71 6c 69 74  argc==3 && sqlit
1a40: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
1a50: 67 76 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[2])==SQLITE_N
1a60: 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  ULL).  ){.    re
1a70: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 30 74 79  turn;.  }.  p0ty
1a80: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
1a90: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
1aa0: 3b 0a 20 20 70 31 20 3d 20 73 71 6c 69 74 65 33  ;.  p1 = sqlite3
1ab0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
1ac0: 31 5d 29 3b 0a 20 20 69 66 28 20 70 30 74 79 70  1]);.  if( p0typ
1ad0: 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
1ae0: 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69  {.    len = sqli
1af0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
1b00: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 7a 20  argv[0]);.    z 
1b10: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1b20: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
1b30: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65     if( z==0 ) re
1b40: 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  turn;.    assert
1b50: 28 20 6c 65 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  ( len==sqlite3_v
1b60: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
1b70: 30 5d 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0]) );.  }else{.
1b80: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
1b90: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
1ba0: 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  0]);.    if( z==
1bb0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
1bc0: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  len = 0;.    if(
1bd0: 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 66   p1<0 ){.      f
1be0: 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32 3b 20 6c 65  or(z2=z; *z2; le
1bf0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 51  n++){.        SQ
1c00: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
1c10: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
1c20: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63  }.  }.  if( argc
1c30: 3d 3d 33 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  ==3 ){.    p2 = 
1c40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
1c50: 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20  t(argv[2]);.    
1c60: 69 66 28 20 70 32 3c 30 20 29 7b 0a 20 20 20 20  if( p2<0 ){.    
1c70: 20 20 70 32 20 3d 20 2d 70 32 3b 0a 20 20 20 20    p2 = -p2;.    
1c80: 20 20 6e 65 67 50 32 20 3d 20 31 3b 0a 20 20 20    negP2 = 1;.   
1c90: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1ca0: 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p2 = sqlite3_con
1cb0: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
1cc0: 6f 6e 74 65 78 74 29 2d 3e 61 4c 69 6d 69 74 5b  ontext)->aLimit[
1cd0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
1ce0: 47 54 48 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  GTH];.  }.  if( 
1cf0: 70 31 3c 30 20 29 7b 0a 20 20 20 20 70 31 20 2b  p1<0 ){.    p1 +
1d00: 3d 20 6c 65 6e 3b 0a 20 20 20 20 69 66 28 20 70  = len;.    if( p
1d10: 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32 20  1<0 ){.      p2 
1d20: 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20 69 66 28  += p1;.      if(
1d30: 20 70 32 3c 30 20 29 20 70 32 20 3d 20 30 3b 0a   p2<0 ) p2 = 0;.
1d40: 20 20 20 20 20 20 70 31 20 3d 20 30 3b 0a 20 20        p1 = 0;.  
1d50: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1d60: 70 31 3e 30 20 29 7b 0a 20 20 20 20 70 31 2d 2d  p1>0 ){.    p1--
1d70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32  ;.  }else if( p2
1d80: 3e 30 20 29 7b 0a 20 20 20 20 70 32 2d 2d 3b 0a  >0 ){.    p2--;.
1d90: 20 20 7d 0a 20 20 69 66 28 20 6e 65 67 50 32 20    }.  if( negP2 
1da0: 29 7b 0a 20 20 20 20 70 31 20 2d 3d 20 70 32 3b  ){.    p1 -= p2;
1db0: 0a 20 20 20 20 69 66 28 20 70 31 3c 30 20 29 7b  .    if( p1<0 ){
1dc0: 0a 20 20 20 20 20 20 70 32 20 2b 3d 20 70 31 3b  .      p2 += p1;
1dd0: 0a 20 20 20 20 20 20 70 31 20 3d 20 30 3b 0a 20  .      p1 = 0;. 
1de0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
1df0: 74 28 20 70 31 3e 3d 30 20 26 26 20 70 32 3e 3d  t( p1>=0 && p2>=
1e00: 30 20 29 3b 0a 20 20 69 66 28 20 70 30 74 79 70  0 );.  if( p0typ
1e10: 65 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e!=SQLITE_BLOB )
1e20: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20  {.    while( *z 
1e30: 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 53  && p1 ){.      S
1e40: 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28  QLITE_SKIP_UTF8(
1e50: 7a 29 3b 0a 20 20 20 20 20 20 70 31 2d 2d 3b 0a  z);.      p1--;.
1e60: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 7a 32      }.    for(z2
1e70: 3d 7a 3b 20 2a 7a 32 20 26 26 20 70 32 3b 20 70  =z; *z2 && p2; p
1e80: 32 2d 2d 29 7b 0a 20 20 20 20 20 20 53 51 4c 49  2--){.      SQLI
1e90: 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 32 29  TE_SKIP_UTF8(z2)
1ea0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1eb0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1ec0: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
1ed0: 7a 2c 20 28 69 6e 74 29 28 7a 32 2d 7a 29 2c 20  z, (int)(z2-z), 
1ee0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
1ef0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f00: 69 66 28 20 70 31 2b 70 32 3e 6c 65 6e 20 29 7b  if( p1+p2>len ){
1f10: 0a 20 20 20 20 20 20 70 32 20 3d 20 6c 65 6e 2d  .      p2 = len-
1f20: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32  p1;.      if( p2
1f30: 3c 30 20 29 20 70 32 20 3d 20 30 3b 0a 20 20 20  <0 ) p2 = 0;.   
1f40: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72   }.    sqlite3_r
1f50: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
1f60: 78 74 2c 20 28 63 68 61 72 2a 29 26 7a 5b 70 31  xt, (char*)&z[p1
1f70: 5d 2c 20 28 69 6e 74 29 70 32 2c 20 53 51 4c 49  ], (int)p2, SQLI
1f80: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
1f90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
1fa0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1fb0: 65 20 72 6f 75 6e 64 28 29 20 66 75 6e 63 74 69  e round() functi
1fc0: 6f 6e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  on.*/.#ifndef SQ
1fd0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1fe0: 4e 47 5f 50 4f 49 4e 54 0a 73 74 61 74 69 63 20  NG_POINT.static 
1ff0: 76 6f 69 64 20 72 6f 75 6e 64 46 75 6e 63 28 73  void roundFunc(s
2000: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2010: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
2020: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
2030: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20   **argv){.  int 
2040: 6e 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20  n = 0;.  double 
2050: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  r;.  char *zBuf;
2060: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
2070: 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =1 || argc==2 );
2080: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29  .  if( argc==2 )
2090: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
20a0: 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76  _NULL==sqlite3_v
20b0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31  alue_type(argv[1
20c0: 5d 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ]) ) return;.   
20d0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
20e0: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b  ue_int(argv[1]);
20f0: 0a 20 20 20 20 69 66 28 20 6e 3e 33 30 20 29 20  .    if( n>30 ) 
2100: 6e 20 3d 20 33 30 3b 0a 20 20 20 20 69 66 28 20  n = 30;.    if( 
2110: 6e 3c 30 20 29 20 6e 20 3d 20 30 3b 0a 20 20 7d  n<0 ) n = 0;.  }
2120: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
2130: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
2140: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
2150: 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 20 3d 20  ) return;.  r = 
2160: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
2170: 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  uble(argv[0]);. 
2180: 20 2f 2a 20 49 66 20 59 3d 3d 30 20 61 6e 64 20   /* If Y==0 and 
2190: 58 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20  X will fit in a 
21a0: 36 34 2d 62 69 74 20 69 6e 74 2c 0a 20 20 2a 2a  64-bit int,.  **
21b0: 20 68 61 6e 64 6c 65 20 74 68 65 20 72 6f 75 6e   handle the roun
21c0: 64 69 6e 67 20 64 69 72 65 63 74 6c 79 2c 0a 20  ding directly,. 
21d0: 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 75 73   ** otherwise us
21e0: 65 20 70 72 69 6e 74 66 2e 0a 20 20 2a 2f 0a 20  e printf..  */. 
21f0: 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 72 3e 3d   if( n==0 && r>=
2200: 30 20 26 26 20 72 3c 4c 41 52 47 45 53 54 5f 49  0 && r<LARGEST_I
2210: 4e 54 36 34 2d 31 20 29 7b 0a 20 20 20 20 72 20  NT64-1 ){.    r 
2220: 3d 20 28 64 6f 75 62 6c 65 29 28 28 73 71 6c 69  = (double)((sqli
2230: 74 65 5f 69 6e 74 36 34 29 28 72 2b 30 2e 35 29  te_int64)(r+0.5)
2240: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
2250: 3d 3d 30 20 26 26 20 72 3c 30 20 26 26 20 28 2d  ==0 && r<0 && (-
2260: 72 29 3c 4c 41 52 47 45 53 54 5f 49 4e 54 36 34  r)<LARGEST_INT64
2270: 2d 31 20 29 7b 0a 20 20 20 20 72 20 3d 20 2d 28  -1 ){.    r = -(
2280: 64 6f 75 62 6c 65 29 28 28 73 71 6c 69 74 65 5f  double)((sqlite_
2290: 69 6e 74 36 34 29 28 28 2d 72 29 2b 30 2e 35 29  int64)((-r)+0.5)
22a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22b0: 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zBuf = sqlite3_m
22c0: 70 72 69 6e 74 66 28 22 25 2e 2a 66 22 2c 6e 2c  printf("%.*f",n,
22d0: 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66  r);.    if( zBuf
22e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
22f0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2300: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
2310: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
2320: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2330: 33 41 74 6f 46 28 7a 42 75 66 2c 20 26 72 2c 20  3AtoF(zBuf, &r, 
2340: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2350: 7a 42 75 66 29 2c 20 53 51 4c 49 54 45 5f 55 54  zBuf), SQLITE_UT
2360: 46 38 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  F8);.    sqlite3
2370: 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 7d  _free(zBuf);.  }
2380: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
2390: 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74  t_double(context
23a0: 2c 20 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  , r);.}.#endif..
23b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
23c0: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
23d0: 61 63 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ace using sqlite
23e0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 74  3_malloc(). If t
23f0: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
2400: 20 66 61 69 6c 73 2c 20 63 61 6c 6c 20 73 71 6c   fails, call sql
2410: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2420: 72 5f 6e 6f 6d 65 6d 28 29 20 74 6f 20 6e 6f 74  r_nomem() to not
2430: 69 66 79 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ify.** the datab
2440: 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
2450: 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 66 61 69  malloc() has fai
2460: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  led and return N
2470: 55 4c 4c 2e 0a 2a 2a 20 49 66 20 6e 42 79 74 65  ULL..** If nByte
2480: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
2490: 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 72 69  the maximum stri
24a0: 6e 67 20 6f 72 20 62 6c 6f 62 20 6c 65 6e 67 74  ng or blob lengt
24b0: 68 2c 20 74 68 65 6e 0a 2a 2a 20 72 61 69 73 65  h, then.** raise
24c0: 20 61 6e 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49   an SQLITE_TOOBI
24d0: 47 20 65 78 63 65 70 74 69 6f 6e 20 61 6e 64 20  G exception and 
24e0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
24f0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e  static void *con
2500: 74 65 78 74 4d 61 6c 6c 6f 63 28 73 71 6c 69 74  textMalloc(sqlit
2510: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
2520: 65 78 74 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  ext, i64 nByte){
2530: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 71  .  char *z;.  sq
2540: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
2550: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
2560: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
2570: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
2580: 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
2590: 20 6e 42 79 74 65 3d 3d 64 62 2d 3e 61 4c 69 6d   nByte==db->aLim
25a0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
25b0: 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 74 65 73  LENGTH] );.  tes
25c0: 74 63 61 73 65 28 20 6e 42 79 74 65 3d 3d 64 62  tcase( nByte==db
25d0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
25e0: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 2b 31 20  LIMIT_LENGTH]+1 
25f0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 64  );.  if( nByte>d
2600: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
2610: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
2620: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
2630: 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69  sult_error_toobi
2640: 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  g(context);.    
2650: 7a 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  z = 0;.  }else{.
2660: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4d      z = sqlite3M
2670: 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 42 79 74 65  alloc((int)nByte
2680: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 20 29 7b  );.    if( !z ){
2690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
26a0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
26b0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
26c0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
26d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
26e0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
26f0: 20 75 70 70 65 72 28 29 20 61 6e 64 20 6c 6f 77   upper() and low
2700: 65 72 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  er() SQL functio
2710: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
2720: 69 64 20 75 70 70 65 72 46 75 6e 63 28 73 71 6c  id upperFunc(sql
2730: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
2740: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
2750: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2760: 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a  *argv){.  char *
2770: 7a 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  z1;.  const char
2780: 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6e   *z2;.  int i, n
2790: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
27a0: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 7a 32  ETER(argc);.  z2
27b0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
27c0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
27d0: 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  v[0]);.  n = sql
27e0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
27f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20  (argv[0]);.  /* 
2800: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
2810: 63 61 6c 6c 20 74 6f 20 5f 62 79 74 65 73 28 29  call to _bytes()
2820: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61 6c 69   does not invali
2830: 64 61 74 65 20 74 68 65 20 5f 74 65 78 74 28 29  date the _text()
2840: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 61 73   pointer */.  as
2850: 73 65 72 74 28 20 7a 32 3d 3d 28 63 68 61 72 2a  sert( z2==(char*
2860: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
2870: 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a  ext(argv[0]) );.
2880: 20 20 69 66 28 20 7a 32 20 29 7b 0a 20 20 20 20    if( z2 ){.    
2890: 7a 31 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c  z1 = contextMall
28a0: 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36  oc(context, ((i6
28b0: 34 29 6e 29 2b 31 29 3b 0a 20 20 20 20 69 66 28  4)n)+1);.    if(
28c0: 20 7a 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72   z1 ){.      for
28d0: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
28e0: 0a 20 20 20 20 20 20 20 20 7a 31 5b 69 5d 20 3d  .        z1[i] =
28f0: 20 28 63 68 61 72 29 73 71 6c 69 74 65 33 54 6f   (char)sqlite3To
2900: 75 70 70 65 72 28 7a 32 5b 69 5d 29 3b 0a 20 20  upper(z2[i]);.  
2910: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2920: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
2930: 63 6f 6e 74 65 78 74 2c 20 7a 31 2c 20 6e 2c 20  context, z1, n, 
2940: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
2950: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2960: 63 20 76 6f 69 64 20 6c 6f 77 65 72 46 75 6e 63  c void lowerFunc
2970: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
2980: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
2990: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
29a0: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68  ue **argv){.  ch
29b0: 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73 74 20  ar *z1;.  const 
29c0: 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20  char *z2;.  int 
29d0: 69 2c 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50  i, n;.  UNUSED_P
29e0: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
29f0: 20 20 7a 32 20 3d 20 28 63 68 61 72 2a 29 73 71    z2 = (char*)sq
2a00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
2a10: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d  (argv[0]);.  n =
2a20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
2a30: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
2a40: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
2a50: 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f 62 79 74  the call to _byt
2a60: 65 73 28 29 20 64 6f 65 73 20 6e 6f 74 20 69 6e  es() does not in
2a70: 76 61 6c 69 64 61 74 65 20 74 68 65 20 5f 74 65  validate the _te
2a80: 78 74 28 29 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  xt() pointer */.
2a90: 20 20 61 73 73 65 72 74 28 20 7a 32 3d 3d 28 63    assert( z2==(c
2aa0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
2ab0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
2ac0: 20 29 3b 0a 20 20 69 66 28 20 7a 32 20 29 7b 0a   );.  if( z2 ){.
2ad0: 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74 65 78 74      z1 = context
2ae0: 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20  Malloc(context, 
2af0: 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a 20 20 20  ((i64)n)+1);.   
2b00: 20 69 66 28 20 7a 31 20 29 7b 0a 20 20 20 20 20   if( z1 ){.     
2b10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
2b20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 31 5b  ++){.        z1[
2b30: 69 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f  i] = sqlite3Tolo
2b40: 77 65 72 28 7a 32 5b 69 5d 29 3b 0a 20 20 20 20  wer(z2[i]);.    
2b50: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2b60: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
2b70: 6e 74 65 78 74 2c 20 7a 31 2c 20 6e 2c 20 73 71  ntext, z1, n, sq
2b80: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
2b90: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2ba0: 54 68 65 20 43 4f 41 4c 45 53 43 45 28 29 20 61  The COALESCE() a
2bb0: 6e 64 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63  nd IFNULL() func
2bc0: 74 69 6f 6e 73 20 61 72 65 20 69 6d 70 6c 65 6d  tions are implem
2bd0: 65 6e 74 65 64 20 61 73 20 56 44 42 45 20 63 6f  ented as VDBE co
2be0: 64 65 20 73 6f 0a 2a 2a 20 74 68 61 74 20 75 6e  de so.** that un
2bf0: 75 73 65 64 20 61 72 67 75 6d 65 6e 74 20 76 61  used argument va
2c00: 6c 75 65 73 20 64 6f 20 6e 6f 74 20 68 61 76 65  lues do not have
2c10: 20 74 6f 20 62 65 20 63 6f 6d 70 75 74 65 64 2e   to be computed.
2c20: 20 20 48 6f 77 65 76 65 72 2c 20 77 65 0a 2a 2a    However, we.**
2c30: 20 73 74 69 6c 6c 20 6e 65 65 64 20 73 6f 6d 65   still need some
2c40: 20 6b 69 6e 64 20 6f 66 20 66 75 6e 63 74 69 6f   kind of functio
2c50: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
2c60: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
2c70: 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 66 75 6e  es in.** the fun
2c80: 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54 68  ction table.  Th
2c90: 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  at function impl
2ca0: 65 6d 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 20  ementation will 
2cb0: 6e 65 76 65 72 20 62 65 20 63 61 6c 6c 65 64 0a  never be called.
2cc0: 2a 2a 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  ** so it doesn't
2cd0: 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65   matter what the
2ce0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2cf0: 69 73 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73  is.  We might as
2d00: 20 77 65 6c 6c 20 75 73 65 0a 2a 2a 20 74 68 65   well use.** the
2d10: 20 22 76 65 72 73 69 6f 6e 28 29 22 20 66 75 6e   "version()" fun
2d20: 63 74 69 6f 6e 20 61 73 20 61 20 73 75 62 73 74  ction as a subst
2d30: 69 74 75 74 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  itute..*/.#defin
2d40: 65 20 69 66 6e 75 6c 6c 46 75 6e 63 20 76 65 72  e ifnullFunc ver
2d50: 73 69 6f 6e 46 75 6e 63 20 20 20 2f 2a 20 53 75  sionFunc   /* Su
2d60: 62 73 74 69 74 75 74 65 20 66 75 6e 63 74 69 6f  bstitute functio
2d70: 6e 20 2d 20 6e 65 76 65 72 20 63 61 6c 6c 65 64  n - never called
2d80: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65   */../*.** Imple
2d90: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e  mentation of ran
2da0: 64 6f 6d 28 29 2e 20 20 52 65 74 75 72 6e 20 61  dom().  Return a
2db0: 20 72 61 6e 64 6f 6d 20 69 6e 74 65 67 65 72 2e   random integer.
2dc0: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69    .*/.static voi
2dd0: 64 20 72 61 6e 64 6f 6d 46 75 6e 63 28 0a 20 20  d randomFunc(.  
2de0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2df0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
2e00: 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74  NotUsed,.  sqlit
2e10: 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73  e3_value **NotUs
2e20: 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 5f  ed2.){.  sqlite_
2e30: 69 6e 74 36 34 20 72 3b 0a 20 20 55 4e 55 53 45  int64 r;.  UNUSE
2e40: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
2e50: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
2e60: 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
2e70: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c  mness(sizeof(r),
2e80: 20 26 72 29 3b 0a 20 20 69 66 28 20 72 3c 30 20   &r);.  if( r<0 
2e90: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 6e 65 65  ){.    /* We nee
2ea0: 64 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72  d to prevent a r
2eb0: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 6f 66 20  andom number of 
2ec0: 30 78 38 30 30 30 30 30 30 30 30 30 30 30 30 30  0x80000000000000
2ed0: 30 30 20 0a 20 20 20 20 2a 2a 20 28 6f 72 20 2d  00 .    ** (or -
2ee0: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
2ef0: 38 30 38 29 20 73 69 6e 63 65 20 77 68 65 6e 20  808) since when 
2f00: 79 6f 75 20 64 6f 20 61 62 73 28 29 20 6f 66 20  you do abs() of 
2f10: 74 68 61 74 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  that.    ** numb
2f20: 65 72 20 6f 66 20 79 6f 75 20 67 65 74 20 74 68  er of you get th
2f30: 65 20 73 61 6d 65 20 76 61 6c 75 65 20 62 61 63  e same value bac
2f40: 6b 20 61 67 61 69 6e 2e 20 20 54 6f 20 64 6f 20  k again.  To do 
2f50: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 20 61  this.    ** in a
2f60: 20 77 61 79 20 74 68 61 74 20 69 73 20 74 65 73   way that is tes
2f70: 74 61 62 6c 65 2c 20 6d 61 73 6b 20 74 68 65 20  table, mask the 
2f80: 73 69 67 6e 20 62 69 74 20 6f 66 66 20 6f 66 20  sign bit off of 
2f90: 6e 65 67 61 74 69 76 65 0a 20 20 20 20 2a 2a 20  negative.    ** 
2fa0: 76 61 6c 75 65 73 2c 20 72 65 73 75 6c 74 69 6e  values, resultin
2fb0: 67 20 69 6e 20 61 20 70 6f 73 69 74 69 76 65 20  g in a positive 
2fc0: 76 61 6c 75 65 2e 20 20 54 68 65 6e 20 74 61 6b  value.  Then tak
2fd0: 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 32 73  e the .    ** 2s
2fe0: 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74   complement of t
2ff0: 68 61 74 20 70 6f 73 69 74 69 76 65 20 76 61 6c  hat positive val
3000: 75 65 2e 20 20 54 68 65 20 65 6e 64 20 72 65 73  ue.  The end res
3010: 75 6c 74 20 63 61 6e 0a 20 20 20 20 2a 2a 20 74  ult can.    ** t
3020: 68 65 72 65 66 6f 72 65 20 62 65 20 6e 6f 20 6c  herefore be no l
3030: 65 73 73 20 74 68 61 6e 20 2d 39 32 32 33 33 37  ess than -922337
3040: 32 30 33 36 38 35 34 37 37 35 38 30 37 2e 0a 20  2036854775807.. 
3050: 20 20 20 2a 2f 0a 20 20 20 20 72 20 3d 20 2d 28     */.    r = -(
3060: 72 20 26 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  r & LARGEST_INT6
3070: 34 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  4);.  }.  sqlite
3080: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
3090: 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 7d 0a 0a 2f  ontext, r);.}../
30a0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
30b0: 69 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d 62 6c 6f  ion of randomblo
30c0: 62 28 4e 29 2e 20 20 52 65 74 75 72 6e 20 61 20  b(N).  Return a 
30d0: 72 61 6e 64 6f 6d 20 62 6c 6f 62 0a 2a 2a 20 74  random blob.** t
30e0: 68 61 74 20 69 73 20 4e 20 62 79 74 65 73 20 6c  hat is N bytes l
30f0: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ong..*/.static v
3100: 6f 69 64 20 72 61 6e 64 6f 6d 42 6c 6f 62 28 0a  oid randomBlob(.
3110: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
3120: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
3130: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
3140: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
3150: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 75 6e 73  {.  int n;.  uns
3160: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20  igned char *p;. 
3170: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
3180: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
3190: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
31a0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
31b0: 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a  e_int(argv[0]);.
31c0: 20 20 69 66 28 20 6e 3c 31 20 29 7b 0a 20 20 20    if( n<1 ){.   
31d0: 20 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 20   n = 1;.  }.  p 
31e0: 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28  = contextMalloc(
31f0: 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20 69  context, n);.  i
3200: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
3210: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 6e  te3_randomness(n
3220: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
3230: 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f  3_result_blob(co
3240: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 70 2c  ntext, (char*)p,
3250: 20 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   n, sqlite3_free
3260: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3270: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
3280: 66 20 74 68 65 20 6c 61 73 74 5f 69 6e 73 65 72  f the last_inser
3290: 74 5f 72 6f 77 69 64 28 29 20 53 51 4c 20 66 75  t_rowid() SQL fu
32a0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74  nction.  The ret
32b0: 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  urn.** value is 
32c0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
32d0: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
32e0: 65 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20  ert_rowid() API 
32f0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
3300: 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 69 6e  tic void last_in
3310: 73 65 72 74 5f 72 6f 77 69 64 28 0a 20 20 73 71  sert_rowid(.  sq
3320: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3330: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 4e  ontext, .  int N
3340: 6f 74 55 73 65 64 2c 20 0a 20 20 73 71 6c 69 74  otUsed, .  sqlit
3350: 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73  e3_value **NotUs
3360: 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  ed2.){.  sqlite3
3370: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
3380: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
3390: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55  (context);.  UNU
33a0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
33b0: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
33c0: 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  );.  /* IMP: R-5
33d0: 31 35 31 33 2d 31 32 30 32 36 20 54 68 65 20 6c  1513-12026 The l
33e0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
33f0: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
3400: 69 73 20 61 0a 20 20 2a 2a 20 77 72 61 70 70 65  is a.  ** wrappe
3410: 72 20 61 72 6f 75 6e 64 20 74 68 65 20 73 71 6c  r around the sql
3420: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
3430: 5f 72 6f 77 69 64 28 29 20 43 2f 43 2b 2b 20 69  _rowid() C/C++ i
3440: 6e 74 65 72 66 61 63 65 0a 20 20 2a 2a 20 66 75  nterface.  ** fu
3450: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c  nction. */.  sql
3460: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
3470: 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  4(context, sqlit
3480: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
3490: 6f 77 69 64 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a  owid(db));.}../*
34a0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
34b0: 6f 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  on of the change
34c0: 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  s() SQL function
34d0: 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52 2d 36  ..**.** IMP: R-6
34e0: 32 30 37 33 2d 31 31 32 30 39 20 54 68 65 20 63  2073-11209 The c
34f0: 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75 6e  hanges() SQL fun
3500: 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
3510: 65 72 0a 2a 2a 20 61 72 6f 75 6e 64 20 74 68 65  er.** around the
3520: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
3530: 28 29 20 43 2f 43 2b 2b 20 66 75 6e 63 74 69 6f  () C/C++ functio
3540: 6e 20 61 6e 64 20 68 65 6e 63 65 20 66 6f 6c 6c  n and hence foll
3550: 6f 77 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  ows the same.** 
3560: 72 75 6c 65 73 20 66 6f 72 20 63 6f 75 6e 74 69  rules for counti
3570: 6e 67 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 73  ng changes..*/.s
3580: 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67  tatic void chang
3590: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  es(.  sqlite3_co
35a0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
35b0: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
35c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
35d0: 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73  *NotUsed2.){.  s
35e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
35f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
3600: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
3610: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
3620: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
3630: 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74  tUsed2);.  sqlit
3640: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
3650: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63  ntext, sqlite3_c
3660: 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a  hanges(db));.}..
3670: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
3680: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 6f 74 61  tion of the tota
3690: 6c 5f 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20  l_changes() SQL 
36a0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72  function.  The r
36b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 0a 2a  eturn value is.*
36c0: 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  * the same as th
36d0: 65 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  e sqlite3_total_
36e0: 63 68 61 6e 67 65 73 28 29 20 41 50 49 20 66 75  changes() API fu
36f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
3700: 63 20 76 6f 69 64 20 74 6f 74 61 6c 5f 63 68 61  c void total_cha
3710: 6e 67 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  nges(.  sqlite3_
3720: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
3730: 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c  ,.  int NotUsed,
3740: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3750: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
3760: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
3770: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
3780: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
3790: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
37a0: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
37b0: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20  NotUsed2);.  /* 
37c0: 49 4d 50 3a 20 52 2d 35 32 37 35 36 2d 34 31 39  IMP: R-52756-419
37d0: 39 33 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  93 This function
37e0: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
37f0: 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71  ound the.  ** sq
3800: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
3810: 67 65 73 28 29 20 43 2f 43 2b 2b 20 69 6e 74 65  ges() C/C++ inte
3820: 72 66 61 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  rface. */.  sqli
3830: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
3840: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
3850: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 64 62  total_changes(db
3860: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  ));.}../*.** A s
3870: 74 72 75 63 74 75 72 65 20 64 65 66 69 6e 69 6e  tructure definin
3880: 67 20 68 6f 77 20 74 6f 20 64 6f 20 47 4c 4f 42  g how to do GLOB
3890: 2d 73 74 79 6c 65 20 63 6f 6d 70 61 72 69 73 6f  -style compariso
38a0: 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ns..*/.struct co
38b0: 6d 70 61 72 65 49 6e 66 6f 20 7b 0a 20 20 75 38  mpareInfo {.  u8
38c0: 20 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20   matchAll;.  u8 
38d0: 6d 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d  matchOne;.  u8 m
38e0: 61 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f  atchSet;.  u8 no
38f0: 43 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  Case;.};../*.** 
3900: 46 6f 72 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f  For LIKE and GLO
3910: 42 20 6d 61 74 63 68 69 6e 67 20 6f 6e 20 45 42  B matching on EB
3920: 43 44 49 43 20 6d 61 63 68 69 6e 65 73 2c 20 61  CDIC machines, a
3930: 73 73 75 6d 65 20 74 68 61 74 20 65 76 65 72 79  ssume that every
3940: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 69 73  .** character is
3950: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 62 79 74   exactly one byt
3960: 65 20 69 6e 20 73 69 7a 65 2e 20 20 41 6c 73 6f  e in size.  Also
3970: 2c 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73  , all characters
3980: 20 61 72 65 0a 2a 2a 20 61 62 6c 65 20 74 6f 20   are.** able to 
3990: 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 75  participate in u
39a0: 70 70 65 72 2d 63 61 73 65 2d 74 6f 2d 6c 6f 77  pper-case-to-low
39b0: 65 72 2d 63 61 73 65 20 6d 61 70 70 69 6e 67 73  er-case mappings
39c0: 20 69 6e 20 45 42 43 44 49 43 0a 2a 2a 20 77 68   in EBCDIC.** wh
39d0: 65 72 65 61 73 20 6f 6e 6c 79 20 63 68 61 72 61  ereas only chara
39e0: 63 74 65 72 73 20 6c 65 73 73 20 74 68 61 6e 20  cters less than 
39f0: 30 78 38 30 20 64 6f 20 69 6e 20 41 53 43 49 49  0x80 do in ASCII
3a00: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
3a10: 28 53 51 4c 49 54 45 5f 45 42 43 44 49 43 29 0a  (SQLITE_EBCDIC).
3a20: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  # define sqlite3
3a30: 55 74 66 38 52 65 61 64 28 41 29 20 20 20 20 28  Utf8Read(A)    (
3a40: 2a 28 28 2a 41 29 2b 2b 29 29 0a 23 20 64 65 66  *((*A)++)).# def
3a50: 69 6e 65 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c  ine GlogUpperToL
3a60: 6f 77 65 72 28 41 29 20 20 20 41 20 3d 20 73 71  ower(A)   A = sq
3a70: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
3a80: 72 5b 41 5d 0a 23 65 6c 73 65 0a 23 20 64 65 66  r[A].#else.# def
3a90: 69 6e 65 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c  ine GlogUpperToL
3aa0: 6f 77 65 72 28 41 29 20 20 20 69 66 28 20 21 28  ower(A)   if( !(
3ab0: 28 41 29 26 7e 30 78 37 66 29 20 29 7b 20 41 20  (A)&~0x7f) ){ A 
3ac0: 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  = sqlite3UpperTo
3ad0: 4c 6f 77 65 72 5b 41 5d 3b 20 7d 0a 23 65 6e 64  Lower[A]; }.#end
3ae0: 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  if..static const
3af0: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
3b00: 6e 66 6f 20 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b  nfo globInfo = {
3b10: 20 27 2a 27 2c 20 27 3f 27 2c 20 27 5b 27 2c 20   '*', '?', '[', 
3b20: 30 20 7d 3b 0a 2f 2a 20 54 68 65 20 63 6f 72 72  0 };./* The corr
3b30: 65 63 74 20 53 51 4c 2d 39 32 20 62 65 68 61 76  ect SQL-92 behav
3b40: 69 6f 72 20 69 73 20 66 6f 72 20 74 68 65 20 4c  ior is for the L
3b50: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  IKE operator to 
3b60: 69 67 6e 6f 72 65 0a 2a 2a 20 63 61 73 65 2e 20  ignore.** case. 
3b70: 20 54 68 75 73 20 20 27 61 27 20 4c 49 4b 45 20   Thus  'a' LIKE 
3b80: 27 41 27 20 77 6f 75 6c 64 20 62 65 20 74 72 75  'A' would be tru
3b90: 65 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e. */.static con
3ba0: 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72  st struct compar
3bb0: 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f  eInfo likeInfoNo
3bc0: 72 6d 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c  rm = { '%', '_',
3bd0: 20 20 20 30 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66     0, 1 };./* If
3be0: 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e   SQLITE_CASE_SEN
3bf0: 53 49 54 49 56 45 5f 4c 49 4b 45 20 69 73 20 64  SITIVE_LIKE is d
3c00: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  efined, then the
3c10: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 0a 2a   LIKE operator.*
3c20: 2a 20 69 73 20 63 61 73 65 20 73 65 6e 73 69 74  * is case sensit
3c30: 69 76 65 20 63 61 75 73 69 6e 67 20 27 61 27 20  ive causing 'a' 
3c40: 4c 49 4b 45 20 27 41 27 20 74 6f 20 62 65 20 66  LIKE 'A' to be f
3c50: 61 6c 73 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  alse */.static c
3c60: 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70  onst struct comp
3c70: 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f  areInfo likeInfo
3c80: 41 6c 74 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27  Alt = { '%', '_'
3c90: 2c 20 20 20 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a  ,   0, 0 };../*.
3ca0: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 55  ** Compare two U
3cb0: 54 46 2d 38 20 73 74 72 69 6e 67 73 20 66 6f 72  TF-8 strings for
3cc0: 20 65 71 75 61 6c 69 74 79 20 77 68 65 72 65 20   equality where 
3cd0: 74 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67  the first string
3ce0: 20 63 61 6e 0a 2a 2a 20 70 6f 74 65 6e 74 69 61   can.** potentia
3cf0: 6c 6c 79 20 62 65 20 61 20 22 67 6c 6f 62 22 20  lly be a "glob" 
3d00: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 52 65 74  expression.  Ret
3d10: 75 72 6e 20 74 72 75 65 20 28 31 29 20 69 66 20  urn true (1) if 
3d20: 74 68 65 79 0a 2a 2a 20 61 72 65 20 74 68 65 20  they.** are the 
3d30: 73 61 6d 65 20 61 6e 64 20 66 61 6c 73 65 20 28  same and false (
3d40: 30 29 20 69 66 20 74 68 65 79 20 61 72 65 20 64  0) if they are d
3d50: 69 66 66 65 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ifferent..**.** 
3d60: 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a  Globbing rules:.
3d70: 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20  **.**      '*'  
3d80: 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
3d90: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72   sequence of zer
3da0: 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63  o or more charac
3db0: 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
3dc0: 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68   '?'       Match
3dd0: 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  es exactly one c
3de0: 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  haracter..**.** 
3df0: 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d      [...]      M
3e00: 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
3e10: 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e  cter from the en
3e20: 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a  closed list of.*
3e30: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
3e40: 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
3e50: 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20  **     [^...]   
3e60: 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68    Matches one ch
3e70: 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74  aracter not in t
3e80: 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74  he enclosed list
3e90: 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65  ..**.** With the
3ea0: 20 5b 2e 2e 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e   [...] and [^...
3eb0: 5d 20 6d 61 74 63 68 69 6e 67 2c 20 61 20 27 5d  ] matching, a ']
3ec0: 27 20 63 68 61 72 61 63 74 65 72 20 63 61 6e 20  ' character can 
3ed0: 62 65 20 69 6e 63 6c 75 64 65 64 0a 2a 2a 20 69  be included.** i
3ee0: 6e 20 74 68 65 20 6c 69 73 74 20 62 79 20 6d 61  n the list by ma
3ef0: 6b 69 6e 67 20 69 74 20 74 68 65 20 66 69 72 73  king it the firs
3f00: 74 20 63 68 61 72 61 63 74 65 72 20 61 66 74 65  t character afte
3f10: 72 20 27 5b 27 20 6f 72 20 27 5e 27 2e 20 20 41  r '[' or '^'.  A
3f20: 0a 2a 2a 20 72 61 6e 67 65 20 6f 66 20 63 68 61  .** range of cha
3f30: 72 61 63 74 65 72 73 20 63 61 6e 20 62 65 20 73  racters can be s
3f40: 70 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 27  pecified using '
3f50: 2d 27 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  -'.  Example:.**
3f60: 20 22 5b 61 2d 7a 5d 22 20 6d 61 74 63 68 65 73   "[a-z]" matches
3f70: 20 61 6e 79 20 73 69 6e 67 6c 65 20 6c 6f 77 65   any single lowe
3f80: 72 2d 63 61 73 65 20 6c 65 74 74 65 72 2e 20 20  r-case letter.  
3f90: 54 6f 20 6d 61 74 63 68 20 61 20 27 2d 27 2c 20  To match a '-', 
3fa0: 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 6c  make.** it the l
3fb0: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  ast character in
3fc0: 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   the list..**.**
3fd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3fe0: 20 75 73 75 61 6c 6c 79 20 71 75 69 63 6b 2c 20   usually quick, 
3ff0: 62 75 74 20 63 61 6e 20 62 65 20 4e 2a 2a 32 20  but can be N**2 
4000: 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73  in the worst cas
4010: 65 2e 0a 2a 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20  e..**.** Hints: 
4020: 74 6f 20 6d 61 74 63 68 20 27 2a 27 20 6f 72 20  to match '*' or 
4030: 27 3f 27 2c 20 70 75 74 20 74 68 65 6d 20 69 6e  '?', put them in
4040: 20 22 5b 5d 22 2e 20 20 4c 69 6b 65 20 74 68 69   "[]".  Like thi
4050: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
4060: 20 61 62 63 5b 2a 5d 78 79 7a 20 20 20 20 20 20   abc[*]xyz      
4070: 20 20 4d 61 74 63 68 65 73 20 22 61 62 63 2a 78    Matches "abc*x
4080: 79 7a 22 20 6f 6e 6c 79 0a 2a 2f 0a 73 74 61 74  yz" only.*/.stat
4090: 69 63 20 69 6e 74 20 70 61 74 74 65 72 6e 43 6f  ic int patternCo
40a0: 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74 20 75  mpare(.  const u
40b0: 38 20 2a 7a 50 61 74 74 65 72 6e 2c 20 20 20 20  8 *zPattern,    
40c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
40d0: 20 67 6c 6f 62 20 70 61 74 74 65 72 6e 20 2a 2f   glob pattern */
40e0: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 53 74  .  const u8 *zSt
40f0: 72 69 6e 67 2c 20 20 20 20 20 20 20 20 20 20 20  ring,           
4100: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e      /* The strin
4110: 67 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  g to compare aga
4120: 69 6e 73 74 20 74 68 65 20 67 6c 6f 62 20 2a 2f  inst the glob */
4130: 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
4140: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e  compareInfo *pIn
4150: 66 6f 2c 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  fo, /* Informati
4160: 6f 6e 20 61 62 6f 75 74 20 68 6f 77 20 74 6f 20  on about how to 
4170: 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 65 20 2a  do the compare *
4180: 2f 0a 20 20 75 33 32 20 65 73 63 20 20 20 20 20  /.  u32 esc     
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 73 63 61       /* The esca
41b0: 70 65 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a  pe character */.
41c0: 29 7b 0a 20 20 75 33 32 20 63 2c 20 63 32 3b 0a  ){.  u32 c, c2;.
41d0: 20 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20    int invert;.  
41e0: 69 6e 74 20 73 65 65 6e 3b 0a 20 20 75 38 20 6d  int seen;.  u8 m
41f0: 61 74 63 68 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d  atchOne = pInfo-
4200: 3e 6d 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20  >matchOne;.  u8 
4210: 6d 61 74 63 68 41 6c 6c 20 3d 20 70 49 6e 66 6f  matchAll = pInfo
4220: 2d 3e 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38  ->matchAll;.  u8
4230: 20 6d 61 74 63 68 53 65 74 20 3d 20 70 49 6e 66   matchSet = pInf
4240: 6f 2d 3e 6d 61 74 63 68 53 65 74 3b 0a 20 20 75  o->matchSet;.  u
4250: 38 20 6e 6f 43 61 73 65 20 3d 20 70 49 6e 66 6f  8 noCase = pInfo
4260: 2d 3e 6e 6f 43 61 73 65 3b 20 0a 20 20 69 6e 74  ->noCase; .  int
4270: 20 70 72 65 76 45 73 63 61 70 65 20 3d 20 30 3b   prevEscape = 0;
4280: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
4290: 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 68 61  the previous cha
42a0: 72 61 63 74 65 72 20 77 61 73 20 27 65 73 63 61  racter was 'esca
42b0: 70 65 27 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28  pe' */..  while(
42c0: 20 28 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66   (c = sqlite3Utf
42d0: 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29  8Read(&zPattern)
42e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
42f0: 63 3d 3d 6d 61 74 63 68 41 6c 6c 20 26 26 20 21  c==matchAll && !
4300: 70 72 65 76 45 73 63 61 70 65 20 29 7b 0a 20 20  prevEscape ){.  
4310: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 73 71      while( (c=sq
4320: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
4330: 50 61 74 74 65 72 6e 29 29 20 3d 3d 20 6d 61 74  Pattern)) == mat
4340: 63 68 41 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  chAll.          
4350: 20 20 20 20 20 7c 7c 20 63 20 3d 3d 20 6d 61 74       || c == mat
4360: 63 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  chOne ){.       
4370: 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65   if( c==matchOne
4380: 20 26 26 20 73 71 6c 69 74 65 33 55 74 66 38 52   && sqlite3Utf8R
4390: 65 61 64 28 26 7a 53 74 72 69 6e 67 29 3d 3d 30  ead(&zString)==0
43a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
43b0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
43c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
43d0: 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
43e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
43f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
4400: 3d 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20  =esc ){.        
4410: 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  c = sqlite3Utf8R
4420: 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a  ead(&zPattern);.
4430: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
4440: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
4450: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
4460: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
4470: 28 20 63 3d 3d 6d 61 74 63 68 53 65 74 20 29 7b  ( c==matchSet ){
4480: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
4490: 20 65 73 63 3d 3d 30 20 29 3b 20 20 20 20 20 20   esc==0 );      
44a0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 47 4c     /* This is GL
44b0: 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45 20 2a 2f 0a  OB, not LIKE */.
44c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
44d0: 6d 61 74 63 68 53 65 74 3c 30 78 38 30 20 29 3b  matchSet<0x80 );
44e0: 20 20 2f 2a 20 27 5b 27 20 69 73 20 61 20 73 69    /* '[' is a si
44f0: 6e 67 6c 65 2d 62 79 74 65 20 63 68 61 72 61 63  ngle-byte charac
4500: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 77  ter */.        w
4510: 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20 26  hile( *zString &
4520: 26 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  & patternCompare
4530: 28 26 7a 50 61 74 74 65 72 6e 5b 2d 31 5d 2c 7a  (&zPattern[-1],z
4540: 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63  String,pInfo,esc
4550: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4560: 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54    SQLITE_SKIP_UT
4570: 46 38 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  F8(zString);.   
4580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
4590: 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 21 3d  eturn *zString!=
45a0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
45b0: 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 73 71   while( (c2 = sq
45c0: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
45d0: 53 74 72 69 6e 67 29 29 21 3d 30 20 29 7b 0a 20  String))!=0 ){. 
45e0: 20 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73         if( noCas
45f0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 47  e ){.          G
4600: 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72 28  logUpperToLower(
4610: 63 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 47  c2);.          G
4620: 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72 28  logUpperToLower(
4630: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  c);.          wh
4640: 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26 20  ile( c2 != 0 && 
4650: 63 32 20 21 3d 20 63 20 29 7b 0a 20 20 20 20 20  c2 != c ){.     
4660: 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69         c2 = sqli
4670: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 53 74  te3Utf8Read(&zSt
4680: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20  ring);.         
4690: 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f     GlogUpperToLo
46a0: 77 65 72 28 63 32 29 3b 0a 20 20 20 20 20 20 20  wer(c2);.       
46b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
46c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
46d0: 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26 20  ile( c2 != 0 && 
46e0: 63 32 20 21 3d 20 63 20 29 7b 0a 20 20 20 20 20  c2 != c ){.     
46f0: 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69         c2 = sqli
4700: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 53 74  te3Utf8Read(&zSt
4710: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20  ring);.         
4720: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
4730: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29       if( c2==0 )
4740: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
4750: 20 20 20 69 66 28 20 70 61 74 74 65 72 6e 43 6f     if( patternCo
4760: 6d 70 61 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a  mpare(zPattern,z
4770: 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63  String,pInfo,esc
4780: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
4790: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
47a0: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 0;.    }else 
47b0: 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20  if( c==matchOne 
47c0: 26 26 20 21 70 72 65 76 45 73 63 61 70 65 20 29  && !prevEscape )
47d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
47e0: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 53 74  te3Utf8Read(&zSt
47f0: 72 69 6e 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ring)==0 ){.    
4800: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4810: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
4820: 69 66 28 20 63 3d 3d 6d 61 74 63 68 53 65 74 20  if( c==matchSet 
4830: 29 7b 0a 20 20 20 20 20 20 75 33 32 20 70 72 69  ){.      u32 pri
4840: 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  or_c = 0;.      
4850: 61 73 73 65 72 74 28 20 65 73 63 3d 3d 30 20 29  assert( esc==0 )
4860: 3b 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c  ;    /* This onl
4870: 79 20 6f 63 63 75 72 73 20 66 6f 72 20 47 4c 4f  y occurs for GLO
4880: 42 2c 20 6e 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20  B, not LIKE */. 
4890: 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20       seen = 0;. 
48a0: 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b       invert = 0;
48b0: 0a 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74  .      c = sqlit
48c0: 65 33 55 74 66 38 52 65 61 64 28 26 7a 53 74 72  e3Utf8Read(&zStr
48d0: 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ing);.      if( 
48e0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
48f0: 0a 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69  .      c2 = sqli
4900: 74 65 33 55 74 66 38 52 65 61 64 28 26 7a 50 61  te3Utf8Read(&zPa
4910: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 69 66  ttern);.      if
4920: 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20  ( c2=='^' ){.   
4930: 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b       invert = 1;
4940: 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71  .        c2 = sq
4950: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
4960: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
4970: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d  }.      if( c2==
4980: 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ']' ){.        i
4990: 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e  f( c==']' ) seen
49a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32   = 1;.        c2
49b0: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
49c0: 61 64 28 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  ad(&zPattern);. 
49d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
49e0: 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d  le( c2 && c2!=']
49f0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
4a00: 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 50 61 74   c2=='-' && zPat
4a10: 74 65 72 6e 5b 30 5d 21 3d 27 5d 27 20 26 26 20  tern[0]!=']' && 
4a20: 7a 50 61 74 74 65 72 6e 5b 30 5d 21 3d 30 20 26  zPattern[0]!=0 &
4a30: 26 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20  & prior_c>0 ){. 
4a40: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
4a50: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 26 7a  lite3Utf8Read(&z
4a60: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
4a70: 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72      if( c>=prior
4a80: 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65  _c && c<=c2 ) se
4a90: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
4aa0: 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20    prior_c = 0;. 
4ab0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
4ac0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63          if( c==c
4ad0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
4ae0: 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
4af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4b00: 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20   prior_c = c2;. 
4b10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4b20: 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66   c2 = sqlite3Utf
4b30: 38 52 65 61 64 28 26 7a 50 61 74 74 65 72 6e 29  8Read(&zPattern)
4b40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4b50: 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65  if( c2==0 || (se
4b60: 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20  en ^ invert)==0 
4b70: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4b80: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
4b90: 20 7d 65 6c 73 65 20 69 66 28 20 65 73 63 3d 3d   }else if( esc==
4ba0: 63 20 26 26 20 21 70 72 65 76 45 73 63 61 70 65  c && !prevEscape
4bb0: 20 29 7b 0a 20 20 20 20 20 20 70 72 65 76 45 73   ){.      prevEs
4bc0: 63 61 70 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65  cape = 1;.    }e
4bd0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 32 20 3d 20  lse{.      c2 = 
4be0: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
4bf0: 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20  &zString);.     
4c00: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
4c10: 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70 65 72         GlogUpper
4c20: 54 6f 4c 6f 77 65 72 28 63 29 3b 0a 20 20 20 20  ToLower(c);.    
4c30: 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c      GlogUpperToL
4c40: 6f 77 65 72 28 63 32 29 3b 0a 20 20 20 20 20 20  ower(c2);.      
4c50: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d 63  }.      if( c!=c
4c60: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  2 ){.        ret
4c70: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
4c80: 20 20 20 20 20 70 72 65 76 45 73 63 61 70 65 20       prevEscape 
4c90: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
4ca0: 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67   return *zString
4cb0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ==0;.}../*.** Co
4cc0: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
4cd0: 66 20 74 69 6d 65 73 20 74 68 61 74 20 74 68 65  f times that the
4ce0: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 28   LIKE operator (
4cf0: 6f 72 20 47 4c 4f 42 20 77 68 69 63 68 20 69 73  or GLOB which is
4d00: 0a 2a 2a 20 6a 75 73 74 20 61 20 76 61 72 69 61  .** just a varia
4d10: 74 69 6f 6e 20 6f 66 20 4c 49 4b 45 29 20 67 65  tion of LIKE) ge
4d20: 74 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  ts called.  This
4d30: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
4d40: 74 69 6e 67 0a 2a 2a 20 6f 6e 6c 79 2e 0a 2a 2f  ting.** only..*/
4d50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4d60: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
4d70: 6c 69 6b 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  like_count = 0;.
4d80: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49  #endif.../*.** I
4d90: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
4da0: 20 74 68 65 20 6c 69 6b 65 28 29 20 53 51 4c 20   the like() SQL 
4db0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
4dc0: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
4dd0: 6e 74 73 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64  nts.** the build
4de0: 2d 69 6e 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  -in LIKE operato
4df0: 72 2e 20 20 54 68 65 20 66 69 72 73 74 20 61 72  r.  The first ar
4e00: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
4e10: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 0a 2a 2a  nction is the.**
4e20: 20 70 61 74 74 65 72 6e 20 61 6e 64 20 74 68 65   pattern and the
4e30: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
4e40: 20 69 73 20 74 68 65 20 73 74 72 69 6e 67 2e 20   is the string. 
4e50: 20 53 6f 2c 20 74 68 65 20 53 51 4c 20 73 74 61   So, the SQL sta
4e60: 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  tements:.**.**  
4e70: 20 20 20 20 20 41 20 4c 49 4b 45 20 42 0a 2a 2a       A LIKE B.**
4e80: 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  .** is implement
4e90: 65 64 20 61 73 20 6c 69 6b 65 28 42 2c 41 29 2e  ed as like(B,A).
4ea0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 61 6d 65  .**.** This same
4eb0: 20 66 75 6e 63 74 69 6f 6e 20 28 77 69 74 68 20   function (with 
4ec0: 61 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6d 70  a different comp
4ed0: 61 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  areInfo structur
4ee0: 65 29 20 63 6f 6d 70 75 74 65 73 0a 2a 2a 20 74  e) computes.** t
4ef0: 68 65 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  he GLOB operator
4f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4f10: 20 6c 69 6b 65 46 75 6e 63 28 0a 20 20 73 71 6c   likeFunc(.  sql
4f20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
4f30: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
4f40: 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  gc, .  sqlite3_v
4f50: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
4f60: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4f70: 63 68 61 72 20 2a 7a 41 2c 20 2a 7a 42 3b 0a 20  char *zA, *zB;. 
4f80: 20 75 33 32 20 65 73 63 61 70 65 20 3d 20 30 3b   u32 escape = 0;
4f90: 0a 20 20 69 6e 74 20 6e 50 61 74 3b 0a 20 20 73  .  int nPat;.  s
4fa0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
4fb0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
4fc0: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
4fd0: 0a 0a 20 20 7a 42 20 3d 20 73 71 6c 69 74 65 33  ..  zB = sqlite3
4fe0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
4ff0: 5b 30 5d 29 3b 0a 20 20 7a 41 20 3d 20 73 71 6c  [0]);.  zA = sql
5000: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5010: 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  argv[1]);..  /* 
5020: 4c 69 6d 69 74 20 74 68 65 20 6c 65 6e 67 74 68  Limit the length
5030: 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20   of the LIKE or 
5040: 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 20  GLOB pattern to 
5050: 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20  avoid problems. 
5060: 20 2a 2a 20 6f 66 20 64 65 65 70 20 72 65 63 75   ** of deep recu
5070: 72 73 69 6f 6e 20 61 6e 64 20 4e 2a 4e 20 62 65  rsion and N*N be
5080: 68 61 76 69 6f 72 20 69 6e 20 70 61 74 74 65 72  havior in patter
5090: 6e 43 6f 6d 70 61 72 65 28 29 2e 0a 20 20 2a 2f  nCompare()..  */
50a0: 0a 20 20 6e 50 61 74 20 3d 20 73 71 6c 69 74 65  .  nPat = sqlite
50b0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
50c0: 67 76 5b 30 5d 29 3b 0a 20 20 74 65 73 74 63 61  gv[0]);.  testca
50d0: 73 65 28 20 6e 50 61 74 3d 3d 64 62 2d 3e 61 4c  se( nPat==db->aL
50e0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
50f0: 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  T_LIKE_PATTERN_L
5100: 45 4e 47 54 48 5d 20 29 3b 0a 20 20 74 65 73 74  ENGTH] );.  test
5110: 63 61 73 65 28 20 6e 50 61 74 3d 3d 64 62 2d 3e  case( nPat==db->
5120: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
5130: 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
5140: 5f 4c 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20 20  _LENGTH]+1 );.  
5150: 69 66 28 20 6e 50 61 74 20 3e 20 64 62 2d 3e 61  if( nPat > db->a
5160: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5170: 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
5180: 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 73  LENGTH] ){.    s
5190: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
51a0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 4c 49  ror(context, "LI
51b0: 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61 74 74 65  KE or GLOB patte
51c0: 72 6e 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 22 2c  rn too complex",
51d0: 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
51e0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
51f0: 7a 42 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  zB==sqlite3_valu
5200: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20  e_text(argv[0]) 
5210: 29 3b 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20  );  /* Encoding 
5220: 64 69 64 20 6e 6f 74 20 63 68 61 6e 67 65 20 2a  did not change *
5230: 2f 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 33  /..  if( argc==3
5240: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
5250: 73 63 61 70 65 20 63 68 61 72 61 63 74 65 72 20  scape character 
5260: 73 74 72 69 6e 67 20 6d 75 73 74 20 63 6f 6e 73  string must cons
5270: 69 73 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ist of a single 
5280: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 2e  UTF-8 character.
5290: 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
52a0: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
52b0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  or..    */.    c
52c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
52d0: 61 72 20 2a 7a 45 73 63 20 3d 20 73 71 6c 69 74  ar *zEsc = sqlit
52e0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
52f0: 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[2]);.    if( 
5300: 7a 45 73 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  zEsc==0 ) return
5310: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
5320: 33 55 74 66 38 43 68 61 72 4c 65 6e 28 28 63 68  3Utf8CharLen((ch
5330: 61 72 2a 29 7a 45 73 63 2c 20 2d 31 29 21 3d 31  ar*)zEsc, -1)!=1
5340: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5350: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
5360: 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20  ontext, .       
5370: 20 20 20 22 45 53 43 41 50 45 20 65 78 70 72 65     "ESCAPE expre
5380: 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 20  ssion must be a 
5390: 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72  single character
53a0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 72 65  ", -1);.      re
53b0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
53c0: 65 73 63 61 70 65 20 3d 20 73 71 6c 69 74 65 33  escape = sqlite3
53d0: 55 74 66 38 52 65 61 64 28 26 7a 45 73 63 29 3b  Utf8Read(&zEsc);
53e0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 20 26 26  .  }.  if( zA &&
53f0: 20 7a 42 20 29 7b 0a 20 20 20 20 73 74 72 75 63   zB ){.    struc
5400: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70  t compareInfo *p
5410: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 75  Info = sqlite3_u
5420: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
5430: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
5440: 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65  _TEST.    sqlite
5450: 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_like_count++;.
5460: 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20  #endif.    .    
5470: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
5480: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 61 74 74  nt(context, patt
5490: 65 72 6e 43 6f 6d 70 61 72 65 28 7a 42 2c 20 7a  ernCompare(zB, z
54a0: 41 2c 20 70 49 6e 66 6f 2c 20 65 73 63 61 70 65  A, pInfo, escape
54b0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
54c0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
54d0: 6f 66 20 74 68 65 20 4e 55 4c 4c 49 46 28 78 2c  of the NULLIF(x,
54e0: 79 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  y) function.  Th
54f0: 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20  e result is the 
5500: 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
5510: 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  t if the argumen
5520: 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
5530: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
5540: 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a 2a 2a 20   NULL if the.** 
5550: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 65 71  arguments are eq
5560: 75 61 6c 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ual to each othe
5570: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
5580: 64 20 6e 75 6c 6c 69 66 46 75 6e 63 28 0a 20 20  d nullifFunc(.  
5590: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
55a0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
55b0: 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74  NotUsed,.  sqlit
55c0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
55d0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
55e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
55f0: 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74  FuncCollSeq(cont
5600: 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ext);.  UNUSED_P
5610: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
5620: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
5630: 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72 67 76 5b  MemCompare(argv[
5640: 30 5d 2c 20 61 72 67 76 5b 31 5d 2c 20 70 43 6f  0], argv[1], pCo
5650: 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  ll)!=0 ){.    sq
5660: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
5670: 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  ue(context, argv
5680: 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  [0]);.  }.}../*.
5690: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
56a0: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
56b0: 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69  version() functi
56c0: 6f 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  on.  The result 
56d0: 69 73 20 74 68 65 20 76 65 72 73 69 6f 6e 0a 2a  is the version.*
56e0: 2a 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20  * of the SQLite 
56f0: 6c 69 62 72 61 72 79 20 74 68 61 74 20 69 73 20  library that is 
5700: 72 75 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  running..*/.stat
5710: 69 63 20 76 6f 69 64 20 76 65 72 73 69 6f 6e 46  ic void versionF
5720: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
5730: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5740: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
5750: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
5760: 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20  **NotUsed2.){.  
5770: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5780: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
5790: 65 64 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20  ed2);.  /* IMP: 
57a0: 52 2d 34 38 36 39 39 2d 34 38 36 31 37 20 54 68  R-48699-48617 Th
57b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
57c0: 6e 20 53 51 4c 20 77 72 61 70 70 65 72 20 61 72  n SQL wrapper ar
57d0: 6f 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71  ound the.  ** sq
57e0: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
57f0: 28 29 20 43 2d 69 6e 74 65 72 66 61 63 65 2e 20  () C-interface. 
5800: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  */.  sqlite3_res
5810: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
5820: 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  , sqlite3_libver
5830: 73 69 6f 6e 28 29 2c 20 2d 31 2c 20 53 51 4c 49  sion(), -1, SQLI
5840: 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f  TE_STATIC);.}../
5850: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
5860: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
5870: 65 5f 73 6f 75 72 63 65 5f 69 64 28 29 20 66 75  e_source_id() fu
5880: 6e 63 74 69 6f 6e 2e 20 54 68 65 20 72 65 73 75  nction. The resu
5890: 6c 74 20 69 73 20 61 20 73 74 72 69 6e 67 0a 2a  lt is a string.*
58a0: 2a 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65  * that identifie
58b0: 73 20 74 68 65 20 70 61 72 74 69 63 75 6c 61 72  s the particular
58c0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
58d0: 73 6f 75 72 63 65 20 63 6f 64 65 20 75 73 65 64  source code used
58e0: 20 74 6f 20 62 75 69 6c 64 0a 2a 2a 20 53 51 4c   to build.** SQL
58f0: 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ite..*/.static v
5900: 6f 69 64 20 73 6f 75 72 63 65 69 64 46 75 6e 63  oid sourceidFunc
5910: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
5920: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
5930: 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73  int NotUsed,.  s
5940: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e  qlite3_value **N
5950: 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 55 4e 55  otUsed2.){.  UNU
5960: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
5970: 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
5980: 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  );.  /* IMP: R-2
5990: 34 34 37 30 2d 33 31 31 33 36 20 54 68 69 73 20  4470-31136 This 
59a0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 53  function is an S
59b0: 51 4c 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  QL wrapper aroun
59c0: 64 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  d the.  ** sqlit
59d0: 65 33 5f 73 6f 75 72 63 65 69 64 28 29 20 43 20  e3_sourceid() C 
59e0: 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f 0a 20 20  interface. */.  
59f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5a00: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  ext(context, sql
5a10: 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c  ite3_sourceid(),
5a20: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
5a30: 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  IC);.}../*.** Im
5a40: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
5a50: 74 68 65 20 73 71 6c 69 74 65 5f 6c 6f 67 28 29  the sqlite_log()
5a60: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
5a70: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
5a80: 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ound.** sqlite3_
5a90: 6c 6f 67 28 29 2e 20 20 54 68 65 20 72 65 74 75  log().  The retu
5aa0: 72 6e 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  rn value is NULL
5ab0: 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  .  The function 
5ac0: 65 78 69 73 74 73 20 70 75 72 65 6c 79 20 66 6f  exists purely fo
5ad0: 72 0a 2a 2a 20 69 74 73 20 73 69 64 65 2d 65 66  r.** its side-ef
5ae0: 66 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fects..*/.static
5af0: 20 76 6f 69 64 20 65 72 72 6c 6f 67 46 75 6e 63   void errlogFunc
5b00: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
5b10: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
5b20: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
5b30: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5b40: 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
5b50: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
5b60: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5b70: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c  (context);.  sql
5b80: 69 74 65 33 5f 6c 6f 67 28 73 71 6c 69 74 65 33  ite3_log(sqlite3
5b90: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
5ba0: 30 5d 29 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  0]), "%s", sqlit
5bb0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5bc0: 67 76 5b 31 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gv[1]));.}../*.*
5bd0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
5be0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 63   of the sqlite_c
5bf0: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65  ompileoption_use
5c00: 64 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  d() function..**
5c10: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   The result is a
5c20: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  n integer that i
5c30: 64 65 6e 74 69 66 69 65 73 20 69 66 20 74 68 65  dentifies if the
5c40: 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e   compiler option
5c50: 0a 2a 2a 20 77 61 73 20 75 73 65 64 20 74 6f 20  .** was used to 
5c60: 62 75 69 6c 64 20 53 51 4c 69 74 65 2e 0a 2a 2f  build SQLite..*/
5c70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5c80: 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
5c90: 4f 4e 5f 44 49 41 47 53 0a 73 74 61 74 69 63 20  ON_DIAGS.static 
5ca0: 76 6f 69 64 20 63 6f 6d 70 69 6c 65 6f 70 74 69  void compileopti
5cb0: 6f 6e 75 73 65 64 46 75 6e 63 28 0a 20 20 73 71  onusedFunc(.  sq
5cc0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5cd0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
5ce0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
5cf0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5d00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74  const char *zOpt
5d10: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
5d20: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55  argc==1 );.  UNU
5d30: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
5d40: 67 63 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52  gc);.  /* IMP: R
5d50: 2d 33 39 35 36 34 2d 33 36 33 30 35 20 54 68 65  -39564-36305 The
5d60: 20 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f   sqlite_compileo
5d70: 70 74 69 6f 6e 5f 75 73 65 64 28 29 20 53 51 4c  ption_used() SQL
5d80: 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  .  ** function i
5d90: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
5da0: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  nd the sqlite3_c
5db0: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65  ompileoption_use
5dc0: 64 28 29 20 43 2f 43 2b 2b 0a 20 20 2a 2a 20 66  d() C/C++.  ** f
5dd0: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
5de0: 69 66 28 20 28 7a 4f 70 74 4e 61 6d 65 20 3d 20  if( (zOptName = 
5df0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
5e00: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5e10: 61 72 67 76 5b 30 5d 29 29 21 3d 30 20 29 7b 0a  argv[0]))!=0 ){.
5e20: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5e30: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
5e40: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f  sqlite3_compileo
5e50: 70 74 69 6f 6e 5f 75 73 65 64 28 7a 4f 70 74 4e  ption_used(zOptN
5e60: 61 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ame));.  }.}.#en
5e70: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
5e80: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
5e90: 5f 44 49 41 47 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DIAGS */../*.**
5ea0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5eb0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 63 6f  of the sqlite_co
5ec0: 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28  mpileoption_get(
5ed0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20  ) function. .** 
5ee0: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  The result is a 
5ef0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 64 65 6e  string that iden
5f00: 74 69 66 69 65 73 20 74 68 65 20 63 6f 6d 70 69  tifies the compi
5f10: 6c 65 72 20 6f 70 74 69 6f 6e 73 20 0a 2a 2a 20  ler options .** 
5f20: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 53 51  used to build SQ
5f30: 4c 69 74 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  Lite..*/.#ifndef
5f40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
5f50: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
5f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
5f70: 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74 46 75 6e  pileoptiongetFun
5f80: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5f90: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
5fa0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
5fb0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5fc0: 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  v.){.  int n;.  
5fd0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
5fe0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
5ff0: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 2f  METER(argc);.  /
6000: 2a 20 49 4d 50 3a 20 52 2d 30 34 39 32 32 2d 32  * IMP: R-04922-2
6010: 34 30 37 36 20 54 68 65 20 73 71 6c 69 74 65 5f  4076 The sqlite_
6020: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65  compileoption_ge
6030: 74 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  t() SQL function
6040: 0a 20 20 2a 2a 20 69 73 20 61 20 77 72 61 70 70  .  ** is a wrapp
6050: 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 73 71  er around the sq
6060: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
6070: 69 6f 6e 5f 67 65 74 28 29 20 43 2f 43 2b 2b 20  ion_get() C/C++ 
6080: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
6090: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
60a0: 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b  ue_int(argv[0]);
60b0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
60c0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
60d0: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f  sqlite3_compileo
60e0: 70 74 69 6f 6e 5f 67 65 74 28 6e 29 2c 20 2d 31  ption_get(n), -1
60f0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
6100: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6110: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
6120: 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f  EOPTION_DIAGS */
6130: 0a 0a 2f 2a 20 41 72 72 61 79 20 66 6f 72 20 63  ../* Array for c
6140: 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d 20 68  onverting from h
6150: 61 6c 66 2d 62 79 74 65 73 20 28 6e 79 62 62 6c  alf-bytes (nybbl
6160: 65 73 29 20 69 6e 74 6f 20 41 53 43 49 49 20 68  es) into ASCII h
6170: 65 78 0a 2a 2a 20 64 69 67 69 74 73 2e 20 2a 2f  ex.** digits. */
6180: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6190: 61 72 20 68 65 78 64 69 67 69 74 73 5b 5d 20 3d  ar hexdigits[] =
61a0: 20 7b 0a 20 20 27 30 27 2c 20 27 31 27 2c 20 27   {.  '0', '1', '
61b0: 32 27 2c 20 27 33 27 2c 20 27 34 27 2c 20 27 35  2', '3', '4', '5
61c0: 27 2c 20 27 36 27 2c 20 27 37 27 2c 0a 20 20 27  ', '6', '7',.  '
61d0: 38 27 2c 20 27 39 27 2c 20 27 41 27 2c 20 27 42  8', '9', 'A', 'B
61e0: 27 2c 20 27 43 27 2c 20 27 44 27 2c 20 27 45 27  ', 'C', 'D', 'E'
61f0: 2c 20 27 46 27 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  , 'F' .};../*.**
6200: 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 2d 20   EXPERIMENTAL - 
6210: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20 6f  This is not an o
6220: 66 66 69 63 69 61 6c 20 66 75 6e 63 74 69 6f 6e  fficial function
6230: 2e 20 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  .  The interface
6240: 20 6d 61 79 0a 2a 2a 20 63 68 61 6e 67 65 2e 20   may.** change. 
6250: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
6260: 61 79 20 64 69 73 61 70 70 65 61 72 2e 20 20 44  ay disappear.  D
6270: 6f 20 6e 6f 74 20 77 72 69 74 65 20 63 6f 64 65  o not write code
6280: 20 74 68 61 74 20 64 65 70 65 6e 64 73 0a 2a 2a   that depends.**
6290: 20 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f   on this functio
62a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  n..**.** Impleme
62b0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 51  ntation of the Q
62c0: 55 4f 54 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e  UOTE() function.
62d0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
62e0: 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  takes a single.*
62f0: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20  * argument.  If 
6300: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
6310: 6e 75 6d 65 72 69 63 2c 20 74 68 65 20 72 65 74  numeric, the ret
6320: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
6330: 20 73 61 6d 65 20 61 73 0a 2a 2a 20 74 68 65 20   same as.** the 
6340: 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20 74 68  argument.  If th
6350: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  e argument is NU
6360: 4c 4c 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  LL, the return v
6370: 61 6c 75 65 20 69 73 20 74 68 65 20 73 74 72 69  alue is the stri
6380: 6e 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e 20 20 4f  ng.** "NULL".  O
6390: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 72  therwise, the ar
63a0: 67 75 6d 65 6e 74 20 69 73 20 65 6e 63 6c 6f 73  gument is enclos
63b0: 65 64 20 69 6e 20 73 69 6e 67 6c 65 20 71 75 6f  ed in single quo
63c0: 74 65 73 20 77 69 74 68 0a 2a 2a 20 73 69 6e 67  tes with.** sing
63d0: 6c 65 2d 71 75 6f 74 65 20 65 73 63 61 70 65 73  le-quote escapes
63e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
63f0: 20 71 75 6f 74 65 46 75 6e 63 28 73 71 6c 69 74   quoteFunc(sqlit
6400: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
6410: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
6420: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6430: 72 67 76 29 7b 0a 20 20 61 73 73 65 72 74 28 20  rgv){.  assert( 
6440: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55  argc==1 );.  UNU
6450: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
6460: 67 63 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  gc);.  switch( s
6470: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
6480: 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20  e(argv[0]) ){.  
6490: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
64a0: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75  OAT: {.      dou
64b0: 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20  ble r1, r2;.    
64c0: 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
64d0: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
64e0: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
64f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
6500: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6510: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
6520: 7a 42 75 66 2c 20 22 25 21 2e 31 35 67 22 2c 20  zBuf, "%!.15g", 
6530: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
6540: 65 33 41 74 6f 46 28 7a 42 75 66 2c 20 26 72 32  e3AtoF(zBuf, &r2
6550: 2c 20 32 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  , 20, SQLITE_UTF
6560: 38 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 31  8);.      if( r1
6570: 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20  !=r2 ){.        
6580: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6590: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
65a0: 42 75 66 2c 20 22 25 21 2e 32 30 65 22 2c 20 72  Buf, "%!.20e", r
65b0: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
65c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
65d0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
65e0: 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
65f0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
6600: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6610: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
6620: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
6630: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
6640: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
6650: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 62 72  gv[0]);.      br
6660: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6670: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
6680: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
6690: 54 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Text = 0;.      
66a0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 42 6c 6f  char const *zBlo
66b0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  b = sqlite3_valu
66c0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
66d0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62  .      int nBlob
66e0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
66f0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
6700: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
6710: 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76 61  Blob==sqlite3_va
6720: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
6730: 29 20 29 3b 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64  ) ); /* No encod
6740: 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ing change */.  
6750: 20 20 20 20 7a 54 65 78 74 20 3d 20 28 63 68 61      zText = (cha
6760: 72 20 2a 29 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  r *)contextMallo
6770: 63 28 63 6f 6e 74 65 78 74 2c 20 28 32 2a 28 69  c(context, (2*(i
6780: 36 34 29 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a 20  64)nBlob)+4); . 
6790: 20 20 20 20 20 69 66 28 20 7a 54 65 78 74 20 29       if( zText )
67a0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
67b0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
67c0: 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b  ; i<nBlob; i++){
67d0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 78 74  .          zText
67e0: 5b 28 69 2a 32 29 2b 32 5d 20 3d 20 68 65 78 64  [(i*2)+2] = hexd
67f0: 69 67 69 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 3e  igits[(zBlob[i]>
6800: 3e 34 29 26 30 78 30 46 5d 3b 0a 20 20 20 20 20  >4)&0x0F];.     
6810: 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29       zText[(i*2)
6820: 2b 33 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b  +3] = hexdigits[
6830: 28 7a 42 6c 6f 62 5b 69 5d 29 26 30 78 30 46 5d  (zBlob[i])&0x0F]
6840: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6850: 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62      zText[(nBlob
6860: 2a 32 29 2b 32 5d 20 3d 20 27 5c 27 27 3b 0a 20  *2)+2] = '\'';. 
6870: 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42         zText[(nB
6880: 6c 6f 62 2a 32 29 2b 33 5d 20 3d 20 27 5c 30 27  lob*2)+3] = '\0'
6890: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b  ;.        zText[
68a0: 30 5d 20 3d 20 27 58 27 3b 0a 20 20 20 20 20 20  0] = 'X';.      
68b0: 20 20 7a 54 65 78 74 5b 31 5d 20 3d 20 27 5c 27    zText[1] = '\'
68c0: 27 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ';.        sqlit
68d0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
68e0: 6f 6e 74 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d  ontext, zText, -
68f0: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
6900: 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ENT);.        sq
6910: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74  lite3_free(zText
6920: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6940: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
6950: 58 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  XT: {.      int 
6960: 69 2c 6a 3b 0a 20 20 20 20 20 20 75 36 34 20 6e  i,j;.      u64 n
6970: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e  ;.      const un
6980: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 72  signed char *zAr
6990: 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  g = sqlite3_valu
69a0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
69b0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  .      char *z;.
69c0: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 72 67 3d  .      if( zArg=
69d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
69e0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 30 3b     for(i=0, n=0;
69f0: 20 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 20   zArg[i]; i++){ 
6a00: 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27  if( zArg[i]=='\'
6a10: 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20  ' ) n++; }.     
6a20: 20 7a 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c   z = contextMall
6a30: 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36  oc(context, ((i6
6a40: 34 29 69 29 2b 28 28 69 36 34 29 6e 29 2b 33 29  4)i)+((i64)n)+3)
6a50: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b  ;.      if( z ){
6a60: 0a 20 20 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20  .        z[0] = 
6a70: 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 66 6f  '\'';.        fo
6a80: 72 28 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41 72 67  r(i=0, j=1; zArg
6a90: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
6aa0: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41       z[j++] = zA
6ab0: 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  rg[i];.         
6ac0: 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c   if( zArg[i]=='\
6ad0: 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  '' ){.          
6ae0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b    z[j++] = '\'';
6af0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6b00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
6b10: 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [j++] = '\'';.  
6b20: 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a        z[j] = 0;.
6b30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6b40: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
6b50: 65 78 74 2c 20 7a 2c 20 6a 2c 20 73 71 6c 69 74  ext, z, j, sqlit
6b60: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20  e3_free);.      
6b70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6b80: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
6b90: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
6ba0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
6bb0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53  type(argv[0])==S
6bc0: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b 0a 20 20  QLITE_NULL );.  
6bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6be0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
6bf0: 20 22 4e 55 4c 4c 22 2c 20 34 2c 20 53 51 4c 49   "NULL", 4, SQLI
6c00: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
6c10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6c20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
6c30: 75 6e 69 63 6f 64 65 28 29 20 66 75 6e 63 74 69  unicode() functi
6c40: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  on.  Return the 
6c50: 69 6e 74 65 67 65 72 20 75 6e 69 63 6f 64 65 20  integer unicode 
6c60: 63 6f 64 65 2d 70 6f 69 6e 74 20 76 61 6c 75 65  code-point value
6c70: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 69 72 73  .** for the firs
6c80: 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  t character of t
6c90: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e  he input string.
6ca0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
6cb0: 20 75 6e 69 63 6f 64 65 46 75 6e 63 28 0a 20 20   unicodeFunc(.  
6cc0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6cd0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
6ce0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
6cf0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
6d00: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
6d10: 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
6d20: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
6d30: 67 76 5b 30 5d 29 3b 0a 20 20 28 76 6f 69 64 29  gv[0]);.  (void)
6d40: 61 72 67 63 3b 0a 20 20 69 66 28 20 7a 20 26 26  argc;.  if( z &&
6d50: 20 7a 5b 30 5d 20 29 20 73 71 6c 69 74 65 33 5f   z[0] ) sqlite3_
6d60: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6d70: 78 74 2c 20 73 71 6c 69 74 65 33 55 74 66 38 52  xt, sqlite3Utf8R
6d80: 65 61 64 28 26 7a 29 29 3b 0a 7d 0a 0a 2f 2a 0a  ead(&z));.}../*.
6d90: 2a 2a 20 54 68 65 20 63 68 61 72 28 29 20 66 75  ** The char() fu
6da0: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 7a 65 72  nction takes zer
6db0: 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65  o or more argume
6dc0: 6e 74 73 2c 20 65 61 63 68 20 6f 66 20 77 68 69  nts, each of whi
6dd0: 63 68 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65  ch is.** an inte
6de0: 67 65 72 2e 20 20 49 74 20 63 6f 6e 73 74 72 75  ger.  It constru
6df0: 63 74 73 20 61 20 73 74 72 69 6e 67 20 77 68 65  cts a string whe
6e00: 72 65 20 65 61 63 68 20 63 68 61 72 61 63 74 65  re each characte
6e10: 72 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 0a  r of the string.
6e20: 2a 2a 20 69 73 20 74 68 65 20 75 6e 69 63 6f 64  ** is the unicod
6e30: 65 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20  e character for 
6e40: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
6e50: 67 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  g integer argume
6e60: 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nt..*/.#ifndef S
6e70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
6e80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61  .static void cha
6e90: 72 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  rFunc(.  sqlite3
6ea0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6eb0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
6ec0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6ed0: 2a 61 72 67 76 0a 29 7b 0a 20 20 75 6e 73 69 67  *argv.){.  unsig
6ee0: 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 4f  ned char *z, *zO
6ef0: 75 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 7a  ut;.  int i;.  z
6f00: 4f 75 74 20 3d 20 7a 20 3d 20 73 71 6c 69 74 65  Out = z = sqlite
6f10: 33 5f 6d 61 6c 6c 6f 63 28 20 61 72 67 63 2a 34  3_malloc( argc*4
6f20: 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29   );.  if( z==0 )
6f30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
6f40: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
6f50: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  (context);.    r
6f60: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  eturn;.  }.  for
6f70: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
6f80: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
6f90: 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 75 6e 73  int64 x;.    uns
6fa0: 69 67 6e 65 64 20 63 3b 0a 20 20 20 20 78 20 3d  igned c;.    x =
6fb0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
6fc0: 6e 74 36 34 28 61 72 67 76 5b 69 5d 29 3b 0a 20  nt64(argv[i]);. 
6fd0: 20 20 20 69 66 28 20 78 3c 30 20 7c 7c 20 78 3e     if( x<0 || x>
6fe0: 30 78 31 30 66 66 66 66 20 29 20 78 20 3d 20 30  0x10ffff ) x = 0
6ff0: 78 66 66 66 64 3b 0a 20 20 20 20 63 20 3d 20 28  xfffd;.    c = (
7000: 75 6e 73 69 67 6e 65 64 29 28 78 20 26 20 30 78  unsigned)(x & 0x
7010: 31 66 66 66 66 66 29 3b 0a 20 20 20 20 69 66 28  1fffff);.    if(
7020: 20 63 3c 3d 30 78 46 46 46 46 20 29 7b 0a 20 20   c<=0xFFFF ){.  
7030: 20 20 20 20 69 66 28 20 63 3e 3d 30 78 64 38 30      if( c>=0xd80
7040: 30 20 26 26 20 63 3c 3d 30 78 64 66 66 66 20 29  0 && c<=0xdfff )
7050: 20 63 20 3d 20 30 78 66 66 66 64 3b 0a 20 20 20   c = 0xfffd;.   
7060: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38     *zOut++ = (u8
7070: 29 28 63 26 30 78 30 30 46 46 29 3b 0a 20 20 20  )(c&0x00FF);.   
7080: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38     *zOut++ = (u8
7090: 29 28 28 63 3e 3e 38 29 26 30 78 30 30 46 46 29  )((c>>8)&0x00FF)
70a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
70b0: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38     *zOut++ = (u8
70c0: 29 28 28 28 63 3e 3e 31 30 29 26 30 78 30 30 33  )(((c>>10)&0x003
70d0: 46 29 20 2b 20 28 28 28 63 2d 30 78 31 30 30 30  F) + (((c-0x1000
70e0: 30 29 3e 3e 31 30 29 26 30 78 30 30 43 30 29 29  0)>>10)&0x00C0))
70f0: 3b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20  ;.      *zOut++ 
7100: 3d 20 28 75 38 29 28 30 78 30 30 44 38 20 2b 20  = (u8)(0x00D8 + 
7110: 28 28 28 63 2d 30 78 31 30 30 30 30 29 3e 3e 31  (((c-0x10000)>>1
7120: 38 29 26 30 78 30 33 29 29 3b 0a 20 20 20 20 20  8)&0x03));.     
7130: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28   *zOut++ = (u8)(
7140: 63 26 30 78 30 30 46 46 29 3b 0a 20 20 20 20 20  c&0x00FF);.     
7150: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28   *zOut++ = (u8)(
7160: 30 78 30 30 44 43 20 2b 20 28 28 63 3e 3e 38 29  0x00DC + ((c>>8)
7170: 26 30 78 30 33 29 29 3b 0a 20 20 20 20 7d 0a 20  &0x03));.    }. 
7180: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
7190: 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 63 6f 6e  ult_text16le(con
71a0: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20  text, (char*)z, 
71b0: 28 69 6e 74 29 28 7a 4f 75 74 2d 7a 29 2c 20 73  (int)(zOut-z), s
71c0: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a  qlite3_free);.}.
71d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
71e0: 65 20 68 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  e hex() function
71f0: 2e 20 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  .  Interpret the
7200: 20 61 72 67 75 6d 65 6e 74 20 61 73 20 61 20 62   argument as a b
7210: 6c 6f 62 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  lob.  Return.** 
7220: 61 20 68 65 78 61 64 65 63 69 6d 61 6c 20 72 65  a hexadecimal re
7230: 6e 64 65 72 69 6e 67 20 61 73 20 74 65 78 74 2e  ndering as text.
7240: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7250: 68 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  hexFunc(.  sqlit
7260: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7270: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
7280: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
7290: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
72a0: 20 69 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75   i, n;.  const u
72b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
72c0: 6c 6f 62 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65  lob;.  char *zHe
72d0: 78 2c 20 2a 7a 3b 0a 20 20 61 73 73 65 72 74 28  x, *z;.  assert(
72e0: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
72f0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
7300: 72 67 63 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20  rgc);.  pBlob = 
7310: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
7320: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e  ob(argv[0]);.  n
7330: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7340: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
7350: 0a 20 20 61 73 73 65 72 74 28 20 70 42 6c 6f 62  .  assert( pBlob
7360: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
7370: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b  blob(argv[0]) );
7380: 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67    /* No encoding
7390: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 20 3d   change */.  z =
73a0: 20 7a 48 65 78 20 3d 20 63 6f 6e 74 65 78 74 4d   zHex = contextM
73b0: 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28  alloc(context, (
73c0: 28 69 36 34 29 6e 29 2a 32 20 2b 20 31 29 3b 0a  (i64)n)*2 + 1);.
73d0: 20 20 69 66 28 20 7a 48 65 78 20 29 7b 0a 20 20    if( zHex ){.  
73e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
73f0: 69 2b 2b 2c 20 70 42 6c 6f 62 2b 2b 29 7b 0a 20  i++, pBlob++){. 
7400: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
7410: 61 72 20 63 20 3d 20 2a 70 42 6c 6f 62 3b 0a 20  ar c = *pBlob;. 
7420: 20 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65       *(z++) = he
7430: 78 64 69 67 69 74 73 5b 28 63 3e 3e 34 29 26 30  xdigits[(c>>4)&0
7440: 78 66 5d 3b 0a 20 20 20 20 20 20 2a 28 7a 2b 2b  xf];.      *(z++
7450: 29 20 3d 20 68 65 78 64 69 67 69 74 73 5b 63 26  ) = hexdigits[c&
7460: 30 78 66 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  0xf];.    }.    
7470: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  *z = 0;.    sqli
7480: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
7490: 63 6f 6e 74 65 78 74 2c 20 7a 48 65 78 2c 20 6e  context, zHex, n
74a0: 2a 32 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  *2, sqlite3_free
74b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
74c0: 54 68 65 20 7a 65 72 6f 62 6c 6f 62 28 4e 29 20  The zeroblob(N) 
74d0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
74e0: 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 62   a zero-filled b
74f0: 6c 6f 62 20 6f 66 20 73 69 7a 65 20 4e 20 62 79  lob of size N by
7500: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
7510: 6f 69 64 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63  oid zeroblobFunc
7520: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
7530: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
7540: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
7550: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
7560: 0a 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 73  .){.  i64 n;.  s
7570: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
7580: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
7590: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
75a0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
75b0: 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
75c0: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
75d0: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
75e0: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
75f0: 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
7600: 6e 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  n==db->aLimit[SQ
7610: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
7620: 48 5d 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  H] );.  testcase
7630: 28 20 6e 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( n==db->aLimit[
7640: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
7650: 47 54 48 5d 2b 31 20 29 3b 0a 20 20 69 66 28 20  GTH]+1 );.  if( 
7660: 6e 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  n>db->aLimit[SQL
7670: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
7680: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
7690: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f  _result_error_to
76a0: 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20  obig(context);. 
76b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
76c0: 74 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62  te3_result_zerob
76d0: 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28 69 6e  lob(context, (in
76e0: 74 29 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  t)n); /* IMP: R-
76f0: 30 30 32 39 33 2d 36 34 39 39 34 20 2a 2f 0a 20  00293-64994 */. 
7700: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
7710: 72 65 70 6c 61 63 65 28 29 20 66 75 6e 63 74 69  replace() functi
7720: 6f 6e 2e 20 20 54 68 72 65 65 20 61 72 67 75 6d  on.  Three argum
7730: 65 6e 74 73 20 61 72 65 20 61 6c 6c 20 73 74 72  ents are all str
7740: 69 6e 67 73 3a 20 63 61 6c 6c 0a 2a 2a 20 74 68  ings: call.** th
7750: 65 6d 20 41 2c 20 42 2c 20 61 6e 64 20 43 2e 20  em A, B, and C. 
7760: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  The result is al
7770: 73 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  so a string whic
7780: 68 20 69 73 20 64 65 72 69 76 65 64 0a 2a 2a 20  h is derived.** 
7790: 66 72 6f 6d 20 41 20 62 79 20 72 65 70 6c 61 63  from A by replac
77a0: 69 6e 67 20 65 76 65 72 79 20 6f 63 63 75 72 61  ing every occura
77b0: 6e 63 65 20 6f 66 20 42 20 77 69 74 68 20 43 2e  nce of B with C.
77c0: 20 20 54 68 65 20 6d 61 74 63 68 0a 2a 2a 20 6d    The match.** m
77d0: 75 73 74 20 62 65 20 65 78 61 63 74 2e 20 20 43  ust be exact.  C
77e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
77f0: 65 73 20 61 72 65 20 6e 6f 74 20 75 73 65 64 2e  es are not used.
7800: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7810: 72 65 70 6c 61 63 65 46 75 6e 63 28 0a 20 20 73  replaceFunc(.  s
7820: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7830: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
7840: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
7850: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
7860: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7870: 63 68 61 72 20 2a 7a 53 74 72 3b 20 20 20 20 20  char *zStr;     
7880: 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20     /* The input 
7890: 73 74 72 69 6e 67 20 41 20 2a 2f 0a 20 20 63 6f  string A */.  co
78a0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
78b0: 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20 20  r *zPattern;    
78c0: 2f 2a 20 54 68 65 20 70 61 74 74 65 72 6e 20 73  /* The pattern s
78d0: 74 72 69 6e 67 20 42 20 2a 2f 0a 20 20 63 6f 6e  tring B */.  con
78e0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
78f0: 20 2a 7a 52 65 70 3b 20 20 20 20 20 20 20 20 2f   *zRep;        /
7900: 2a 20 54 68 65 20 72 65 70 6c 61 63 65 6d 65 6e  * The replacemen
7910: 74 20 73 74 72 69 6e 67 20 43 20 2a 2f 0a 20 20  t string C */.  
7920: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
7930: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
7940: 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
7950: 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 72 3b 20 20  */.  int nStr;  
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7970: 20 53 69 7a 65 20 6f 66 20 7a 53 74 72 20 2a 2f   Size of zStr */
7980: 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b  .  int nPattern;
7990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
79a0: 69 7a 65 20 6f 66 20 7a 50 61 74 74 65 72 6e 20  ize of zPattern 
79b0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 70 3b 20 20  */.  int nRep;  
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
79d0: 20 53 69 7a 65 20 6f 66 20 7a 52 65 70 20 2a 2f   Size of zRep */
79e0: 0a 20 20 69 36 34 20 6e 4f 75 74 3b 20 20 20 20  .  i64 nOut;    
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7a00: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 7a  aximum size of z
7a10: 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6f  Out */.  int loo
7a20: 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
7a30: 20 20 2f 2a 20 4c 61 73 74 20 7a 53 74 72 5b 5d    /* Last zStr[]
7a40: 20 74 68 61 74 20 6d 69 67 68 74 20 6d 61 74 63   that might matc
7a50: 68 20 7a 50 61 74 74 65 72 6e 5b 5d 20 2a 2f 0a  h zPattern[] */.
7a60: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
7a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7a80: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 0a  op counters */..
7a90: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
7aa0: 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  3 );.  UNUSED_PA
7ab0: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
7ac0: 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f   zStr = sqlite3_
7ad0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
7ae0: 30 5d 29 3b 0a 20 20 69 66 28 20 7a 53 74 72 3d  0]);.  if( zStr=
7af0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e  =0 ) return;.  n
7b00: 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Str = sqlite3_va
7b10: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
7b20: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53  ]);.  assert( zS
7b30: 74 72 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  tr==sqlite3_valu
7b40: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20  e_text(argv[0]) 
7b50: 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69  );  /* No encodi
7b60: 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a  ng change */.  z
7b70: 50 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65  Pattern = sqlite
7b80: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
7b90: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50 61  v[1]);.  if( zPa
7ba0: 74 74 65 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ttern==0 ){.    
7bb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7bc0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
7bd0: 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  1])==SQLITE_NULL
7be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
7bf0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
7c00: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
7c10: 74 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  t)->mallocFailed
7c20: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
7c30: 20 20 7d 0a 20 20 69 66 28 20 7a 50 61 74 74 65    }.  if( zPatte
7c40: 72 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  rn[0]==0 ){.    
7c50: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7c60: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
7c70: 31 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  1])!=SQLITE_NULL
7c80: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
7c90: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
7ca0: 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  text, argv[0]);.
7cb0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7cc0: 20 20 6e 50 61 74 74 65 72 6e 20 3d 20 73 71 6c    nPattern = sql
7cd0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
7ce0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73 73  (argv[1]);.  ass
7cf0: 65 72 74 28 20 7a 50 61 74 74 65 72 6e 3d 3d 73  ert( zPattern==s
7d00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
7d10: 74 28 61 72 67 76 5b 31 5d 29 20 29 3b 20 20 2f  t(argv[1]) );  /
7d20: 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68  * No encoding ch
7d30: 61 6e 67 65 20 2a 2f 0a 20 20 7a 52 65 70 20 3d  ange */.  zRep =
7d40: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
7d50: 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ext(argv[2]);.  
7d60: 69 66 28 20 7a 52 65 70 3d 3d 30 20 29 20 72 65  if( zRep==0 ) re
7d70: 74 75 72 6e 3b 0a 20 20 6e 52 65 70 20 3d 20 73  turn;.  nRep = s
7d80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
7d90: 65 73 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 61  es(argv[2]);.  a
7da0: 73 73 65 72 74 28 20 7a 52 65 70 3d 3d 73 71 6c  ssert( zRep==sql
7db0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
7dc0: 61 72 67 76 5b 32 5d 29 20 29 3b 0a 20 20 6e 4f  argv[2]) );.  nO
7dd0: 75 74 20 3d 20 6e 53 74 72 20 2b 20 31 3b 0a 20  ut = nStr + 1;. 
7de0: 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3c 53 51   assert( nOut<SQ
7df0: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
7e00: 29 3b 0a 20 20 7a 4f 75 74 20 3d 20 63 6f 6e 74  );.  zOut = cont
7e10: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
7e20: 74 2c 20 28 69 36 34 29 6e 4f 75 74 29 3b 0a 20  t, (i64)nOut);. 
7e30: 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a   if( zOut==0 ){.
7e40: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7e50: 20 20 6c 6f 6f 70 4c 69 6d 69 74 20 3d 20 6e 53    loopLimit = nS
7e60: 74 72 20 2d 20 6e 50 61 74 74 65 72 6e 3b 20 20  tr - nPattern;  
7e70: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
7e80: 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20 69 2b 2b 29  =loopLimit; i++)
7e90: 7b 0a 20 20 20 20 69 66 28 20 7a 53 74 72 5b 69  {.    if( zStr[i
7ea0: 5d 21 3d 7a 50 61 74 74 65 72 6e 5b 30 5d 20 7c  ]!=zPattern[0] |
7eb0: 7c 20 6d 65 6d 63 6d 70 28 26 7a 53 74 72 5b 69  | memcmp(&zStr[i
7ec0: 5d 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e 50 61  ], zPattern, nPa
7ed0: 74 74 65 72 6e 29 20 29 7b 0a 20 20 20 20 20 20  ttern) ){.      
7ee0: 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 53 74 72  zOut[j++] = zStr
7ef0: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
7f00: 20 20 20 20 20 20 75 38 20 2a 7a 4f 6c 64 3b 0a        u8 *zOld;.
7f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
7f20: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
7f30: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
7f40: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 4f  ntext);.      nO
7f50: 75 74 20 2b 3d 20 6e 52 65 70 20 2d 20 6e 50 61  ut += nRep - nPa
7f60: 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 74 65 73  ttern;.      tes
7f70: 74 63 61 73 65 28 20 6e 4f 75 74 2d 31 3d 3d 64  tcase( nOut-1==d
7f80: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
7f90: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
7fa0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7fb0: 28 20 6e 4f 75 74 2d 32 3d 3d 64 62 2d 3e 61 4c  ( nOut-2==db->aL
7fc0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
7fd0: 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20  T_LENGTH] );.   
7fe0: 20 20 20 69 66 28 20 6e 4f 75 74 2d 31 3e 64 62     if( nOut-1>db
7ff0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8000: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
8010: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8020: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f  _result_error_to
8030: 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20  obig(context);. 
8040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
8050: 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
8060: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
8070: 20 7d 0a 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20   }.      zOld = 
8080: 7a 4f 75 74 3b 0a 20 20 20 20 20 20 7a 4f 75 74  zOut;.      zOut
8090: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
80a0: 6f 63 28 7a 4f 75 74 2c 20 28 69 6e 74 29 6e 4f  oc(zOut, (int)nO
80b0: 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ut);.      if( z
80c0: 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
80d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
80e0: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
80f0: 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73  text);.        s
8100: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64  qlite3_free(zOld
8110: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
8120: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
8130: 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d   memcpy(&zOut[j]
8140: 2c 20 7a 52 65 70 2c 20 6e 52 65 70 29 3b 0a 20  , zRep, nRep);. 
8150: 20 20 20 20 20 6a 20 2b 3d 20 6e 52 65 70 3b 0a       j += nRep;.
8160: 20 20 20 20 20 20 69 20 2b 3d 20 6e 50 61 74 74        i += nPatt
8170: 65 72 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ern-1;.    }.  }
8180: 0a 20 20 61 73 73 65 72 74 28 20 6a 2b 6e 53 74  .  assert( j+nSt
8190: 72 2d 69 2b 31 3d 3d 6e 4f 75 74 20 29 3b 0a 20  r-i+1==nOut );. 
81a0: 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6a 5d   memcpy(&zOut[j]
81b0: 2c 20 26 7a 53 74 72 5b 69 5d 2c 20 6e 53 74 72  , &zStr[i], nStr
81c0: 2d 69 29 3b 0a 20 20 6a 20 2b 3d 20 6e 53 74 72  -i);.  j += nStr
81d0: 20 2d 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20   - i;.  assert( 
81e0: 6a 3c 3d 6e 4f 75 74 20 29 3b 0a 20 20 7a 4f 75  j<=nOut );.  zOu
81f0: 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  t[j] = 0;.  sqli
8200: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
8210: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
8220: 7a 4f 75 74 2c 20 6a 2c 20 73 71 6c 69 74 65 33  zOut, j, sqlite3
8230: 5f 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _free);.}../*.**
8240: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
8250: 6f 66 20 74 68 65 20 54 52 49 4d 28 29 2c 20 4c  of the TRIM(), L
8260: 54 52 49 4d 28 29 2c 20 61 6e 64 20 52 54 52 49  TRIM(), and RTRI
8270: 4d 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  M() functions..*
8280: 2a 20 54 68 65 20 75 73 65 72 64 61 74 61 20 69  * The userdata i
8290: 73 20 30 78 31 20 66 6f 72 20 6c 65 66 74 20 74  s 0x1 for left t
82a0: 72 69 6d 2c 20 30 78 32 20 66 6f 72 20 72 69 67  rim, 0x2 for rig
82b0: 68 74 20 74 72 69 6d 2c 20 30 78 33 20 66 6f 72  ht trim, 0x3 for
82c0: 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
82d0: 20 76 6f 69 64 20 74 72 69 6d 46 75 6e 63 28 0a   void trimFunc(.
82e0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
82f0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
8300: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
8310: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
8320: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
8330: 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20  ed char *zIn;   
8340: 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 73        /* Input s
8350: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  tring */.  const
8360: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8370: 7a 43 68 61 72 53 65 74 3b 20 20 20 20 2f 2a 20  zCharSet;    /* 
8380: 53 65 74 20 6f 66 20 63 68 61 72 61 63 74 65 72  Set of character
8390: 73 20 74 6f 20 74 72 69 6d 20 2a 2f 0a 20 20 69  s to trim */.  i
83a0: 6e 74 20 6e 49 6e 3b 20 20 20 20 20 20 20 20 20  nt nIn;         
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
83d0: 74 65 73 20 69 6e 20 69 6e 70 75 74 20 2a 2f 0a  tes in input */.
83e0: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 2f 2a 20 31 3a 20 74 72 69 6d 6c 65      /* 1: trimle
8410: 66 74 20 20 32 3a 20 74 72 69 6d 72 69 67 68 74  ft  2: trimright
8420: 20 20 33 3a 20 74 72 69 6d 20 2a 2f 0a 20 20 69    3: trim */.  i
8430: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8460: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
8470: 68 61 72 20 2a 61 4c 65 6e 20 3d 20 30 3b 20 20  har *aLen = 0;  
8480: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
8490: 68 20 6f 66 20 65 61 63 68 20 63 68 61 72 61 63  h of each charac
84a0: 74 65 72 20 69 6e 20 7a 43 68 61 72 53 65 74 20  ter in zCharSet 
84b0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
84c0: 61 72 20 2a 2a 61 7a 43 68 61 72 20 3d 20 30 3b  ar **azChar = 0;
84d0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 76 69         /* Indivi
84e0: 64 75 61 6c 20 63 68 61 72 61 63 74 65 72 73 20  dual characters 
84f0: 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20  in zCharSet */. 
8500: 20 69 6e 74 20 6e 43 68 61 72 3b 20 20 20 20 20   int nChar;     
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8530: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43  characters in zC
8540: 68 61 72 53 65 74 20 2a 2f 0a 0a 20 20 69 66 28  harSet */..  if(
8550: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8560: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
8570: 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
8580: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a   return;.  }.  z
8590: 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  In = sqlite3_val
85a0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
85b0: 3b 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29  ;.  if( zIn==0 )
85c0: 20 72 65 74 75 72 6e 3b 0a 20 20 6e 49 6e 20 3d   return;.  nIn =
85d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
85e0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
85f0: 20 61 73 73 65 72 74 28 20 7a 49 6e 3d 3d 73 71   assert( zIn==sq
8600: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
8610: 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69  (argv[0]) );.  i
8620: 66 28 20 61 72 67 63 3d 3d 31 20 29 7b 0a 20 20  f( argc==1 ){.  
8630: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
8640: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 6e  nsigned char len
8650: 4f 6e 65 5b 5d 20 3d 20 7b 20 31 20 7d 3b 0a 20  One[] = { 1 };. 
8660: 20 20 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e     static unsign
8670: 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  ed char * const 
8680: 61 7a 4f 6e 65 5b 5d 20 3d 20 7b 20 28 75 38 2a  azOne[] = { (u8*
8690: 29 22 20 22 20 7d 3b 0a 20 20 20 20 6e 43 68 61  )" " };.    nCha
86a0: 72 20 3d 20 31 3b 0a 20 20 20 20 61 4c 65 6e 20  r = 1;.    aLen 
86b0: 3d 20 28 75 38 2a 29 6c 65 6e 4f 6e 65 3b 0a 20  = (u8*)lenOne;. 
86c0: 20 20 20 61 7a 43 68 61 72 20 3d 20 28 75 6e 73     azChar = (uns
86d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 29 61 7a  igned char **)az
86e0: 4f 6e 65 3b 0a 20 20 20 20 7a 43 68 61 72 53 65  One;.    zCharSe
86f0: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
8700: 66 28 20 28 7a 43 68 61 72 53 65 74 20 3d 20 73  f( (zCharSet = s
8710: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8720: 74 28 61 72 67 76 5b 31 5d 29 29 3d 3d 30 20 29  t(argv[1]))==0 )
8730: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
8740: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
8750: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8760: 7a 3b 0a 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68  z;.    for(z=zCh
8770: 61 72 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20  arSet, nChar=0; 
8780: 2a 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20  *z; nChar++){.  
8790: 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f      SQLITE_SKIP_
87a0: 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 7d 0a 20  UTF8(z);.    }. 
87b0: 20 20 20 69 66 28 20 6e 43 68 61 72 3e 30 20 29     if( nChar>0 )
87c0: 7b 0a 20 20 20 20 20 20 61 7a 43 68 61 72 20 3d  {.      azChar =
87d0: 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63   contextMalloc(c
87e0: 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29 6e 43  ontext, ((i64)nC
87f0: 68 61 72 29 2a 28 73 69 7a 65 6f 66 28 63 68 61  har)*(sizeof(cha
8800: 72 2a 29 2b 31 29 29 3b 0a 20 20 20 20 20 20 69  r*)+1));.      i
8810: 66 28 20 61 7a 43 68 61 72 3d 3d 30 20 29 7b 0a  f( azChar==0 ){.
8820: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
8830: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4c        }.      aL
8840: 65 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  en = (unsigned c
8850: 68 61 72 2a 29 26 61 7a 43 68 61 72 5b 6e 43 68  har*)&azChar[nCh
8860: 61 72 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 7a  ar];.      for(z
8870: 3d 7a 43 68 61 72 53 65 74 2c 20 6e 43 68 61 72  =zCharSet, nChar
8880: 3d 30 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b 29  =0; *z; nChar++)
8890: 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 68 61 72  {.        azChar
88a0: 5b 6e 43 68 61 72 5d 20 3d 20 28 75 6e 73 69 67  [nChar] = (unsig
88b0: 6e 65 64 20 63 68 61 72 20 2a 29 7a 3b 0a 20 20  ned char *)z;.  
88c0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
88d0: 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 20  P_UTF8(z);.     
88e0: 20 20 20 61 4c 65 6e 5b 6e 43 68 61 72 5d 20 3d     aLen[nChar] =
88f0: 20 28 75 38 29 28 7a 20 2d 20 61 7a 43 68 61 72   (u8)(z - azChar
8900: 5b 6e 43 68 61 72 5d 29 3b 0a 20 20 20 20 20 20  [nChar]);.      
8910: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
8920: 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20  ( nChar>0 ){.   
8930: 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
8940: 50 54 52 5f 54 4f 5f 49 4e 54 28 73 71 6c 69 74  PTR_TO_INT(sqlit
8950: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
8960: 74 65 78 74 29 29 3b 0a 20 20 20 20 69 66 28 20  text));.    if( 
8970: 66 6c 61 67 73 20 26 20 31 20 29 7b 0a 20 20 20  flags & 1 ){.   
8980: 20 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20     while( nIn>0 
8990: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ){.        int l
89a0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  en = 0;.        
89b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72  for(i=0; i<nChar
89c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
89d0: 20 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b 69 5d 3b    len = aLen[i];
89e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
89f0: 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d 65 6d 63 6d  en<=nIn && memcm
8a00: 70 28 7a 49 6e 2c 20 61 7a 43 68 61 72 5b 69 5d  p(zIn, azChar[i]
8a10: 2c 20 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65 61  , len)==0 ) brea
8a20: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
8a30: 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 61       if( i>=nCha
8a40: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
8a50: 20 20 20 7a 49 6e 20 2b 3d 20 6c 65 6e 3b 0a 20     zIn += len;. 
8a60: 20 20 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65         nIn -= le
8a70: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
8a80: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
8a90: 20 32 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c   2 ){.      whil
8aa0: 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20  e( nIn>0 ){.    
8ab0: 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b      int len = 0;
8ac0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
8ad0: 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b  ; i<nChar; i++){
8ae0: 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  .          len =
8af0: 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20   aLen[i];.      
8b00: 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e 49 6e      if( len<=nIn
8b10: 20 26 26 20 6d 65 6d 63 6d 70 28 26 7a 49 6e 5b   && memcmp(&zIn[
8b20: 6e 49 6e 2d 6c 65 6e 5d 2c 61 7a 43 68 61 72 5b  nIn-len],azChar[
8b30: 69 5d 2c 6c 65 6e 29 3d 3d 30 20 29 20 62 72 65  i],len)==0 ) bre
8b40: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
8b50: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68        if( i>=nCh
8b60: 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ar ) break;.    
8b70: 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a      nIn -= len;.
8b80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8b90: 20 20 69 66 28 20 7a 43 68 61 72 53 65 74 20 29    if( zCharSet )
8ba0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8bb0: 66 72 65 65 28 61 7a 43 68 61 72 29 3b 0a 20 20  free(azChar);.  
8bc0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
8bd0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
8be0: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 49  ntext, (char*)zI
8bf0: 6e 2c 20 6e 49 6e 2c 20 53 51 4c 49 54 45 5f 54  n, nIn, SQLITE_T
8c00: 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 0a 2f  RANSIENT);.}.../
8c10: 2a 20 49 4d 50 3a 20 52 2d 32 35 33 36 31 2d 31  * IMP: R-25361-1
8c20: 36 31 35 30 20 54 68 69 73 20 66 75 6e 63 74 69  6150 This functi
8c30: 6f 6e 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  on is omitted fr
8c40: 6f 6d 20 53 51 4c 69 74 65 20 62 79 20 64 65 66  om SQLite by def
8c50: 61 75 6c 74 2e 20 49 74 0a 2a 2a 20 69 73 20 6f  ault. It.** is o
8c60: 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 66  nly available if
8c70: 20 74 68 65 20 53 51 4c 49 54 45 5f 53 4f 55 4e   the SQLITE_SOUN
8c80: 44 45 58 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  DEX compile-time
8c90: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 0a   option is used.
8ca0: 2a 2a 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69  ** when SQLite i
8cb0: 73 20 62 75 69 6c 74 2e 0a 2a 2f 0a 23 69 66 64  s built..*/.#ifd
8cc0: 65 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45  ef SQLITE_SOUNDE
8cd0: 58 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  X./*.** Compute 
8ce0: 74 68 65 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f  the soundex enco
8cf0: 64 69 6e 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a  ding of a word..
8d00: 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52 2d 35 39 37  **.** IMP: R-597
8d10: 38 32 2d 30 30 30 37 32 20 54 68 65 20 73 6f 75  82-00072 The sou
8d20: 6e 64 65 78 28 58 29 20 66 75 6e 63 74 69 6f 6e  ndex(X) function
8d30: 20 72 65 74 75 72 6e 73 20 61 20 73 74 72 69 6e   returns a strin
8d40: 67 20 74 68 61 74 20 69 73 20 74 68 65 0a 2a 2a  g that is the.**
8d50: 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e   soundex encodin
8d60: 67 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  g of the string 
8d70: 58 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  X. .*/.static vo
8d80: 69 64 20 73 6f 75 6e 64 65 78 46 75 6e 63 28 0a  id soundexFunc(.
8d90: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
8da0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
8db0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
8dc0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
8dd0: 7b 0a 20 20 63 68 61 72 20 7a 52 65 73 75 6c 74  {.  char zResult
8de0: 5b 38 5d 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  [8];.  const u8 
8df0: 2a 7a 49 6e 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  *zIn;.  int i, j
8e00: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
8e10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
8e20: 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 30  Code[] = {.    0
8e30: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8e40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8e50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
8e60: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
8e70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8e80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8e90: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,.    0, 0, 0, 
8ea0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8eb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8ec0: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
8ed0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8ee0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8ef0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
8f00: 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c  , 0, 1, 2, 3, 0,
8f10: 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20   1, 2, 0, 0, 2, 
8f20: 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20  2, 4, 5, 5, 0,. 
8f30: 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33     1, 2, 6, 2, 3
8f40: 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c  , 0, 1, 0, 2, 0,
8f50: 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   2, 0, 0, 0, 0, 
8f60: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20  0,.    0, 0, 1, 
8f70: 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30  2, 3, 0, 1, 2, 0
8f80: 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c  , 0, 2, 2, 4, 5,
8f90: 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c   5, 0,.    1, 2,
8fa0: 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20   6, 2, 3, 0, 1, 
8fb0: 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30  0, 2, 0, 2, 0, 0
8fc0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a  , 0, 0, 0,.  };.
8fd0: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
8fe0: 31 20 29 3b 0a 20 20 7a 49 6e 20 3d 20 28 75 38  1 );.  zIn = (u8
8ff0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
9000: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
9010: 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 7a 49   if( zIn==0 ) zI
9020: 6e 20 3d 20 28 75 38 2a 29 22 22 3b 0a 20 20 66  n = (u8*)"";.  f
9030: 6f 72 28 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26  or(i=0; zIn[i] &
9040: 26 20 21 73 71 6c 69 74 65 33 49 73 61 6c 70 68  & !sqlite3Isalph
9050: 61 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29 7b  a(zIn[i]); i++){
9060: 7d 0a 20 20 69 66 28 20 7a 49 6e 5b 69 5d 20 29  }.  if( zIn[i] )
9070: 7b 0a 20 20 20 20 75 38 20 70 72 65 76 63 6f 64  {.    u8 prevcod
9080: 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d  e = iCode[zIn[i]
9090: 26 30 78 37 66 5d 3b 0a 20 20 20 20 7a 52 65 73  &0x7f];.    zRes
90a0: 75 6c 74 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  ult[0] = sqlite3
90b0: 54 6f 75 70 70 65 72 28 7a 49 6e 5b 69 5d 29 3b  Toupper(zIn[i]);
90c0: 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c  .    for(j=1; j<
90d0: 34 20 26 26 20 7a 49 6e 5b 69 5d 3b 20 69 2b 2b  4 && zIn[i]; i++
90e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 64  ){.      int cod
90f0: 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69 5d  e = iCode[zIn[i]
9100: 26 30 78 37 66 5d 3b 0a 20 20 20 20 20 20 69 66  &0x7f];.      if
9110: 28 20 63 6f 64 65 3e 30 20 29 7b 0a 20 20 20 20  ( code>0 ){.    
9120: 20 20 20 20 69 66 28 20 63 6f 64 65 21 3d 70 72      if( code!=pr
9130: 65 76 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  evcode ){.      
9140: 20 20 20 20 70 72 65 76 63 6f 64 65 20 3d 20 63      prevcode = c
9150: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ode;.          z
9160: 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63 6f  Result[j++] = co
9170: 64 65 20 2b 20 27 30 27 3b 0a 20 20 20 20 20 20  de + '0';.      
9180: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
9190: 0a 20 20 20 20 20 20 20 20 70 72 65 76 63 6f 64  .        prevcod
91a0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
91b0: 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
91c0: 6a 3c 34 20 29 7b 0a 20 20 20 20 20 20 7a 52 65  j<4 ){.      zRe
91d0: 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 27 30 27 3b  sult[j++] = '0';
91e0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 73 75  .    }.    zResu
91f0: 6c 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73  lt[j] = 0;.    s
9200: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
9210: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52 65 73  xt(context, zRes
9220: 75 6c 74 2c 20 34 2c 20 53 51 4c 49 54 45 5f 54  ult, 4, SQLITE_T
9230: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c  RANSIENT);.  }el
9240: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20  se{.    /* IMP: 
9250: 52 2d 36 34 38 39 34 2d 35 30 33 32 31 20 54 68  R-64894-50321 Th
9260: 65 20 73 74 72 69 6e 67 20 22 3f 30 30 30 22 20  e string "?000" 
9270: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
9280: 68 65 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20  he argument.    
9290: 2a 2a 20 69 73 20 4e 55 4c 4c 20 6f 72 20 63 6f  ** is NULL or co
92a0: 6e 74 61 69 6e 73 20 6e 6f 20 41 53 43 49 49 20  ntains no ASCII 
92b0: 61 6c 70 68 61 62 65 74 69 63 20 63 68 61 72 61  alphabetic chara
92c0: 63 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 73 71  cters. */.    sq
92d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
92e0: 74 28 63 6f 6e 74 65 78 74 2c 20 22 3f 30 30 30  t(context, "?000
92f0: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54 41  ", 4, SQLITE_STA
9300: 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  TIC);.  }.}.#end
9310: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 55  if /* SQLITE_SOU
9320: 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  NDEX */..#ifndef
9330: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
9340: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
9350: 2a 20 41 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  * A function tha
9360: 74 20 6c 6f 61 64 73 20 61 20 73 68 61 72 65 64  t loads a shared
9370: 2d 6c 69 62 72 61 72 79 20 65 78 74 65 6e 73 69  -library extensi
9380: 6f 6e 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20  on then returns 
9390: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
93a0: 76 6f 69 64 20 6c 6f 61 64 45 78 74 28 73 71 6c  void loadExt(sql
93b0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
93c0: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
93d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
93e0: 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20  *argv){.  const 
93f0: 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28 63  char *zFile = (c
9400: 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
9410: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
9420: 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74  rgv[0]);.  const
9430: 20 63 68 61 72 20 2a 7a 50 72 6f 63 3b 0a 20 20   char *zProc;.  
9440: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
9450: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
9460: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
9470: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
9480: 67 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72  g = 0;..  if( ar
9490: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 72  gc==2 ){.    zPr
94a0: 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  oc = (const char
94b0: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
94c0: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
94d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72    }else{.    zPr
94e0: 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  oc = 0;.  }.  if
94f0: 28 20 7a 46 69 6c 65 20 26 26 20 73 71 6c 69 74  ( zFile && sqlit
9500: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
9510: 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72  n(db, zFile, zPr
9520: 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 20 29 7b  oc, &zErrMsg) ){
9530: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9540: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
9550: 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b  t, zErrMsg, -1);
9560: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
9570: 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  e(zErrMsg);.  }.
9580: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
9590: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
95a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
95b0: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68  ructure holds th
95c0: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a  e context of a.*
95d0: 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67 28 29  * sum() or avg()
95e0: 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75   aggregate compu
95f0: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  tation..*/.typed
9600: 65 66 20 73 74 72 75 63 74 20 53 75 6d 43 74 78  ef struct SumCtx
9610: 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63 74 20   SumCtx;.struct 
9620: 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c  SumCtx {.  doubl
9630: 65 20 72 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20  e rSum;      /* 
9640: 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 73  Floating point s
9650: 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d  um */.  i64 iSum
9660: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74  ;         /* Int
9670: 65 67 65 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20  eger sum */   . 
9680: 20 69 36 34 20 63 6e 74 3b 20 20 20 20 20 20 20   i64 cnt;       
9690: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
96a0: 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20  elements summed 
96b0: 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c 6f 77  */.  u8 overflow
96c0: 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ;      /* True i
96d0: 66 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c  f integer overfl
96e0: 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20  ow seen */.  u8 
96f0: 61 70 70 72 6f 78 3b 20 20 20 20 20 20 20 20 2f  approx;        /
9700: 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e  * True if non-in
9710: 74 65 67 65 72 20 76 61 6c 75 65 20 77 61 73 20  teger value was 
9720: 69 6e 70 75 74 20 74 6f 20 74 68 65 20 73 75 6d  input to the sum
9730: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f   */.};../*.** Ro
9740: 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63  utines used to c
9750: 6f 6d 70 75 74 65 20 74 68 65 20 73 75 6d 2c 20  ompute the sum, 
9760: 61 76 65 72 61 67 65 2c 20 61 6e 64 20 74 6f 74  average, and tot
9770: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55  al..**.** The SU
9780: 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c  M() function fol
9790: 6c 6f 77 73 20 74 68 65 20 28 62 72 6f 6b 65 6e  lows the (broken
97a0: 29 20 53 51 4c 20 73 74 61 6e 64 61 72 64 20 77  ) SQL standard w
97b0: 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  hich means.** th
97c0: 61 74 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55  at it returns NU
97d0: 4c 4c 20 69 66 20 69 74 20 73 75 6d 73 20 6f 76  LL if it sums ov
97e0: 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54  er no inputs.  T
97f0: 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20  OTAL returns.** 
9800: 30 2e 30 20 69 6e 20 74 68 61 74 20 63 61 73 65  0.0 in that case
9810: 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20  .  In addition, 
9820: 54 4f 54 41 4c 20 61 6c 77 61 79 73 20 72 65 74  TOTAL always ret
9830: 75 72 6e 73 20 61 20 66 6c 6f 61 74 20 77 68 65  urns a float whe
9840: 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20  re.** SUM might 
9850: 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
9860: 72 20 69 66 20 69 74 20 6e 65 76 65 72 20 65 6e  r if it never en
9870: 63 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f 61 74  counters a float
9880: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
9890: 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76 65 72  ue.  TOTAL never
98a0: 20 66 61 69 6c 73 2c 20 62 75 74 20 53 55 4d 20   fails, but SUM 
98b0: 6d 69 67 68 74 20 74 68 72 6f 75 67 68 20 61 6e  might through an
98c0: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a   exception if.**
98d0: 20 69 74 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e   it overflows an
98e0: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61   integer..*/.sta
98f0: 74 69 63 20 76 6f 69 64 20 73 75 6d 53 74 65 70  tic void sumStep
9900: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
9910: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
9920: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
9930: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75  ue **argv){.  Su
9940: 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74  mCtx *p;.  int t
9950: 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ype;.  assert( a
9960: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
9970: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
9980: 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  c);.  p = sqlite
9990: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
99a0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
99b0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79 70 65  eof(*p));.  type
99c0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
99d0: 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61 72  _numeric_type(ar
99e0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 20  gv[0]);.  if( p 
99f0: 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54 45 5f  && type!=SQLITE_
9a00: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 63  NULL ){.    p->c
9a10: 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 74 79  nt++;.    if( ty
9a20: 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  pe==SQLITE_INTEG
9a30: 45 52 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  ER ){.      i64 
9a40: 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
9a50: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29  e_int64(argv[0])
9a60: 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20  ;.      p->rSum 
9a70: 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  += v;.      if( 
9a80: 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f 76  (p->approx|p->ov
9a90: 65 72 66 6c 6f 77 29 3d 3d 30 20 26 26 20 73 71  erflow)==0 && sq
9aa0: 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28 26 70  lite3AddInt64(&p
9ab0: 2d 3e 69 53 75 6d 2c 20 76 29 20 29 7b 0a 20 20  ->iSum, v) ){.  
9ac0: 20 20 20 20 20 20 70 2d 3e 6f 76 65 72 66 6c 6f        p->overflo
9ad0: 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  w = 1;.      }. 
9ae0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9af0: 70 2d 3e 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74  p->rSum += sqlit
9b00: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
9b10: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
9b20: 70 2d 3e 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20  p->approx = 1;. 
9b30: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
9b40: 63 20 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69  c void sumFinali
9b50: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
9b60: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
9b70: 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  SumCtx *p;.  p =
9b80: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
9b90: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
9ba0: 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  xt, 0);.  if( p 
9bb0: 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20  && p->cnt>0 ){. 
9bc0: 20 20 20 69 66 28 20 70 2d 3e 6f 76 65 72 66 6c     if( p->overfl
9bd0: 6f 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ow ){.      sqli
9be0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
9bf0: 28 63 6f 6e 74 65 78 74 2c 22 69 6e 74 65 67 65  (context,"intege
9c00: 72 20 6f 76 65 72 66 6c 6f 77 22 2c 2d 31 29 3b  r overflow",-1);
9c10: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
9c20: 2d 3e 61 70 70 72 6f 78 20 29 7b 0a 20 20 20 20  ->approx ){.    
9c30: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9c40: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
9c50: 20 70 2d 3e 72 53 75 6d 29 3b 0a 20 20 20 20 7d   p->rSum);.    }
9c60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
9c70: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
9c80: 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 69 53 75  (context, p->iSu
9c90: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  m);.    }.  }.}.
9ca0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 76 67 46  static void avgF
9cb0: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
9cc0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
9cd0: 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a  ){.  SumCtx *p;.
9ce0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
9cf0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
9d00: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
9d10: 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30  f( p && p->cnt>0
9d20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9d30: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
9d40: 6e 74 65 78 74 2c 20 70 2d 3e 72 53 75 6d 2f 28  ntext, p->rSum/(
9d50: 64 6f 75 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a  double)p->cnt);.
9d60: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
9d70: 64 20 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 28  d totalFinalize(
9d80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
9d90: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d  *context){.  Sum
9da0: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
9db0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
9dc0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
9dd0: 20 30 29 3b 0a 20 20 2f 2a 20 28 64 6f 75 62 6c   0);.  /* (doubl
9de0: 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53  e)0 In case of S
9df0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
9e00: 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a  ING_POINT... */.
9e10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9e20: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
9e30: 20 70 20 3f 20 70 2d 3e 72 53 75 6d 20 3a 20 28   p ? p->rSum : (
9e40: 64 6f 75 62 6c 65 29 30 29 3b 0a 7d 0a 0a 2f 2a  double)0);.}../*
9e50: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
9e60: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
9e70: 73 20 74 72 61 63 6b 20 6f 66 20 73 74 61 74 65  s track of state
9e80: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
9e90: 20 74 68 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20   the.** count() 
9ea0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
9eb0: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
9ec0: 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20 43  truct CountCtx C
9ed0: 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74 20  ountCtx;.struct 
9ee0: 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 36 34  CountCtx {.  i64
9ef0: 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f   n;.};../*.** Ro
9f00: 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d  utines to implem
9f10: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 28 29 20  ent the count() 
9f20: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
9f30: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
9f40: 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73 71 6c  id countStep(sql
9f50: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
9f60: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
9f70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
9f80: 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43  *argv){.  CountC
9f90: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
9fa0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
9fb0: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
9fc0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
9fd0: 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53  f( (argc==0 || S
9fe0: 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69  QLITE_NULL!=sqli
9ff0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
a000: 72 67 76 5b 30 5d 29 29 20 26 26 20 70 20 29 7b  rgv[0])) && p ){
a010: 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d  .    p->n++;.  }
a020: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a030: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
a040: 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65  .  /* The sqlite
a050: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  3_aggregate_coun
a060: 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  t() function is 
a070: 64 65 70 72 65 63 61 74 65 64 2e 20 20 42 75 74  deprecated.  But
a080: 20 6a 75 73 74 20 74 6f 20 6d 61 6b 65 0a 20 20   just to make.  
a090: 2a 2a 20 73 75 72 65 20 69 74 20 73 74 69 6c 6c  ** sure it still
a0a0: 20 6f 70 65 72 61 74 65 73 20 63 6f 72 72 65 63   operates correc
a0b0: 74 6c 79 2c 20 76 65 72 69 66 79 20 74 68 61 74  tly, verify that
a0c0: 20 69 74 73 20 63 6f 75 6e 74 20 61 67 72 65 65   its count agree
a0d0: 73 20 77 69 74 68 20 6f 75 72 20 0a 20 20 2a 2a  s with our .  **
a0e0: 20 69 6e 74 65 72 6e 61 6c 20 63 6f 75 6e 74 20   internal count 
a0f0: 77 68 65 6e 20 75 73 69 6e 67 20 63 6f 75 6e 74  when using count
a100: 28 2a 29 20 61 6e 64 20 77 68 65 6e 20 74 68 65  (*) and when the
a110: 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 63 61 6e   total count can
a120: 20 62 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73   be.  ** express
a130: 65 64 20 61 73 20 61 20 33 32 2d 62 69 74 20 69  ed as a 32-bit i
a140: 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 61 73 73  nteger. */.  ass
a150: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20  ert( argc==1 || 
a160: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 3e 30 78 37  p==0 || p->n>0x7
a170: 66 66 66 66 66 66 66 0a 20 20 20 20 20 20 20 20  fffffff.        
a180: 20 20 7c 7c 20 70 2d 3e 6e 3d 3d 73 71 6c 69 74    || p->n==sqlit
a190: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75  e3_aggregate_cou
a1a0: 6e 74 28 63 6f 6e 74 65 78 74 29 20 29 3b 0a 23  nt(context) );.#
a1b0: 65 6e 64 69 66 0a 7d 20 20 20 0a 73 74 61 74 69  endif.}   .stati
a1c0: 63 20 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61  c void countFina
a1d0: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
a1e0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
a1f0: 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20    CountCtx *p;. 
a200: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
a210: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
a220: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 73 71  ontext, 0);.  sq
a230: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
a240: 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20  64(context, p ? 
a250: 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a  p->n : 0);.}../*
a260: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
a270: 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20  implement min() 
a280: 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72 65 67  and max() aggreg
a290: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
a2a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 69  /.static void mi
a2b0: 6e 6d 61 78 53 74 65 70 28 0a 20 20 73 71 6c 69  nmaxStep(.  sqli
a2c0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
a2d0: 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 4e 6f 74  text, .  int Not
a2e0: 55 73 65 64 2c 20 0a 20 20 73 71 6c 69 74 65 33  Used, .  sqlite3
a2f0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
a300: 0a 20 20 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20  .  Mem *pArg  = 
a310: 28 4d 65 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a  (Mem *)argv[0];.
a320: 20 20 4d 65 6d 20 2a 70 42 65 73 74 3b 0a 20 20    Mem *pBest;.  
a330: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
a340: 28 4e 6f 74 55 73 65 64 29 3b 0a 0a 20 20 70 42  (NotUsed);..  pB
a350: 65 73 74 20 3d 20 28 4d 65 6d 20 2a 29 73 71 6c  est = (Mem *)sql
a360: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
a370: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
a380: 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29 29 3b  sizeof(*pBest));
a390: 0a 20 20 69 66 28 20 21 70 42 65 73 74 20 29 20  .  if( !pBest ) 
a3a0: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
a3b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
a3c0: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
a3d0: 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  TE_NULL ){.    i
a3e0: 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20  f( pBest->flags 
a3f0: 29 20 73 71 6c 69 74 65 33 53 6b 69 70 41 63 63  ) sqlite3SkipAcc
a400: 75 6d 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e  umulatorLoad(con
a410: 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  text);.  }else i
a420: 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20  f( pBest->flags 
a430: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78 3b 0a  ){.    int max;.
a440: 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20 20 20      int cmp;.   
a450: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
a460: 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63  = sqlite3GetFunc
a470: 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74 29  CollSeq(context)
a480: 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74  ;.    /* This st
a490: 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ep function is u
a4a0: 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
a4b0: 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29   min() and max()
a4c0: 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20 20 20   aggregates,.   
a4d0: 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64 69 66   ** the only dif
a4e0: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
a4f0: 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20 74 68  the two being th
a500: 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f 66 20  at the sense of 
a510: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61  the.    ** compa
a520: 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72 74 65  rison is inverte
a530: 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78 28 29  d. For the max()
a540: 20 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 0a   aggregate, the.
a550: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75      ** sqlite3_u
a560: 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e 63 74  ser_data() funct
a570: 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76 6f 69  ion returns (voi
a580: 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69 6e 28  d *)-1. For min(
a590: 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) it.    ** retu
a5a0: 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62 2c 20  rns (void *)db, 
a5b0: 77 68 65 72 65 20 64 62 20 69 73 20 74 68 65 20  where db is the 
a5c0: 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73  sqlite3* databas
a5d0: 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20 2a  e pointer..    *
a5e0: 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68 65 20  * Therefore the 
a5f0: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 73  next statement s
a600: 65 74 73 20 76 61 72 69 61 62 6c 65 20 27 6d 61  ets variable 'ma
a610: 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68 65 20  x' to 1 for the 
a620: 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61 67 67  max().    ** agg
a630: 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66 6f 72  regate, or 0 for
a640: 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20   min()..    */. 
a650: 20 20 20 6d 61 78 20 3d 20 73 71 6c 69 74 65 33     max = sqlite3
a660: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
a670: 78 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d 70 20  xt)!=0;.    cmp 
a680: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
a690: 61 72 65 28 70 42 65 73 74 2c 20 70 41 72 67 2c  are(pBest, pArg,
a6a0: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pColl);.    if(
a6b0: 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30 29 20   (max && cmp<0) 
a6c0: 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d 70 3e  || (!max && cmp>
a6d0: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
a6e0: 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70  te3VdbeMemCopy(p
a6f0: 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 20  Best, pArg);.   
a700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
a710: 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d 75 6c  lite3SkipAccumul
a720: 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65 78 74  atorLoad(context
a730: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
a740: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
a750: 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74 2c 20  eMemCopy(pBest, 
a760: 70 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  pArg);.  }.}.sta
a770: 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78 46  tic void minMaxF
a780: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
a790: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
a7a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ){.  sqlite3_val
a7b0: 75 65 20 2a 70 52 65 73 3b 0a 20 20 70 52 65 73  ue *pRes;.  pRes
a7c0: 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 61 6c 75   = (sqlite3_valu
a7d0: 65 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  e *)sqlite3_aggr
a7e0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
a7f0: 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28  ntext, 0);.  if(
a800: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 69 66 28   pRes ){.    if(
a810: 20 70 52 65 73 2d 3e 66 6c 61 67 73 20 29 7b 0a   pRes->flags ){.
a820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
a830: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
a840: 78 74 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  xt, pRes);.    }
a850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a860: 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 65 73 29  MemRelease(pRes)
a870: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 67  ;.  }.}../*.** g
a880: 72 6f 75 70 5f 63 6f 6e 63 61 74 28 45 58 50 52  roup_concat(EXPR
a890: 2c 20 3f 53 45 50 41 52 41 54 4f 52 3f 29 0a 2a  , ?SEPARATOR?).*
a8a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 72  /.static void gr
a8b0: 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 28 0a 20  oupConcatStep(. 
a8c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
a8d0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
a8e0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
a8f0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
a900: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a910: 56 61 6c 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  Val;.  StrAccum 
a920: 2a 70 41 63 63 75 6d 3b 0a 20 20 63 6f 6e 73 74  *pAccum;.  const
a930: 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 69   char *zSep;.  i
a940: 6e 74 20 6e 56 61 6c 2c 20 6e 53 65 70 3b 0a 20  nt nVal, nSep;. 
a950: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
a960: 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20   || argc==2 );. 
a970: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
a980: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
a990: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
a9a0: 72 65 74 75 72 6e 3b 0a 20 20 70 41 63 63 75 6d  return;.  pAccum
a9b0: 20 3d 20 28 53 74 72 41 63 63 75 6d 2a 29 73 71   = (StrAccum*)sq
a9c0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
a9d0: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
a9e0: 20 73 69 7a 65 6f 66 28 2a 70 41 63 63 75 6d 29   sizeof(*pAccum)
a9f0: 29 3b 0a 0a 20 20 69 66 28 20 70 41 63 63 75 6d  );..  if( pAccum
aa00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
aa10: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
aa20: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
aa30: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 69 6e  context);.    in
aa40: 74 20 66 69 72 73 74 54 65 72 6d 20 3d 20 70 41  t firstTerm = pA
aa50: 63 63 75 6d 2d 3e 75 73 65 4d 61 6c 6c 6f 63 3d  ccum->useMalloc=
aa60: 3d 30 3b 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e  =0;.    pAccum->
aa70: 75 73 65 4d 61 6c 6c 6f 63 20 3d 20 32 3b 0a 20  useMalloc = 2;. 
aa80: 20 20 20 70 41 63 63 75 6d 2d 3e 6d 78 41 6c 6c     pAccum->mxAll
aa90: 6f 63 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  oc = db->aLimit[
aaa0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
aab0: 47 54 48 5d 3b 0a 20 20 20 20 69 66 28 20 21 66  GTH];.    if( !f
aac0: 69 72 73 74 54 65 72 6d 20 29 7b 0a 20 20 20 20  irstTerm ){.    
aad0: 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b    if( argc==2 ){
aae0: 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
aaf0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
ab00: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
ab10: 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 70  ]);.        nSep
ab20: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
ab30: 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b  _bytes(argv[1]);
ab40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ab50: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22        zSep = ","
ab60: 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 70 20 3d  ;.        nSep =
ab70: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
ab80: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
ab90: 6d 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20  mAppend(pAccum, 
aba0: 7a 53 65 70 2c 20 6e 53 65 70 29 3b 0a 20 20 20  zSep, nSep);.   
abb0: 20 7d 0a 20 20 20 20 7a 56 61 6c 20 3d 20 28 63   }.    zVal = (c
abc0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
abd0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
abe0: 3b 0a 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c  ;.    nVal = sql
abf0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
ac00: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 73  (argv[0]);.    s
ac10: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
ac20: 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a 56 61  pend(pAccum, zVa
ac30: 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a  l, nVal);.  }.}.
ac40: 73 74 61 74 69 63 20 76 6f 69 64 20 67 72 6f 75  static void grou
ac50: 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 28  pConcatFinalize(
ac60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
ac70: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 74 72  *context){.  Str
ac80: 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20  Accum *pAccum;. 
ac90: 20 70 41 63 63 75 6d 20 3d 20 73 71 6c 69 74 65   pAccum = sqlite
aca0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
acb0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
acc0: 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20 29 7b  .  if( pAccum ){
acd0: 0a 20 20 20 20 69 66 28 20 70 41 63 63 75 6d 2d  .    if( pAccum-
ace0: 3e 74 6f 6f 42 69 67 20 29 7b 0a 20 20 20 20 20  >tooBig ){.     
acf0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ad00: 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e  error_toobig(con
ad10: 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  text);.    }else
ad20: 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 6d 61 6c   if( pAccum->mal
ad30: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
ad40: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
ad50: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
ad60: 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73  ntext);.    }els
ad70: 65 7b 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c  e{    .      sql
ad80: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
ad90: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
ada0: 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
adb0: 70 41 63 63 75 6d 29 2c 20 2d 31 2c 20 0a 20 20  pAccum), -1, .  
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
add0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ade0: 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  free);.    }.  }
adf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
ae00: 6f 75 74 69 6e 65 20 64 6f 65 73 20 70 65 72 2d  outine does per-
ae10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 75 6e 63 74  connection funct
ae20: 69 6f 6e 20 72 65 67 69 73 74 72 61 74 69 6f 6e  ion registration
ae30: 2e 20 20 4d 6f 73 74 0a 2a 2a 20 6f 66 20 74 68  .  Most.** of th
ae40: 65 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  e built-in funct
ae50: 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 70  ions above are p
ae60: 61 72 74 20 6f 66 20 74 68 65 20 67 6c 6f 62 61  art of the globa
ae70: 6c 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 2e 0a  l function set..
ae80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ae90: 6f 6e 6c 79 20 64 65 61 6c 73 20 77 69 74 68 20  only deals with 
aea0: 74 68 6f 73 65 20 74 68 61 74 20 61 72 65 20 6e  those that are n
aeb0: 6f 74 20 67 6c 6f 62 61 6c 2e 0a 2a 2f 0a 76 6f  ot global..*/.vo
aec0: 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  id sqlite3Regist
aed0: 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f  erBuiltinFunctio
aee0: 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ns(sqlite3 *db){
aef0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
af00: 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
af10: 63 74 69 6f 6e 28 64 62 2c 20 22 4d 41 54 43 48  ction(db, "MATCH
af20: 22 2c 20 32 29 3b 0a 20 20 61 73 73 65 72 74 28  ", 2);.  assert(
af30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
af40: 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  M || rc==SQLITE_
af50: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  OK );.  if( rc==
af60: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
af70: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
af80: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  iled = 1;.  }.}.
af90: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 4c  ./*.** Set the L
afa0: 49 4b 45 4f 50 54 20 66 6c 61 67 20 6f 6e 20 74  IKEOPT flag on t
afb0: 68 65 20 32 2d 61 72 67 75 6d 65 6e 74 20 66 75  he 2-argument fu
afc0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
afd0: 67 69 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  given name..*/.s
afe0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4c 69  tatic void setLi
aff0: 6b 65 4f 70 74 46 6c 61 67 28 73 71 6c 69 74 65  keOptFlag(sqlite
b000: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
b010: 72 20 2a 7a 4e 61 6d 65 2c 20 75 38 20 66 6c 61  r *zName, u8 fla
b020: 67 56 61 6c 29 7b 0a 20 20 46 75 6e 63 44 65 66  gVal){.  FuncDef
b030: 20 2a 70 44 65 66 3b 0a 20 20 70 44 65 66 20 3d   *pDef;.  pDef =
b040: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
b050: 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
b060: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
b070: 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45 5f 55       2, SQLITE_U
b0a0: 54 46 38 2c 20 30 29 3b 0a 20 20 69 66 28 20 41  TF8, 0);.  if( A
b0b0: 4c 57 41 59 53 28 70 44 65 66 29 20 29 7b 0a 20  LWAYS(pDef) ){. 
b0c0: 20 20 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 3d     pDef->flags =
b0d0: 20 66 6c 61 67 56 61 6c 3b 0a 20 20 7d 0a 7d 0a   flagVal;.  }.}.
b0e0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
b0f0: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 4c 49 4b  the built-in LIK
b100: 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74  E and GLOB funct
b110: 69 6f 6e 73 2e 20 20 54 68 65 20 63 61 73 65 53  ions.  The caseS
b120: 65 6e 73 69 74 69 76 65 0a 2a 2a 20 70 61 72 61  ensitive.** para
b130: 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
b140: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
b150: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
b160: 72 20 69 73 20 63 61 73 65 0a 2a 2a 20 73 65 6e  r is case.** sen
b170: 73 69 74 69 76 65 2e 20 20 47 4c 4f 42 20 69 73  sitive.  GLOB is
b180: 20 61 6c 77 61 79 73 20 63 61 73 65 20 73 65 6e   always case sen
b190: 73 69 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20  sitive..*/.void 
b1a0: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c  sqlite3RegisterL
b1b0: 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c  ikeFunctions(sql
b1c0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 63 61  ite3 *db, int ca
b1d0: 73 65 53 65 6e 73 69 74 69 76 65 29 7b 0a 20 20  seSensitive){.  
b1e0: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
b1f0: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 69 66 28  fo *pInfo;.  if(
b200: 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 20 29   caseSensitive )
b210: 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73  {.    pInfo = (s
b220: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
b230: 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 3b  o*)&likeInfoAlt;
b240: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
b250: 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f  nfo = (struct co
b260: 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65  mpareInfo*)&like
b270: 49 6e 66 6f 4e 6f 72 6d 3b 0a 20 20 7d 0a 20 20  InfoNorm;.  }.  
b280: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
b290: 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 32 2c  c(db, "like", 2,
b2a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 49   SQLITE_UTF8, pI
b2b0: 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30  nfo, likeFunc, 0
b2c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
b2d0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
b2e0: 20 22 6c 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49   "like", 3, SQLI
b2f0: 54 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20  TE_UTF8, pInfo, 
b300: 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20  likeFunc, 0, 0, 
b310: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 72 65  0);.  sqlite3Cre
b320: 61 74 65 46 75 6e 63 28 64 62 2c 20 22 67 6c 6f  ateFunc(db, "glo
b330: 62 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  b", 2, SQLITE_UT
b340: 46 38 2c 20 0a 20 20 20 20 20 20 28 73 74 72 75  F8, .      (stru
b350: 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29  ct compareInfo*)
b360: 26 67 6c 6f 62 49 6e 66 6f 2c 20 6c 69 6b 65 46  &globInfo, likeF
b370: 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  unc, 0, 0, 0);. 
b380: 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28   setLikeOptFlag(
b390: 64 62 2c 20 22 67 6c 6f 62 22 2c 20 53 51 4c 49  db, "glob", SQLI
b3a0: 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53  TE_FUNC_LIKE | S
b3b0: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29  QLITE_FUNC_CASE)
b3c0: 3b 0a 20 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c  ;.  setLikeOptFl
b3d0: 61 67 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 0a  ag(db, "like", .
b3e0: 20 20 20 20 20 20 63 61 73 65 53 65 6e 73 69 74        caseSensit
b3f0: 69 76 65 20 3f 20 28 53 51 4c 49 54 45 5f 46 55  ive ? (SQLITE_FU
b400: 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45  NC_LIKE | SQLITE
b410: 5f 46 55 4e 43 5f 43 41 53 45 29 20 3a 20 53 51  _FUNC_CASE) : SQ
b420: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3b  LITE_FUNC_LIKE);
b430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
b440: 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 78 70  points to an exp
b450: 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69 6d  ression which im
b460: 70 6c 65 6d 65 6e 74 73 20 61 20 66 75 6e 63 74  plements a funct
b470: 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69  ion.  If.** it i
b480: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f  s appropriate to
b490: 20 61 70 70 6c 79 20 74 68 65 20 4c 49 4b 45 20   apply the LIKE 
b4a0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20  optimization to 
b4b0: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  that function.**
b4c0: 20 74 68 65 6e 20 73 65 74 20 61 57 63 5b 30 5d   then set aWc[0]
b4d0: 20 74 68 72 6f 75 67 68 20 61 57 63 5b 32 5d 20   through aWc[2] 
b4e0: 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 20  to the wildcard 
b4f0: 63 68 61 72 61 63 74 65 72 73 20 61 6e 64 0a 2a  characters and.*
b500: 2a 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  * return TRUE.  
b510: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
b520: 69 73 20 6e 6f 74 20 61 20 4c 49 4b 45 2d 73 74  is not a LIKE-st
b530: 79 6c 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 65  yle function the
b540: 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 46 41 4c 53  n.** return FALS
b550: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
b560: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
b570: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
b580: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70  r *pExpr, int *p
b590: 49 73 4e 6f 63 61 73 65 2c 20 63 68 61 72 20 2a  IsNocase, char *
b5a0: 61 57 63 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  aWc){.  FuncDef 
b5b0: 2a 70 44 65 66 3b 0a 20 20 69 66 28 20 70 45 78  *pDef;.  if( pEx
b5c0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54  pr->op!=TK_FUNCT
b5d0: 49 4f 4e 20 0a 20 20 20 7c 7c 20 21 70 45 78 70  ION .   || !pExp
b5e0: 72 2d 3e 78 2e 70 4c 69 73 74 20 0a 20 20 20 7c  r->x.pList .   |
b5f0: 7c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  | pExpr->x.pList
b600: 2d 3e 6e 45 78 70 72 21 3d 32 0a 20 20 29 7b 0a  ->nExpr!=2.  ){.
b610: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b620: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  }.  assert( !Exp
b630: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
b640: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
b650: 29 20 29 3b 0a 20 20 70 44 65 66 20 3d 20 73 71  ) );.  pDef = sq
b660: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
b670: 6e 28 64 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  n(db, pExpr->u.z
b680: 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  Token, .        
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c       sqlite3Strl
b6b0: 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
b6c0: 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  oken),.         
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 20 20 20 20 32 2c 20 53 51 4c 49 54 45 5f 55 54      2, SQLITE_UT
b6f0: 46 38 2c 20 30 29 3b 0a 20 20 69 66 28 20 4e 45  F8, 0);.  if( NE
b700: 56 45 52 28 70 44 65 66 3d 3d 30 29 20 7c 7c 20  VER(pDef==0) || 
b710: 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53  (pDef->flags & S
b720: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29  QLITE_FUNC_LIKE)
b730: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
b740: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
b750: 68 65 20 6d 65 6d 63 70 79 28 29 20 73 74 61 74  he memcpy() stat
b760: 65 6d 65 6e 74 20 61 73 73 75 6d 65 73 20 74 68  ement assumes th
b770: 61 74 20 74 68 65 20 77 69 6c 64 63 61 72 64 20  at the wildcard 
b780: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 0a 20  characters are. 
b790: 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 68   ** the first th
b7a0: 72 65 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ree statements i
b7b0: 6e 20 74 68 65 20 63 6f 6d 70 61 72 65 49 6e 66  n the compareInf
b7c0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
b7d0: 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 28 29  e.  ** asserts()
b7e0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72   that follow ver
b7f0: 69 66 79 20 74 68 61 74 20 61 73 73 75 6d 70 74  ify that assumpt
b800: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  ion.  */.  memcp
b810: 79 28 61 57 63 2c 20 70 44 65 66 2d 3e 70 55 73  y(aWc, pDef->pUs
b820: 65 72 44 61 74 61 2c 20 33 29 3b 0a 20 20 61 73  erData, 3);.  as
b830: 73 65 72 74 28 20 28 63 68 61 72 2a 29 26 6c 69  sert( (char*)&li
b840: 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68  keInfoAlt == (ch
b850: 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74  ar*)&likeInfoAlt
b860: 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61  .matchAll );.  a
b870: 73 73 65 72 74 28 20 26 28 28 63 68 61 72 2a 29  ssert( &((char*)
b880: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d  &likeInfoAlt)[1]
b890: 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65   == (char*)&like
b8a0: 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65  InfoAlt.matchOne
b8b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28   );.  assert( &(
b8c0: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
b8d0: 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72  Alt)[2] == (char
b8e0: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d  *)&likeInfoAlt.m
b8f0: 61 74 63 68 53 65 74 20 29 3b 0a 20 20 2a 70 49  atchSet );.  *pI
b900: 73 4e 6f 63 61 73 65 20 3d 20 28 70 44 65 66 2d  sNocase = (pDef-
b910: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
b920: 46 55 4e 43 5f 43 41 53 45 29 3d 3d 30 3b 0a 20  FUNC_CASE)==0;. 
b930: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
b940: 0a 2a 2a 20 41 6c 6c 20 61 6c 6c 20 6f 66 20 74  .** All all of t
b950: 68 65 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  he FuncDef struc
b960: 74 75 72 65 73 20 69 6e 20 74 68 65 20 61 42 75  tures in the aBu
b970: 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 61 72 72 61  iltinFunc[] arra
b980: 79 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 74 68  y above.** to th
b990: 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  e global functio
b9a0: 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 54  n hash table.  T
b9b0: 68 69 73 20 6f 63 63 75 72 73 20 61 74 20 73 74  his occurs at st
b9c0: 61 72 74 2d 74 69 6d 65 20 28 61 73 0a 2a 2a 20  art-time (as.** 
b9d0: 61 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66  a consequence of
b9e0: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
b9f0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 29 2e 0a  _initialize())..
ba00: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
ba10: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 0a 2a 2f   routine runs.*/
ba20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67  .void sqlite3Reg
ba30: 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74  isterGlobalFunct
ba40: 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ions(void){.  /*
ba50: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
ba60: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
ba70: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
ba80: 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  es for all of th
ba90: 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a  e functions.  **
baa0: 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73   defined in this
bab0: 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   file..  **.  **
bac0: 20 54 68 65 20 61 72 72 61 79 20 63 61 6e 6e 6f   The array canno
bad0: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 73 69  t be constant si
bae0: 6e 63 65 20 63 68 61 6e 67 65 73 20 61 72 65 20  nce changes are 
baf0: 6d 61 64 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a  made to the.  **
bb00: 20 46 75 6e 63 44 65 66 2e 70 48 61 73 68 20 65   FuncDef.pHash e
bb10: 6c 65 6d 65 6e 74 73 20 61 74 20 73 74 61 72 74  lements at start
bb20: 2d 74 69 6d 65 2e 20 20 54 68 65 20 65 6c 65 6d  -time.  The elem
bb30: 65 6e 74 73 20 6f 66 20 74 68 69 73 20 61 72 72  ents of this arr
bb40: 61 79 0a 20 20 2a 2a 20 61 72 65 20 72 65 61 64  ay.  ** are read
bb50: 2d 6f 6e 6c 79 20 61 66 74 65 72 20 69 6e 69 74  -only after init
bb60: 69 61 6c 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f  ialization is co
bb70: 6d 70 6c 65 74 65 2e 0a 20 20 2a 2f 0a 20 20 73  mplete..  */.  s
bb80: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 57 53 44  tatic SQLITE_WSD
bb90: 20 46 75 6e 63 44 65 66 20 61 42 75 69 6c 74 69   FuncDef aBuilti
bba0: 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20  nFunc[] = {.    
bbb0: 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20  FUNCTION(ltrim, 
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
bbd0: 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20  1, 0, trimFunc  
bbe0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
bbf0: 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20  NCTION(ltrim,   
bc00: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 31 2c             2, 1,
bc10: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
bc20: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
bc30: 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20 20  TION(rtrim,     
bc40: 20 20 20 20 20 20 20 20 20 31 2c 20 32 2c 20 30           1, 2, 0
bc50: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
bc60: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
bc70: 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20 20 20 20  ON(rtrim,       
bc80: 20 20 20 20 20 20 20 32 2c 20 32 2c 20 30 2c 20         2, 2, 0, 
bc90: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
bca0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
bcb0: 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20  (trim,          
bcc0: 20 20 20 20 20 31 2c 20 33 2c 20 30 2c 20 74 72       1, 3, 0, tr
bcd0: 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29  imFunc         )
bce0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 74  ,.    FUNCTION(t
bcf0: 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rim,            
bd00: 20 20 20 32 2c 20 33 2c 20 30 2c 20 74 72 69 6d     2, 3, 0, trim
bd10: 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a  Func         ),.
bd20: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e      FUNCTION(min
bd30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bd40: 2d 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78  -1, 0, 1, minmax
bd50: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20  Func       ),.  
bd60: 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20    FUNCTION(min, 
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
bd80: 2c 20 30 2c 20 31 2c 20 30 20 20 20 20 20 20 20  , 0, 1, 0       
bd90: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
bda0: 41 47 47 52 45 47 41 54 45 28 6d 69 6e 2c 20 20  AGGREGATE(min,  
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
bdc0: 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70  0, 1, minmaxStep
bdd0: 2c 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 69 6e  ,      minMaxFin
bde0: 61 6c 69 7a 65 20 29 2c 0a 20 20 20 20 46 55 4e  alize ),.    FUN
bdf0: 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20  CTION(max,      
be00: 20 20 20 20 20 20 20 20 20 2d 31 2c 20 31 2c 20           -1, 1, 
be10: 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20 20 20  1, minmaxFunc   
be20: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
be30: 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20 20 20  ION(max,        
be40: 20 20 20 20 20 20 20 20 30 2c 20 31 2c 20 31 2c          0, 1, 1,
be50: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
be60: 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41    ),.    AGGREGA
be70: 54 45 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20  TE(max,         
be80: 20 20 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 6d        1, 1, 1, m
be90: 69 6e 6d 61 78 53 74 65 70 2c 20 20 20 20 20 20  inmaxStep,      
bea0: 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 20 29  minMaxFinalize )
beb0: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 32 28  ,.    FUNCTION2(
bec0: 74 79 70 65 6f 66 2c 20 20 20 20 20 20 20 20 20  typeof,         
bed0: 20 20 20 31 2c 20 30 2c 20 30 2c 20 74 79 70 65     1, 0, 0, type
bee0: 6f 66 46 75 6e 63 2c 20 20 53 51 4c 49 54 45 5f  ofFunc,  SQLITE_
bef0: 46 55 4e 43 5f 54 59 50 45 4f 46 29 2c 0a 20 20  FUNC_TYPEOF),.  
bf00: 20 20 46 55 4e 43 54 49 4f 4e 32 28 6c 65 6e 67    FUNCTION2(leng
bf10: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  th,            1
bf20: 2c 20 30 2c 20 30 2c 20 6c 65 6e 67 74 68 46 75  , 0, 0, lengthFu
bf30: 6e 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43  nc,  SQLITE_FUNC
bf40: 5f 4c 45 4e 47 54 48 29 2c 0a 20 20 20 20 46 55  _LENGTH),.    FU
bf50: 4e 43 54 49 4f 4e 28 69 6e 73 74 72 2c 20 20 20  NCTION(instr,   
bf60: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
bf70: 20 30 2c 20 69 6e 73 74 72 46 75 6e 63 20 20 20   0, instrFunc   
bf80: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
bf90: 54 49 4f 4e 28 73 75 62 73 74 72 2c 20 20 20 20  TION(substr,    
bfa0: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30           2, 0, 0
bfb0: 2c 20 73 75 62 73 74 72 46 75 6e 63 20 20 20 20  , substrFunc    
bfc0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
bfd0: 4f 4e 28 73 75 62 73 74 72 2c 20 20 20 20 20 20  ON(substr,      
bfe0: 20 20 20 20 20 20 20 33 2c 20 30 2c 20 30 2c 20         3, 0, 0, 
bff0: 73 75 62 73 74 72 46 75 6e 63 20 20 20 20 20 20  substrFunc      
c000: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
c010: 28 75 6e 69 63 6f 64 65 2c 20 20 20 20 20 20 20  (unicode,       
c020: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 75 6e       1, 0, 0, un
c030: 69 63 6f 64 65 46 75 6e 63 20 20 20 20 20 20 29  icodeFunc      )
c040: 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
c050: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
c060: 46 55 4e 43 54 49 4f 4e 28 63 68 61 72 2c 20 20  FUNCTION(char,  
c070: 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
c080: 30 2c 20 30 2c 20 63 68 61 72 46 75 6e 63 20 20  0, 0, charFunc  
c090: 20 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66         ),.#endif
c0a0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 61 62  .    FUNCTION(ab
c0b0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
c0c0: 20 20 31 2c 20 30 2c 20 30 2c 20 61 62 73 46 75    1, 0, 0, absFu
c0d0: 6e 63 20 20 20 20 20 20 20 20 20 20 29 2c 0a 23  nc          ),.#
c0e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c0f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
c100: 54 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72  T.    FUNCTION(r
c110: 6f 75 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  ound,           
c120: 20 20 20 31 2c 20 30 2c 20 30 2c 20 72 6f 75 6e     1, 0, 0, roun
c130: 64 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a  dFunc        ),.
c140: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75      FUNCTION(rou
c150: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
c160: 20 32 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46   2, 0, 0, roundF
c170: 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 23 65  unc        ),.#e
c180: 6e 64 69 66 0a 20 20 20 20 46 55 4e 43 54 49 4f  ndif.    FUNCTIO
c190: 4e 28 75 70 70 65 72 2c 20 20 20 20 20 20 20 20  N(upper,        
c1a0: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 75        1, 0, 0, u
c1b0: 70 70 65 72 46 75 6e 63 20 20 20 20 20 20 20 20  pperFunc        
c1c0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
c1d0: 6c 6f 77 65 72 2c 20 20 20 20 20 20 20 20 20 20  lower,          
c1e0: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 77      1, 0, 0, low
c1f0: 65 72 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c  erFunc        ),
c200: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f  .    FUNCTION(co
c210: 61 6c 65 73 63 65 2c 20 20 20 20 20 20 20 20 20  alesce,         
c220: 20 20 31 2c 20 30 2c 20 30 2c 20 30 20 20 20 20    1, 0, 0, 0    
c230: 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20              ),. 
c240: 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c     FUNCTION(coal
c250: 65 73 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  esce,           
c260: 30 2c 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20  0, 0, 0, 0      
c270: 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20            ),.   
c280: 20 46 55 4e 43 54 49 4f 4e 32 28 63 6f 61 6c 65   FUNCTION2(coale
c290: 73 63 65 2c 20 20 20 20 20 20 20 20 20 2d 31 2c  sce,         -1,
c2a0: 20 30 2c 20 30 2c 20 69 66 6e 75 6c 6c 46 75 6e   0, 0, ifnullFun
c2b0: 63 2c 20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  c,  SQLITE_FUNC_
c2c0: 43 4f 41 4c 45 53 43 45 29 2c 0a 20 20 20 20 46  COALESCE),.    F
c2d0: 55 4e 43 54 49 4f 4e 28 68 65 78 2c 20 20 20 20  UNCTION(hex,    
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
c2f0: 2c 20 30 2c 20 68 65 78 46 75 6e 63 20 20 20 20  , 0, hexFunc    
c300: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
c310: 43 54 49 4f 4e 32 28 69 66 6e 75 6c 6c 2c 20 20  CTION2(ifnull,  
c320: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
c330: 30 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 20  0, ifnullFunc,  
c340: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
c350: 45 53 43 45 29 2c 0a 20 20 20 20 46 55 4e 43 54  ESCE),.    FUNCT
c360: 49 4f 4e 28 72 61 6e 64 6f 6d 2c 20 20 20 20 20  ION(random,     
c370: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c          0, 0, 0,
c380: 20 72 61 6e 64 6f 6d 46 75 6e 63 20 20 20 20 20   randomFunc     
c390: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
c3a0: 4e 28 72 61 6e 64 6f 6d 62 6c 6f 62 2c 20 20 20  N(randomblob,   
c3b0: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 72        1, 0, 0, r
c3c0: 61 6e 64 6f 6d 42 6c 6f 62 20 20 20 20 20 20 20  andomBlob       
c3d0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
c3e0: 6e 75 6c 6c 69 66 2c 20 20 20 20 20 20 20 20 20  nullif,         
c3f0: 20 20 20 20 32 2c 20 30 2c 20 31 2c 20 6e 75 6c      2, 0, 1, nul
c400: 6c 69 66 46 75 6e 63 20 20 20 20 20 20 20 29 2c  lifFunc       ),
c410: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71  .    FUNCTION(sq
c420: 6c 69 74 65 5f 76 65 72 73 69 6f 6e 2c 20 20 20  lite_version,   
c430: 20 20 30 2c 20 30 2c 20 30 2c 20 76 65 72 73 69    0, 0, 0, versi
c440: 6f 6e 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20  onFunc      ),. 
c450: 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69     FUNCTION(sqli
c460: 74 65 5f 73 6f 75 72 63 65 5f 69 64 2c 20 20 20  te_source_id,   
c470: 30 2c 20 30 2c 20 30 2c 20 73 6f 75 72 63 65 69  0, 0, 0, sourcei
c480: 64 46 75 6e 63 20 20 20 20 20 29 2c 0a 20 20 20  dFunc     ),.   
c490: 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65   FUNCTION(sqlite
c4a0: 5f 6c 6f 67 2c 20 20 20 20 20 20 20 20 20 32 2c  _log,         2,
c4b0: 20 30 2c 20 30 2c 20 65 72 72 6c 6f 67 46 75 6e   0, 0, errlogFun
c4c0: 63 20 20 20 20 20 20 20 29 2c 0a 23 69 66 6e 64  c       ),.#ifnd
c4d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
c4e0: 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41  OMPILEOPTION_DIA
c4f0: 47 53 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  GS.    FUNCTION(
c500: 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70  sqlite_compileop
c510: 74 69 6f 6e 5f 75 73 65 64 2c 31 2c 20 30 2c 20  tion_used,1, 0, 
c520: 30 2c 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  0, compileoption
c530: 75 73 65 64 46 75 6e 63 20 20 29 2c 0a 20 20 20  usedFunc  ),.   
c540: 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65   FUNCTION(sqlite
c550: 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67  _compileoption_g
c560: 65 74 2c 20 31 2c 20 30 2c 20 30 2c 20 63 6f 6d  et, 1, 0, 0, com
c570: 70 69 6c 65 6f 70 74 69 6f 6e 67 65 74 46 75 6e  pileoptiongetFun
c580: 63 20 20 29 2c 0a 23 65 6e 64 69 66 20 2f 2a 20  c  ),.#endif /* 
c590: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
c5a0: 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20  ILEOPTION_DIAGS 
c5b0: 2a 2f 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  */.    FUNCTION(
c5c0: 71 75 6f 74 65 2c 20 20 20 20 20 20 20 20 20 20  quote,          
c5d0: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 71 75 6f      1, 0, 0, quo
c5e0: 74 65 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c  teFunc        ),
c5f0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 61  .    FUNCTION(la
c600: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 2c  st_insert_rowid,
c610: 20 20 30 2c 20 30 2c 20 30 2c 20 6c 61 73 74 5f    0, 0, 0, last_
c620: 69 6e 73 65 72 74 5f 72 6f 77 69 64 29 2c 0a 20  insert_rowid),. 
c630: 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 68 61 6e     FUNCTION(chan
c640: 67 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ges,            
c650: 30 2c 20 30 2c 20 30 2c 20 63 68 61 6e 67 65 73  0, 0, 0, changes
c660: 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20            ),.   
c670: 20 46 55 4e 43 54 49 4f 4e 28 74 6f 74 61 6c 5f   FUNCTION(total_
c680: 63 68 61 6e 67 65 73 2c 20 20 20 20 20 20 30 2c  changes,      0,
c690: 20 30 2c 20 30 2c 20 74 6f 74 61 6c 5f 63 68 61   0, 0, total_cha
c6a0: 6e 67 65 73 20 20 20 20 29 2c 0a 20 20 20 20 46  nges    ),.    F
c6b0: 55 4e 43 54 49 4f 4e 28 72 65 70 6c 61 63 65 2c  UNCTION(replace,
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 33 2c 20 30              3, 0
c6d0: 2c 20 30 2c 20 72 65 70 6c 61 63 65 46 75 6e 63  , 0, replaceFunc
c6e0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
c6f0: 43 54 49 4f 4e 28 7a 65 72 6f 62 6c 6f 62 2c 20  CTION(zeroblob, 
c700: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
c710: 30 2c 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63 20  0, zeroblobFunc 
c720: 20 20 20 20 29 2c 0a 20 20 23 69 66 64 65 66 20      ),.  #ifdef 
c730: 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 20  SQLITE_SOUNDEX. 
c740: 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 6f 75 6e     FUNCTION(soun
c750: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
c760: 31 2c 20 30 2c 20 30 2c 20 73 6f 75 6e 64 65 78  1, 0, 0, soundex
c770: 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 23  Func      ),.  #
c780: 65 6e 64 69 66 0a 20 20 23 69 66 6e 64 65 66 20  endif.  #ifndef 
c790: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
c7a0: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 46  _EXTENSION.    F
c7b0: 55 4e 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78 74  UNCTION(load_ext
c7c0: 65 6e 73 69 6f 6e 2c 20 20 20 20 20 31 2c 20 30  ension,     1, 0
c7d0: 2c 20 30 2c 20 6c 6f 61 64 45 78 74 20 20 20 20  , 0, loadExt    
c7e0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
c7f0: 43 54 49 4f 4e 28 6c 6f 61 64 5f 65 78 74 65 6e  CTION(load_exten
c800: 73 69 6f 6e 2c 20 20 20 20 20 32 2c 20 30 2c 20  sion,     2, 0, 
c810: 30 2c 20 6c 6f 61 64 45 78 74 20 20 20 20 20 20  0, loadExt      
c820: 20 20 20 20 29 2c 0a 20 20 23 65 6e 64 69 66 0a      ),.  #endif.
c830: 20 20 20 20 41 47 47 52 45 47 41 54 45 28 73 75      AGGREGATE(su
c840: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
c850: 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65   1, 0, 0, sumSte
c860: 70 2c 20 20 20 20 20 20 20 20 20 73 75 6d 46 69  p,         sumFi
c870: 6e 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20 20  nalize    ),.   
c880: 20 41 47 47 52 45 47 41 54 45 28 74 6f 74 61 6c   AGGREGATE(total
c890: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c  ,             1,
c8a0: 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20   0, 0, sumStep, 
c8b0: 20 20 20 20 20 20 20 20 74 6f 74 61 6c 46 69 6e          totalFin
c8c0: 61 6c 69 7a 65 20 20 20 20 29 2c 0a 20 20 20 20  alize    ),.    
c8d0: 41 47 47 52 45 47 41 54 45 28 61 76 67 2c 20 20  AGGREGATE(avg,  
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
c8f0: 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20  0, 0, sumStep,  
c900: 20 20 20 20 20 20 20 61 76 67 46 69 6e 61 6c 69         avgFinali
c910: 7a 65 20 20 20 20 29 2c 0a 20 2f 2a 20 41 47 47  ze    ),. /* AGG
c920: 52 45 47 41 54 45 28 63 6f 75 6e 74 2c 20 20 20  REGATE(count,   
c930: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
c940: 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20 20  0, countStep,   
c950: 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a      countFinaliz
c960: 65 20 20 29 2c 20 2a 2f 0a 20 20 20 20 7b 30 2c  e  ), */.    {0,
c970: 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49  SQLITE_UTF8,SQLI
c980: 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 2c 30 2c  TE_FUNC_COUNT,0,
c990: 30 2c 30 2c 63 6f 75 6e 74 53 74 65 70 2c 63 6f  0,0,countStep,co
c9a0: 75 6e 74 46 69 6e 61 6c 69 7a 65 2c 22 63 6f 75  untFinalize,"cou
c9b0: 6e 74 22 2c 30 2c 30 7d 2c 0a 20 20 20 20 41 47  nt",0,0},.    AG
c9c0: 47 52 45 47 41 54 45 28 63 6f 75 6e 74 2c 20 20  GREGATE(count,  
c9d0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
c9e0: 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20   0, countStep,  
c9f0: 20 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69       countFinali
ca00: 7a 65 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45  ze  ),.    AGGRE
ca10: 47 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63 61  GATE(group_conca
ca20: 74 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c  t,      1, 0, 0,
ca30: 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70   groupConcatStep
ca40: 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e  , groupConcatFin
ca50: 61 6c 69 7a 65 29 2c 0a 20 20 20 20 41 47 47 52  alize),.    AGGR
ca60: 45 47 41 54 45 28 67 72 6f 75 70 5f 63 6f 6e 63  EGATE(group_conc
ca70: 61 74 2c 20 20 20 20 20 20 32 2c 20 30 2c 20 30  at,      2, 0, 0
ca80: 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65  , groupConcatSte
ca90: 70 2c 20 67 72 6f 75 70 43 6f 6e 63 61 74 46 69  p, groupConcatFi
caa0: 6e 61 6c 69 7a 65 29 2c 0a 20 20 0a 20 20 20 20  nalize),.  .    
cab0: 4c 49 4b 45 46 55 4e 43 28 67 6c 6f 62 2c 20 32  LIKEFUNC(glob, 2
cac0: 2c 20 26 67 6c 6f 62 49 6e 66 6f 2c 20 53 51 4c  , &globInfo, SQL
cad0: 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53 51  ITE_FUNC_LIKE|SQ
cae0: 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 2c  LITE_FUNC_CASE),
caf0: 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
cb00: 5f 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f  _CASE_SENSITIVE_
cb10: 4c 49 4b 45 0a 20 20 20 20 4c 49 4b 45 46 55 4e  LIKE.    LIKEFUN
cb20: 43 28 6c 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65  C(like, 2, &like
cb30: 49 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f  InfoAlt, SQLITE_
cb40: 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45  FUNC_LIKE|SQLITE
cb50: 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20 20  _FUNC_CASE),.   
cb60: 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20   LIKEFUNC(like, 
cb70: 33 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c  3, &likeInfoAlt,
cb80: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
cb90: 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  E|SQLITE_FUNC_CA
cba0: 53 45 29 2c 0a 20 20 23 65 6c 73 65 0a 20 20 20  SE),.  #else.   
cbb0: 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20   LIKEFUNC(like, 
cbc0: 32 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d  2, &likeInfoNorm
cbd0: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  , SQLITE_FUNC_LI
cbe0: 4b 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e  KE),.    LIKEFUN
cbf0: 43 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65  C(like, 3, &like
cc00: 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45  InfoNorm, SQLITE
cc10: 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20 23  _FUNC_LIKE),.  #
cc20: 65 6e 64 69 66 0a 20 20 7d 3b 0a 0a 20 20 69 6e  endif.  };..  in
cc30: 74 20 69 3b 0a 20 20 46 75 6e 63 44 65 66 48 61  t i;.  FuncDefHa
cc40: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f  sh *pHash = &GLO
cc50: 42 41 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c  BAL(FuncDefHash,
cc60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75   sqlite3GlobalFu
cc70: 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 46 75 6e 63  nctions);.  Func
cc80: 44 65 66 20 2a 61 46 75 6e 63 20 3d 20 28 46 75  Def *aFunc = (Fu
cc90: 6e 63 44 65 66 2a 29 26 47 4c 4f 42 41 4c 28 46  ncDef*)&GLOBAL(F
cca0: 75 6e 63 44 65 66 2c 20 61 42 75 69 6c 74 69 6e  uncDef, aBuiltin
ccb0: 46 75 6e 63 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  Func);..  for(i=
ccc0: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
ccd0: 42 75 69 6c 74 69 6e 46 75 6e 63 29 3b 20 69 2b  BuiltinFunc); i+
cce0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  +){.    sqlite3F
ccf0: 75 6e 63 44 65 66 49 6e 73 65 72 74 28 70 48 61  uncDefInsert(pHa
cd00: 73 68 2c 20 26 61 46 75 6e 63 5b 69 5d 29 3b 0a  sh, &aFunc[i]);.
cd10: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 67    }.  sqlite3Reg
cd20: 69 73 74 65 72 44 61 74 65 54 69 6d 65 46 75 6e  isterDateTimeFun
cd30: 63 74 69 6f 6e 73 28 29 3b 0a 23 69 66 6e 64 65  ctions();.#ifnde
cd40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
cd50: 54 45 52 54 41 42 4c 45 0a 20 20 73 71 6c 69 74  TERTABLE.  sqlit
cd60: 65 33 41 6c 74 65 72 46 75 6e 63 74 69 6f 6e 73  e3AlterFunctions
cd70: 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a           ();.#endif.}.