/ Hex Artifact Content
Login

Artifact 5d67931ffefd08e89057847dafee4a032eae505e:


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 73 75 62 73 74 72 28 29 20  of the substr() 
11c0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
11d0: 73 75 62 73 74 72 28 78 2c 70 31 2c 70 32 29 20  substr(x,p1,p2) 
11e0: 20 72 65 74 75 72 6e 73 20 70 32 20 63 68 61 72   returns p2 char
11f0: 61 63 74 65 72 73 20 6f 66 20 78 5b 5d 20 62 65  acters of x[] be
1200: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 70 31 2e  ginning with p1.
1210: 0a 2a 2a 20 70 31 20 69 73 20 31 2d 69 6e 64 65  .** p1 is 1-inde
1220: 78 65 64 2e 20 20 53 6f 20 73 75 62 73 74 72 28  xed.  So substr(
1230: 78 2c 31 2c 31 29 20 72 65 74 75 72 6e 73 20 74  x,1,1) returns t
1240: 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
1250: 65 72 0a 2a 2a 20 6f 66 20 78 2e 20 20 49 66 20  er.** of x.  If 
1260: 78 20 69 73 20 74 65 78 74 2c 20 74 68 65 6e 20  x is text, then 
1270: 77 65 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e  we actually coun
1280: 74 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65  t UTF-8 characte
1290: 72 73 2e 0a 2a 2a 20 49 66 20 78 20 69 73 20 61  rs..** If x is a
12a0: 20 62 6c 6f 62 2c 20 74 68 65 6e 20 77 65 20 63   blob, then we c
12b0: 6f 75 6e 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ount bytes..**.*
12c0: 2a 20 49 66 20 70 31 20 69 73 20 6e 65 67 61 74  * If p1 is negat
12d0: 69 76 65 2c 20 74 68 65 6e 20 77 65 20 62 65 67  ive, then we beg
12e0: 69 6e 20 61 62 73 28 70 31 29 20 66 72 6f 6d 20  in abs(p1) from 
12f0: 74 68 65 20 65 6e 64 20 6f 66 20 78 5b 5d 2e 0a  the end of x[]..
1300: 2a 2a 0a 2a 2a 20 49 66 20 70 32 20 69 73 20 6e  **.** If p2 is n
1310: 65 67 61 74 69 76 65 2c 20 72 65 74 75 72 6e 20  egative, return 
1320: 74 68 65 20 70 32 20 63 68 61 72 61 63 74 65 72  the p2 character
1330: 73 20 70 72 65 63 65 65 64 69 6e 67 20 70 31 2e  s preceeding p1.
1340: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1350: 73 75 62 73 74 72 46 75 6e 63 28 0a 20 20 73 71  substrFunc(.  sq
1360: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1370: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
1380: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
1390: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
13a0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
13b0: 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20  har *z;.  const 
13c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
13d0: 32 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  2;.  int len;.  
13e0: 69 6e 74 20 70 30 74 79 70 65 3b 0a 20 20 69 36  int p0type;.  i6
13f0: 34 20 70 31 2c 20 70 32 3b 0a 20 20 69 6e 74 20  4 p1, p2;.  int 
1400: 6e 65 67 50 32 20 3d 20 30 3b 0a 0a 20 20 61 73  negP2 = 0;..  as
1410: 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20 7c 7c  sert( argc==3 ||
1420: 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66   argc==2 );.  if
1430: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
1440: 74 79 70 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53  type(argv[1])==S
1450: 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 7c 7c  QLITE_NULL.   ||
1460: 20 28 61 72 67 63 3d 3d 33 20 26 26 20 73 71 6c   (argc==3 && 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 32 5d 29 3d 3d 53 51 4c 49 54 45  argv[2])==SQLITE
1490: 5f 4e 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20  _NULL).  ){.    
14a0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 30  return;.  }.  p0
14b0: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  type = sqlite3_v
14c0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
14d0: 5d 29 3b 0a 20 20 70 31 20 3d 20 73 71 6c 69 74  ]);.  p1 = sqlit
14e0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
14f0: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 70 30 74  v[1]);.  if( p0t
1500: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
1510: 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71   ){.    len = sq
1520: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
1530: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  s(argv[0]);.    
1540: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
1550: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
1560: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
1570: 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65  return;.    asse
1580: 72 74 28 20 6c 65 6e 3d 3d 73 71 6c 69 74 65 33  rt( len==sqlite3
1590: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
15a0: 76 5b 30 5d 29 20 29 3b 0a 20 20 7d 65 6c 73 65  v[0]) );.  }else
15b0: 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
15c0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
15d0: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a  v[0]);.    if( z
15e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
15f0: 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69    len = 0;.    i
1600: 66 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20  f( p1<0 ){.     
1610: 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32 3b 20   for(z2=z; *z2; 
1620: 6c 65 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  len++){.        
1630: 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38  SQLITE_SKIP_UTF8
1640: 28 7a 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (z2);.      }.  
1650: 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
1660: 51 4c 49 54 45 5f 53 55 42 53 54 52 5f 43 4f 4d  QLITE_SUBSTR_COM
1670: 50 41 54 49 42 49 4c 49 54 59 0a 20 20 69 66 28  PATIBILITY.  if(
1680: 20 70 31 3d 3d 30 20 29 20 70 31 20 3d 20 31 3b   p1==0 ) p1 = 1;
1690: 20 2f 2a 20 3c 72 64 61 72 3a 2f 2f 70 72 6f 62   /* <rdar://prob
16a0: 6c 65 6d 2f 36 37 37 38 33 33 39 3e 20 2a 2f 0a  lem/6778339> */.
16b0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 61 72 67  #endif.  if( arg
16c0: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 70 32 20 3d  c==3 ){.    p2 =
16d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
16e0: 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  nt(argv[2]);.   
16f0: 20 69 66 28 20 70 32 3c 30 20 29 7b 0a 20 20 20   if( p2<0 ){.   
1700: 20 20 20 70 32 20 3d 20 2d 70 32 3b 0a 20 20 20     p2 = -p2;.   
1710: 20 20 20 6e 65 67 50 32 20 3d 20 31 3b 0a 20 20     negP2 = 1;.  
1720: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1730: 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   p2 = sqlite3_co
1740: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
1750: 63 6f 6e 74 65 78 74 29 2d 3e 61 4c 69 6d 69 74  context)->aLimit
1760: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
1770: 4e 47 54 48 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  NGTH];.  }.  if(
1780: 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 70 31 20   p1<0 ){.    p1 
1790: 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 69 66 28 20  += len;.    if( 
17a0: 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 32  p1<0 ){.      p2
17b0: 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20 69 66   += p1;.      if
17c0: 28 20 70 32 3c 30 20 29 20 70 32 20 3d 20 30 3b  ( p2<0 ) p2 = 0;
17d0: 0a 20 20 20 20 20 20 70 31 20 3d 20 30 3b 0a 20  .      p1 = 0;. 
17e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
17f0: 20 70 31 3e 30 20 29 7b 0a 20 20 20 20 70 31 2d   p1>0 ){.    p1-
1800: 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  -;.  }else if( p
1810: 32 3e 30 20 29 7b 0a 20 20 20 20 70 32 2d 2d 3b  2>0 ){.    p2--;
1820: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 67 50 32  .  }.  if( negP2
1830: 20 29 7b 0a 20 20 20 20 70 31 20 2d 3d 20 70 32   ){.    p1 -= p2
1840: 3b 0a 20 20 20 20 69 66 28 20 70 31 3c 30 20 29  ;.    if( p1<0 )
1850: 7b 0a 20 20 20 20 20 20 70 32 20 2b 3d 20 70 31  {.      p2 += p1
1860: 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 30 3b 0a  ;.      p1 = 0;.
1870: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
1880: 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 32 3e  rt( p1>=0 && p2>
1890: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 30 74 79  =0 );.  if( p0ty
18a0: 70 65 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe!=SQLITE_BLOB 
18b0: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  ){.    while( *z
18c0: 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20   && p1 ){.      
18d0: 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38  SQLITE_SKIP_UTF8
18e0: 28 7a 29 3b 0a 20 20 20 20 20 20 70 31 2d 2d 3b  (z);.      p1--;
18f0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 7a  .    }.    for(z
1900: 32 3d 7a 3b 20 2a 7a 32 20 26 26 20 70 32 3b 20  2=z; *z2 && p2; 
1910: 70 32 2d 2d 29 7b 0a 20 20 20 20 20 20 53 51 4c  p2--){.      SQL
1920: 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 32  ITE_SKIP_UTF8(z2
1930: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1940: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
1950: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a  (context, (char*
1960: 29 7a 2c 20 28 69 6e 74 29 28 7a 32 2d 7a 29 2c  )z, (int)(z2-z),
1970: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
1980: 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  T);.  }else{.   
1990: 20 69 66 28 20 70 31 2b 70 32 3e 6c 65 6e 20 29   if( p1+p2>len )
19a0: 7b 0a 20 20 20 20 20 20 70 32 20 3d 20 6c 65 6e  {.      p2 = len
19b0: 2d 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  -p1;.      if( p
19c0: 32 3c 30 20 29 20 70 32 20 3d 20 30 3b 0a 20 20  2<0 ) p2 = 0;.  
19d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
19e0: 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74  result_blob(cont
19f0: 65 78 74 2c 20 28 63 68 61 72 2a 29 26 7a 5b 70  ext, (char*)&z[p
1a00: 31 5d 2c 20 28 69 6e 74 29 70 32 2c 20 53 51 4c  1], (int)p2, SQL
1a10: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
1a20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70    }.}../*.** Imp
1a30: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1a40: 68 65 20 72 6f 75 6e 64 28 29 20 66 75 6e 63 74  he round() funct
1a50: 69 6f 6e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ion.*/.#ifndef S
1a60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1a70: 49 4e 47 5f 50 4f 49 4e 54 0a 73 74 61 74 69 63  ING_POINT.static
1a80: 20 76 6f 69 64 20 72 6f 75 6e 64 46 75 6e 63 28   void roundFunc(
1a90: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1aa0: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
1ab0: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
1ac0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74  e **argv){.  int
1ad0: 20 6e 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65   n = 0;.  double
1ae0: 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66   r;.  char *zBuf
1af0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
1b00: 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29  ==1 || argc==2 )
1b10: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20  ;.  if( argc==2 
1b20: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
1b30: 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f  E_NULL==sqlite3_
1b40: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
1b50: 31 5d 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  1]) ) return;.  
1b60: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
1b70: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
1b80: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 33 30 20 29  ;.    if( n>30 )
1b90: 20 6e 20 3d 20 33 30 3b 0a 20 20 20 20 69 66 28   n = 30;.    if(
1ba0: 20 6e 3c 30 20 29 20 6e 20 3d 20 30 3b 0a 20 20   n<0 ) n = 0;.  
1bb0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
1bc0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
1bd0: 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
1be0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 20 3d   ) return;.  r =
1bf0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
1c00: 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a  ouble(argv[0]);.
1c10: 20 20 2f 2a 20 49 66 20 59 3d 3d 30 20 61 6e 64    /* If Y==0 and
1c20: 20 58 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61   X will fit in a
1c30: 20 36 34 2d 62 69 74 20 69 6e 74 2c 0a 20 20 2a   64-bit int,.  *
1c40: 2a 20 68 61 6e 64 6c 65 20 74 68 65 20 72 6f 75  * handle the rou
1c50: 6e 64 69 6e 67 20 64 69 72 65 63 74 6c 79 2c 0a  nding directly,.
1c60: 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 75    ** otherwise u
1c70: 73 65 20 70 72 69 6e 74 66 2e 0a 20 20 2a 2f 0a  se printf..  */.
1c80: 20 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 72 3e    if( n==0 && r>
1c90: 3d 30 20 26 26 20 72 3c 4c 41 52 47 45 53 54 5f  =0 && r<LARGEST_
1ca0: 49 4e 54 36 34 2d 31 20 29 7b 0a 20 20 20 20 72  INT64-1 ){.    r
1cb0: 20 3d 20 28 64 6f 75 62 6c 65 29 28 28 73 71 6c   = (double)((sql
1cc0: 69 74 65 5f 69 6e 74 36 34 29 28 72 2b 30 2e 35  ite_int64)(r+0.5
1cd0: 29 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ));.  }else if( 
1ce0: 6e 3d 3d 30 20 26 26 20 72 3c 30 20 26 26 20 28  n==0 && r<0 && (
1cf0: 2d 72 29 3c 4c 41 52 47 45 53 54 5f 49 4e 54 36  -r)<LARGEST_INT6
1d00: 34 2d 31 20 29 7b 0a 20 20 20 20 72 20 3d 20 2d  4-1 ){.    r = -
1d10: 28 64 6f 75 62 6c 65 29 28 28 73 71 6c 69 74 65  (double)((sqlite
1d20: 5f 69 6e 74 36 34 29 28 28 2d 72 29 2b 30 2e 35  _int64)((-r)+0.5
1d30: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
1d40: 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f   zBuf = sqlite3_
1d50: 6d 70 72 69 6e 74 66 28 22 25 2e 2a 66 22 2c 6e  mprintf("%.*f",n
1d60: 2c 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75  ,r);.    if( zBu
1d70: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  f==0 ){.      sq
1d80: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1d90: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
1da0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
1db0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1dc0: 65 33 41 74 6f 46 28 7a 42 75 66 2c 20 26 72 2c  e3AtoF(zBuf, &r,
1dd0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1de0: 28 7a 42 75 66 29 2c 20 53 51 4c 49 54 45 5f 55  (zBuf), SQLITE_U
1df0: 54 46 38 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TF8);.    sqlite
1e00: 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
1e10: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
1e20: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
1e30: 74 2c 20 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  t, r);.}.#endif.
1e40: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1e50: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
1e60: 70 61 63 65 20 75 73 69 6e 67 20 73 71 6c 69 74  pace using sqlit
1e70: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  e3_malloc(). If 
1e80: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  the.** allocatio
1e90: 6e 20 66 61 69 6c 73 2c 20 63 61 6c 6c 20 73 71  n fails, call sq
1ea0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1eb0: 6f 72 5f 6e 6f 6d 65 6d 28 29 20 74 6f 20 6e 6f  or_nomem() to no
1ec0: 74 69 66 79 0a 2a 2a 20 74 68 65 20 64 61 74 61  tify.** the data
1ed0: 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
1ee0: 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 66 61   malloc() has fa
1ef0: 69 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20  iled and return 
1f00: 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20 6e 42 79 74  NULL..** If nByt
1f10: 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
1f20: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 72   the maximum str
1f30: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6c 65 6e 67  ing or blob leng
1f40: 74 68 2c 20 74 68 65 6e 0a 2a 2a 20 72 61 69 73  th, then.** rais
1f50: 65 20 61 6e 20 53 51 4c 49 54 45 5f 54 4f 4f 42  e an SQLITE_TOOB
1f60: 49 47 20 65 78 63 65 70 74 69 6f 6e 20 61 6e 64  IG exception and
1f70: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
1f80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 6f  .static void *co
1f90: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 73 71 6c 69  ntextMalloc(sqli
1fa0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
1fb0: 74 65 78 74 2c 20 69 36 34 20 6e 42 79 74 65 29  text, i64 nByte)
1fc0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
1fd0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
1fe0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
1ff0: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
2000: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
2010: 3e 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  >0 );.  testcase
2020: 28 20 6e 42 79 74 65 3d 3d 64 62 2d 3e 61 4c 69  ( nByte==db->aLi
2030: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
2040: 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 74 65  _LENGTH] );.  te
2050: 73 74 63 61 73 65 28 20 6e 42 79 74 65 3d 3d 64  stcase( nByte==d
2060: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
2070: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 2b 31  _LIMIT_LENGTH]+1
2080: 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e   );.  if( nByte>
2090: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
20a0: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
20b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
20c0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62  esult_error_toob
20d0: 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ig(context);.   
20e0: 20 7a 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b   z = 0;.  }else{
20f0: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
2100: 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 42 79 74  Malloc((int)nByt
2110: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 20 29  e);.    if( !z )
2120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2130: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
2140: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
2150: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2160: 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  z;.}../*.** Impl
2170: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
2180: 65 20 75 70 70 65 72 28 29 20 61 6e 64 20 6c 6f  e upper() and lo
2190: 77 65 72 28 29 20 53 51 4c 20 66 75 6e 63 74 69  wer() SQL functi
21a0: 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ons..*/.static v
21b0: 6f 69 64 20 75 70 70 65 72 46 75 6e 63 28 73 71  oid upperFunc(sq
21c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
21d0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
21e0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
21f0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20  **argv){.  char 
2200: 2a 7a 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *z1;.  const cha
2210: 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 69 2c 20  r *z2;.  int i, 
2220: 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  n;.  UNUSED_PARA
2230: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 7a  METER(argc);.  z
2240: 32 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  2 = (char*)sqlit
2250: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
2260: 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71  gv[0]);.  n = sq
2270: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
2280: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a  s(argv[0]);.  /*
2290: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
22a0: 20 63 61 6c 6c 20 74 6f 20 5f 62 79 74 65 73 28   call to _bytes(
22b0: 29 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61 6c  ) does not inval
22c0: 69 64 61 74 65 20 74 68 65 20 5f 74 65 78 74 28  idate the _text(
22d0: 29 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 61  ) pointer */.  a
22e0: 73 73 65 72 74 28 20 7a 32 3d 3d 28 63 68 61 72  ssert( z2==(char
22f0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
2300: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b  text(argv[0]) );
2310: 0a 20 20 69 66 28 20 7a 32 20 29 7b 0a 20 20 20  .  if( z2 ){.   
2320: 20 7a 31 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c   z1 = contextMal
2330: 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28 28 69  loc(context, ((i
2340: 36 34 29 6e 29 2b 31 29 3b 0a 20 20 20 20 69 66  64)n)+1);.    if
2350: 28 20 7a 31 20 29 7b 0a 20 20 20 20 20 20 66 6f  ( z1 ){.      fo
2360: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
2370: 7b 0a 20 20 20 20 20 20 20 20 7a 31 5b 69 5d 20  {.        z1[i] 
2380: 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65 33 54  = (char)sqlite3T
2390: 6f 75 70 70 65 72 28 7a 32 5b 69 5d 29 3b 0a 20  oupper(z2[i]);. 
23a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
23b0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
23c0: 28 63 6f 6e 74 65 78 74 2c 20 7a 31 2c 20 6e 2c  (context, z1, n,
23d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
23e0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
23f0: 69 63 20 76 6f 69 64 20 6c 6f 77 65 72 46 75 6e  ic void lowerFun
2400: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
2410: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
2420: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
2430: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  lue **argv){.  c
2440: 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73 74  har *z1;.  const
2450: 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74   char *z2;.  int
2460: 20 69 2c 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f   i, n;.  UNUSED_
2470: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
2480: 0a 20 20 7a 32 20 3d 20 28 63 68 61 72 2a 29 73  .  z2 = (char*)s
2490: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
24a0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20  t(argv[0]);.  n 
24b0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
24c0: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
24d0: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
24e0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f 62 79   the call to _by
24f0: 74 65 73 28 29 20 64 6f 65 73 20 6e 6f 74 20 69  tes() does not i
2500: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 5f 74  nvalidate the _t
2510: 65 78 74 28 29 20 70 6f 69 6e 74 65 72 20 2a 2f  ext() pointer */
2520: 0a 20 20 61 73 73 65 72 74 28 20 7a 32 3d 3d 28  .  assert( z2==(
2530: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
2540: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
2550: 29 20 29 3b 0a 20 20 69 66 28 20 7a 32 20 29 7b  ) );.  if( z2 ){
2560: 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74 65 78  .    z1 = contex
2570: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
2580: 20 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a 20 20   ((i64)n)+1);.  
2590: 20 20 69 66 28 20 7a 31 20 29 7b 0a 20 20 20 20    if( z1 ){.    
25a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
25b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 31  i++){.        z1
25c0: 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 6c  [i] = sqlite3Tol
25d0: 6f 77 65 72 28 7a 32 5b 69 5d 29 3b 0a 20 20 20  ower(z2[i]);.   
25e0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
25f0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
2600: 6f 6e 74 65 78 74 2c 20 7a 31 2c 20 6e 2c 20 73  ontext, z1, n, s
2610: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
2620: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20    }.  }.}...#if 
2630: 30 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  0  /* This funct
2640: 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65  ion is never use
2650: 64 2e 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  d. */./*.** The 
2660: 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 20 49  COALESCE() and I
2670: 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e  FNULL() function
2680: 73 20 75 73 65 64 20 74 6f 20 62 65 20 69 6d 70  s used to be imp
2690: 6c 65 6d 65 6e 74 65 64 20 61 73 20 73 68 6f 77  lemented as show
26a0: 6e 0a 2a 2a 20 68 65 72 65 2e 20 20 42 75 74 20  n.** here.  But 
26b0: 6e 6f 77 20 74 68 65 79 20 61 72 65 20 69 6d 70  now they are imp
26c0: 6c 65 6d 65 6e 74 65 64 20 61 73 20 56 44 42 45  lemented as VDBE
26d0: 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 75 6e   code so that un
26e0: 75 73 65 64 20 61 72 67 75 6d 65 6e 74 73 0a 2a  used arguments.*
26f0: 2a 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  * do not have to
2700: 20 62 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 54   be computed.  T
2710: 68 69 73 20 6c 65 67 61 63 79 20 69 6d 70 6c 65  his legacy imple
2720: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 72 65 74  mentation is ret
2730: 61 69 6e 65 64 20 61 73 0a 2a 2a 20 63 6f 6d 6d  ained as.** comm
2740: 65 6e 74 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6d  ent..*/./*.** Im
2750: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2760: 74 68 65 20 49 46 4e 55 4c 4c 28 29 2c 20 4e 56  the IFNULL(), NV
2770: 4c 28 29 2c 20 61 6e 64 20 43 4f 41 4c 45 53 43  L(), and COALESC
2780: 45 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  E() functions.  
2790: 0a 2a 2a 20 41 6c 6c 20 74 68 72 65 65 20 64 6f  .** All three do
27a0: 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
27b0: 20 20 54 68 65 79 20 72 65 74 75 72 6e 20 74 68    They return th
27c0: 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c  e first non-NULL
27d0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
27e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 66 6e  .static void ifn
27f0: 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ullFunc(.  sqlit
2800: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
2810: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
2820: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2830: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
2840: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
2850: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
2860: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c   if( SQLITE_NULL
2870: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
2880: 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20 29 7b  type(argv[i]) ){
2890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
28a0: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74  esult_value(cont
28b0: 65 78 74 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20  ext, argv[i]);. 
28c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28d0: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  }.  }.}.#endif /
28e0: 2a 20 4e 4f 54 20 55 53 45 44 20 2a 2f 0a 23 64  * NOT USED */.#d
28f0: 65 66 69 6e 65 20 69 66 6e 75 6c 6c 46 75 6e 63  efine ifnullFunc
2900: 20 76 65 72 73 69 6f 6e 46 75 6e 63 20 20 20 2f   versionFunc   /
2910: 2a 20 53 75 62 73 74 69 74 75 74 65 20 66 75 6e  * Substitute fun
2920: 63 74 69 6f 6e 20 2d 20 6e 65 76 65 72 20 63 61  ction - never ca
2930: 6c 6c 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  lled */../*.** I
2940: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2950: 20 72 61 6e 64 6f 6d 28 29 2e 20 20 52 65 74 75   random().  Retu
2960: 72 6e 20 61 20 72 61 6e 64 6f 6d 20 69 6e 74 65  rn a random inte
2970: 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  ger.  .*/.static
2980: 20 76 6f 69 64 20 72 61 6e 64 6f 6d 46 75 6e 63   void randomFunc
2990: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
29a0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
29b0: 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73  int NotUsed,.  s
29c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e  qlite3_value **N
29d0: 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c  otUsed2.){.  sql
29e0: 69 74 65 5f 69 6e 74 36 34 20 72 3b 0a 20 20 55  ite_int64 r;.  U
29f0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
2a00: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
2a10: 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  d2);.  sqlite3_r
2a20: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
2a30: 28 72 29 2c 20 26 72 29 3b 0a 20 20 69 66 28 20  (r), &r);.  if( 
2a40: 72 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  r<0 ){.    /* We
2a50: 20 6e 65 65 64 20 74 6f 20 70 72 65 76 65 6e 74   need to prevent
2a60: 20 61 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72   a random number
2a70: 20 6f 66 20 30 78 38 30 30 30 30 30 30 30 30 30   of 0x8000000000
2a80: 30 30 30 30 30 30 20 0a 20 20 20 20 2a 2a 20 28  000000 .    ** (
2a90: 6f 72 20 2d 39 32 32 33 33 37 32 30 33 36 38 35  or -922337203685
2aa0: 34 37 37 35 38 30 38 29 20 73 69 6e 63 65 20 77  4775808) since w
2ab0: 68 65 6e 20 79 6f 75 20 64 6f 20 61 62 73 28 29  hen you do abs()
2ac0: 20 6f 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   of that.    ** 
2ad0: 6e 75 6d 62 65 72 20 6f 66 20 79 6f 75 20 67 65  number of you ge
2ae0: 74 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  t the same value
2af0: 20 62 61 63 6b 20 61 67 61 69 6e 2e 20 20 54 6f   back again.  To
2b00: 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
2b10: 69 6e 20 61 20 77 61 79 20 74 68 61 74 20 69 73  in a way that is
2b20: 20 74 65 73 74 61 62 6c 65 2c 20 6d 61 73 6b 20   testable, mask 
2b30: 74 68 65 20 73 69 67 6e 20 62 69 74 20 6f 66 66  the sign bit off
2b40: 20 6f 66 20 6e 65 67 61 74 69 76 65 0a 20 20 20   of negative.   
2b50: 20 2a 2a 20 76 61 6c 75 65 73 2c 20 72 65 73 75   ** values, resu
2b60: 6c 74 69 6e 67 20 69 6e 20 61 20 70 6f 73 69 74  lting in a posit
2b70: 69 76 65 20 76 61 6c 75 65 2e 20 20 54 68 65 6e  ive value.  Then
2b80: 20 74 61 6b 65 20 74 68 65 20 0a 20 20 20 20 2a   take the .    *
2b90: 2a 20 32 73 20 63 6f 6d 70 6c 65 6d 65 6e 74 20  * 2s complement 
2ba0: 6f 66 20 74 68 61 74 20 70 6f 73 69 74 69 76 65  of that positive
2bb0: 20 76 61 6c 75 65 2e 20 20 54 68 65 20 65 6e 64   value.  The end
2bc0: 20 72 65 73 75 6c 74 20 63 61 6e 0a 20 20 20 20   result can.    
2bd0: 2a 2a 20 74 68 65 72 65 66 6f 72 65 20 62 65 20  ** therefore be 
2be0: 6e 6f 20 6c 65 73 73 20 74 68 61 6e 20 2d 39 32  no less than -92
2bf0: 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
2c00: 37 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 20  7..    */.    r 
2c10: 3d 20 2d 28 72 20 5e 20 28 28 28 73 71 6c 69 74  = -(r ^ (((sqlit
2c20: 65 33 5f 69 6e 74 36 34 29 31 29 3c 3c 36 33 29  e3_int64)1)<<63)
2c30: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2c40: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
2c50: 6e 74 65 78 74 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a  ntext, r);.}../*
2c60: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2c70: 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d 62 6c 6f 62  on of randomblob
2c80: 28 4e 29 2e 20 20 52 65 74 75 72 6e 20 61 20 72  (N).  Return a r
2c90: 61 6e 64 6f 6d 20 62 6c 6f 62 0a 2a 2a 20 74 68  andom blob.** th
2ca0: 61 74 20 69 73 20 4e 20 62 79 74 65 73 20 6c 6f  at is N bytes lo
2cb0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
2cc0: 69 64 20 72 61 6e 64 6f 6d 42 6c 6f 62 28 0a 20  id randomBlob(. 
2cd0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2ce0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
2cf0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
2d00: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
2d10: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 75 6e 73 69  .  int n;.  unsi
2d20: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20  gned char *p;.  
2d30: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
2d40: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2d50: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6e  METER(argc);.  n
2d60: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2d70: 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  _int(argv[0]);. 
2d80: 20 69 66 28 20 6e 3c 31 20 29 7b 0a 20 20 20 20   if( n<1 ){.    
2d90: 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 20 3d  n = 1;.  }.  p =
2da0: 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63   contextMalloc(c
2db0: 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20 69 66  ontext, n);.  if
2dc0: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
2dd0: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 6e 2c  e3_randomness(n,
2de0: 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
2df0: 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e  _result_blob(con
2e00: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 70 2c 20  text, (char*)p, 
2e10: 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  n, sqlite3_free)
2e20: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
2e30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2e40: 20 74 68 65 20 6c 61 73 74 5f 69 6e 73 65 72 74   the last_insert
2e50: 5f 72 6f 77 69 64 28 29 20 53 51 4c 20 66 75 6e  _rowid() SQL fun
2e60: 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74 75  ction.  The retu
2e70: 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 74  rn.** value is t
2e80: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73  he same as the s
2e90: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
2ea0: 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20 66  rt_rowid() API f
2eb0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2ec0: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 69 6e 73  ic void last_ins
2ed0: 65 72 74 5f 72 6f 77 69 64 28 0a 20 20 73 71 6c  ert_rowid(.  sql
2ee0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
2ef0: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 4e 6f  ntext, .  int No
2f00: 74 55 73 65 64 2c 20 0a 20 20 73 71 6c 69 74 65  tUsed, .  sqlite
2f10: 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65  3_value **NotUse
2f20: 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  d2.){.  sqlite3 
2f30: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
2f40: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
2f50: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53  context);.  UNUS
2f60: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
2f70: 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
2f80: 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31  ;.  /* IMP: R-51
2f90: 35 31 33 2d 31 32 30 32 36 20 54 68 65 20 6c 61  513-12026 The la
2fa0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
2fb0: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69  ) SQL function i
2fc0: 73 20 61 0a 20 20 2a 2a 20 77 72 61 70 70 65 72  s a.  ** wrapper
2fd0: 20 61 72 6f 75 6e 64 20 74 68 65 20 73 71 6c 69   around the sqli
2fe0: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
2ff0: 72 6f 77 69 64 28 29 20 43 2f 43 2b 2b 20 69 6e  rowid() C/C++ in
3000: 74 65 72 66 61 63 65 0a 20 20 2a 2a 20 66 75 6e  terface.  ** fun
3010: 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69  ction. */.  sqli
3020: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
3030: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
3040: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
3050: 77 69 64 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a  wid(db));.}../*.
3060: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3070: 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73  n of the changes
3080: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  () SQL function.
3090: 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52 2d 36 32  .**.** IMP: R-62
30a0: 30 37 33 2d 31 31 32 30 39 20 54 68 65 20 63 68  073-11209 The ch
30b0: 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75 6e 63  anges() SQL func
30c0: 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65  tion is a wrappe
30d0: 72 0a 2a 2a 20 61 72 6f 75 6e 64 20 74 68 65 20  r.** around the 
30e0: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
30f0: 29 20 43 2f 43 2b 2b 20 66 75 6e 63 74 69 6f 6e  ) C/C++ function
3100: 20 61 6e 64 20 68 65 6e 63 65 20 66 6f 6c 6c 6f   and hence follo
3110: 77 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 72  ws the same.** r
3120: 75 6c 65 73 20 66 6f 72 20 63 6f 75 6e 74 69 6e  ules for countin
3130: 67 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 73 74  g changes..*/.st
3140: 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65  atic void change
3150: 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  s(.  sqlite3_con
3160: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
3170: 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20   int NotUsed,.  
3180: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3190: 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73 71  NotUsed2.){.  sq
31a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
31b0: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
31c0: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
31d0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
31e0: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
31f0: 55 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74 65  Used2);.  sqlite
3200: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
3210: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63 68  text, sqlite3_ch
3220: 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f  anges(db));.}../
3230: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
3240: 69 6f 6e 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  ion of the total
3250: 5f 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66  _changes() SQL f
3260: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65  unction.  The re
3270: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 0a 2a 2a  turn value is.**
3280: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
3290: 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
32a0: 68 61 6e 67 65 73 28 29 20 41 50 49 20 66 75 6e  hanges() API fun
32b0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
32c0: 20 76 6f 69 64 20 74 6f 74 61 6c 5f 63 68 61 6e   void total_chan
32d0: 67 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ges(.  sqlite3_c
32e0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
32f0: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
3300: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3310: 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20  **NotUsed2.){.  
3320: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
3330: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
3340: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
3350: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
3360: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
3370: 6f 74 55 73 65 64 32 29 3b 0a 20 20 2f 2a 20 49  otUsed2);.  /* I
3380: 4d 50 3a 20 52 2d 35 32 37 35 36 2d 34 31 39 39  MP: R-52756-4199
3390: 33 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  3 This function 
33a0: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
33b0: 75 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  und the.  ** sql
33c0: 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
33d0: 65 73 28 29 20 43 2f 43 2b 2b 20 69 6e 74 65 72  es() C/C++ inter
33e0: 66 61 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  face. */.  sqlit
33f0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
3400: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 74  ntext, sqlite3_t
3410: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 64 62 29  otal_changes(db)
3420: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  );.}../*.** A st
3430: 72 75 63 74 75 72 65 20 64 65 66 69 6e 69 6e 67  ructure defining
3440: 20 68 6f 77 20 74 6f 20 64 6f 20 47 4c 4f 42 2d   how to do GLOB-
3450: 73 74 79 6c 65 20 63 6f 6d 70 61 72 69 73 6f 6e  style comparison
3460: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6d  s..*/.struct com
3470: 70 61 72 65 49 6e 66 6f 20 7b 0a 20 20 75 38 20  pareInfo {.  u8 
3480: 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d  matchAll;.  u8 m
3490: 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61  atchOne;.  u8 ma
34a0: 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f 43  tchSet;.  u8 noC
34b0: 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46  ase;.};../*.** F
34c0: 6f 72 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  or LIKE and GLOB
34d0: 20 6d 61 74 63 68 69 6e 67 20 6f 6e 20 45 42 43   matching on EBC
34e0: 44 49 43 20 6d 61 63 68 69 6e 65 73 2c 20 61 73  DIC machines, as
34f0: 73 75 6d 65 20 74 68 61 74 20 65 76 65 72 79 0a  sume that every.
3500: 2a 2a 20 63 68 61 72 61 63 74 65 72 20 69 73 20  ** character is 
3510: 65 78 61 63 74 6c 79 20 6f 6e 65 20 62 79 74 65  exactly one byte
3520: 20 69 6e 20 73 69 7a 65 2e 20 20 41 6c 73 6f 2c   in size.  Also,
3530: 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
3540: 61 72 65 0a 2a 2a 20 61 62 6c 65 20 74 6f 20 70  are.** able to p
3550: 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 75 70  articipate in up
3560: 70 65 72 2d 63 61 73 65 2d 74 6f 2d 6c 6f 77 65  per-case-to-lowe
3570: 72 2d 63 61 73 65 20 6d 61 70 70 69 6e 67 73 20  r-case mappings 
3580: 69 6e 20 45 42 43 44 49 43 0a 2a 2a 20 77 68 65  in EBCDIC.** whe
3590: 72 65 61 73 20 6f 6e 6c 79 20 63 68 61 72 61 63  reas only charac
35a0: 74 65 72 73 20 6c 65 73 73 20 74 68 61 6e 20 30  ters less than 0
35b0: 78 38 30 20 64 6f 20 69 6e 20 41 53 43 49 49 2e  x80 do in ASCII.
35c0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
35d0: 53 51 4c 49 54 45 5f 45 42 43 44 49 43 29 0a 23  SQLITE_EBCDIC).#
35e0: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 55   define sqlite3U
35f0: 74 66 38 52 65 61 64 28 41 2c 43 29 20 20 28 2a  tf8Read(A,C)  (*
3600: 28 41 2b 2b 29 29 0a 23 20 64 65 66 69 6e 65 20  (A++)).# define 
3610: 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72  GlogUpperToLower
3620: 28 41 29 20 20 20 41 20 3d 20 73 71 6c 69 74 65  (A)   A = sqlite
3630: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 41 5d  3UpperToLower[A]
3640: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3650: 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72  GlogUpperToLower
3660: 28 41 29 20 20 20 69 66 28 20 21 28 28 41 29 26  (A)   if( !((A)&
3670: 7e 30 78 37 66 29 20 29 7b 20 41 20 3d 20 73 71  ~0x7f) ){ A = sq
3680: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
3690: 72 5b 41 5d 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a  r[A]; }.#endif..
36a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
36b0: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
36c0: 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b 20 27 2a 27  globInfo = { '*'
36d0: 2c 20 27 3f 27 2c 20 27 5b 27 2c 20 30 20 7d 3b  , '?', '[', 0 };
36e0: 0a 2f 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20  ./* The correct 
36f0: 53 51 4c 2d 39 32 20 62 65 68 61 76 69 6f 72 20  SQL-92 behavior 
3700: 69 73 20 66 6f 72 20 74 68 65 20 4c 49 4b 45 20  is for the LIKE 
3710: 6f 70 65 72 61 74 6f 72 20 74 6f 20 69 67 6e 6f  operator to igno
3720: 72 65 0a 2a 2a 20 63 61 73 65 2e 20 20 54 68 75  re.** case.  Thu
3730: 73 20 20 27 61 27 20 4c 49 4b 45 20 27 41 27 20  s  'a' LIKE 'A' 
3740: 77 6f 75 6c 64 20 62 65 20 74 72 75 65 2e 20 2a  would be true. *
3750: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
3760: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
3770: 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 20 3d  o likeInfoNorm =
3780: 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20 30   { '%', '_',   0
3790: 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66 20 53 51 4c  , 1 };./* If SQL
37a0: 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49  ITE_CASE_SENSITI
37b0: 56 45 5f 4c 49 4b 45 20 69 73 20 64 65 66 69 6e  VE_LIKE is defin
37c0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 4c 49 4b  ed, then the LIK
37d0: 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  E operator.** is
37e0: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 20   case sensitive 
37f0: 63 61 75 73 69 6e 67 20 27 61 27 20 4c 49 4b 45  causing 'a' LIKE
3800: 20 27 41 27 20 74 6f 20 62 65 20 66 61 6c 73 65   'A' to be false
3810: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
3820: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
3830: 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 41 6c 74 20  nfo likeInfoAlt 
3840: 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20  = { '%', '_',   
3850: 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  0, 0 };../*.** C
3860: 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d 38  ompare two UTF-8
3870: 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75   strings for equ
3880: 61 6c 69 74 79 20 77 68 65 72 65 20 74 68 65 20  ality where the 
3890: 66 69 72 73 74 20 73 74 72 69 6e 67 20 63 61 6e  first string can
38a0: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
38b0: 62 65 20 61 20 22 67 6c 6f 62 22 20 65 78 70 72  be a "glob" expr
38c0: 65 73 73 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ession.  Return 
38d0: 74 72 75 65 20 28 31 29 20 69 66 20 74 68 65 79  true (1) if they
38e0: 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
38f0: 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69   and false (0) i
3900: 66 20 74 68 65 79 20 61 72 65 20 64 69 66 66 65  f they are diffe
3910: 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62  rent..**.** Glob
3920: 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  bing rules:.**.*
3930: 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20  *      '*'      
3940: 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
3950: 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72  uence of zero or
3960: 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73   more characters
3970: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27  ..**.**      '?'
3980: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65         Matches e
3990: 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61  xactly one chara
39a0: 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  cter..**.**     
39b0: 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68  [...]      Match
39c0: 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
39d0: 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73   from the enclos
39e0: 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20  ed list of.**   
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
3a00: 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
3a10: 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61     [^...]     Ma
3a20: 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
3a30: 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65  ter not in the e
3a40: 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  nclosed list..**
3a50: 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 5b 2e 2e  .** With the [..
3a60: 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61  .] and [^...] ma
3a70: 74 63 68 69 6e 67 2c 20 61 20 27 5d 27 20 63 68  tching, a ']' ch
3a80: 61 72 61 63 74 65 72 20 63 61 6e 20 62 65 20 69  aracter can be i
3a90: 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68  ncluded.** in th
3aa0: 65 20 6c 69 73 74 20 62 79 20 6d 61 6b 69 6e 67  e list by making
3ab0: 20 69 74 20 74 68 65 20 66 69 72 73 74 20 63 68   it the first ch
3ac0: 61 72 61 63 74 65 72 20 61 66 74 65 72 20 27 5b  aracter after '[
3ad0: 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a 2a 2a 20  ' or '^'.  A.** 
3ae0: 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61 63 74  range of charact
3af0: 65 72 73 20 63 61 6e 20 62 65 20 73 70 65 63 69  ers can be speci
3b00: 66 69 65 64 20 75 73 69 6e 67 20 27 2d 27 2e 20  fied using '-'. 
3b10: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61   Example:.** "[a
3b20: 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20 61 6e 79  -z]" matches any
3b30: 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72 2d 63 61   single lower-ca
3b40: 73 65 20 6c 65 74 74 65 72 2e 20 20 54 6f 20 6d  se letter.  To m
3b50: 61 74 63 68 20 61 20 27 2d 27 2c 20 6d 61 6b 65  atch a '-', make
3b60: 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61 73 74 20  .** it the last 
3b70: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65  character in the
3b80: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   list..**.** Thi
3b90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 75  s routine is usu
3ba0: 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75 74 20  ally quick, but 
3bb0: 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e 20 74  can be N**2 in t
3bc0: 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e 0a 2a  he worst case..*
3bd0: 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20 74 6f 20 6d  *.** Hints: to m
3be0: 61 74 63 68 20 27 2a 27 20 6f 72 20 27 3f 27 2c  atch '*' or '?',
3bf0: 20 70 75 74 20 74 68 65 6d 20 69 6e 20 22 5b 5d   put them in "[]
3c00: 22 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  ".  Like this:.*
3c10: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 62 63  *.**         abc
3c20: 5b 2a 5d 78 79 7a 20 20 20 20 20 20 20 20 4d 61  [*]xyz        Ma
3c30: 74 63 68 65 73 20 22 61 62 63 2a 78 79 7a 22 20  tches "abc*xyz" 
3c40: 6f 6e 6c 79 0a 2a 2f 0a 73 74 61 74 69 63 20 69  only.*/.static i
3c50: 6e 74 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72  nt patternCompar
3c60: 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  e(.  const u8 *z
3c70: 50 61 74 74 65 72 6e 2c 20 20 20 20 20 20 20 20  Pattern,        
3c80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 6c 6f        /* The glo
3c90: 62 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63  b pattern */.  c
3ca0: 6f 6e 73 74 20 75 38 20 2a 7a 53 74 72 69 6e 67  onst u8 *zString
3cb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3cc0: 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 20 74 6f  /* The string to
3cd0: 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
3ce0: 20 74 68 65 20 67 6c 6f 62 20 2a 2f 0a 20 20 63   the glob */.  c
3cf0: 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70  onst struct comp
3d00: 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 2c 20  areInfo *pInfo, 
3d10: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
3d20: 62 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f 20 74  bout how to do t
3d30: 68 65 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  he compare */.  
3d40: 75 33 32 20 65 73 63 20 20 20 20 20 20 20 20 20  u32 esc         
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d60: 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63   /* The escape c
3d70: 68 61 72 61 63 74 65 72 20 2a 2f 0a 29 7b 0a 20  haracter */.){. 
3d80: 20 75 33 32 20 63 2c 20 63 32 3b 0a 20 20 69 6e   u32 c, c2;.  in
3d90: 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20  t invert;.  int 
3da0: 73 65 65 6e 3b 0a 20 20 75 38 20 6d 61 74 63 68  seen;.  u8 match
3db0: 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74  One = pInfo->mat
3dc0: 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61 74 63  chOne;.  u8 matc
3dd0: 68 41 6c 6c 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61  hAll = pInfo->ma
3de0: 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d 61 74  tchAll;.  u8 mat
3df0: 63 68 53 65 74 20 3d 20 70 49 6e 66 6f 2d 3e 6d  chSet = pInfo->m
3e00: 61 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f  atchSet;.  u8 no
3e10: 43 61 73 65 20 3d 20 70 49 6e 66 6f 2d 3e 6e 6f  Case = pInfo->no
3e20: 43 61 73 65 3b 20 0a 20 20 69 6e 74 20 70 72 65  Case; .  int pre
3e30: 76 45 73 63 61 70 65 20 3d 20 30 3b 20 20 20 20  vEscape = 0;    
3e40: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
3e50: 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  previous charact
3e60: 65 72 20 77 61 73 20 27 65 73 63 61 70 65 27 20  er was 'escape' 
3e70: 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20  */..  while( (c 
3e80: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
3e90: 64 28 7a 50 61 74 74 65 72 6e 2c 26 7a 50 61 74  d(zPattern,&zPat
3ea0: 74 65 72 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20  tern))!=0 ){.   
3eb0: 20 69 66 28 20 21 70 72 65 76 45 73 63 61 70 65   if( !prevEscape
3ec0: 20 26 26 20 63 3d 3d 6d 61 74 63 68 41 6c 6c 20   && c==matchAll 
3ed0: 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
3ee0: 28 63 3d 73 71 6c 69 74 65 33 55 74 66 38 52 65  (c=sqlite3Utf8Re
3ef0: 61 64 28 7a 50 61 74 74 65 72 6e 2c 26 7a 50 61  ad(zPattern,&zPa
3f00: 74 74 65 72 6e 29 29 20 3d 3d 20 6d 61 74 63 68  ttern)) == match
3f10: 41 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  All.            
3f20: 20 20 20 7c 7c 20 63 20 3d 3d 20 6d 61 74 63 68     || c == match
3f30: 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  One ){.        i
3f40: 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 26  f( c==matchOne &
3f50: 26 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  & sqlite3Utf8Rea
3f60: 64 28 7a 53 74 72 69 6e 67 2c 20 26 7a 53 74 72  d(zString, &zStr
3f70: 69 6e 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ing)==0 ){.     
3f80: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
3f90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3fa0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
3fb0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3fc0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
3fd0: 20 69 66 28 20 63 3d 3d 65 73 63 20 29 7b 0a 20   if( c==esc ){. 
3fe0: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
3ff0: 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  e3Utf8Read(zPatt
4000: 65 72 6e 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b  ern, &zPattern);
4010: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
4020: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
4030: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
4040: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
4050: 66 28 20 63 3d 3d 6d 61 74 63 68 53 65 74 20 29  f( c==matchSet )
4060: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
4070: 28 20 65 73 63 3d 3d 30 20 29 3b 20 20 20 20 20  ( esc==0 );     
4080: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 47      /* This is G
4090: 4c 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45 20 2a 2f  LOB, not LIKE */
40a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
40b0: 20 6d 61 74 63 68 53 65 74 3c 30 78 38 30 20 29   matchSet<0x80 )
40c0: 3b 20 20 2f 2a 20 27 5b 27 20 69 73 20 61 20 73  ;  /* '[' is a s
40d0: 69 6e 67 6c 65 2d 62 79 74 65 20 63 68 61 72 61  ingle-byte chara
40e0: 63 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  cter */.        
40f0: 77 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20  while( *zString 
4100: 26 26 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72  && patternCompar
4110: 65 28 26 7a 50 61 74 74 65 72 6e 5b 2d 31 5d 2c  e(&zPattern[-1],
4120: 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73  zString,pInfo,es
4130: 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  c)==0 ){.       
4140: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
4150: 54 46 38 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  TF8(zString);.  
4160: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4170: 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 21  return *zString!
4180: 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  =0;.      }.    
4190: 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 73    while( (c2 = s
41a0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a  qlite3Utf8Read(z
41b0: 53 74 72 69 6e 67 2c 26 7a 53 74 72 69 6e 67 29  String,&zString)
41c0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
41d0: 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20  if( noCase ){.  
41e0: 20 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70 65          GlogUppe
41f0: 72 54 6f 4c 6f 77 65 72 28 63 32 29 3b 0a 20 20  rToLower(c2);.  
4200: 20 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70 65          GlogUppe
4210: 72 54 6f 4c 6f 77 65 72 28 63 29 3b 0a 20 20 20  rToLower(c);.   
4220: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32         while( c2
4230: 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20 63   != 0 && c2 != c
4240: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4250: 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  c2 = sqlite3Utf8
4260: 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 20 26 7a  Read(zString, &z
4270: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  String);.       
4280: 20 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f       GlogUpperTo
4290: 4c 6f 77 65 72 28 63 32 29 3b 0a 20 20 20 20 20  Lower(c2);.     
42a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
42b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
42c0: 77 68 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26  while( c2 != 0 &
42d0: 26 20 63 32 20 21 3d 20 63 20 29 7b 0a 20 20 20  & c2 != c ){.   
42e0: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
42f0: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 53  lite3Utf8Read(zS
4300: 74 72 69 6e 67 2c 20 26 7a 53 74 72 69 6e 67 29  tring, &zString)
4310: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4330: 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75  if( c2==0 ) retu
4340: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66  rn 0;.        if
4350: 28 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  ( patternCompare
4360: 28 7a 50 61 74 74 65 72 6e 2c 7a 53 74 72 69 6e  (zPattern,zStrin
4370: 67 2c 70 49 6e 66 6f 2c 65 73 63 29 20 29 20 72  g,pInfo,esc) ) r
4380: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
4390: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
43a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
43b0: 70 72 65 76 45 73 63 61 70 65 20 26 26 20 63 3d  prevEscape && c=
43c0: 3d 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20 20  =matchOne ){.   
43d0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 55 74     if( sqlite3Ut
43e0: 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 20  f8Read(zString, 
43f0: 26 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a  &zString)==0 ){.
4400: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
4410: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
4420: 6c 73 65 20 69 66 28 20 63 3d 3d 6d 61 74 63 68  lse if( c==match
4430: 53 65 74 20 29 7b 0a 20 20 20 20 20 20 75 33 32  Set ){.      u32
4440: 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20   prior_c = 0;.  
4450: 20 20 20 20 61 73 73 65 72 74 28 20 65 73 63 3d      assert( esc=
4460: 3d 30 20 29 3b 20 20 20 20 2f 2a 20 54 68 69 73  =0 );    /* This
4470: 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 66 6f 72   only occurs for
4480: 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45 20   GLOB, not LIKE 
4490: 2a 2f 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20  */.      seen = 
44a0: 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20  0;.      invert 
44b0: 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 73  = 0;.      c = s
44c0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a  qlite3Utf8Read(z
44d0: 53 74 72 69 6e 67 2c 20 26 7a 53 74 72 69 6e 67  String, &zString
44e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  );.      if( c==
44f0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4500: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
4510: 55 74 66 38 52 65 61 64 28 7a 50 61 74 74 65 72  Utf8Read(zPatter
4520: 6e 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  n, &zPattern);. 
4530: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27       if( c2=='^'
4540: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 65   ){.        inve
4550: 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
4560: 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  c2 = sqlite3Utf8
4570: 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 26  Read(zPattern, &
4580: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
4590: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d   }.      if( c2=
45a0: 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =']' ){.        
45b0: 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65  if( c==']' ) see
45c0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63  n = 1;.        c
45d0: 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  2 = sqlite3Utf8R
45e0: 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 26 7a  ead(zPattern, &z
45f0: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
4600: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 63  }.      while( c
4610: 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a  2 && c2!=']' ){.
4620: 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
4630: 27 2d 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b  '-' && zPattern[
4640: 30 5d 21 3d 27 5d 27 20 26 26 20 7a 50 61 74 74  0]!=']' && zPatt
4650: 65 72 6e 5b 30 5d 21 3d 30 20 26 26 20 70 72 69  ern[0]!=0 && pri
4660: 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  or_c>0 ){.      
4670: 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33      c2 = sqlite3
4680: 55 74 66 38 52 65 61 64 28 7a 50 61 74 74 65 72  Utf8Read(zPatter
4690: 6e 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  n, &zPattern);. 
46a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d           if( c>=
46b0: 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32  prior_c && c<=c2
46c0: 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
46d0: 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
46e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
46f0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
4700: 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20   c==c2 ){.      
4710: 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a        seen = 1;.
4720: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4730: 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
4740: 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
4750: 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74        c2 = sqlit
4760: 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  e3Utf8Read(zPatt
4770: 65 72 6e 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b  ern, &zPattern);
4780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4790: 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65  f( c2==0 || (see
47a0: 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20 29  n ^ invert)==0 )
47b0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
47c0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
47d0: 7d 65 6c 73 65 20 69 66 28 20 65 73 63 3d 3d 63  }else if( esc==c
47e0: 20 26 26 20 21 70 72 65 76 45 73 63 61 70 65 20   && !prevEscape 
47f0: 29 7b 0a 20 20 20 20 20 20 70 72 65 76 45 73 63  ){.      prevEsc
4800: 61 70 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ape = 1;.    }el
4810: 73 65 7b 0a 20 20 20 20 20 20 63 32 20 3d 20 73  se{.      c2 = s
4820: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a  qlite3Utf8Read(z
4830: 53 74 72 69 6e 67 2c 20 26 7a 53 74 72 69 6e 67  String, &zString
4840: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43  );.      if( noC
4850: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 47  ase ){.        G
4860: 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72 28  logUpperToLower(
4870: 63 29 3b 0a 20 20 20 20 20 20 20 20 47 6c 6f 67  c);.        Glog
4880: 55 70 70 65 72 54 6f 4c 6f 77 65 72 28 63 32 29  UpperToLower(c2)
4890: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
48a0: 69 66 28 20 63 21 3d 63 32 20 29 7b 0a 20 20 20  if( c!=c2 ){.   
48b0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
48c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 65       }.      pre
48d0: 76 45 73 63 61 70 65 20 3d 20 30 3b 0a 20 20 20  vEscape = 0;.   
48e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
48f0: 2a 7a 53 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a  *zString==0;.}..
4900: 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
4910: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
4920: 74 68 61 74 20 74 68 65 20 4c 49 4b 45 20 6f 70  that the LIKE op
4930: 65 72 61 74 6f 72 20 28 6f 72 20 47 4c 4f 42 20  erator (or GLOB 
4940: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6a 75 73 74  which is.** just
4950: 20 61 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20   a variation of 
4960: 4c 49 4b 45 29 20 67 65 74 73 20 63 61 6c 6c 65  LIKE) gets calle
4970: 64 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  d.  This is used
4980: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
4990: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
49a0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
49b0: 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75  sqlite3_like_cou
49c0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
49d0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
49e0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 6b  ation of the lik
49f0: 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  e() SQL function
4a00: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
4a10: 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74   implements.** t
4a20: 68 65 20 62 75 69 6c 64 2d 69 6e 20 4c 49 4b 45  he build-in LIKE
4a30: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
4a40: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
4a50: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  o the function i
4a60: 73 20 74 68 65 0a 2a 2a 20 70 61 74 74 65 72 6e  s the.** pattern
4a70: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
4a80: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
4a90: 73 74 72 69 6e 67 2e 20 20 53 6f 2c 20 74 68 65  string.  So, the
4aa0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a   SQL statements:
4ab0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41 20 4c  .**.**       A L
4ac0: 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69 73 20 69  IKE B.**.** is i
4ad0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 6c 69  mplemented as li
4ae0: 6b 65 28 42 2c 41 29 2e 0a 2a 2a 0a 2a 2a 20 54  ke(B,A)..**.** T
4af0: 68 69 73 20 73 61 6d 65 20 66 75 6e 63 74 69 6f  his same functio
4b00: 6e 20 28 77 69 74 68 20 61 20 64 69 66 66 65 72  n (with a differ
4b10: 65 6e 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  ent compareInfo 
4b20: 73 74 72 75 63 74 75 72 65 29 20 63 6f 6d 70 75  structure) compu
4b30: 74 65 73 0a 2a 2a 20 74 68 65 20 47 4c 4f 42 20  tes.** the GLOB 
4b40: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  operator..*/.sta
4b50: 74 69 63 20 76 6f 69 64 20 6c 69 6b 65 46 75 6e  tic void likeFun
4b60: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
4b70: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
4b80: 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73    int argc, .  s
4b90: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4ba0: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgv.){.  const u
4bb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41  nsigned char *zA
4bc0: 2c 20 2a 7a 42 3b 0a 20 20 75 33 32 20 65 73 63  , *zB;.  u32 esc
4bd0: 61 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ape = 0;.  int n
4be0: 50 61 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Pat;.  sqlite3 *
4bf0: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
4c00: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
4c10: 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 7a 42 20 3d  ontext);..  zB =
4c20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
4c30: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
4c40: 7a 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  zA = sqlite3_val
4c50: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
4c60: 3b 0a 0a 20 20 2f 2a 20 4c 69 6d 69 74 20 74 68  ;..  /* Limit th
4c70: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
4c80: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61 74  LIKE or GLOB pat
4c90: 74 65 72 6e 20 74 6f 20 61 76 6f 69 64 20 70 72  tern to avoid pr
4ca0: 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 6f 66 20 64  oblems.  ** of d
4cb0: 65 65 70 20 72 65 63 75 72 73 69 6f 6e 20 61 6e  eep recursion an
4cc0: 64 20 4e 2a 4e 20 62 65 68 61 76 69 6f 72 20 69  d N*N behavior i
4cd0: 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65  n patternCompare
4ce0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 74 20  ()..  */.  nPat 
4cf0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4d00: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
4d10: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 74    testcase( nPat
4d20: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
4d30: 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
4d40: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 20 29  ATTERN_LENGTH] )
4d50: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
4d60: 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  at==db->aLimit[S
4d70: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
4d80: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
4d90: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 74  +1 );.  if( nPat
4da0: 20 3e 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   > db->aLimit[SQ
4db0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
4dc0: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 20  PATTERN_LENGTH] 
4dd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
4de0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
4df0: 65 78 74 2c 20 22 4c 49 4b 45 20 6f 72 20 47 4c  ext, "LIKE or GL
4e00: 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 6f 20 63  OB pattern too c
4e10: 6f 6d 70 6c 65 78 22 2c 20 2d 31 29 3b 0a 20 20  omplex", -1);.  
4e20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
4e30: 61 73 73 65 72 74 28 20 7a 42 3d 3d 73 71 6c 69  assert( zB==sqli
4e40: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
4e50: 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 45  rgv[0]) );  /* E
4e60: 6e 63 6f 64 69 6e 67 20 64 69 64 20 6e 6f 74 20  ncoding did not 
4e70: 63 68 61 6e 67 65 20 2a 2f 0a 0a 20 20 69 66 28  change */..  if(
4e80: 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20   argc==3 ){.    
4e90: 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63 68  /* The escape ch
4ea0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 6d  aracter string m
4eb0: 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66 20 61  ust consist of a
4ec0: 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20 63 68   single UTF-8 ch
4ed0: 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20  aracter..    ** 
4ee0: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
4ef0: 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
4f00: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  */.    const uns
4f10: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 73 63  igned char *zEsc
4f20: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4f30: 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a  _text(argv[2]);.
4f40: 20 20 20 20 69 66 28 20 7a 45 73 63 3d 3d 30 20      if( zEsc==0 
4f50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
4f60: 28 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  ( sqlite3Utf8Cha
4f70: 72 4c 65 6e 28 28 63 68 61 72 2a 29 7a 45 73 63  rLen((char*)zEsc
4f80: 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20 20 20 20  , -1)!=1 ){.    
4f90: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4fa0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
4fb0: 0a 20 20 20 20 20 20 20 20 20 20 22 45 53 43 41  .          "ESCA
4fc0: 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  PE expression mu
4fd0: 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
4fe0: 68 61 72 61 63 74 65 72 22 2c 20 2d 31 29 3b 0a  haracter", -1);.
4ff0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
5000: 20 20 7d 0a 20 20 20 20 65 73 63 61 70 65 20 3d    }.    escape =
5010: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
5020: 28 7a 45 73 63 2c 20 26 7a 45 73 63 29 3b 0a 20  (zEsc, &zEsc);. 
5030: 20 7d 0a 20 20 69 66 28 20 7a 41 20 26 26 20 7a   }.  if( zA && z
5040: 42 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  B ){.    struct 
5050: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e  compareInfo *pIn
5060: 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  fo = sqlite3_use
5070: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
5080: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
5090: 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
50a0: 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  like_count++;.#e
50b0: 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20 73 71  ndif.    .    sq
50c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
50d0: 28 63 6f 6e 74 65 78 74 2c 20 70 61 74 74 65 72  (context, patter
50e0: 6e 43 6f 6d 70 61 72 65 28 7a 42 2c 20 7a 41 2c  nCompare(zB, zA,
50f0: 20 70 49 6e 66 6f 2c 20 65 73 63 61 70 65 29 29   pInfo, escape))
5100: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
5110: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
5120: 20 74 68 65 20 4e 55 4c 4c 49 46 28 78 2c 79 29   the NULLIF(x,y)
5130: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
5140: 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69  result is the fi
5150: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  rst.** argument 
5160: 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  if the arguments
5170: 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
5180: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   The result is N
5190: 55 4c 4c 20 69 66 20 74 68 65 0a 2a 2a 20 61 72  ULL if the.** ar
51a0: 67 75 6d 65 6e 74 73 20 61 72 65 20 65 71 75 61  guments are equa
51b0: 6c 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 2e  l to each other.
51c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
51d0: 6e 75 6c 6c 69 66 46 75 6e 63 28 0a 20 20 73 71  nullifFunc(.  sq
51e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
51f0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
5200: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
5210: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
5220: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
5230: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75  l = sqlite3GetFu
5240: 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78  ncCollSeq(contex
5250: 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t);.  UNUSED_PAR
5260: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
5270: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 65  .  if( sqlite3Me
5280: 6d 43 6f 6d 70 61 72 65 28 61 72 67 76 5b 30 5d  mCompare(argv[0]
5290: 2c 20 61 72 67 76 5b 31 5d 2c 20 70 43 6f 6c 6c  , argv[1], pColl
52a0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
52b0: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
52c0: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30  (context, argv[0
52d0: 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ]);.  }.}../*.**
52e0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
52f0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 76 65  of the sqlite_ve
5300: 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e  rsion() function
5310: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
5320: 20 74 68 65 20 76 65 72 73 69 6f 6e 0a 2a 2a 20   the version.** 
5330: 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  of the SQLite li
5340: 62 72 61 72 79 20 74 68 61 74 20 69 73 20 72 75  brary that is ru
5350: 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  nning..*/.static
5360: 20 76 6f 69 64 20 76 65 72 73 69 6f 6e 46 75 6e   void versionFun
5370: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5380: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
5390: 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20   int NotUsed,.  
53a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
53b0: 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 55 4e  NotUsed2.){.  UN
53c0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
53d0: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
53e0: 32 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  2);.  /* IMP: R-
53f0: 34 38 36 39 39 2d 34 38 36 31 37 20 54 68 69 73  48699-48617 This
5400: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
5410: 53 51 4c 20 77 72 61 70 70 65 72 20 61 72 6f 75  SQL wrapper arou
5420: 6e 64 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  nd the.  ** sqli
5430: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
5440: 20 43 2d 69 6e 74 65 72 66 61 63 65 2e 20 2a 2f   C-interface. */
5450: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5460: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
5470: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
5480: 6f 6e 28 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45  on(), -1, SQLITE
5490: 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a  _STATIC);.}../*.
54a0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
54b0: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
54c0: 73 6f 75 72 63 65 5f 69 64 28 29 20 66 75 6e 63  source_id() func
54d0: 74 69 6f 6e 2e 20 54 68 65 20 72 65 73 75 6c 74  tion. The result
54e0: 20 69 73 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20   is a string.** 
54f0: 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 73 20  that identifies 
5500: 74 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 76  the particular v
5510: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 6f  ersion of the so
5520: 75 72 63 65 20 63 6f 64 65 20 75 73 65 64 20 74  urce code used t
5530: 6f 20 62 75 69 6c 64 0a 2a 2a 20 53 51 4c 69 74  o build.** SQLit
5540: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5550: 64 20 73 6f 75 72 63 65 69 64 46 75 6e 63 28 0a  d sourceidFunc(.
5560: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5570: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
5580: 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c  t NotUsed,.  sql
5590: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74  ite3_value **Not
55a0: 55 73 65 64 32 0a 29 7b 0a 20 20 55 4e 55 53 45  Used2.){.  UNUSE
55b0: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
55c0: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
55d0: 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 34  .  /* IMP: R-244
55e0: 37 30 2d 33 31 31 33 36 20 54 68 69 73 20 66 75  70-31136 This fu
55f0: 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 53 51 4c  nction is an SQL
5600: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
5610: 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
5620: 5f 73 6f 75 72 63 65 69 64 28 29 20 43 20 69 6e  _sourceid() C in
5630: 74 65 72 66 61 63 65 2e 20 2a 2f 0a 20 20 73 71  terface. */.  sq
5640: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
5650: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
5660: 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c 20 2d  e3_sourceid(), -
5670: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
5680: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
5690: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
56a0: 65 20 73 71 6c 69 74 65 5f 6c 6f 67 28 29 20 66  e sqlite_log() f
56b0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
56c0: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
56d0: 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 6f  nd.** sqlite3_lo
56e0: 67 28 29 2e 20 20 54 68 65 20 72 65 74 75 72 6e  g().  The return
56f0: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20   value is NULL. 
5700: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 65 78   The function ex
5710: 69 73 74 73 20 70 75 72 65 6c 79 20 66 6f 72 0a  ists purely for.
5720: 2a 2a 20 69 74 73 20 73 69 64 65 2d 65 66 66 65  ** its side-effe
5730: 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cts..*/.static v
5740: 6f 69 64 20 65 72 72 6c 6f 67 46 75 6e 63 28 0a  oid errlogFunc(.
5750: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5760: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
5770: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
5780: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5790: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
57a0: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55 4e  ETER(argc);.  UN
57b0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 63  USED_PARAMETER(c
57c0: 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74  ontext);.  sqlit
57d0: 65 33 5f 6c 6f 67 28 73 71 6c 69 74 65 33 5f 76  e3_log(sqlite3_v
57e0: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d  alue_int(argv[0]
57f0: 29 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  ), "%s", sqlite3
5800: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
5810: 5b 31 5d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  [1]));.}../*.** 
5820: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
5830: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 63 6f 6d  f the sqlite_com
5840: 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28  pileoption_used(
5850: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ) function..** T
5860: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6e 20  he result is an 
5870: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 64 65  integer that ide
5880: 6e 74 69 66 69 65 73 20 69 66 20 74 68 65 20 63  ntifies if the c
5890: 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 0a 2a  ompiler option.*
58a0: 2a 20 77 61 73 20 75 73 65 64 20 74 6f 20 62 75  * was used to bu
58b0: 69 6c 64 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23  ild SQLite..*/.#
58c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
58d0: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
58e0: 5f 44 49 41 47 53 0a 73 74 61 74 69 63 20 76 6f  _DIAGS.static vo
58f0: 69 64 20 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  id compileoption
5900: 75 73 65 64 46 75 6e 63 28 0a 20 20 73 71 6c 69  usedFunc(.  sqli
5910: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5920: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
5930: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5940: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
5950: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61  nst char *zOptNa
5960: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72  me;.  assert( ar
5970: 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45  gc==1 );.  UNUSE
5980: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
5990: 29 3b 0a 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  );.  /* IMP: R-3
59a0: 39 35 36 34 2d 33 36 33 30 35 20 54 68 65 20 73  9564-36305 The s
59b0: 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 6f 70 74  qlite_compileopt
59c0: 69 6f 6e 5f 75 73 65 64 28 29 20 53 51 4c 0a 20  ion_used() SQL. 
59d0: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20   ** function is 
59e0: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
59f0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6d   the sqlite3_com
5a00: 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28  pileoption_used(
5a10: 29 20 43 2f 43 2b 2b 0a 20 20 2a 2a 20 66 75 6e  ) C/C++.  ** fun
5a20: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ction..  */.  if
5a30: 28 20 28 7a 4f 70 74 4e 61 6d 65 20 3d 20 28 63  ( (zOptName = (c
5a40: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
5a50: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5a60: 67 76 5b 30 5d 29 29 21 3d 30 20 29 7b 0a 20 20  gv[0]))!=0 ){.  
5a70: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5a80: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
5a90: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
5aa0: 69 6f 6e 5f 75 73 65 64 28 7a 4f 70 74 4e 61 6d  ion_used(zOptNam
5ab0: 65 29 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  e));.  }.}.#endi
5ac0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5ad0: 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
5ae0: 49 41 47 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  IAGS */../*.** I
5af0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
5b00: 20 74 68 65 20 73 71 6c 69 74 65 5f 63 6f 6d 70   the sqlite_comp
5b10: 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 29 20  ileoption_get() 
5b20: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68  function. .** Th
5b30: 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73 74  e result is a st
5b40: 72 69 6e 67 20 74 68 61 74 20 69 64 65 6e 74 69  ring that identi
5b50: 66 69 65 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  fies the compile
5b60: 72 20 6f 70 74 69 6f 6e 73 20 0a 2a 2a 20 75 73  r options .** us
5b70: 65 64 20 74 6f 20 62 75 69 6c 64 20 53 51 4c 69  ed to build SQLi
5b80: 74 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  te..*/.#ifndef S
5b90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49  QLITE_OMIT_COMPI
5ba0: 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 73  LEOPTION_DIAGS.s
5bb0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 69  tatic void compi
5bc0: 6c 65 6f 70 74 69 6f 6e 67 65 74 46 75 6e 63 28  leoptiongetFunc(
5bd0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5be0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
5bf0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
5c00: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5c10: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73  ){.  int n;.  as
5c20: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
5c30: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
5c40: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 2f 2a 20  TER(argc);.  /* 
5c50: 49 4d 50 3a 20 52 2d 30 34 39 32 32 2d 32 34 30  IMP: R-04922-240
5c60: 37 36 20 54 68 65 20 73 71 6c 69 74 65 5f 63 6f  76 The sqlite_co
5c70: 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28  mpileoption_get(
5c80: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 20  ) SQL function. 
5c90: 20 2a 2a 20 69 73 20 61 20 77 72 61 70 70 65 72   ** is a wrapper
5ca0: 20 61 72 6f 75 6e 64 20 74 68 65 20 73 71 6c 69   around the sqli
5cb0: 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  te3_compileoptio
5cc0: 6e 5f 67 65 74 28 29 20 43 2f 43 2b 2b 20 66 75  n_get() C/C++ fu
5cd0: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 6e  nction..  */.  n
5ce0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5cf0: 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  _int(argv[0]);. 
5d00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5d10: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  text(context, sq
5d20: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
5d30: 69 6f 6e 5f 67 65 74 28 6e 29 2c 20 2d 31 2c 20  ion_get(n), -1, 
5d40: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
5d50: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5d60: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
5d70: 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a  PTION_DIAGS */..
5d80: 2f 2a 20 41 72 72 61 79 20 66 6f 72 20 63 6f 6e  /* Array for con
5d90: 76 65 72 74 69 6e 67 20 66 72 6f 6d 20 68 61 6c  verting from hal
5da0: 66 2d 62 79 74 65 73 20 28 6e 79 62 62 6c 65 73  f-bytes (nybbles
5db0: 29 20 69 6e 74 6f 20 41 53 43 49 49 20 68 65 78  ) into ASCII hex
5dc0: 0a 2a 2a 20 64 69 67 69 74 73 2e 20 2a 2f 0a 73  .** digits. */.s
5dd0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
5de0: 20 68 65 78 64 69 67 69 74 73 5b 5d 20 3d 20 7b   hexdigits[] = {
5df0: 0a 20 20 27 30 27 2c 20 27 31 27 2c 20 27 32 27  .  '0', '1', '2'
5e00: 2c 20 27 33 27 2c 20 27 34 27 2c 20 27 35 27 2c  , '3', '4', '5',
5e10: 20 27 36 27 2c 20 27 37 27 2c 0a 20 20 27 38 27   '6', '7',.  '8'
5e20: 2c 20 27 39 27 2c 20 27 41 27 2c 20 27 42 27 2c  , '9', 'A', 'B',
5e30: 20 27 43 27 2c 20 27 44 27 2c 20 27 45 27 2c 20   'C', 'D', 'E', 
5e40: 27 46 27 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45  'F' .};../*.** E
5e50: 58 50 45 52 49 4d 45 4e 54 41 4c 20 2d 20 54 68  XPERIMENTAL - Th
5e60: 69 73 20 69 73 20 6e 6f 74 20 61 6e 20 6f 66 66  is is not an off
5e70: 69 63 69 61 6c 20 66 75 6e 63 74 69 6f 6e 2e 20  icial function. 
5e80: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 6d   The interface m
5e90: 61 79 0a 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54  ay.** change.  T
5ea0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
5eb0: 20 64 69 73 61 70 70 65 61 72 2e 20 20 44 6f 20   disappear.  Do 
5ec0: 6e 6f 74 20 77 72 69 74 65 20 63 6f 64 65 20 74  not write code t
5ed0: 68 61 74 20 64 65 70 65 6e 64 73 0a 2a 2a 20 6f  hat depends.** o
5ee0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  n this function.
5ef0: 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  .**.** Implement
5f00: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 51 55 4f  ation of the QUO
5f10: 54 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  TE() function.  
5f20: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61  This function ta
5f30: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  kes a single.** 
5f40: 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20 74 68  argument.  If th
5f50: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 75  e argument is nu
5f60: 6d 65 72 69 63 2c 20 74 68 65 20 72 65 74 75 72  meric, the retur
5f70: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  n value is the s
5f80: 61 6d 65 20 61 73 0a 2a 2a 20 74 68 65 20 61 72  ame as.** the ar
5f90: 67 75 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20  gument.  If the 
5fa0: 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c  argument is NULL
5fb0: 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  , the return val
5fc0: 75 65 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  ue is the string
5fd0: 0a 2a 2a 20 22 4e 55 4c 4c 22 2e 20 20 4f 74 68  .** "NULL".  Oth
5fe0: 65 72 77 69 73 65 2c 20 74 68 65 20 61 72 67 75  erwise, the argu
5ff0: 6d 65 6e 74 20 69 73 20 65 6e 63 6c 6f 73 65 64  ment is enclosed
6000: 20 69 6e 20 73 69 6e 67 6c 65 20 71 75 6f 74 65   in single quote
6010: 73 20 77 69 74 68 0a 2a 2a 20 73 69 6e 67 6c 65  s with.** single
6020: 2d 71 75 6f 74 65 20 65 73 63 61 70 65 73 2e 0a  -quote escapes..
6030: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 71  */.static void q
6040: 75 6f 74 65 46 75 6e 63 28 73 71 6c 69 74 65 33  uoteFunc(sqlite3
6050: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6060: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
6070: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6080: 76 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 72  v){.  assert( ar
6090: 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45  gc==1 );.  UNUSE
60a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
60b0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c  );.  switch( sql
60c0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
60d0: 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20  argv[0]) ){.    
60e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
60f0: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 53 51  GER:.    case SQ
6100: 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
6110: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6120: 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74  lt_value(context
6130: 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  , argv[0]);.    
6140: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6150: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
6160: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  LOB: {.      cha
6170: 72 20 2a 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20  r *zText = 0;.  
6180: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
6190: 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  zBlob = sqlite3_
61a0: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
61b0: 30 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0]);.      int n
61c0: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
61d0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
61e0: 30 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0]);.      asser
61f0: 74 28 20 7a 42 6c 6f 62 3d 3d 73 71 6c 69 74 65  t( zBlob==sqlite
6200: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
6210: 76 5b 30 5d 29 20 29 3b 20 2f 2a 20 4e 6f 20 65  v[0]) ); /* No e
6220: 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a  ncoding change *
6230: 2f 0a 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20  /.      zText = 
6240: 28 63 68 61 72 20 2a 29 63 6f 6e 74 65 78 74 4d  (char *)contextM
6250: 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28  alloc(context, (
6260: 32 2a 28 69 36 34 29 6e 42 6c 6f 62 29 2b 34 29  2*(i64)nBlob)+4)
6270: 3b 20 0a 20 20 20 20 20 20 69 66 28 20 7a 54 65  ; .      if( zTe
6280: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  xt ){.        in
6290: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
62a0: 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69  (i=0; i<nBlob; i
62b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ++){.          z
62c0: 54 65 78 74 5b 28 69 2a 32 29 2b 32 5d 20 3d 20  Text[(i*2)+2] = 
62d0: 68 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f 62  hexdigits[(zBlob
62e0: 5b 69 5d 3e 3e 34 29 26 30 78 30 46 5d 3b 0a 20  [i]>>4)&0x0F];. 
62f0: 20 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28           zText[(
6300: 69 2a 32 29 2b 33 5d 20 3d 20 68 65 78 64 69 67  i*2)+3] = hexdig
6310: 69 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 29 26 30  its[(zBlob[i])&0
6320: 78 30 46 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  x0F];.        }.
6330: 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28 6e          zText[(n
6340: 42 6c 6f 62 2a 32 29 2b 32 5d 20 3d 20 27 5c 27  Blob*2)+2] = '\'
6350: 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74  ';.        zText
6360: 5b 28 6e 42 6c 6f 62 2a 32 29 2b 33 5d 20 3d 20  [(nBlob*2)+3] = 
6370: 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7a 54  '\0';.        zT
6380: 65 78 74 5b 30 5d 20 3d 20 27 58 27 3b 0a 20 20  ext[0] = 'X';.  
6390: 20 20 20 20 20 20 7a 54 65 78 74 5b 31 5d 20 3d        zText[1] =
63a0: 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 73   '\'';.        s
63b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
63c0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 54 65 78  xt(context, zTex
63d0: 74 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  t, -1, SQLITE_TR
63e0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
63f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
6400: 54 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Text);.      }. 
6410: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6420: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
6430: 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20  E_TEXT: {.      
6440: 69 6e 74 20 69 2c 6a 3b 0a 20 20 20 20 20 20 75  int i,j;.      u
6450: 36 34 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  64 n;.      cons
6460: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
6470: 2a 7a 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  *zArg = sqlite3_
6480: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6490: 30 5d 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  0]);.      char 
64a0: 2a 7a 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 7a  *z;..      if( z
64b0: 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Arg==0 ) return;
64c0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
64d0: 6e 3d 30 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b  n=0; zArg[i]; i+
64e0: 2b 29 7b 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d  +){ if( zArg[i]=
64f0: 3d 27 5c 27 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20  ='\'' ) n++; }. 
6500: 20 20 20 20 20 7a 20 3d 20 63 6f 6e 74 65 78 74       z = context
6510: 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20  Malloc(context, 
6520: 28 28 69 36 34 29 69 29 2b 28 28 69 36 34 29 6e  ((i64)i)+((i64)n
6530: 29 2b 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20  )+3);.      if( 
6540: 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 5b 30  z ){.        z[0
6550: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20  ] = '\'';.      
6560: 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 31 3b 20    for(i=0, j=1; 
6570: 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zArg[i]; i++){. 
6580: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
6590: 3d 20 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20  = zArg[i];.     
65a0: 20 20 20 20 20 69 66 28 20 7a 41 72 67 5b 69 5d       if( zArg[i]
65b0: 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20  =='\'' ){.      
65c0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
65d0: 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  \'';.          }
65e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
65f0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27     z[j++] = '\''
6600: 3b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d  ;.        z[j] =
6610: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
6620: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
6630: 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 6a 2c 20 73  context, z, j, s
6640: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
6650: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6660: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
6670: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
6680: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61  sert( sqlite3_va
6690: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
66a0: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
66b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
66c0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
66d0: 65 78 74 2c 20 22 4e 55 4c 4c 22 2c 20 34 2c 20  ext, "NULL", 4, 
66e0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
66f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6700: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
6710: 54 68 65 20 68 65 78 28 29 20 66 75 6e 63 74 69  The hex() functi
6720: 6f 6e 2e 20 20 49 6e 74 65 72 70 72 65 74 20 74  on.  Interpret t
6730: 68 65 20 61 72 67 75 6d 65 6e 74 20 61 73 20 61  he argument as a
6740: 20 62 6c 6f 62 2e 20 20 52 65 74 75 72 6e 0a 2a   blob.  Return.*
6750: 2a 20 61 20 68 65 78 61 64 65 63 69 6d 61 6c 20  * a hexadecimal 
6760: 72 65 6e 64 65 72 69 6e 67 20 61 73 20 74 65 78  rendering as tex
6770: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
6780: 64 20 68 65 78 46 75 6e 63 28 0a 20 20 73 71 6c  d hexFunc(.  sql
6790: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
67a0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
67b0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
67c0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
67d0: 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74  nt i, n;.  const
67e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
67f0: 70 42 6c 6f 62 3b 0a 20 20 63 68 61 72 20 2a 7a  pBlob;.  char *z
6800: 48 65 78 2c 20 2a 7a 3b 0a 20 20 61 73 73 65 72  Hex, *z;.  asser
6810: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
6820: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6830: 28 61 72 67 63 29 3b 0a 20 20 70 42 6c 6f 62 20  (argc);.  pBlob 
6840: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6850: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
6860: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
6870: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
6880: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 6c  );.  assert( pBl
6890: 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  ob==sqlite3_valu
68a0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20  e_blob(argv[0]) 
68b0: 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69  );  /* No encodi
68c0: 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a  ng change */.  z
68d0: 20 3d 20 7a 48 65 78 20 3d 20 63 6f 6e 74 65 78   = zHex = contex
68e0: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
68f0: 20 28 28 69 36 34 29 6e 29 2a 32 20 2b 20 31 29   ((i64)n)*2 + 1)
6900: 3b 0a 20 20 69 66 28 20 7a 48 65 78 20 29 7b 0a  ;.  if( zHex ){.
6910: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
6920: 3b 20 69 2b 2b 2c 20 70 42 6c 6f 62 2b 2b 29 7b  ; i++, pBlob++){
6930: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
6940: 63 68 61 72 20 63 20 3d 20 2a 70 42 6c 6f 62 3b  char c = *pBlob;
6950: 0a 20 20 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20  .      *(z++) = 
6960: 68 65 78 64 69 67 69 74 73 5b 28 63 3e 3e 34 29  hexdigits[(c>>4)
6970: 26 30 78 66 5d 3b 0a 20 20 20 20 20 20 2a 28 7a  &0xf];.      *(z
6980: 2b 2b 29 20 3d 20 68 65 78 64 69 67 69 74 73 5b  ++) = hexdigits[
6990: 63 26 30 78 66 5d 3b 0a 20 20 20 20 7d 0a 20 20  c&0xf];.    }.  
69a0: 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 73 71    *z = 0;.    sq
69b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
69c0: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 48 65 78 2c  t(context, zHex,
69d0: 20 6e 2a 32 2c 20 73 71 6c 69 74 65 33 5f 66 72   n*2, sqlite3_fr
69e0: 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ee);.  }.}../*.*
69f0: 2a 20 54 68 65 20 7a 65 72 6f 62 6c 6f 62 28 4e  * The zeroblob(N
6a00: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
6a10: 6e 73 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  ns a zero-filled
6a20: 20 62 6c 6f 62 20 6f 66 20 73 69 7a 65 20 4e 20   blob of size N 
6a30: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
6a40: 20 76 6f 69 64 20 7a 65 72 6f 62 6c 6f 62 46 75   void zeroblobFu
6a50: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
6a60: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
6a70: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
6a80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
6a90: 67 76 0a 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20  gv.){.  i64 n;. 
6aa0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
6ab0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
6ac0: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
6ad0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  );.  assert( arg
6ae0: 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==1 );.  UNUSED
6af0: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
6b00: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  n = sqlite3_
6b10: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
6b20: 5b 30 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  [0]);.  testcase
6b30: 28 20 6e 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( n==db->aLimit[
6b40: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
6b50: 47 54 48 5d 20 29 3b 0a 20 20 74 65 73 74 63 61  GTH] );.  testca
6b60: 73 65 28 20 6e 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( n==db->aLimi
6b70: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
6b80: 45 4e 47 54 48 5d 2b 31 20 29 3b 0a 20 20 69 66  ENGTH]+1 );.  if
6b90: 28 20 6e 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ( n>db->aLimit[S
6ba0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
6bb0: 54 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TH] ){.    sqlit
6bc0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
6bd0: 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b  toobig(context);
6be0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
6bf0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72  lite3_result_zer
6c00: 6f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28  oblob(context, (
6c10: 69 6e 74 29 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20  int)n); /* IMP: 
6c20: 52 2d 30 30 32 39 33 2d 36 34 39 39 34 20 2a 2f  R-00293-64994 */
6c30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
6c40: 65 20 72 65 70 6c 61 63 65 28 29 20 66 75 6e 63  e replace() func
6c50: 74 69 6f 6e 2e 20 20 54 68 72 65 65 20 61 72 67  tion.  Three arg
6c60: 75 6d 65 6e 74 73 20 61 72 65 20 61 6c 6c 20 73  uments are all s
6c70: 74 72 69 6e 67 73 3a 20 63 61 6c 6c 0a 2a 2a 20  trings: call.** 
6c80: 74 68 65 6d 20 41 2c 20 42 2c 20 61 6e 64 20 43  them A, B, and C
6c90: 2e 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  . The result is 
6ca0: 61 6c 73 6f 20 61 20 73 74 72 69 6e 67 20 77 68  also a string wh
6cb0: 69 63 68 20 69 73 20 64 65 72 69 76 65 64 0a 2a  ich is derived.*
6cc0: 2a 20 66 72 6f 6d 20 41 20 62 79 20 72 65 70 6c  * from A by repl
6cd0: 61 63 69 6e 67 20 65 76 65 72 79 20 6f 63 63 75  acing every occu
6ce0: 72 61 6e 63 65 20 6f 66 20 42 20 77 69 74 68 20  rance of B with 
6cf0: 43 2e 20 20 54 68 65 20 6d 61 74 63 68 0a 2a 2a  C.  The match.**
6d00: 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 2e 20   must be exact. 
6d10: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
6d20: 6e 63 65 73 20 61 72 65 20 6e 6f 74 20 75 73 65  nces are not use
6d30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6d40: 64 20 72 65 70 6c 61 63 65 46 75 6e 63 28 0a 20  d replaceFunc(. 
6d50: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6d60: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
6d70: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
6d80: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
6d90: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
6da0: 64 20 63 68 61 72 20 2a 7a 53 74 72 3b 20 20 20  d char *zStr;   
6db0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75       /* The inpu
6dc0: 74 20 73 74 72 69 6e 67 20 41 20 2a 2f 0a 20 20  t string A */.  
6dd0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
6de0: 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20  har *zPattern;  
6df0: 20 20 2f 2a 20 54 68 65 20 70 61 74 74 65 72 6e    /* The pattern
6e00: 20 73 74 72 69 6e 67 20 42 20 2a 2f 0a 20 20 63   string B */.  c
6e10: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
6e20: 61 72 20 2a 7a 52 65 70 3b 20 20 20 20 20 20 20  ar *zRep;       
6e30: 20 2f 2a 20 54 68 65 20 72 65 70 6c 61 63 65 6d   /* The replacem
6e40: 65 6e 74 20 73 74 72 69 6e 67 20 43 20 2a 2f 0a  ent string C */.
6e50: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6e60: 2a 7a 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20  *zOut;          
6e70: 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
6e80: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 72 3b  t */.  int nStr;
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 53 74 72 20  /* Size of zStr 
6eb0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72  */.  int nPatter
6ec0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
6ed0: 20 53 69 7a 65 20 6f 66 20 7a 50 61 74 74 65 72   Size of zPatter
6ee0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 70 3b  n */.  int nRep;
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f00: 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 52 65 70 20  /* Size of zRep 
6f10: 2a 2f 0a 20 20 69 36 34 20 6e 4f 75 74 3b 20 20  */.  i64 nOut;  
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6f30: 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   Maximum size of
6f40: 20 7a 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6c   zOut */.  int l
6f50: 6f 6f 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  oopLimit;       
6f60: 20 20 20 20 2f 2a 20 4c 61 73 74 20 7a 53 74 72      /* Last zStr
6f70: 5b 5d 20 74 68 61 74 20 6d 69 67 68 74 20 6d 61  [] that might ma
6f80: 74 63 68 20 7a 50 61 74 74 65 72 6e 5b 5d 20 2a  tch zPattern[] *
6f90: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6fb0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
6fc0: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ..  assert( argc
6fd0: 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==3 );.  UNUSED_
6fe0: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
6ff0: 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65  .  zStr = sqlite
7000: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
7010: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 53 74  v[0]);.  if( zSt
7020: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
7030: 20 6e 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f   nStr = sqlite3_
7040: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
7050: 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [0]);.  assert( 
7060: 7a 53 74 72 3d 3d 73 71 6c 69 74 65 33 5f 76 61  zStr==sqlite3_va
7070: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
7080: 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f  ) );  /* No enco
7090: 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20  ding change */. 
70a0: 20 7a 50 61 74 74 65 72 6e 20 3d 20 73 71 6c 69   zPattern = sqli
70b0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
70c0: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[1]);.  if( z
70d0: 50 61 74 74 65 72 6e 3d 3d 30 20 29 7b 0a 20 20  Pattern==0 ){.  
70e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
70f0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
7100: 76 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  v[1])==SQLITE_NU
7110: 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  LL.            |
7120: 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  | sqlite3_contex
7130: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
7140: 65 78 74 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ext)->mallocFail
7150: 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
7160: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50 61 74  ;.  }.  if( zPat
7170: 74 65 72 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  tern[0]==0 ){.  
7180: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7190: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
71a0: 76 5b 31 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55  v[1])!=SQLITE_NU
71b0: 4c 4c 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  LL );.    sqlite
71c0: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
71d0: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29  ontext, argv[0])
71e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
71f0: 7d 0a 20 20 6e 50 61 74 74 65 72 6e 20 3d 20 73  }.  nPattern = s
7200: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
7210: 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61  es(argv[1]);.  a
7220: 73 73 65 72 74 28 20 7a 50 61 74 74 65 72 6e 3d  ssert( zPattern=
7230: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
7240: 65 78 74 28 61 72 67 76 5b 31 5d 29 20 29 3b 20  ext(argv[1]) ); 
7250: 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20   /* No encoding 
7260: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 52 65 70  change */.  zRep
7270: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7280: 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a  _text(argv[2]);.
7290: 20 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29 20    if( zRep==0 ) 
72a0: 72 65 74 75 72 6e 3b 0a 20 20 6e 52 65 70 20 3d  return;.  nRep =
72b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
72c0: 79 74 65 73 28 61 72 67 76 5b 32 5d 29 3b 0a 20  ytes(argv[2]);. 
72d0: 20 61 73 73 65 72 74 28 20 7a 52 65 70 3d 3d 73   assert( zRep==s
72e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
72f0: 74 28 61 72 67 76 5b 32 5d 29 20 29 3b 0a 20 20  t(argv[2]) );.  
7300: 6e 4f 75 74 20 3d 20 6e 53 74 72 20 2b 20 31 3b  nOut = nStr + 1;
7310: 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3c  .  assert( nOut<
7320: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
7330: 48 20 29 3b 0a 20 20 7a 4f 75 74 20 3d 20 63 6f  H );.  zOut = co
7340: 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74  ntextMalloc(cont
7350: 65 78 74 2c 20 28 69 36 34 29 6e 4f 75 74 29 3b  ext, (i64)nOut);
7360: 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29  .  if( zOut==0 )
7370: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
7380: 7d 0a 20 20 6c 6f 6f 70 4c 69 6d 69 74 20 3d 20  }.  loopLimit = 
7390: 6e 53 74 72 20 2d 20 6e 50 61 74 74 65 72 6e 3b  nStr - nPattern;
73a0: 20 20 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20    .  for(i=j=0; 
73b0: 69 3c 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20 69 2b  i<=loopLimit; i+
73c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 74 72  +){.    if( zStr
73d0: 5b 69 5d 21 3d 7a 50 61 74 74 65 72 6e 5b 30 5d  [i]!=zPattern[0]
73e0: 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 7a 53 74 72   || memcmp(&zStr
73f0: 5b 69 5d 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e  [i], zPattern, n
7400: 50 61 74 74 65 72 6e 29 20 29 7b 0a 20 20 20 20  Pattern) ){.    
7410: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 53    zOut[j++] = zS
7420: 74 72 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  tr[i];.    }else
7430: 7b 0a 20 20 20 20 20 20 75 38 20 2a 7a 4f 6c 64  {.      u8 *zOld
7440: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  ;.      sqlite3 
7450: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
7460: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
7470: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
7480: 6e 4f 75 74 20 2b 3d 20 6e 52 65 70 20 2d 20 6e  nOut += nRep - n
7490: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 74  Pattern;.      t
74a0: 65 73 74 63 61 73 65 28 20 6e 4f 75 74 2d 31 3d  estcase( nOut-1=
74b0: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
74c0: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
74d0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
74e0: 73 65 28 20 6e 4f 75 74 2d 32 3d 3d 64 62 2d 3e  se( nOut-2==db->
74f0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7500: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20  MIT_LENGTH] );. 
7510: 20 20 20 20 20 69 66 28 20 6e 4f 75 74 2d 31 3e       if( nOut-1>
7520: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7530: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
7540: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7550: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
7560: 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b  toobig(context);
7570: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7580: 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
7590: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
75a0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4f 6c 64 20     }.      zOld 
75b0: 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 20 20 7a 4f  = zOut;.      zO
75c0: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ut = sqlite3_rea
75d0: 6c 6c 6f 63 28 7a 4f 75 74 2c 20 28 69 6e 74 29  lloc(zOut, (int)
75e0: 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  nOut);.      if(
75f0: 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   zOut==0 ){.    
7600: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7610: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
7620: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
7630: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
7640: 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ld);.        ret
7650: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
7660: 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b     memcpy(&zOut[
7670: 6a 5d 2c 20 7a 52 65 70 2c 20 6e 52 65 70 29 3b  j], zRep, nRep);
7680: 0a 20 20 20 20 20 20 6a 20 2b 3d 20 6e 52 65 70  .      j += nRep
7690: 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50 61  ;.      i += nPa
76a0: 74 74 65 72 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20  ttern-1;.    }. 
76b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 2b 6e   }.  assert( j+n
76c0: 53 74 72 2d 69 2b 31 3d 3d 6e 4f 75 74 20 29 3b  Str-i+1==nOut );
76d0: 0a 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b  .  memcpy(&zOut[
76e0: 6a 5d 2c 20 26 7a 53 74 72 5b 69 5d 2c 20 6e 53  j], &zStr[i], nS
76f0: 74 72 2d 69 29 3b 0a 20 20 6a 20 2b 3d 20 6e 53  tr-i);.  j += nS
7700: 74 72 20 2d 20 69 3b 0a 20 20 61 73 73 65 72 74  tr - i;.  assert
7710: 28 20 6a 3c 3d 6e 4f 75 74 20 29 3b 0a 20 20 7a  ( j<=nOut );.  z
7720: 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 73 71  Out[j] = 0;.  sq
7730: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
7740: 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  t(context, (char
7750: 2a 29 7a 4f 75 74 2c 20 6a 2c 20 73 71 6c 69 74  *)zOut, j, sqlit
7760: 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e3_free);.}../*.
7770: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
7780: 6e 20 6f 66 20 74 68 65 20 54 52 49 4d 28 29 2c  n of the TRIM(),
7790: 20 4c 54 52 49 4d 28 29 2c 20 61 6e 64 20 52 54   LTRIM(), and RT
77a0: 52 49 4d 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  RIM() functions.
77b0: 0a 2a 2a 20 54 68 65 20 75 73 65 72 64 61 74 61  .** The userdata
77c0: 20 69 73 20 30 78 31 20 66 6f 72 20 6c 65 66 74   is 0x1 for left
77d0: 20 74 72 69 6d 2c 20 30 78 32 20 66 6f 72 20 72   trim, 0x2 for r
77e0: 69 67 68 74 20 74 72 69 6d 2c 20 30 78 33 20 66  ight trim, 0x3 f
77f0: 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74  or both..*/.stat
7800: 69 63 20 76 6f 69 64 20 74 72 69 6d 46 75 6e 63  ic void trimFunc
7810: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
7820: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
7830: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
7840: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
7850: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
7860: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 20  gned char *zIn; 
7870: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
7880: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e   string */.  con
7890: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
78a0: 20 2a 7a 43 68 61 72 53 65 74 3b 20 20 20 20 2f   *zCharSet;    /
78b0: 2a 20 53 65 74 20 6f 66 20 63 68 61 72 61 63 74  * Set of charact
78c0: 65 72 73 20 74 6f 20 74 72 69 6d 20 2a 2f 0a 20  ers to trim */. 
78d0: 20 69 6e 74 20 6e 49 6e 3b 20 20 20 20 20 20 20   int nIn;       
78e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7900: 62 79 74 65 73 20 69 6e 20 69 6e 70 75 74 20 2a  bytes in input *
7910: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7930: 20 20 20 20 20 20 2f 2a 20 31 3a 20 74 72 69 6d        /* 1: trim
7940: 6c 65 66 74 20 20 32 3a 20 74 72 69 6d 72 69 67  left  2: trimrig
7950: 68 74 20 20 33 3a 20 74 72 69 6d 20 2a 2f 0a 20  ht  3: trim */. 
7960: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7980: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
7990: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
79a0: 20 63 68 61 72 20 2a 61 4c 65 6e 20 3d 20 30 3b   char *aLen = 0;
79b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
79c0: 67 74 68 20 6f 66 20 65 61 63 68 20 63 68 61 72  gth of each char
79d0: 61 63 74 65 72 20 69 6e 20 7a 43 68 61 72 53 65  acter in zCharSe
79e0: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
79f0: 63 68 61 72 20 2a 2a 61 7a 43 68 61 72 20 3d 20  char **azChar = 
7a00: 30 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69  0;       /* Indi
7a10: 76 69 64 75 61 6c 20 63 68 61 72 61 63 74 65 72  vidual character
7a20: 73 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f  s in zCharSet */
7a30: 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 20 20 20  .  int nChar;   
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7a60: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
7a70: 7a 43 68 61 72 53 65 74 20 2a 2f 0a 0a 20 20 69  zCharSet */..  i
7a80: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
7a90: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
7aa0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
7ab0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7ac0: 20 7a 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76   zIn = sqlite3_v
7ad0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
7ae0: 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30  ]);.  if( zIn==0
7af0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 49 6e   ) return;.  nIn
7b00: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7b10: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
7b20: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 3d 3d  .  assert( zIn==
7b30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
7b40: 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a 20  xt(argv[0]) );. 
7b50: 20 69 66 28 20 61 72 67 63 3d 3d 31 20 29 7b 0a   if( argc==1 ){.
7b60: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7b70: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
7b80: 65 6e 4f 6e 65 5b 5d 20 3d 20 7b 20 31 20 7d 3b  enOne[] = { 1 };
7b90: 0a 20 20 20 20 73 74 61 74 69 63 20 75 6e 73 69  .    static unsi
7ba0: 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73  gned char * cons
7bb0: 74 20 61 7a 4f 6e 65 5b 5d 20 3d 20 7b 20 28 75  t azOne[] = { (u
7bc0: 38 2a 29 22 20 22 20 7d 3b 0a 20 20 20 20 6e 43  8*)" " };.    nC
7bd0: 68 61 72 20 3d 20 31 3b 0a 20 20 20 20 61 4c 65  har = 1;.    aLe
7be0: 6e 20 3d 20 28 75 38 2a 29 6c 65 6e 4f 6e 65 3b  n = (u8*)lenOne;
7bf0: 0a 20 20 20 20 61 7a 43 68 61 72 20 3d 20 28 75  .    azChar = (u
7c00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 29  nsigned char **)
7c10: 61 7a 4f 6e 65 3b 0a 20 20 20 20 7a 43 68 61 72  azOne;.    zChar
7c20: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Set = 0;.  }else
7c30: 20 69 66 28 20 28 7a 43 68 61 72 53 65 74 20 3d   if( (zCharSet =
7c40: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
7c50: 65 78 74 28 61 72 67 76 5b 31 5d 29 29 3d 3d 30  ext(argv[1]))==0
7c60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
7c70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
7c80: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
7c90: 20 2a 7a 3b 0a 20 20 20 20 66 6f 72 28 7a 3d 7a   *z;.    for(z=z
7ca0: 43 68 61 72 53 65 74 2c 20 6e 43 68 61 72 3d 30  CharSet, nChar=0
7cb0: 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a  ; *z; nChar++){.
7cc0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
7cd0: 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 7d  P_UTF8(z);.    }
7ce0: 0a 20 20 20 20 69 66 28 20 6e 43 68 61 72 3e 30  .    if( nChar>0
7cf0: 20 29 7b 0a 20 20 20 20 20 20 61 7a 43 68 61 72   ){.      azChar
7d00: 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   = contextMalloc
7d10: 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29  (context, ((i64)
7d20: 6e 43 68 61 72 29 2a 28 73 69 7a 65 6f 66 28 63  nChar)*(sizeof(c
7d30: 68 61 72 2a 29 2b 31 29 29 3b 0a 20 20 20 20 20  har*)+1));.     
7d40: 20 69 66 28 20 61 7a 43 68 61 72 3d 3d 30 20 29   if( azChar==0 )
7d50: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7d60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7d70: 61 4c 65 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64  aLen = (unsigned
7d80: 20 63 68 61 72 2a 29 26 61 7a 43 68 61 72 5b 6e   char*)&azChar[n
7d90: 43 68 61 72 5d 3b 0a 20 20 20 20 20 20 66 6f 72  Char];.      for
7da0: 28 7a 3d 7a 43 68 61 72 53 65 74 2c 20 6e 43 68  (z=zCharSet, nCh
7db0: 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68 61 72 2b  ar=0; *z; nChar+
7dc0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 68  +){.        azCh
7dd0: 61 72 5b 6e 43 68 61 72 5d 20 3d 20 28 75 6e 73  ar[nChar] = (uns
7de0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 3b 0a  igned char *)z;.
7df0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
7e00: 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20  KIP_UTF8(z);.   
7e10: 20 20 20 20 20 61 4c 65 6e 5b 6e 43 68 61 72 5d       aLen[nChar]
7e20: 20 3d 20 28 75 38 29 28 7a 20 2d 20 61 7a 43 68   = (u8)(z - azCh
7e30: 61 72 5b 6e 43 68 61 72 5d 29 3b 0a 20 20 20 20  ar[nChar]);.    
7e40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7e50: 69 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20  if( nChar>0 ){. 
7e60: 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54     flags = SQLIT
7e70: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 73 71 6c  E_PTR_TO_INT(sql
7e80: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
7e90: 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 69 66  ontext));.    if
7ea0: 28 20 66 6c 61 67 73 20 26 20 31 20 29 7b 0a 20  ( flags & 1 ){. 
7eb0: 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e       while( nIn>
7ec0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
7ed0: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20   len = 0;.      
7ee0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68    for(i=0; i<nCh
7ef0: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
7f00: 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b 69      len = aLen[i
7f10: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
7f20: 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d 65 6d   len<=nIn && mem
7f30: 63 6d 70 28 7a 49 6e 2c 20 61 7a 43 68 61 72 5b  cmp(zIn, azChar[
7f40: 69 5d 2c 20 6c 65 6e 29 3d 3d 30 20 29 20 62 72  i], len)==0 ) br
7f50: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
7f60: 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43         if( i>=nC
7f70: 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  har ) break;.   
7f80: 20 20 20 20 20 7a 49 6e 20 2b 3d 20 6c 65 6e 3b       zIn += len;
7f90: 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 2d 3d 20  .        nIn -= 
7fa0: 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
7fb0: 20 7d 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73   }.    if( flags
7fc0: 20 26 20 32 20 29 7b 0a 20 20 20 20 20 20 77 68   & 2 ){.      wh
7fd0: 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20  ile( nIn>0 ){.  
7fe0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
7ff0: 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
8000: 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
8010: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
8020: 20 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20   = aLen[i];.    
8030: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e        if( len<=n
8040: 49 6e 20 26 26 20 6d 65 6d 63 6d 70 28 26 7a 49  In && memcmp(&zI
8050: 6e 5b 6e 49 6e 2d 6c 65 6e 5d 2c 61 7a 43 68 61  n[nIn-len],azCha
8060: 72 5b 69 5d 2c 6c 65 6e 29 3d 3d 30 20 29 20 62  r[i],len)==0 ) b
8070: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
8080: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e          if( i>=n
8090: 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  Char ) break;.  
80a0: 20 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e        nIn -= len
80b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
80c0: 20 20 20 20 69 66 28 20 7a 43 68 61 72 53 65 74      if( zCharSet
80d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
80e0: 33 5f 66 72 65 65 28 61 7a 43 68 61 72 29 3b 0a  3_free(azChar);.
80f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
8100: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
8110: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
8120: 7a 49 6e 2c 20 6e 49 6e 2c 20 53 51 4c 49 54 45  zIn, nIn, SQLITE
8130: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a  _TRANSIENT);.}..
8140: 0a 2f 2a 20 49 4d 50 3a 20 52 2d 32 35 33 36 31  ./* IMP: R-25361
8150: 2d 31 36 31 35 30 20 54 68 69 73 20 66 75 6e 63  -16150 This func
8160: 74 69 6f 6e 20 69 73 20 6f 6d 69 74 74 65 64 20  tion is omitted 
8170: 66 72 6f 6d 20 53 51 4c 69 74 65 20 62 79 20 64  from SQLite by d
8180: 65 66 61 75 6c 74 2e 20 49 74 0a 2a 2a 20 69 73  efault. It.** is
8190: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
81a0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 4f  if the SQLITE_SO
81b0: 55 4e 44 45 58 20 63 6f 6d 70 69 6c 65 2d 74 69  UNDEX compile-ti
81c0: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  me option is use
81d0: 64 0a 2a 2a 20 77 68 65 6e 20 53 51 4c 69 74 65  d.** when SQLite
81e0: 20 69 73 20 62 75 69 6c 74 2e 0a 2a 2f 0a 23 69   is built..*/.#i
81f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55 4e  fdef SQLITE_SOUN
8200: 44 45 58 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  DEX./*.** Comput
8210: 65 20 74 68 65 20 73 6f 75 6e 64 65 78 20 65 6e  e the soundex en
8220: 63 6f 64 69 6e 67 20 6f 66 20 61 20 77 6f 72 64  coding of a word
8230: 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 3a 20 52 2d 35  ..**.** IMP: R-5
8240: 39 37 38 32 2d 30 30 30 37 32 20 54 68 65 20 73  9782-00072 The s
8250: 6f 75 6e 64 65 78 28 58 29 20 66 75 6e 63 74 69  oundex(X) functi
8260: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74 72  on returns a str
8270: 69 6e 67 20 74 68 61 74 20 69 73 20 74 68 65 0a  ing that is the.
8280: 2a 2a 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64  ** soundex encod
8290: 69 6e 67 20 6f 66 20 74 68 65 20 73 74 72 69 6e  ing of the strin
82a0: 67 20 58 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  g X. .*/.static 
82b0: 76 6f 69 64 20 73 6f 75 6e 64 65 78 46 75 6e 63  void soundexFunc
82c0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
82d0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
82e0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
82f0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8300: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 52 65 73 75  .){.  char zResu
8310: 6c 74 5b 38 5d 3b 0a 20 20 63 6f 6e 73 74 20 75  lt[8];.  const u
8320: 38 20 2a 7a 49 6e 3b 0a 20 20 69 6e 74 20 69 2c  8 *zIn;.  int i,
8330: 20 6a 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   j;.  static con
8340: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
8350: 20 69 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20   iCode[] = {.   
8360: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8370: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8380: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8390: 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
83a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
83b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
83c0: 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30  , 0,.    0, 0, 0
83d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
83e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
83f0: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20  0, 0, 0,.    0, 
8400: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8410: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8420: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
8430: 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20   0, 0, 1, 2, 3, 
8440: 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32  0, 1, 2, 0, 0, 2
8450: 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c  , 2, 4, 5, 5, 0,
8460: 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c  .    1, 2, 6, 2,
8470: 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20   3, 0, 1, 0, 2, 
8480: 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 2, 0, 0, 0, 0
8490: 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31  , 0,.    0, 0, 1
84a0: 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c  , 2, 3, 0, 1, 2,
84b0: 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20   0, 0, 2, 2, 4, 
84c0: 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20  5, 5, 0,.    1, 
84d0: 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31  2, 6, 2, 3, 0, 1
84e0: 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c  , 0, 2, 0, 2, 0,
84f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 7d   0, 0, 0, 0,.  }
8500: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
8510: 3d 3d 31 20 29 3b 0a 20 20 7a 49 6e 20 3d 20 28  ==1 );.  zIn = (
8520: 75 38 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  u8*)sqlite3_valu
8530: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
8540: 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20  .  if( zIn==0 ) 
8550: 7a 49 6e 20 3d 20 28 75 38 2a 29 22 22 3b 0a 20  zIn = (u8*)"";. 
8560: 20 66 6f 72 28 69 3d 30 3b 20 7a 49 6e 5b 69 5d   for(i=0; zIn[i]
8570: 20 26 26 20 21 73 71 6c 69 74 65 33 49 73 61 6c   && !sqlite3Isal
8580: 70 68 61 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b  pha(zIn[i]); i++
8590: 29 7b 7d 0a 20 20 69 66 28 20 7a 49 6e 5b 69 5d  ){}.  if( zIn[i]
85a0: 20 29 7b 0a 20 20 20 20 75 38 20 70 72 65 76 63   ){.    u8 prevc
85b0: 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b  ode = iCode[zIn[
85c0: 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 7a 52  i]&0x7f];.    zR
85d0: 65 73 75 6c 74 5b 30 5d 20 3d 20 73 71 6c 69 74  esult[0] = sqlit
85e0: 65 33 54 6f 75 70 70 65 72 28 7a 49 6e 5b 69 5d  e3Toupper(zIn[i]
85f0: 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  );.    for(j=1; 
8600: 6a 3c 34 20 26 26 20 7a 49 6e 5b 69 5d 3b 20 69  j<4 && zIn[i]; i
8610: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  ++){.      int c
8620: 6f 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b  ode = iCode[zIn[
8630: 69 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 20 20  i]&0x7f];.      
8640: 69 66 28 20 63 6f 64 65 3e 30 20 29 7b 0a 20 20  if( code>0 ){.  
8650: 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 21 3d        if( code!=
8660: 70 72 65 76 63 6f 64 65 20 29 7b 0a 20 20 20 20  prevcode ){.    
8670: 20 20 20 20 20 20 70 72 65 76 63 6f 64 65 20 3d        prevcode =
8680: 20 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20   code;.         
8690: 20 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20   zResult[j++] = 
86a0: 63 6f 64 65 20 2b 20 27 30 27 3b 0a 20 20 20 20  code + '0';.    
86b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
86c0: 65 7b 0a 20 20 20 20 20 20 20 20 70 72 65 76 63  e{.        prevc
86d0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ode = 0;.      }
86e0: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
86f0: 28 20 6a 3c 34 20 29 7b 0a 20 20 20 20 20 20 7a  ( j<4 ){.      z
8700: 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 27 30  Result[j++] = '0
8710: 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65  ';.    }.    zRe
8720: 73 75 6c 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  sult[j] = 0;.   
8730: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8740: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52  text(context, zR
8750: 65 73 75 6c 74 2c 20 34 2c 20 53 51 4c 49 54 45  esult, 4, SQLITE
8760: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
8770: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 4d 50  else{.    /* IMP
8780: 3a 20 52 2d 36 34 38 39 34 2d 35 30 33 32 31 20  : R-64894-50321 
8790: 54 68 65 20 73 74 72 69 6e 67 20 22 3f 30 30 30  The string "?000
87a0: 22 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  " is returned if
87b0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 20 20   the argument.  
87c0: 20 20 2a 2a 20 69 73 20 4e 55 4c 4c 20 6f 72 20    ** is NULL or 
87d0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 41 53 43 49  contains no ASCI
87e0: 49 20 61 6c 70 68 61 62 65 74 69 63 20 63 68 61  I alphabetic cha
87f0: 72 61 63 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20  racters. */.    
8800: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
8810: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 3f 30  ext(context, "?0
8820: 30 30 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53  00", 4, SQLITE_S
8830: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
8840: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 53  ndif /* SQLITE_S
8850: 4f 55 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64  OUNDEX */..#ifnd
8860: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
8870: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
8880: 0a 2a 2a 20 41 20 66 75 6e 63 74 69 6f 6e 20 74  .** A function t
8890: 68 61 74 20 6c 6f 61 64 73 20 61 20 73 68 61 72  hat loads a shar
88a0: 65 64 2d 6c 69 62 72 61 72 79 20 65 78 74 65 6e  ed-library exten
88b0: 73 69 6f 6e 20 74 68 65 6e 20 72 65 74 75 72 6e  sion then return
88c0: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  s NULL..*/.stati
88d0: 63 20 76 6f 69 64 20 6c 6f 61 64 45 78 74 28 73  c void loadExt(s
88e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
88f0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
8900: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
8910: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73   **argv){.  cons
8920: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20  t char *zFile = 
8930: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
8940: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
8950: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e  (argv[0]);.  con
8960: 73 74 20 63 68 61 72 20 2a 7a 50 72 6f 63 3b 0a  st char *zProc;.
8970: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8980: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
8990: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
89a0: 74 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  t);.  char *zErr
89b0: 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Msg = 0;..  if( 
89c0: 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  argc==2 ){.    z
89d0: 50 72 6f 63 20 3d 20 28 63 6f 6e 73 74 20 63 68  Proc = (const ch
89e0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
89f0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
8a00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
8a10: 50 72 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Proc = 0;.  }.  
8a20: 69 66 28 20 7a 46 69 6c 65 20 26 26 20 73 71 6c  if( zFile && sql
8a30: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
8a40: 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a  ion(db, zFile, z
8a50: 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 20  Proc, &zErrMsg) 
8a60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
8a70: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
8a80: 65 78 74 2c 20 7a 45 72 72 4d 73 67 2c 20 2d 31  ext, zErrMsg, -1
8a90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
8aa0: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
8ab0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
8ac0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
8ad0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8ae0: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
8af0: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61  the context of a
8b00: 0a 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67  .** sum() or avg
8b10: 28 29 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d  () aggregate com
8b20: 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  putation..*/.typ
8b30: 65 64 65 66 20 73 74 72 75 63 74 20 53 75 6d 43  edef struct SumC
8b40: 74 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63  tx SumCtx;.struc
8b50: 74 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75  t SumCtx {.  dou
8b60: 62 6c 65 20 72 53 75 6d 3b 20 20 20 20 20 20 2f  ble rSum;      /
8b70: 2a 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * Floating point
8b80: 20 73 75 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53   sum */.  i64 iS
8b90: 75 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  um;         /* I
8ba0: 6e 74 65 67 65 72 20 73 75 6d 20 2a 2f 20 20 20  nteger sum */   
8bb0: 0a 20 20 69 36 34 20 63 6e 74 3b 20 20 20 20 20  .  i64 cnt;     
8bc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8bd0: 66 20 65 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65  f elements summe
8be0: 64 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c  d */.  u8 overfl
8bf0: 6f 77 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ow;      /* True
8c00: 20 69 66 20 69 6e 74 65 67 65 72 20 6f 76 65 72   if integer over
8c10: 66 6c 6f 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75  flow seen */.  u
8c20: 38 20 61 70 70 72 6f 78 3b 20 20 20 20 20 20 20  8 approx;       
8c30: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d   /* True if non-
8c40: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77 61  integer value wa
8c50: 73 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 73  s input to the s
8c60: 75 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  um */.};../*.** 
8c70: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f  Routines used to
8c80: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 73 75 6d   compute the sum
8c90: 2c 20 61 76 65 72 61 67 65 2c 20 61 6e 64 20 74  , average, and t
8ca0: 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  otal..**.** The 
8cb0: 53 55 4d 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  SUM() function f
8cc0: 6f 6c 6c 6f 77 73 20 74 68 65 20 28 62 72 6f 6b  ollows the (brok
8cd0: 65 6e 29 20 53 51 4c 20 73 74 61 6e 64 61 72 64  en) SQL standard
8ce0: 20 77 68 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20   which means.** 
8cf0: 74 68 61 74 20 69 74 20 72 65 74 75 72 6e 73 20  that it returns 
8d00: 4e 55 4c 4c 20 69 66 20 69 74 20 73 75 6d 73 20  NULL if it sums 
8d10: 6f 76 65 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20  over no inputs. 
8d20: 20 54 4f 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a   TOTAL returns.*
8d30: 2a 20 30 2e 30 20 69 6e 20 74 68 61 74 20 63 61  * 0.0 in that ca
8d40: 73 65 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  se.  In addition
8d50: 2c 20 54 4f 54 41 4c 20 61 6c 77 61 79 73 20 72  , TOTAL always r
8d60: 65 74 75 72 6e 73 20 61 20 66 6c 6f 61 74 20 77  eturns a float w
8d70: 68 65 72 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68  here.** SUM migh
8d80: 74 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  t return an inte
8d90: 67 65 72 20 69 66 20 69 74 20 6e 65 76 65 72 20  ger if it never 
8da0: 65 6e 63 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f  encounters a flo
8db0: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
8dc0: 61 6c 75 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76  alue.  TOTAL nev
8dd0: 65 72 20 66 61 69 6c 73 2c 20 62 75 74 20 53 55  er fails, but SU
8de0: 4d 20 6d 69 67 68 74 20 74 68 72 6f 75 67 68 20  M might through 
8df0: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 0a  an exception if.
8e00: 2a 2a 20 69 74 20 6f 76 65 72 66 6c 6f 77 73 20  ** it overflows 
8e10: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  an integer..*/.s
8e20: 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 53 74  tatic void sumSt
8e30: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
8e40: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
8e50: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
8e60: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
8e70: 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74  SumCtx *p;.  int
8e80: 20 74 79 70 65 3b 0a 20 20 61 73 73 65 72 74 28   type;.  assert(
8e90: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
8ea0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
8eb0: 72 67 63 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  rgc);.  p = sqli
8ec0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
8ed0: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
8ee0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79  izeof(*p));.  ty
8ef0: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
8f00: 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28  ue_numeric_type(
8f10: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
8f20: 70 20 26 26 20 74 79 70 65 21 3d 53 51 4c 49 54  p && type!=SQLIT
8f30: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d  E_NULL ){.    p-
8f40: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20  >cnt++;.    if( 
8f50: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  type==SQLITE_INT
8f60: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 69 36  EGER ){.      i6
8f70: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  4 v = sqlite3_va
8f80: 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
8f90: 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75  ]);.      p->rSu
8fa0: 6d 20 2b 3d 20 76 3b 0a 20 20 20 20 20 20 69 66  m += v;.      if
8fb0: 28 20 28 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e  ( (p->approx|p->
8fc0: 6f 76 65 72 66 6c 6f 77 29 3d 3d 30 20 26 26 20  overflow)==0 && 
8fd0: 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36 34 28  sqlite3AddInt64(
8fe0: 26 70 2d 3e 69 53 75 6d 2c 20 76 29 20 29 7b 0a  &p->iSum, v) ){.
8ff0: 20 20 20 20 20 20 20 20 70 2d 3e 6f 76 65 72 66          p->overf
9000: 6c 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  low = 1;.      }
9010: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9020: 20 20 70 2d 3e 72 53 75 6d 20 2b 3d 20 73 71 6c    p->rSum += sql
9030: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
9040: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  e(argv[0]);.    
9050: 20 20 70 2d 3e 61 70 70 72 6f 78 20 3d 20 31 3b    p->approx = 1;
9060: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
9070: 74 69 63 20 76 6f 69 64 20 73 75 6d 46 69 6e 61  tic void sumFina
9080: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
9090: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
90a0: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70    SumCtx *p;.  p
90b0: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
90c0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
90d0: 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  text, 0);.  if( 
90e0: 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b  p && p->cnt>0 ){
90f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 76 65 72  .    if( p->over
9100: 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 73 71  flow ){.      sq
9110: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
9120: 6f 72 28 63 6f 6e 74 65 78 74 2c 22 69 6e 74 65  or(context,"inte
9130: 67 65 72 20 6f 76 65 72 66 6c 6f 77 22 2c 2d 31  ger overflow",-1
9140: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
9150: 20 70 2d 3e 61 70 70 72 6f 78 20 29 7b 0a 20 20   p->approx ){.  
9160: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9170: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
9180: 74 2c 20 70 2d 3e 72 53 75 6d 29 3b 0a 20 20 20  t, p->rSum);.   
9190: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
91a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
91b0: 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 69  64(context, p->i
91c0: 53 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sum);.    }.  }.
91d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 76  }.static void av
91e0: 67 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  gFinalize(sqlite
91f0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
9200: 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70  xt){.  SumCtx *p
9210: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
9220: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
9230: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
9240: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74   if( p && p->cnt
9250: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
9260: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
9270: 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53 75 6d  context, p->rSum
9280: 2f 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e 74 29  /(double)p->cnt)
9290: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
92a0: 6f 69 64 20 74 6f 74 61 6c 46 69 6e 61 6c 69 7a  oid totalFinaliz
92b0: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
92c0: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  t *context){.  S
92d0: 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  umCtx *p;.  p = 
92e0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
92f0: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
9300: 74 2c 20 30 29 3b 0a 20 20 2f 2a 20 28 64 6f 75  t, 0);.  /* (dou
9310: 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66  ble)0 In case of
9320: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
9330: 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
9340: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  /.  sqlite3_resu
9350: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
9360: 74 2c 20 70 20 3f 20 70 2d 3e 72 53 75 6d 20 3a  t, p ? p->rSum :
9370: 20 28 64 6f 75 62 6c 65 29 30 29 3b 0a 7d 0a 0a   (double)0);.}..
9380: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
9390: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
93a0: 65 70 73 20 74 72 61 63 6b 20 6f 66 20 73 74 61  eps track of sta
93b0: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  te information f
93c0: 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75 6e 74 28  or the.** count(
93d0: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
93e0: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
93f0: 20 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78   struct CountCtx
9400: 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63   CountCtx;.struc
9410: 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69  t CountCtx {.  i
9420: 36 34 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  64 n;.};../*.** 
9430: 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c  Routines to impl
9440: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 28  ement the count(
9450: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
9460: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9470: 76 6f 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73  void countStep(s
9480: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9490: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
94a0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
94b0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e   **argv){.  Coun
94c0: 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  tCtx *p;.  p = s
94d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
94e0: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
94f0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
9500: 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c   if( (argc==0 ||
9510: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
9520: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
9530: 28 61 72 67 76 5b 30 5d 29 29 20 26 26 20 70 20  (argv[0])) && p 
9540: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
9550: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
9560: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
9570: 45 44 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69  ED.  /* The sqli
9580: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
9590: 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  unt() function i
95a0: 73 20 64 65 70 72 65 63 61 74 65 64 2e 20 20 42  s deprecated.  B
95b0: 75 74 20 6a 75 73 74 20 74 6f 20 6d 61 6b 65 0a  ut just to make.
95c0: 20 20 2a 2a 20 73 75 72 65 20 69 74 20 73 74 69    ** sure it sti
95d0: 6c 6c 20 6f 70 65 72 61 74 65 73 20 63 6f 72 72  ll operates corr
95e0: 65 63 74 6c 79 2c 20 76 65 72 69 66 79 20 74 68  ectly, verify th
95f0: 61 74 20 69 74 73 20 63 6f 75 6e 74 20 61 67 72  at its count agr
9600: 65 65 73 20 77 69 74 68 20 6f 75 72 20 0a 20 20  ees with our .  
9610: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 63 6f 75 6e  ** internal coun
9620: 74 20 77 68 65 6e 20 75 73 69 6e 67 20 63 6f 75  t when using cou
9630: 6e 74 28 2a 29 20 61 6e 64 20 77 68 65 6e 20 74  nt(*) and when t
9640: 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 63  he total count c
9650: 61 6e 20 62 65 0a 20 20 2a 2a 20 65 78 70 72 65  an be.  ** expre
9660: 73 73 65 64 20 61 73 20 61 20 33 32 2d 62 69 74  ssed as a 32-bit
9670: 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 61   integer. */.  a
9680: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c  ssert( argc==1 |
9690: 7c 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 3e 30  | p==0 || p->n>0
96a0: 78 37 66 66 66 66 66 66 66 0a 20 20 20 20 20 20  x7fffffff.      
96b0: 20 20 20 20 7c 7c 20 70 2d 3e 6e 3d 3d 73 71 6c      || p->n==sql
96c0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
96d0: 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 20 29 3b  ount(context) );
96e0: 0a 23 65 6e 64 69 66 0a 7d 20 20 20 0a 73 74 61  .#endif.}   .sta
96f0: 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 46 69  tic void countFi
9700: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
9710: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
9720: 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b  {.  CountCtx *p;
9730: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
9740: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
9750: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
9760: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
9770: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 20  nt64(context, p 
9780: 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a  ? p->n : 0);.}..
9790: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74  /*.** Routines t
97a0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e 28  o implement min(
97b0: 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67 72  ) and max() aggr
97c0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
97d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
97e0: 6d 69 6e 6d 61 78 53 74 65 70 28 0a 20 20 73 71  minmaxStep(.  sq
97f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
9800: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 4e  ontext, .  int N
9810: 6f 74 55 73 65 64 2c 20 0a 20 20 73 71 6c 69 74  otUsed, .  sqlit
9820: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
9830: 29 7b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 20 20  ){.  Mem *pArg  
9840: 3d 20 28 4d 65 6d 20 2a 29 61 72 67 76 5b 30 5d  = (Mem *)argv[0]
9850: 3b 0a 20 20 4d 65 6d 20 2a 70 42 65 73 74 3b 0a  ;.  Mem *pBest;.
9860: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
9870: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 0a 20 20  ER(NotUsed);..  
9880: 70 42 65 73 74 20 3d 20 28 4d 65 6d 20 2a 29 73  pBest = (Mem *)s
9890: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
98a0: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
98b0: 2c 20 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29  , sizeof(*pBest)
98c0: 29 3b 0a 20 20 69 66 28 20 21 70 42 65 73 74 20  );.  if( !pBest 
98d0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
98e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
98f0: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
9900: 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
9910: 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67   if( pBest->flag
9920: 73 20 29 20 73 71 6c 69 74 65 33 53 6b 69 70 41  s ) sqlite3SkipA
9930: 63 63 75 6d 75 6c 61 74 6f 72 4c 6f 61 64 28 63  ccumulatorLoad(c
9940: 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65  ontext);.  }else
9950: 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67   if( pBest->flag
9960: 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78  s ){.    int max
9970: 3b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20  ;.    int cmp;. 
9980: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
9990: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75  l = sqlite3GetFu
99a0: 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78  ncCollSeq(contex
99b0: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  t);.    /* This 
99c0: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73  step function is
99d0: 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
99e0: 68 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78  he min() and max
99f0: 28 29 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20  () aggregates,. 
9a00: 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64     ** the only d
9a10: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
9a20: 6e 20 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20  n the two being 
9a30: 74 68 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f  that the sense o
9a40: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  f the.    ** com
9a50: 70 61 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72  parison is inver
9a60: 74 65 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78  ted. For the max
9a70: 28 29 20 61 67 67 72 65 67 61 74 65 2c 20 74 68  () aggregate, th
9a80: 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
9a90: 5f 75 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e  _user_data() fun
9aa0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76  ction returns (v
9ab0: 6f 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69  oid *)-1. For mi
9ac0: 6e 28 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65  n() it.    ** re
9ad0: 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62  turns (void *)db
9ae0: 2c 20 77 68 65 72 65 20 64 62 20 69 73 20 74 68  , where db is th
9af0: 65 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62  e sqlite3* datab
9b00: 61 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20  ase pointer..   
9b10: 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68   ** Therefore th
9b20: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
9b30: 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 27   sets variable '
9b40: 6d 61 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68  max' to 1 for th
9b50: 65 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61  e max().    ** a
9b60: 67 67 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66  ggregate, or 0 f
9b70: 6f 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  or min()..    */
9b80: 0a 20 20 20 20 6d 61 78 20 3d 20 73 71 6c 69 74  .    max = sqlit
9b90: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
9ba0: 74 65 78 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d  text)!=0;.    cm
9bb0: 70 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  p = sqlite3MemCo
9bc0: 6d 70 61 72 65 28 70 42 65 73 74 2c 20 70 41 72  mpare(pBest, pAr
9bd0: 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  g, pColl);.    i
9be0: 66 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30  f( (max && cmp<0
9bf0: 29 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d  ) || (!max && cm
9c00: 70 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  p>0) ){.      sq
9c10: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
9c20: 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20  (pBest, pArg);. 
9c30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9c40: 73 71 6c 69 74 65 33 53 6b 69 70 41 63 63 75 6d  sqlite3SkipAccum
9c50: 75 6c 61 74 6f 72 4c 6f 61 64 28 63 6f 6e 74 65  ulatorLoad(conte
9c60: 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  xt);.    }.  }el
9c70: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
9c80: 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74  dbeMemCopy(pBest
9c90: 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 73  , pArg);.  }.}.s
9ca0: 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61  tatic void minMa
9cb0: 78 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  xFinalize(sqlite
9cc0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
9cd0: 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  xt){.  sqlite3_v
9ce0: 61 6c 75 65 20 2a 70 52 65 73 3b 0a 20 20 70 52  alue *pRes;.  pR
9cf0: 65 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 61  es = (sqlite3_va
9d00: 6c 75 65 20 2a 29 73 71 6c 69 74 65 33 5f 61 67  lue *)sqlite3_ag
9d10: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
9d20: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
9d30: 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 69  f( pRes ){.    i
9d40: 66 28 20 70 52 65 73 2d 3e 66 6c 61 67 73 20 29  f( pRes->flags )
9d50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9d60: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
9d70: 74 65 78 74 2c 20 70 52 65 73 29 3b 0a 20 20 20  text, pRes);.   
9d80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
9d90: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 65  beMemRelease(pRe
9da0: 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  s);.  }.}../*.**
9db0: 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 45 58   group_concat(EX
9dc0: 50 52 2c 20 3f 53 45 50 41 52 41 54 4f 52 3f 29  PR, ?SEPARATOR?)
9dd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9de0: 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65 70 28  groupConcatStep(
9df0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
9e00: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
9e10: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
9e20: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
9e30: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
9e40: 2a 7a 56 61 6c 3b 0a 20 20 53 74 72 41 63 63 75  *zVal;.  StrAccu
9e50: 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 63 6f 6e  m *pAccum;.  con
9e60: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20  st char *zSep;. 
9e70: 20 69 6e 74 20 6e 56 61 6c 2c 20 6e 53 65 70 3b   int nVal, nSep;
9e80: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
9e90: 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =1 || argc==2 );
9ea0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
9eb0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
9ec0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
9ed0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 41 63 63  ) return;.  pAcc
9ee0: 75 6d 20 3d 20 28 53 74 72 41 63 63 75 6d 2a 29  um = (StrAccum*)
9ef0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
9f00: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
9f10: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 41 63 63 75  t, sizeof(*pAccu
9f20: 6d 29 29 3b 0a 0a 20 20 69 66 28 20 70 41 63 63  m));..  if( pAcc
9f30: 75 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  um ){.    sqlite
9f40: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
9f50: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
9f60: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  e(context);.    
9f70: 69 6e 74 20 66 69 72 73 74 54 65 72 6d 20 3d 20  int firstTerm = 
9f80: 70 41 63 63 75 6d 2d 3e 75 73 65 4d 61 6c 6c 6f  pAccum->useMallo
9f90: 63 3d 3d 30 3b 0a 20 20 20 20 70 41 63 63 75 6d  c==0;.    pAccum
9fa0: 2d 3e 75 73 65 4d 61 6c 6c 6f 63 20 3d 20 32 3b  ->useMalloc = 2;
9fb0: 0a 20 20 20 20 70 41 63 63 75 6d 2d 3e 6d 78 41  .    pAccum->mxA
9fc0: 6c 6c 6f 63 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  lloc = db->aLimi
9fd0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
9fe0: 45 4e 47 54 48 5d 3b 0a 20 20 20 20 69 66 28 20  ENGTH];.    if( 
9ff0: 21 66 69 72 73 74 54 65 72 6d 20 29 7b 0a 20 20  !firstTerm ){.  
a000: 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20      if( argc==2 
a010: 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20  ){.        zSep 
a020: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
a030: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
a040: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 53  [1]);.        nS
a050: 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ep = sqlite3_val
a060: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d  ue_bytes(argv[1]
a070: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a080: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
a090: 2c 22 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 70  ,";.        nSep
a0a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
a0b0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
a0c0: 63 75 6d 41 70 70 65 6e 64 28 70 41 63 63 75 6d  cumAppend(pAccum
a0d0: 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3b 0a 20  , zSep, nSep);. 
a0e0: 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c 20 3d 20     }.    zVal = 
a0f0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
a100: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
a110: 5d 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d 20 73  ]);.    nVal = s
a120: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
a130: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
a140: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
a150: 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a  Append(pAccum, z
a160: 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 7d 0a  Val, nVal);.  }.
a170: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 72  }.static void gr
a180: 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a  oupConcatFinaliz
a190: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
a1a0: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  t *context){.  S
a1b0: 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b  trAccum *pAccum;
a1c0: 0a 20 20 70 41 63 63 75 6d 20 3d 20 73 71 6c 69  .  pAccum = sqli
a1d0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
a1e0: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
a1f0: 29 3b 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20  );.  if( pAccum 
a200: 29 7b 0a 20 20 20 20 69 66 28 20 70 41 63 63 75  ){.    if( pAccu
a210: 6d 2d 3e 74 6f 6f 42 69 67 20 29 7b 0a 20 20 20  m->tooBig ){.   
a220: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
a230: 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63  t_error_toobig(c
a240: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c  ontext);.    }el
a250: 73 65 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 6d  se if( pAccum->m
a260: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
a270: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
a280: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
a290: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65  context);.    }e
a2a0: 6c 73 65 7b 20 20 20 20 0a 20 20 20 20 20 20 73  lse{    .      s
a2b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
a2c0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  xt(context, sqli
a2d0: 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
a2e0: 68 28 70 41 63 63 75 6d 29 2c 20 2d 31 2c 20 0a  h(pAccum), -1, .
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a300: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a310: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  3_free);.    }. 
a320: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
a330: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 70 65   routine does pe
a340: 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 75 6e  r-connection fun
a350: 63 74 69 6f 6e 20 72 65 67 69 73 74 72 61 74 69  ction registrati
a360: 6f 6e 2e 20 20 4d 6f 73 74 0a 2a 2a 20 6f 66 20  on.  Most.** of 
a370: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e  the built-in fun
a380: 63 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  ctions above are
a390: 20 70 61 72 74 20 6f 66 20 74 68 65 20 67 6c 6f   part of the glo
a3a0: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  bal function set
a3b0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
a3c0: 65 20 6f 6e 6c 79 20 64 65 61 6c 73 20 77 69 74  e only deals wit
a3d0: 68 20 74 68 6f 73 65 20 74 68 61 74 20 61 72 65  h those that are
a3e0: 20 6e 6f 74 20 67 6c 6f 62 61 6c 2e 0a 2a 2f 0a   not global..*/.
a3f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67 69  void sqlite3Regi
a400: 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74  sterBuiltinFunct
a410: 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ions(sqlite3 *db
a420: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
a430: 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
a440: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 4d 41 54  unction(db, "MAT
a450: 43 48 22 2c 20 32 29 3b 0a 20 20 61 73 73 65 72  CH", 2);.  asser
a460: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
a470: 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  MEM || rc==SQLIT
a480: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63  E_OK );.  if( rc
a490: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
a4a0: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
a4b0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
a4c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
a4d0: 20 4c 49 4b 45 4f 50 54 20 66 6c 61 67 20 6f 6e   LIKEOPT flag on
a4e0: 20 74 68 65 20 32 2d 61 72 67 75 6d 65 6e 74 20   the 2-argument 
a4f0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
a500: 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2f  e given name..*/
a510: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
a520: 4c 69 6b 65 4f 70 74 46 6c 61 67 28 73 71 6c 69  LikeOptFlag(sqli
a530: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
a540: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 75 38 20 66  har *zName, u8 f
a550: 6c 61 67 56 61 6c 29 7b 0a 20 20 46 75 6e 63 44  lagVal){.  FuncD
a560: 65 66 20 2a 70 44 65 66 3b 0a 20 20 70 44 65 66  ef *pDef;.  pDef
a570: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
a580: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  nction(db, zName
a590: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
a5a0: 30 28 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  0(zName),.      
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5c0: 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45         2, SQLITE
a5d0: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69 66 28  _UTF8, 0);.  if(
a5e0: 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 29 7b   ALWAYS(pDef) ){
a5f0: 0a 20 20 20 20 70 44 65 66 2d 3e 66 6c 61 67 73  .    pDef->flags
a600: 20 3d 20 66 6c 61 67 56 61 6c 3b 0a 20 20 7d 0a   = flagVal;.  }.
a610: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
a620: 72 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 4c  r the built-in L
a630: 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e  IKE and GLOB fun
a640: 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 63 61 73  ctions.  The cas
a650: 65 53 65 6e 73 69 74 69 76 65 0a 2a 2a 20 70 61  eSensitive.** pa
a660: 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
a670: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
a680: 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  t the LIKE opera
a690: 74 6f 72 20 69 73 20 63 61 73 65 0a 2a 2a 20 73  tor is case.** s
a6a0: 65 6e 73 69 74 69 76 65 2e 20 20 47 4c 4f 42 20  ensitive.  GLOB 
a6b0: 69 73 20 61 6c 77 61 79 73 20 63 61 73 65 20 73  is always case s
a6c0: 65 6e 73 69 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69  ensitive..*/.voi
a6d0: 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  d sqlite3Registe
a6e0: 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 73  rLikeFunctions(s
a6f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
a700: 63 61 73 65 53 65 6e 73 69 74 69 76 65 29 7b 0a  caseSensitive){.
a710: 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65    struct compare
a720: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 69  Info *pInfo;.  i
a730: 66 28 20 63 61 73 65 53 65 6e 73 69 74 69 76 65  f( caseSensitive
a740: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20   ){.    pInfo = 
a750: 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49  (struct compareI
a760: 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  nfo*)&likeInfoAl
a770: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
a780: 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20  pInfo = (struct 
a790: 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69  compareInfo*)&li
a7a0: 6b 65 49 6e 66 6f 4e 6f 72 6d 3b 0a 20 20 7d 0a  keInfoNorm;.  }.
a7b0: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46    sqlite3CreateF
a7c0: 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20  unc(db, "like", 
a7d0: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
a7e0: 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c  pInfo, likeFunc,
a7f0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c   0, 0, 0);.  sql
a800: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
a810: 62 2c 20 22 6c 69 6b 65 22 2c 20 33 2c 20 53 51  b, "like", 3, SQ
a820: 4c 49 54 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f  LITE_UTF8, pInfo
a830: 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30  , likeFunc, 0, 0
a840: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  , 0);.  sqlite3C
a850: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22 67  reateFunc(db, "g
a860: 6c 6f 62 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  lob", 2, SQLITE_
a870: 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28 73 74  UTF8, .      (st
a880: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
a890: 2a 29 26 67 6c 6f 62 49 6e 66 6f 2c 20 6c 69 6b  *)&globInfo, lik
a8a0: 65 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b  eFunc, 0, 0, 0);
a8b0: 0a 20 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61  .  setLikeOptFla
a8c0: 67 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20 53 51  g(db, "glob", SQ
a8d0: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 20 7c  LITE_FUNC_LIKE |
a8e0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53   SQLITE_FUNC_CAS
a8f0: 45 29 3b 0a 20 20 73 65 74 4c 69 6b 65 4f 70 74  E);.  setLikeOpt
a900: 46 6c 61 67 28 64 62 2c 20 22 6c 69 6b 65 22 2c  Flag(db, "like",
a910: 20 0a 20 20 20 20 20 20 63 61 73 65 53 65 6e 73   .      caseSens
a920: 69 74 69 76 65 20 3f 20 28 53 51 4c 49 54 45 5f  itive ? (SQLITE_
a930: 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49  FUNC_LIKE | SQLI
a940: 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 20 3a 20  TE_FUNC_CASE) : 
a950: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
a960: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  );.}../*.** pExp
a970: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  r points to an e
a980: 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20  xpression which 
a990: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 66 75 6e  implements a fun
a9a0: 63 74 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20 69 74  ction.  If.** it
a9b0: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
a9c0: 74 6f 20 61 70 70 6c 79 20 74 68 65 20 4c 49 4b  to apply the LIK
a9d0: 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74  E optimization t
a9e0: 6f 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 0a  o that function.
a9f0: 2a 2a 20 74 68 65 6e 20 73 65 74 20 61 57 63 5b  ** then set aWc[
aa00: 30 5d 20 74 68 72 6f 75 67 68 20 61 57 63 5b 32  0] through aWc[2
aa10: 5d 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  ] to the wildcar
aa20: 64 20 63 68 61 72 61 63 74 65 72 73 20 61 6e 64  d characters and
aa30: 0a 2a 2a 20 72 65 74 75 72 6e 20 54 52 55 45 2e  .** return TRUE.
aa40: 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f    If the functio
aa50: 6e 20 69 73 20 6e 6f 74 20 61 20 4c 49 4b 45 2d  n is not a LIKE-
aa60: 73 74 79 6c 65 20 66 75 6e 63 74 69 6f 6e 20 74  style function t
aa70: 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 46 41  hen.** return FA
aa80: 4c 53 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  LSE..*/.int sqli
aa90: 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f  te3IsLikeFunctio
aaa0: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  n(sqlite3 *db, E
aab0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
aac0: 2a 70 49 73 4e 6f 63 61 73 65 2c 20 63 68 61 72  *pIsNocase, char
aad0: 20 2a 61 57 63 29 7b 0a 20 20 46 75 6e 63 44 65   *aWc){.  FuncDe
aae0: 66 20 2a 70 44 65 66 3b 0a 20 20 69 66 28 20 70  f *pDef;.  if( p
aaf0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e  Expr->op!=TK_FUN
ab00: 43 54 49 4f 4e 20 0a 20 20 20 7c 7c 20 21 70 45  CTION .   || !pE
ab10: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 0a 20 20  xpr->x.pList .  
ab20: 20 7c 7c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   || pExpr->x.pLi
ab30: 73 74 2d 3e 6e 45 78 70 72 21 3d 32 0a 20 20 29  st->nExpr!=2.  )
ab40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
ab50: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 45    }.  assert( !E
ab60: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ab70: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
ab80: 63 74 29 20 29 3b 0a 20 20 70 44 65 66 20 3d 20  ct) );.  pDef = 
ab90: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
aba0: 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2d 3e 75  ion(db, pExpr->u
abb0: 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20  .zToken, .      
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
abe0: 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
abf0: 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20  zToken),.       
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac10: 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45 5f        2, SQLITE_
ac20: 55 54 46 38 2c 20 30 29 3b 0a 20 20 69 66 28 20  UTF8, 0);.  if( 
ac30: 4e 45 56 45 52 28 70 44 65 66 3d 3d 30 29 20 7c  NEVER(pDef==0) |
ac40: 7c 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  | (pDef->flags &
ac50: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
ac60: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  E)==0 ){.    ret
ac70: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
ac80: 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 73 74   The memcpy() st
ac90: 61 74 65 6d 65 6e 74 20 61 73 73 75 6d 65 73 20  atement assumes 
aca0: 74 68 61 74 20 74 68 65 20 77 69 6c 64 63 61 72  that the wildcar
acb0: 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65  d characters are
acc0: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
acd0: 74 68 72 65 65 20 73 74 61 74 65 6d 65 6e 74 73  three statements
ace0: 20 69 6e 20 74 68 65 20 63 6f 6d 70 61 72 65 49   in the compareI
acf0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
ad00: 54 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 73  The.  ** asserts
ad10: 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 76  () that follow v
ad20: 65 72 69 66 79 20 74 68 61 74 20 61 73 73 75 6d  erify that assum
ad30: 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ption.  */.  mem
ad40: 63 70 79 28 61 57 63 2c 20 70 44 65 66 2d 3e 70  cpy(aWc, pDef->p
ad50: 55 73 65 72 44 61 74 61 2c 20 33 29 3b 0a 20 20  UserData, 3);.  
ad60: 61 73 73 65 72 74 28 20 28 63 68 61 72 2a 29 26  assert( (char*)&
ad70: 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20 28  likeInfoAlt == (
ad80: 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41  char*)&likeInfoA
ad90: 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a 20  lt.matchAll );. 
ada0: 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61 72   assert( &((char
adb0: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b  *)&likeInfoAlt)[
adc0: 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69  1] == (char*)&li
add0: 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 4f  keInfoAlt.matchO
ade0: 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
adf0: 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  &((char*)&likeIn
ae00: 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63 68  foAlt)[2] == (ch
ae10: 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74  ar*)&likeInfoAlt
ae20: 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a 20 20 2a  .matchSet );.  *
ae30: 70 49 73 4e 6f 63 61 73 65 20 3d 20 28 70 44 65  pIsNocase = (pDe
ae40: 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
ae50: 45 5f 46 55 4e 43 5f 43 41 53 45 29 3d 3d 30 3b  E_FUNC_CASE)==0;
ae60: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
ae70: 2f 2a 0a 2a 2a 20 41 6c 6c 20 61 6c 6c 20 6f 66  /*.** All all of
ae80: 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74 72   the FuncDef str
ae90: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 61  uctures in the a
aea0: 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 61 72  BuiltinFunc[] ar
aeb0: 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20  ray above.** to 
aec0: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
aed0: 69 6f 6e 20 68 61 73 68 20 74 61 62 6c 65 2e 20  ion hash table. 
aee0: 20 54 68 69 73 20 6f 63 63 75 72 73 20 61 74 20   This occurs at 
aef0: 73 74 61 72 74 2d 74 69 6d 65 20 28 61 73 0a 2a  start-time (as.*
af00: 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  * a consequence 
af10: 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  of calling sqlit
af20: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 29  e3_initialize())
af30: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
af40: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 0a  is routine runs.
af50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
af60: 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e  egisterGlobalFun
af70: 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20  ctions(void){.  
af80: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  /*.  ** The foll
af90: 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64  owing array hold
afa0: 73 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  s FuncDef struct
afb0: 75 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  ures for all of 
afc0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20  the functions.  
afd0: 2a 2a 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ** defined in th
afe0: 69 73 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20  is file..  **.  
aff0: 2a 2a 20 54 68 65 20 61 72 72 61 79 20 63 61 6e  ** The array can
b000: 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20  not be constant 
b010: 73 69 6e 63 65 20 63 68 61 6e 67 65 73 20 61 72  since changes ar
b020: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 0a 20 20  e made to the.  
b030: 2a 2a 20 46 75 6e 63 44 65 66 2e 70 48 61 73 68  ** FuncDef.pHash
b040: 20 65 6c 65 6d 65 6e 74 73 20 61 74 20 73 74 61   elements at sta
b050: 72 74 2d 74 69 6d 65 2e 20 20 54 68 65 20 65 6c  rt-time.  The el
b060: 65 6d 65 6e 74 73 20 6f 66 20 74 68 69 73 20 61  ements of this a
b070: 72 72 61 79 0a 20 20 2a 2a 20 61 72 65 20 72 65  rray.  ** are re
b080: 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 69 6e  ad-only after in
b090: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69 73 20  itialization is 
b0a0: 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a 2f 0a 20  complete..  */. 
b0b0: 20 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 57   static SQLITE_W
b0c0: 53 44 20 46 75 6e 63 44 65 66 20 61 42 75 69 6c  SD FuncDef aBuil
b0d0: 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20  tinFunc[] = {.  
b0e0: 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d    FUNCTION(ltrim
b0f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
b100: 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63  , 1, 0, trimFunc
b110: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
b120: 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20  FUNCTION(ltrim, 
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
b140: 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20  1, 0, trimFunc  
b150: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
b160: 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20  NCTION(rtrim,   
b170: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 32 2c             1, 2,
b180: 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20   0, trimFunc    
b190: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
b1a0: 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20 20  TION(rtrim,     
b1b0: 20 20 20 20 20 20 20 20 20 32 2c 20 32 2c 20 30           2, 2, 0
b1c0: 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20  , trimFunc      
b1d0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
b1e0: 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20  ON(trim,        
b1f0: 20 20 20 20 20 20 20 31 2c 20 33 2c 20 30 2c 20         1, 3, 0, 
b200: 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20  trimFunc        
b210: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
b220: 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20  (trim,          
b230: 20 20 20 20 20 32 2c 20 33 2c 20 30 2c 20 74 72       2, 3, 0, tr
b240: 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29  imFunc         )
b250: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d  ,.    FUNCTION(m
b260: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
b270: 20 20 2d 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d    -1, 0, 1, minm
b280: 61 78 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  axFunc       ),.
b290: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e      FUNCTION(min
b2a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b2b0: 20 30 2c 20 30 2c 20 31 2c 20 30 20 20 20 20 20   0, 0, 1, 0     
b2c0: 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20             ),.  
b2d0: 20 20 41 47 47 52 45 47 41 54 45 28 6d 69 6e 2c    AGGREGATE(min,
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
b2f0: 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74  , 0, 1, minmaxSt
b300: 65 70 2c 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  ep,      minMaxF
b310: 69 6e 61 6c 69 7a 65 20 29 2c 0a 20 20 20 20 46  inalize ),.    F
b320: 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20  UNCTION(max,    
b330: 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 31             -1, 1
b340: 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20  , 1, minmaxFunc 
b350: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
b360: 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20  CTION(max,      
b370: 20 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c 20            0, 1, 
b380: 31 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  1, 0            
b390: 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45      ),.    AGGRE
b3a0: 47 41 54 45 28 6d 61 78 2c 20 20 20 20 20 20 20  GATE(max,       
b3b0: 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20 31 2c          1, 1, 1,
b3c0: 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20 20 20   minmaxStep,    
b3d0: 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65    minMaxFinalize
b3e0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
b3f0: 28 74 79 70 65 6f 66 2c 20 20 20 20 20 20 20 20  (typeof,        
b400: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 74 79       1, 0, 0, ty
b410: 70 65 6f 66 46 75 6e 63 20 20 20 20 20 20 20 29  peofFunc       )
b420: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c  ,.    FUNCTION(l
b430: 65 6e 67 74 68 2c 20 20 20 20 20 20 20 20 20 20  ength,          
b440: 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 65 6e 67     1, 0, 0, leng
b450: 74 68 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a  thFunc       ),.
b460: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 75 62      FUNCTION(sub
b470: 73 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  str,            
b480: 20 32 2c 20 30 2c 20 30 2c 20 73 75 62 73 74 72   2, 0, 0, substr
b490: 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20  Func       ),.  
b4a0: 20 20 46 55 4e 43 54 49 4f 4e 28 73 75 62 73 74    FUNCTION(subst
b4b0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 33  r,             3
b4c0: 2c 20 30 2c 20 30 2c 20 73 75 62 73 74 72 46 75  , 0, 0, substrFu
b4d0: 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  nc       ),.    
b4e0: 46 55 4e 43 54 49 4f 4e 28 61 62 73 2c 20 20 20  FUNCTION(abs,   
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
b500: 30 2c 20 30 2c 20 61 62 73 46 75 6e 63 20 20 20  0, 0, absFunc   
b510: 20 20 20 20 20 20 20 29 2c 0a 23 69 66 6e 64 65         ),.#ifnde
b520: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
b530: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
b540: 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c   FUNCTION(round,
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
b560: 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63   0, 0, roundFunc
b570: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
b580: 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20 20  UNCTION(round,  
b590: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
b5a0: 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20  , 0, roundFunc  
b5b0: 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66 0a        ),.#endif.
b5c0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 70 70      FUNCTION(upp
b5d0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
b5e0: 20 31 2c 20 30 2c 20 30 2c 20 75 70 70 65 72 46   1, 0, 0, upperF
b5f0: 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20  unc        ),.  
b600: 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 77 65 72    FUNCTION(lower
b610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
b620: 2c 20 30 2c 20 30 2c 20 6c 6f 77 65 72 46 75 6e  , 0, 0, lowerFun
b630: 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  c        ),.    
b640: 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63  FUNCTION(coalesc
b650: 65 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  e,           1, 
b660: 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20 20  0, 0, 0         
b670: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
b680: 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c  NCTION(coalesce,
b690: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
b6a0: 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20   0, 0           
b6b0: 20 20 20 20 20 29 2c 0a 2f 2a 20 20 46 55 4e 43       ),./*  FUNC
b6c0: 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20 20  TION(coalesce,  
b6d0: 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30          -1, 0, 0
b6e0: 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20 20 20 20  , ifnullFunc    
b6f0: 20 20 20 29 2c 20 2a 2f 0a 20 20 20 20 7b 2d 31     ), */.    {-1
b700: 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c  ,SQLITE_UTF8,SQL
b710: 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
b720: 45 2c 30 2c 30 2c 69 66 6e 75 6c 6c 46 75 6e 63  E,0,0,ifnullFunc
b730: 2c 30 2c 30 2c 22 63 6f 61 6c 65 73 63 65 22 2c  ,0,0,"coalesce",
b740: 30 2c 30 7d 2c 0a 20 20 20 20 46 55 4e 43 54 49  0,0},.    FUNCTI
b750: 4f 4e 28 68 65 78 2c 20 20 20 20 20 20 20 20 20  ON(hex,         
b760: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
b770: 68 65 78 46 75 6e 63 20 20 20 20 20 20 20 20 20  hexFunc         
b780: 20 29 2c 0a 2f 2a 20 20 46 55 4e 43 54 49 4f 4e   ),./*  FUNCTION
b790: 28 69 66 6e 75 6c 6c 2c 20 20 20 20 20 20 20 20  (ifnull,        
b7a0: 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 69 66       2, 0, 0, if
b7b0: 6e 75 6c 6c 46 75 6e 63 20 20 20 20 20 20 20 29  nullFunc       )
b7c0: 2c 20 2a 2f 0a 20 20 20 20 7b 32 2c 53 51 4c 49  , */.    {2,SQLI
b7d0: 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 46  TE_UTF8,SQLITE_F
b7e0: 55 4e 43 5f 43 4f 41 4c 45 53 43 45 2c 30 2c 30  UNC_COALESCE,0,0
b7f0: 2c 69 66 6e 75 6c 6c 46 75 6e 63 2c 30 2c 30 2c  ,ifnullFunc,0,0,
b800: 22 69 66 6e 75 6c 6c 22 2c 30 2c 30 7d 2c 0a 20  "ifnull",0,0},. 
b810: 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 61 6e 64     FUNCTION(rand
b820: 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  om,             
b830: 30 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d 46  0, 0, 0, randomF
b840: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
b850: 20 46 55 4e 43 54 49 4f 4e 28 72 61 6e 64 6f 6d   FUNCTION(random
b860: 62 6c 6f 62 2c 20 20 20 20 20 20 20 20 20 31 2c  blob,         1,
b870: 20 30 2c 20 30 2c 20 72 61 6e 64 6f 6d 42 6c 6f   0, 0, randomBlo
b880: 62 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  b       ),.    F
b890: 55 4e 43 54 49 4f 4e 28 6e 75 6c 6c 69 66 2c 20  UNCTION(nullif, 
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
b8b0: 2c 20 31 2c 20 6e 75 6c 6c 69 66 46 75 6e 63 20  , 1, nullifFunc 
b8c0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
b8d0: 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 76 65 72  CTION(sqlite_ver
b8e0: 73 69 6f 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20  sion,     0, 0, 
b8f0: 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63 20 20  0, versionFunc  
b900: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
b910: 49 4f 4e 28 73 71 6c 69 74 65 5f 73 6f 75 72 63  ION(sqlite_sourc
b920: 65 5f 69 64 2c 20 20 20 30 2c 20 30 2c 20 30 2c  e_id,   0, 0, 0,
b930: 20 73 6f 75 72 63 65 69 64 46 75 6e 63 20 20 20   sourceidFunc   
b940: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
b950: 4e 28 73 71 6c 69 74 65 5f 6c 6f 67 2c 20 20 20  N(sqlite_log,   
b960: 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 65        2, 0, 0, e
b970: 72 72 6c 6f 67 46 75 6e 63 20 20 20 20 20 20 20  rrlogFunc       
b980: 29 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ),.#ifndef SQLIT
b990: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
b9a0: 54 49 4f 4e 5f 44 49 41 47 53 0a 20 20 20 20 46  TION_DIAGS.    F
b9b0: 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 63  UNCTION(sqlite_c
b9c0: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65  ompileoption_use
b9d0: 64 2c 31 2c 20 30 2c 20 30 2c 20 63 6f 6d 70 69  d,1, 0, 0, compi
b9e0: 6c 65 6f 70 74 69 6f 6e 75 73 65 64 46 75 6e 63  leoptionusedFunc
b9f0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
ba00: 4e 28 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65  N(sqlite_compile
ba10: 6f 70 74 69 6f 6e 5f 67 65 74 2c 20 31 2c 20 30  option_get, 1, 0
ba20: 2c 20 30 2c 20 63 6f 6d 70 69 6c 65 6f 70 74 69  , 0, compileopti
ba30: 6f 6e 67 65 74 46 75 6e 63 20 20 29 2c 0a 23 65  ongetFunc  ),.#e
ba40: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ba50: 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
ba60: 4e 5f 44 49 41 47 53 20 2a 2f 0a 20 20 20 20 46  N_DIAGS */.    F
ba70: 55 4e 43 54 49 4f 4e 28 71 75 6f 74 65 2c 20 20  UNCTION(quote,  
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
ba90: 2c 20 30 2c 20 71 75 6f 74 65 46 75 6e 63 20 20  , 0, quoteFunc  
baa0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
bab0: 43 54 49 4f 4e 28 6c 61 73 74 5f 69 6e 73 65 72  CTION(last_inser
bac0: 74 5f 72 6f 77 69 64 2c 20 20 30 2c 20 30 2c 20  t_rowid,  0, 0, 
bad0: 30 2c 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  0, last_insert_r
bae0: 6f 77 69 64 29 2c 0a 20 20 20 20 46 55 4e 43 54  owid),.    FUNCT
baf0: 49 4f 4e 28 63 68 61 6e 67 65 73 2c 20 20 20 20  ION(changes,    
bb00: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c          0, 0, 0,
bb10: 20 63 68 61 6e 67 65 73 20 20 20 20 20 20 20 20   changes        
bb20: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
bb30: 4e 28 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 2c  N(total_changes,
bb40: 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 74        0, 0, 0, t
bb50: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20 20 20 20  otal_changes    
bb60: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
bb70: 72 65 70 6c 61 63 65 2c 20 20 20 20 20 20 20 20  replace,        
bb80: 20 20 20 20 33 2c 20 30 2c 20 30 2c 20 72 65 70      3, 0, 0, rep
bb90: 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20 29 2c  laceFunc      ),
bba0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 7a 65  .    FUNCTION(ze
bbb0: 72 6f 62 6c 6f 62 2c 20 20 20 20 20 20 20 20 20  roblob,         
bbc0: 20 20 31 2c 20 30 2c 20 30 2c 20 7a 65 72 6f 62    1, 0, 0, zerob
bbd0: 6c 6f 62 46 75 6e 63 20 20 20 20 20 29 2c 0a 20  lobFunc     ),. 
bbe0: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53   #ifdef SQLITE_S
bbf0: 4f 55 4e 44 45 58 0a 20 20 20 20 46 55 4e 43 54  OUNDEX.    FUNCT
bc00: 49 4f 4e 28 73 6f 75 6e 64 65 78 2c 20 20 20 20  ION(soundex,    
bc10: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
bc20: 20 73 6f 75 6e 64 65 78 46 75 6e 63 20 20 20 20   soundexFunc    
bc30: 20 20 29 2c 0a 20 20 23 65 6e 64 69 66 0a 20 20    ),.  #endif.  
bc40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bc50: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
bc60: 4f 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ON.    FUNCTION(
bc70: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20  load_extension, 
bc80: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 61      1, 0, 0, loa
bc90: 64 45 78 74 20 20 20 20 20 20 20 20 20 20 29 2c  dExt          ),
bca0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f  .    FUNCTION(lo
bcb0: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20  ad_extension,   
bcc0: 20 20 32 2c 20 30 2c 20 30 2c 20 6c 6f 61 64 45    2, 0, 0, loadE
bcd0: 78 74 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20  xt          ),. 
bce0: 20 23 65 6e 64 69 66 0a 20 20 20 20 41 47 47 52   #endif.    AGGR
bcf0: 45 47 41 54 45 28 73 75 6d 2c 20 20 20 20 20 20  EGATE(sum,      
bd00: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
bd10: 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20  , sumStep,      
bd20: 20 20 20 73 75 6d 46 69 6e 61 6c 69 7a 65 20 20     sumFinalize  
bd30: 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41    ),.    AGGREGA
bd40: 54 45 28 74 6f 74 61 6c 2c 20 20 20 20 20 20 20  TE(total,       
bd50: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73        1, 0, 0, s
bd60: 75 6d 53 74 65 70 2c 20 20 20 20 20 20 20 20 20  umStep,         
bd70: 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 20 20 20  totalFinalize   
bd80: 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54   ),.    AGGREGAT
bd90: 45 28 61 76 67 2c 20 20 20 20 20 20 20 20 20 20  E(avg,          
bda0: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 75       1, 0, 0, su
bdb0: 6d 53 74 65 70 2c 20 20 20 20 20 20 20 20 20 61  mStep,         a
bdc0: 76 67 46 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c  vgFinalize    ),
bdd0: 0a 20 2f 2a 20 41 47 47 52 45 47 41 54 45 28 63  . /* AGGREGATE(c
bde0: 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ount,           
bdf0: 20 20 30 2c 20 30 2c 20 30 2c 20 63 6f 75 6e 74    0, 0, 0, count
be00: 53 74 65 70 2c 20 20 20 20 20 20 20 63 6f 75 6e  Step,       coun
be10: 74 46 69 6e 61 6c 69 7a 65 20 20 29 2c 20 2a 2f  tFinalize  ), */
be20: 0a 20 20 20 20 7b 30 2c 53 51 4c 49 54 45 5f 55  .    {0,SQLITE_U
be30: 54 46 38 2c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  TF8,SQLITE_FUNC_
be40: 43 4f 55 4e 54 2c 30 2c 30 2c 30 2c 63 6f 75 6e  COUNT,0,0,0,coun
be50: 74 53 74 65 70 2c 63 6f 75 6e 74 46 69 6e 61 6c  tStep,countFinal
be60: 69 7a 65 2c 22 63 6f 75 6e 74 22 2c 30 2c 30 7d  ize,"count",0,0}
be70: 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54 45 28  ,.    AGGREGATE(
be80: 63 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20  count,          
be90: 20 20 20 31 2c 20 30 2c 20 30 2c 20 63 6f 75 6e     1, 0, 0, coun
bea0: 74 53 74 65 70 2c 20 20 20 20 20 20 20 63 6f 75  tStep,       cou
beb0: 6e 74 46 69 6e 61 6c 69 7a 65 20 20 29 2c 0a 20  ntFinalize  ),. 
bec0: 20 20 20 41 47 47 52 45 47 41 54 45 28 67 72 6f     AGGREGATE(gro
bed0: 75 70 5f 63 6f 6e 63 61 74 2c 20 20 20 20 20 20  up_concat,      
bee0: 31 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70 43 6f  1, 0, 0, groupCo
bef0: 6e 63 61 74 53 74 65 70 2c 20 67 72 6f 75 70 43  ncatStep, groupC
bf00: 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 29 2c 0a  oncatFinalize),.
bf10: 20 20 20 20 41 47 47 52 45 47 41 54 45 28 67 72      AGGREGATE(gr
bf20: 6f 75 70 5f 63 6f 6e 63 61 74 2c 20 20 20 20 20  oup_concat,     
bf30: 20 32 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70 43   2, 0, 0, groupC
bf40: 6f 6e 63 61 74 53 74 65 70 2c 20 67 72 6f 75 70  oncatStep, group
bf50: 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a 65 29 2c  ConcatFinalize),
bf60: 0a 20 20 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43  .  .    LIKEFUNC
bf70: 28 67 6c 6f 62 2c 20 32 2c 20 26 67 6c 6f 62 49  (glob, 2, &globI
bf80: 6e 66 6f 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  nfo, SQLITE_FUNC
bf90: 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e  _LIKE|SQLITE_FUN
bfa0: 43 5f 43 41 53 45 29 2c 0a 20 20 23 69 66 64 65  C_CASE),.  #ifde
bfb0: 66 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45  f SQLITE_CASE_SE
bfc0: 4e 53 49 54 49 56 45 5f 4c 49 4b 45 0a 20 20 20  NSITIVE_LIKE.   
bfd0: 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20   LIKEFUNC(like, 
bfe0: 32 2c 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c  2, &likeInfoAlt,
bff0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b   SQLITE_FUNC_LIK
c000: 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41  E|SQLITE_FUNC_CA
c010: 53 45 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e  SE),.    LIKEFUN
c020: 43 28 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65  C(like, 3, &like
c030: 49 6e 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f  InfoAlt, SQLITE_
c040: 46 55 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45  FUNC_LIKE|SQLITE
c050: 5f 46 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20 23  _FUNC_CASE),.  #
c060: 65 6c 73 65 0a 20 20 20 20 4c 49 4b 45 46 55 4e  else.    LIKEFUN
c070: 43 28 6c 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65  C(like, 2, &like
c080: 49 6e 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45  InfoNorm, SQLITE
c090: 5f 46 55 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20 20  _FUNC_LIKE),.   
c0a0: 20 4c 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20   LIKEFUNC(like, 
c0b0: 33 2c 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d  3, &likeInfoNorm
c0c0: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  , SQLITE_FUNC_LI
c0d0: 4b 45 29 2c 0a 20 20 23 65 6e 64 69 66 0a 20 20  KE),.  #endif.  
c0e0: 7d 3b 0a 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46  };..  int i;.  F
c0f0: 75 6e 63 44 65 66 48 61 73 68 20 2a 70 48 61 73  uncDefHash *pHas
c100: 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e 63  h = &GLOBAL(Func
c110: 44 65 66 48 61 73 68 2c 20 73 71 6c 69 74 65 33  DefHash, sqlite3
c120: 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29  GlobalFunctions)
c130: 3b 0a 20 20 46 75 6e 63 44 65 66 20 2a 61 46 75  ;.  FuncDef *aFu
c140: 6e 63 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 26  nc = (FuncDef*)&
c150: 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 2c 20  GLOBAL(FuncDef, 
c160: 61 42 75 69 6c 74 69 6e 46 75 6e 63 29 3b 0a 0a  aBuiltinFunc);..
c170: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
c180: 61 79 53 69 7a 65 28 61 42 75 69 6c 74 69 6e 46  aySize(aBuiltinF
c190: 75 6e 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  unc); i++){.    
c1a0: 73 71 6c 69 74 65 33 46 75 6e 63 44 65 66 49 6e  sqlite3FuncDefIn
c1b0: 73 65 72 74 28 70 48 61 73 68 2c 20 26 61 46 75  sert(pHash, &aFu
c1c0: 6e 63 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71  nc[i]);.  }.  sq
c1d0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 44 61 74  lite3RegisterDat
c1e0: 65 54 69 6d 65 46 75 6e 63 74 69 6f 6e 73 28 29  eTimeFunctions()
c1f0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
c200: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
c210: 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72 46  .  sqlite3AlterF
c220: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 23 65 6e 64  unctions();.#end
c230: 69 66 0a 7d 0a                                   if.}.