/ Hex Artifact Content
Login

Artifact f58648e196e86a1c7dfced3f1c82a7fbc714ebd0:


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 2a 0a 2a  file scope..**.*
0280: 2a 20 24 49 64 3a 20 66 75 6e 63 2e 63 2c 76 20  * $Id: func.c,v 
0290: 31 2e 32 31 36 20 32 30 30 39 2f 30 32 2f 30 32  1.216 2009/02/02
02a0: 20 31 36 3a 33 32 3a 35 35 20 64 72 68 20 45 78   16:32:55 drh Ex
02b0: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
02c0: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
02d0: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
02e0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  >.#include <asse
02f0: 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22  rt.h>.#include "
0300: 76 64 62 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a  vdbeInt.h"../*.*
0310: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c  * Return the col
0320: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
0330: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
0340: 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  a function..*/.s
0350: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 73  tatic CollSeq *s
0360: 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c  qlite3GetFuncCol
0370: 6c 53 65 71 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lSeq(sqlite3_con
0380: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
0390: 20 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 78 74    return context
03a0: 2d 3e 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pColl;.}../*.*
03b0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
03c0: 20 6f 66 20 74 68 65 20 6e 6f 6e 2d 61 67 67 72   of the non-aggr
03d0: 65 67 61 74 65 20 6d 69 6e 28 29 20 61 6e 64 20  egate min() and 
03e0: 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 0a  max() functions.
03f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
0400: 69 6e 6d 61 78 46 75 6e 63 28 0a 20 20 73 71 6c  inmaxFunc(.  sql
0410: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
0420: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
0430: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
0440: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
0450: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  nt i;.  int mask
0460: 3b 20 20 20 20 2f 2a 20 30 20 66 6f 72 20 6d 69  ;    /* 0 for mi
0470: 6e 28 29 20 6f 72 20 30 78 66 66 66 66 66 66 66  n() or 0xfffffff
0480: 66 20 66 6f 72 20 6d 61 78 28 29 20 2a 2f 0a 20  f for max() */. 
0490: 20 69 6e 74 20 69 42 65 73 74 3b 0a 20 20 43 6f   int iBest;.  Co
04a0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
04b0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3e 31 20   assert( argc>1 
04c0: 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 73 71 6c 69  );.  mask = sqli
04d0: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
04e0: 6e 74 65 78 74 29 3d 3d 30 20 3f 20 30 20 3a 20  ntext)==0 ? 0 : 
04f0: 2d 31 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  -1;.  pColl = sq
0500: 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c  lite3GetFuncColl
0510: 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  Seq(context);.  
0520: 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 20 29 3b  assert( pColl );
0530: 0a 20 20 61 73 73 65 72 74 28 20 6d 61 73 6b 3d  .  assert( mask=
0540: 3d 2d 31 20 7c 7c 20 6d 61 73 6b 3d 3d 30 20 29  =-1 || mask==0 )
0550: 3b 0a 20 20 69 42 65 73 74 20 3d 20 30 3b 0a 20  ;.  iBest = 0;. 
0560: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
0570: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
0580: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
0590: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
05a0: 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
05b0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
05c0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
05d0: 5b 69 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [i])==SQLITE_NUL
05e0: 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  L ) return;.    
05f0: 69 66 28 20 28 73 71 6c 69 74 65 33 4d 65 6d 43  if( (sqlite3MemC
0600: 6f 6d 70 61 72 65 28 61 72 67 76 5b 69 42 65 73  ompare(argv[iBes
0610: 74 5d 2c 20 61 72 67 76 5b 69 5d 2c 20 70 43 6f  t], argv[i], pCo
0620: 6c 6c 29 5e 6d 61 73 6b 29 3e 3d 30 20 29 7b 0a  ll)^mask)>=0 ){.
0630: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
0640: 6d 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  mask==0 );.     
0650: 20 69 42 65 73 74 20 3d 20 69 3b 0a 20 20 20 20   iBest = i;.    
0660: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
0670: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
0680: 74 65 78 74 2c 20 61 72 67 76 5b 69 42 65 73 74  text, argv[iBest
0690: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ]);.}../*.** Ret
06a0: 75 72 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20  urn the type of 
06b0: 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
06c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 79 70  .static void typ
06d0: 65 6f 66 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  eofFunc(.  sqlit
06e0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
06f0: 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73  ext,.  int NotUs
0700: 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ed,.  sqlite3_va
0710: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
0720: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
0730: 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
0740: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
0750: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
0760: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
0770: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
0780: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
0790: 3a 20 7a 20 3d 20 22 69 6e 74 65 67 65 72 22 3b  : z = "integer";
07a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
07b0: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 20 20   SQLITE_TEXT:   
07c0: 20 7a 20 3d 20 22 74 65 78 74 22 3b 20 20 20 20   z = "text";    
07d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
07e0: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 20 20  SQLITE_FLOAT:   
07f0: 7a 20 3d 20 22 72 65 61 6c 22 3b 20 20 20 20 62  z = "real";    b
0800: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0810: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 20 20 20 7a  QLITE_BLOB:    z
0820: 20 3d 20 22 62 6c 6f 62 22 3b 20 20 20 20 62 72   = "blob";    br
0830: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
0840: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  :             z 
0850: 3d 20 22 6e 75 6c 6c 22 3b 20 20 20 20 62 72 65  = "null";    bre
0860: 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ak;.  }.  sqlite
0870: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
0880: 6e 74 65 78 74 2c 20 7a 2c 20 2d 31 2c 20 53 51  ntext, z, -1, SQ
0890: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a  LITE_STATIC);.}.
08a0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
08b0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 65  tation of the le
08c0: 6e 67 74 68 28 29 20 66 75 6e 63 74 69 6f 6e 0a  ngth() function.
08d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
08e0: 65 6e 67 74 68 46 75 6e 63 28 0a 20 20 73 71 6c  engthFunc(.  sql
08f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
0900: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
0910: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
0920: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
0930: 6e 74 20 6c 65 6e 3b 0a 0a 20 20 61 73 73 65 72  nt len;..  asser
0940: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
0950: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
0960: 28 61 72 67 63 29 3b 0a 20 20 73 77 69 74 63 68  (argc);.  switch
0970: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
0980: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b  type(argv[0]) ){
0990: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
09a0: 5f 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20  _BLOB:.    case 
09b0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a  SQLITE_INTEGER:.
09c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
09d0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73  FLOAT: {.      s
09e0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
09f0: 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  t(context, sqlit
0a00: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
0a10: 72 67 76 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[0]));.      
0a20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
0a30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
0a40: 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  T: {.      const
0a50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0a60: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
0a70: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
0a80: 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  .      if( z==0 
0a90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
0aa0: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  len = 0;.      w
0ab0: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
0ac0: 20 20 20 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 20      len++;.     
0ad0: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
0ae0: 54 46 38 28 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  TF8(z);.      }.
0af0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
0b00: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
0b10: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  , len);.      br
0b20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
0b30: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
0b40: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
0b50: 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ull(context);.  
0b60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0b70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  .  }.}../*.** Im
0b80: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
0b90: 74 68 65 20 61 62 73 28 29 20 66 75 6e 63 74 69  the abs() functi
0ba0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
0bb0: 64 20 61 62 73 46 75 6e 63 28 73 71 6c 69 74 65  d absFunc(sqlite
0bc0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
0bd0: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
0be0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
0bf0: 67 76 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61  gv){.  assert( a
0c00: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53  rgc==1 );.  UNUS
0c10: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
0c20: 63 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71  c);.  switch( sq
0c30: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
0c40: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
0c50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
0c60: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 36  EGER: {.      i6
0c70: 34 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  4 iVal = sqlite3
0c80: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
0c90: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[0]);.      if(
0ca0: 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iVal<0 ){.     
0cb0: 20 20 20 69 66 28 20 28 69 56 61 6c 3c 3c 31 29     if( (iVal<<1)
0cc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
0cd0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0ce0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
0cf0: 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77  integer overflow
0d00: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ", -1);.        
0d10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
0d20: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 56 61 6c    }.        iVal
0d30: 20 3d 20 2d 69 56 61 6c 3b 0a 20 20 20 20 20 20   = -iVal;.      
0d40: 7d 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  } .      sqlite3
0d50: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
0d60: 6e 74 65 78 74 2c 20 69 56 61 6c 29 3b 0a 20 20  ntext, iVal);.  
0d70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0d80: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0d90: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
0da0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
0db0: 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ll(context);.   
0dc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
0dd0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
0de0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 56 61 6c       double rVal
0df0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
0e00: 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29  _double(argv[0])
0e10: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 56 61 6c  ;.      if( rVal
0e20: 3c 30 20 29 20 72 56 61 6c 20 3d 20 2d 72 56 61  <0 ) rVal = -rVa
0e30: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
0e40: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
0e50: 6f 6e 74 65 78 74 2c 20 72 56 61 6c 29 3b 0a 20  ontext, rVal);. 
0e60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0e70: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
0e80: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
0e90: 20 74 68 65 20 73 75 62 73 74 72 28 29 20 66 75   the substr() fu
0ea0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 73 75  nction..**.** su
0eb0: 62 73 74 72 28 78 2c 70 31 2c 70 32 29 20 20 72  bstr(x,p1,p2)  r
0ec0: 65 74 75 72 6e 73 20 70 32 20 63 68 61 72 61 63  eturns p2 charac
0ed0: 74 65 72 73 20 6f 66 20 78 5b 5d 20 62 65 67 69  ters of x[] begi
0ee0: 6e 6e 69 6e 67 20 77 69 74 68 20 70 31 2e 0a 2a  nning with p1..*
0ef0: 2a 20 70 31 20 69 73 20 31 2d 69 6e 64 65 78 65  * p1 is 1-indexe
0f00: 64 2e 20 20 53 6f 20 73 75 62 73 74 72 28 78 2c  d.  So substr(x,
0f10: 31 2c 31 29 20 72 65 74 75 72 6e 73 20 74 68 65  1,1) returns the
0f20: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
0f30: 0a 2a 2a 20 6f 66 20 78 2e 20 20 49 66 20 78 20  .** of x.  If x 
0f40: 69 73 20 74 65 78 74 2c 20 74 68 65 6e 20 77 65  is text, then we
0f50: 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 20   actually count 
0f60: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 73  UTF-8 characters
0f70: 2e 0a 2a 2a 20 49 66 20 78 20 69 73 20 61 20 62  ..** If x is a b
0f80: 6c 6f 62 2c 20 74 68 65 6e 20 77 65 20 63 6f 75  lob, then we cou
0f90: 6e 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt bytes..**.** 
0fa0: 49 66 20 70 31 20 69 73 20 6e 65 67 61 74 69 76  If p1 is negativ
0fb0: 65 2c 20 74 68 65 6e 20 77 65 20 62 65 67 69 6e  e, then we begin
0fc0: 20 61 62 73 28 70 31 29 20 66 72 6f 6d 20 74 68   abs(p1) from th
0fd0: 65 20 65 6e 64 20 6f 66 20 78 5b 5d 2e 0a 2a 2f  e end of x[]..*/
0fe0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
0ff0: 73 74 72 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  strFunc(.  sqlit
1000: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1010: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
1020: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1030: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
1040: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1050: 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73   *z;.  const uns
1060: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 32 3b 0a  igned char *z2;.
1070: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
1080: 20 70 30 74 79 70 65 3b 0a 20 20 69 36 34 20 70   p0type;.  i64 p
1090: 31 2c 20 70 32 3b 0a 20 20 69 6e 74 20 6e 65 67  1, p2;.  int neg
10a0: 50 32 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  P2 = 0;..  asser
10b0: 74 28 20 61 72 67 63 3d 3d 33 20 7c 7c 20 61 72  t( argc==3 || ar
10c0: 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 73  gc==2 );.  if( s
10d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
10e0: 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49  e(argv[1])==SQLI
10f0: 54 45 5f 4e 55 4c 4c 0a 20 20 20 7c 7c 20 28 61  TE_NULL.   || (a
1100: 72 67 63 3d 3d 33 20 26 26 20 73 71 6c 69 74 65  rgc==3 && sqlite
1110: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
1120: 76 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  v[2])==SQLITE_NU
1130: 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  LL).  ){.    ret
1140: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 30 74 79 70  urn;.  }.  p0typ
1150: 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
1160: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3b  e_type(argv[0]);
1170: 0a 20 20 69 66 28 20 70 30 74 79 70 65 3d 3d 53  .  if( p0type==S
1180: 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20  QLITE_BLOB ){.  
1190: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f    len = sqlite3_
11a0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
11b0: 5b 30 5d 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71  [0]);.    z = sq
11c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
11d0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
11e0: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
11f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 65  ;.    assert( le
1200: 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  n==sqlite3_value
1210: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 20  _bytes(argv[0]) 
1220: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1230: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
1240: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
1250: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
1260: 72 65 74 75 72 6e 3b 0a 20 20 20 20 6c 65 6e 20  return;.    len 
1270: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 7a 32 3d  = 0;.    for(z2=
1280: 7a 3b 20 2a 7a 32 3b 20 6c 65 6e 2b 2b 29 7b 0a  z; *z2; len++){.
1290: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
12a0: 50 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20 20 20  P_UTF8(z2);.    
12b0: 7d 0a 20 20 7d 0a 20 20 70 31 20 3d 20 73 71 6c  }.  }.  p1 = sql
12c0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
12d0: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 61  rgv[1]);.  if( a
12e0: 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20 70 32  rgc==3 ){.    p2
12f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1300: 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20  _int(argv[2]);. 
1310: 20 20 20 69 66 28 20 70 32 3c 30 20 29 7b 0a 20     if( p2<0 ){. 
1320: 20 20 20 20 20 70 32 20 3d 20 2d 70 32 3b 0a 20       p2 = -p2;. 
1330: 20 20 20 20 20 6e 65 67 50 32 20 3d 20 31 3b 0a       negP2 = 1;.
1340: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1350: 20 20 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f     p2 = sqlite3_
1360: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
1370: 65 28 63 6f 6e 74 65 78 74 29 2d 3e 61 4c 69 6d  e(context)->aLim
1380: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1390: 4c 45 4e 47 54 48 5d 3b 0a 20 20 7d 0a 20 20 69  LENGTH];.  }.  i
13a0: 66 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 70  f( p1<0 ){.    p
13b0: 31 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 69 66  1 += len;.    if
13c0: 28 20 70 31 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( p1<0 ){.      
13d0: 70 32 20 2b 3d 20 70 31 3b 0a 20 20 20 20 20 20  p2 += p1;.      
13e0: 69 66 28 20 70 32 3c 30 20 29 20 70 32 20 3d 20  if( p2<0 ) p2 = 
13f0: 30 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 30 3b  0;.      p1 = 0;
1400: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1410: 66 28 20 70 31 3e 30 20 29 7b 0a 20 20 20 20 70  f( p1>0 ){.    p
1420: 31 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  1--;.  }else if(
1430: 20 70 32 3e 30 20 29 7b 0a 20 20 20 20 70 32 2d   p2>0 ){.    p2-
1440: 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 67  -;.  }.  if( neg
1450: 50 32 20 29 7b 0a 20 20 20 20 70 31 20 2d 3d 20  P2 ){.    p1 -= 
1460: 70 32 3b 0a 20 20 20 20 69 66 28 20 70 31 3c 30  p2;.    if( p1<0
1470: 20 29 7b 0a 20 20 20 20 20 20 70 32 20 2b 3d 20   ){.      p2 += 
1480: 70 31 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 30  p1;.      p1 = 0
1490: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
14a0: 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
14b0: 32 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 31  2>=0 );.  if( p1
14c0: 2b 70 32 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 70  +p2>len ){.    p
14d0: 32 20 3d 20 6c 65 6e 2d 70 31 3b 0a 20 20 7d 0a  2 = len-p1;.  }.
14e0: 20 20 69 66 28 20 70 30 74 79 70 65 21 3d 53 51    if( p0type!=SQ
14f0: 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
1500: 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 70 31   while( *z && p1
1510: 20 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54 45   ){.      SQLITE
1520: 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20  _SKIP_UTF8(z);. 
1530: 20 20 20 20 20 70 31 2d 2d 3b 0a 20 20 20 20 7d       p1--;.    }
1540: 0a 20 20 20 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a  .    for(z2=z; *
1550: 7a 32 20 26 26 20 70 32 3b 20 70 32 2d 2d 29 7b  z2 && p2; p2--){
1560: 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b  .      SQLITE_SK
1570: 49 50 5f 55 54 46 38 28 7a 32 29 3b 0a 20 20 20  IP_UTF8(z2);.   
1580: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72   }.    sqlite3_r
1590: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
15a0: 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 28 69  xt, (char*)z, (i
15b0: 6e 74 29 28 7a 32 2d 7a 29 2c 20 53 51 4c 49 54  nt)(z2-z), SQLIT
15c0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
15d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
15e0: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
15f0: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 26  ontext, (char*)&
1600: 7a 5b 70 31 5d 2c 20 28 69 6e 74 29 70 32 2c 20  z[p1], (int)p2, 
1610: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
1620: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1630: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1640: 66 20 74 68 65 20 72 6f 75 6e 64 28 29 20 66 75  f the round() fu
1650: 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  nction.*/.static
1660: 20 76 6f 69 64 20 72 6f 75 6e 64 46 75 6e 63 28   void roundFunc(
1670: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1680: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
1690: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
16a0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74  e **argv){.  int
16b0: 20 6e 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65   n = 0;.  double
16c0: 20 72 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   r;.  char zBuf[
16d0: 35 30 30 5d 3b 20 20 2f 2a 20 6c 61 72 67 65 72  500];  /* larger
16e0: 20 74 68 61 6e 20 74 68 65 20 25 66 20 72 65 70   than the %f rep
16f0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
1700: 68 65 20 6c 61 72 67 65 73 74 20 64 6f 75 62 6c  he largest doubl
1710: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61  e */.  assert( a
1720: 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d  rgc==1 || argc==
1730: 32 20 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d  2 );.  if( argc=
1740: 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51  =2 ){.    if( SQ
1750: 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74  LITE_NULL==sqlit
1760: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
1770: 67 76 5b 31 5d 29 20 29 20 72 65 74 75 72 6e 3b  gv[1]) ) return;
1780: 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
1790: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
17a0: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 33  1]);.    if( n>3
17b0: 30 20 29 20 6e 20 3d 20 33 30 3b 0a 20 20 20 20  0 ) n = 30;.    
17c0: 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 30 3b  if( n<0 ) n = 0;
17d0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
17e0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
17f0: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
1800: 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ULL ) return;.  
1810: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
1820: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d  e_double(argv[0]
1830: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
1840: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
1850: 66 29 2c 7a 42 75 66 2c 22 25 2e 2a 66 22 2c 6e  f),zBuf,"%.*f",n
1860: 2c 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 41 74  ,r);.  sqlite3At
1870: 6f 46 28 7a 42 75 66 2c 20 26 72 29 3b 0a 20 20  oF(zBuf, &r);.  
1880: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
1890: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72  ouble(context, r
18a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
18b0: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
18c0: 20 6f 66 20 73 70 61 63 65 20 75 73 69 6e 67 20   of space using 
18d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
18e0: 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f  . If the.** allo
18f0: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 63 61  cation fails, ca
1900: 6c 6c 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ll sqlite3_resul
1910: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 29 20  t_error_nomem() 
1920: 74 6f 20 6e 6f 74 69 66 79 0a 2a 2a 20 74 68 65  to notify.** the
1930: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1940: 20 74 68 61 74 20 6d 61 6c 6c 6f 63 28 29 20 68   that malloc() h
1950: 61 73 20 66 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74  as failed..*/.st
1960: 61 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 74 65  atic void *conte
1970: 78 74 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33  xtMalloc(sqlite3
1980: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1990: 74 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  t, i64 nByte){. 
19a0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
19b0: 6e 42 79 74 65 3e 73 71 6c 69 74 65 33 5f 63 6f  nByte>sqlite3_co
19c0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
19d0: 63 6f 6e 74 65 78 74 29 2d 3e 61 4c 69 6d 69 74  context)->aLimit
19e0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
19f0: 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c  NGTH] ){.    sql
1a00: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
1a10: 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74  r_toobig(context
1a20: 29 3b 0a 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20  );.    z = 0;.  
1a30: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
1a40: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e  qlite3Malloc((in
1a50: 74 29 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  t)nByte);.    if
1a60: 28 20 21 7a 20 26 26 20 6e 42 79 74 65 3e 30 20  ( !z && nByte>0 
1a70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a80: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
1a90: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
1aa0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ab0: 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70   z;.}../*.** Imp
1ac0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1ad0: 68 65 20 75 70 70 65 72 28 29 20 61 6e 64 20 6c  he upper() and l
1ae0: 6f 77 65 72 28 29 20 53 51 4c 20 66 75 6e 63 74  ower() SQL funct
1af0: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
1b00: 76 6f 69 64 20 75 70 70 65 72 46 75 6e 63 28 73  void upperFunc(s
1b10: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1b20: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
1b30: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
1b40: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72   **argv){.  char
1b50: 20 2a 7a 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *z1;.  const ch
1b60: 61 72 20 2a 7a 32 3b 0a 20 20 69 6e 74 20 69 2c  ar *z2;.  int i,
1b70: 20 6e 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31   n;.  if( argc<1
1b80: 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d   || SQLITE_NULL=
1b90: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
1ba0: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20 72  ype(argv[0]) ) r
1bb0: 65 74 75 72 6e 3b 0a 20 20 7a 32 20 3d 20 28 63  eturn;.  z2 = (c
1bc0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1bd0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
1be0: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  n = sqlite3_
1bf0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
1c00: 5b 30 5d 29 3b 0a 20 20 2f 2a 20 56 65 72 69 66  [0]);.  /* Verif
1c10: 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  y that the call 
1c20: 74 6f 20 5f 62 79 74 65 73 28 29 20 64 6f 65 73  to _bytes() does
1c30: 20 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20   not invalidate 
1c40: 74 68 65 20 5f 74 65 78 74 28 29 20 70 6f 69 6e  the _text() poin
1c50: 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ter */.  assert(
1c60: 20 7a 32 3d 3d 28 63 68 61 72 2a 29 73 71 6c 69   z2==(char*)sqli
1c70: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1c80: 72 67 76 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  rgv[0]) );.  if(
1c90: 20 7a 32 20 29 7b 0a 20 20 20 20 7a 31 20 3d 20   z2 ){.    z1 = 
1ca0: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
1cb0: 6e 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29 2b  ntext, ((i64)n)+
1cc0: 31 29 3b 0a 20 20 20 20 69 66 28 20 7a 31 20 29  1);.    if( z1 )
1cd0: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  {.      memcpy(z
1ce0: 31 2c 20 7a 32 2c 20 6e 2b 31 29 3b 0a 20 20 20  1, z2, n+1);.   
1cf0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 31 5b 69     for(i=0; z1[i
1d00: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
1d10: 20 7a 31 5b 69 5d 20 3d 20 28 63 68 61 72 29 73   z1[i] = (char)s
1d20: 71 6c 69 74 65 33 54 6f 75 70 70 65 72 28 7a 31  qlite3Toupper(z1
1d30: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
1d40: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1d50: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
1d60: 20 7a 31 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33   z1, -1, sqlite3
1d70: 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _free);.    }.  
1d80: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1d90: 6c 6f 77 65 72 46 75 6e 63 28 73 71 6c 69 74 65  lowerFunc(sqlite
1da0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
1db0: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
1dc0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1dd0: 67 76 29 7b 0a 20 20 75 38 20 2a 7a 31 3b 0a 20  gv){.  u8 *z1;. 
1de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b   const char *z2;
1df0: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
1e00: 66 28 20 61 72 67 63 3c 31 20 7c 7c 20 53 51 4c  f( argc<1 || SQL
1e10: 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65  ITE_NULL==sqlite
1e20: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
1e30: 76 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 3b 0a  v[0]) ) return;.
1e40: 20 20 7a 32 20 3d 20 28 63 68 61 72 2a 29 73 71    z2 = (char*)sq
1e50: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1e60: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d  (argv[0]);.  n =
1e70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
1e80: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
1e90: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1ea0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f 62 79 74  the call to _byt
1eb0: 65 73 28 29 20 64 6f 65 73 20 6e 6f 74 20 69 6e  es() does not in
1ec0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 5f 74 65  validate the _te
1ed0: 78 74 28 29 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  xt() pointer */.
1ee0: 20 20 61 73 73 65 72 74 28 20 7a 32 3d 3d 28 63    assert( z2==(c
1ef0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1f00: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
1f10: 20 29 3b 0a 20 20 69 66 28 20 7a 32 20 29 7b 0a   );.  if( z2 ){.
1f20: 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74 65 78 74      z1 = context
1f30: 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20  Malloc(context, 
1f40: 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a 20 20 20  ((i64)n)+1);.   
1f50: 20 69 66 28 20 7a 31 20 29 7b 0a 20 20 20 20 20   if( z1 ){.     
1f60: 20 6d 65 6d 63 70 79 28 7a 31 2c 20 7a 32 2c 20   memcpy(z1, z2, 
1f70: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  n+1);.      for(
1f80: 69 3d 30 3b 20 7a 31 5b 69 5d 3b 20 69 2b 2b 29  i=0; z1[i]; i++)
1f90: 7b 0a 20 20 20 20 20 20 20 20 7a 31 5b 69 5d 20  {.        z1[i] 
1fa0: 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72  = sqlite3Tolower
1fb0: 28 7a 31 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  (z1[i]);.      }
1fc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
1fd0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
1fe0: 78 74 2c 20 28 63 68 61 72 20 2a 29 7a 31 2c 20  xt, (char *)z1, 
1ff0: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
2000: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
2010: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
2020: 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 46 4e 55  tion of the IFNU
2030: 4c 4c 28 29 2c 20 4e 56 4c 28 29 2c 20 61 6e 64  LL(), NVL(), and
2040: 20 43 4f 41 4c 45 53 43 45 28 29 20 66 75 6e 63   COALESCE() func
2050: 74 69 6f 6e 73 2e 20 20 0a 2a 2a 20 41 6c 6c 20  tions.  .** All 
2060: 74 68 72 65 65 20 64 6f 20 74 68 65 20 73 61 6d  three do the sam
2070: 65 20 74 68 69 6e 67 2e 20 20 54 68 65 79 20 72  e thing.  They r
2080: 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
2090: 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 61 72 67 75  non-NULL.** argu
20a0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
20b0: 76 6f 69 64 20 69 66 6e 75 6c 6c 46 75 6e 63 28  void ifnullFunc(
20c0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
20d0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
20e0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
20f0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
2100: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
2110: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
2120: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  ++){.    if( SQL
2130: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
2140: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
2150: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 73  v[i]) ){.      s
2160: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
2170: 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  lue(context, arg
2180: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  v[i]);.      bre
2190: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
21a0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
21b0: 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d 28  ation of random(
21c0: 29 2e 20 20 52 65 74 75 72 6e 20 61 20 72 61 6e  ).  Return a ran
21d0: 64 6f 6d 20 69 6e 74 65 67 65 72 2e 20 20 0a 2a  dom integer.  .*
21e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61  /.static void ra
21f0: 6e 64 6f 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69  ndomFunc(.  sqli
2200: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
2210: 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55  text,.  int NotU
2220: 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  sed,.  sqlite3_v
2230: 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a  alue **NotUsed2.
2240: 29 7b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  ){.  sqlite_int6
2250: 34 20 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  4 r;.  UNUSED_PA
2260: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
2270: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 73  , NotUsed2);.  s
2280: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
2290: 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29  s(sizeof(r), &r)
22a0: 3b 0a 20 20 69 66 28 20 28 72 3c 3c 31 29 3d 3d  ;.  if( (r<<1)==
22b0: 30 20 29 20 72 20 3d 20 30 3b 20 20 2f 2a 20 50  0 ) r = 0;  /* P
22c0: 72 65 76 65 6e 74 20 30 78 38 30 30 30 2e 2e 2e  revent 0x8000...
22d0: 2e 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  . as the result 
22e0: 73 6f 20 74 68 61 74 20 77 65 20 2a 2f 0a 20 20  so that we */.  
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 20 20 20 2f 2a 20 63 61 6e 20 61          /* can a
2310: 6c 77 61 79 73 20 64 6f 20 61 62 73 28 29 20 6f  lways do abs() o
2320: 66 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  f the result */.
2330: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2340: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
2350: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  r);.}../*.** Imp
2360: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72  lementation of r
2370: 61 6e 64 6f 6d 62 6c 6f 62 28 4e 29 2e 20 20 52  andomblob(N).  R
2380: 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 62  eturn a random b
2390: 6c 6f 62 0a 2a 2a 20 74 68 61 74 20 69 73 20 4e  lob.** that is N
23a0: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a   bytes long..*/.
23b0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64  static void rand
23c0: 6f 6d 42 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65  omBlob(.  sqlite
23d0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
23e0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
23f0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2400: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
2410: 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  n;.  unsigned ch
2420: 61 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  ar *p;.  assert(
2430: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e   argc==1 );.  UN
2440: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
2450: 72 67 63 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  rgc);.  n = sqli
2460: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
2470: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3c  gv[0]);.  if( n<
2480: 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 31 3b 0a  1 ){.    n = 1;.
2490: 20 20 7d 0a 20 20 70 20 3d 20 63 6f 6e 74 65 78    }.  p = contex
24a0: 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c  tMalloc(context,
24b0: 20 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   n);.  if( p ){.
24c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
24d0: 6f 6d 6e 65 73 73 28 6e 2c 20 70 29 3b 0a 20 20  omness(n, p);.  
24e0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
24f0: 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28  _blob(context, (
2500: 63 68 61 72 2a 29 70 2c 20 6e 2c 20 73 71 6c 69  char*)p, n, sqli
2510: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d  te3_free);.  }.}
2520: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2530: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
2540: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
2550: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
2560: 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76   The return.** v
2570: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
2580: 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f   as the sqlite3_
2590: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
25a0: 64 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  d() API function
25b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25c0: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
25d0: 69 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  id(.  sqlite3_co
25e0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
25f0: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20  .  int NotUsed, 
2600: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2610: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
2620: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
2630: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
2640: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
2650: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2660: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
2670: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c  NotUsed2);.  sql
2680: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
2690: 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  4(context, sqlit
26a0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
26b0: 6f 77 69 64 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a  owid(db));.}../*
26c0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
26d0: 6f 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  on of the change
26e0: 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  s() SQL function
26f0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
2700: 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61  lue is the.** sa
2710: 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  me as the sqlite
2720: 33 5f 63 68 61 6e 67 65 73 28 29 20 41 50 49 20  3_changes() API 
2730: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2740: 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 73  tic void changes
2750: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
2760: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
2770: 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73  int NotUsed,.  s
2780: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e  qlite3_value **N
2790: 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c  otUsed2.){.  sql
27a0: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
27b0: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
27c0: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
27d0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
27e0: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
27f0: 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  sed2);.  sqlite3
2800: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
2810: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61  ext, sqlite3_cha
2820: 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a  nges(db));.}../*
2830: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2840: 6f 6e 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 5f  on of the total_
2850: 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20 66 75  changes() SQL fu
2860: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72 65 74  nction.  The ret
2870: 75 72 6e 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  urn value is.** 
2880: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
2890: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
28a0: 61 6e 67 65 73 28 29 20 41 50 49 20 66 75 6e 63  anges() API func
28b0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
28c0: 76 6f 69 64 20 74 6f 74 61 6c 5f 63 68 61 6e 67  void total_chang
28d0: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  es(.  sqlite3_co
28e0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
28f0: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
2900: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2910: 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73  *NotUsed2.){.  s
2920: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
2930: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
2940: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
2950: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2960: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
2970: 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74  tUsed2);.  sqlit
2980: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
2990: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 74  ntext, sqlite3_t
29a0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 64 62 29  otal_changes(db)
29b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  );.}../*.** A st
29c0: 72 75 63 74 75 72 65 20 64 65 66 69 6e 69 6e 67  ructure defining
29d0: 20 68 6f 77 20 74 6f 20 64 6f 20 47 4c 4f 42 2d   how to do GLOB-
29e0: 73 74 79 6c 65 20 63 6f 6d 70 61 72 69 73 6f 6e  style comparison
29f0: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6d  s..*/.struct com
2a00: 70 61 72 65 49 6e 66 6f 20 7b 0a 20 20 75 38 20  pareInfo {.  u8 
2a10: 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d  matchAll;.  u8 m
2a20: 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61  atchOne;.  u8 ma
2a30: 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f 43  tchSet;.  u8 noC
2a40: 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46  ase;.};../*.** F
2a50: 6f 72 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  or LIKE and GLOB
2a60: 20 6d 61 74 63 68 69 6e 67 20 6f 6e 20 45 42 43   matching on EBC
2a70: 44 49 43 20 6d 61 63 68 69 6e 65 73 2c 20 61 73  DIC machines, as
2a80: 73 75 6d 65 20 74 68 61 74 20 65 76 65 72 79 0a  sume that every.
2a90: 2a 2a 20 63 68 61 72 61 63 74 65 72 20 69 73 20  ** character is 
2aa0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 62 79 74 65  exactly one byte
2ab0: 20 69 6e 20 73 69 7a 65 2e 20 20 41 6c 73 6f 2c   in size.  Also,
2ac0: 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
2ad0: 61 72 65 0a 2a 2a 20 61 62 6c 65 20 74 6f 20 70  are.** able to p
2ae0: 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 75 70  articipate in up
2af0: 70 65 72 2d 63 61 73 65 2d 74 6f 2d 6c 6f 77 65  per-case-to-lowe
2b00: 72 2d 63 61 73 65 20 6d 61 70 70 69 6e 67 73 20  r-case mappings 
2b10: 69 6e 20 45 42 43 44 49 43 0a 2a 2a 20 77 68 65  in EBCDIC.** whe
2b20: 72 65 61 73 20 6f 6e 6c 79 20 63 68 61 72 61 63  reas only charac
2b30: 74 65 72 73 20 6c 65 73 73 20 74 68 61 6e 20 30  ters less than 0
2b40: 78 38 30 20 64 6f 20 69 6e 20 41 53 43 49 49 2e  x80 do in ASCII.
2b50: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
2b60: 53 51 4c 49 54 45 5f 45 42 43 44 49 43 29 0a 23  SQLITE_EBCDIC).#
2b70: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 55   define sqlite3U
2b80: 74 66 38 52 65 61 64 28 41 2c 42 2c 43 29 20 20  tf8Read(A,B,C)  
2b90: 28 2a 28 41 2b 2b 29 29 0a 23 20 64 65 66 69 6e  (*(A++)).# defin
2ba0: 65 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77  e GlogUpperToLow
2bb0: 65 72 28 41 29 20 20 20 20 20 41 20 3d 20 73 71  er(A)     A = sq
2bc0: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
2bd0: 72 5b 41 5d 0a 23 65 6c 73 65 0a 23 20 64 65 66  r[A].#else.# def
2be0: 69 6e 65 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c  ine GlogUpperToL
2bf0: 6f 77 65 72 28 41 29 20 20 20 20 20 69 66 28 20  ower(A)     if( 
2c00: 41 3c 30 78 38 30 20 29 7b 20 41 20 3d 20 73 71  A<0x80 ){ A = sq
2c10: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
2c20: 72 5b 41 5d 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a  r[A]; }.#endif..
2c30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2c40: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
2c50: 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b 20 27 2a 27  globInfo = { '*'
2c60: 2c 20 27 3f 27 2c 20 27 5b 27 2c 20 30 20 7d 3b  , '?', '[', 0 };
2c70: 0a 2f 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20  ./* The correct 
2c80: 53 51 4c 2d 39 32 20 62 65 68 61 76 69 6f 72 20  SQL-92 behavior 
2c90: 69 73 20 66 6f 72 20 74 68 65 20 4c 49 4b 45 20  is for the LIKE 
2ca0: 6f 70 65 72 61 74 6f 72 20 74 6f 20 69 67 6e 6f  operator to igno
2cb0: 72 65 0a 2a 2a 20 63 61 73 65 2e 20 20 54 68 75  re.** case.  Thu
2cc0: 73 20 20 27 61 27 20 4c 49 4b 45 20 27 41 27 20  s  'a' LIKE 'A' 
2cd0: 77 6f 75 6c 64 20 62 65 20 74 72 75 65 2e 20 2a  would be true. *
2ce0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2cf0: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
2d00: 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 20 3d  o likeInfoNorm =
2d10: 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20 30   { '%', '_',   0
2d20: 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66 20 53 51 4c  , 1 };./* If SQL
2d30: 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49 54 49  ITE_CASE_SENSITI
2d40: 56 45 5f 4c 49 4b 45 20 69 73 20 64 65 66 69 6e  VE_LIKE is defin
2d50: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 4c 49 4b  ed, then the LIK
2d60: 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  E operator.** is
2d70: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 20   case sensitive 
2d80: 63 61 75 73 69 6e 67 20 27 61 27 20 4c 49 4b 45  causing 'a' LIKE
2d90: 20 27 41 27 20 74 6f 20 62 65 20 66 61 6c 73 65   'A' to be false
2da0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
2db0: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
2dc0: 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 41 6c 74 20  nfo likeInfoAlt 
2dd0: 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20 20  = { '%', '_',   
2de0: 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  0, 0 };../*.** C
2df0: 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d 38  ompare two UTF-8
2e00: 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75   strings for equ
2e10: 61 6c 69 74 79 20 77 68 65 72 65 20 74 68 65 20  ality where the 
2e20: 66 69 72 73 74 20 73 74 72 69 6e 67 20 63 61 6e  first string can
2e30: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
2e40: 62 65 20 61 20 22 67 6c 6f 62 22 20 65 78 70 72  be a "glob" expr
2e50: 65 73 73 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ession.  Return 
2e60: 74 72 75 65 20 28 31 29 20 69 66 20 74 68 65 79  true (1) if they
2e70: 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
2e80: 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69   and false (0) i
2e90: 66 20 74 68 65 79 20 61 72 65 20 64 69 66 66 65  f they are diffe
2ea0: 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62  rent..**.** Glob
2eb0: 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  bing rules:.**.*
2ec0: 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20  *      '*'      
2ed0: 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
2ee0: 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72  uence of zero or
2ef0: 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73   more characters
2f00: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27  ..**.**      '?'
2f10: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65         Matches e
2f20: 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61  xactly one chara
2f30: 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  cter..**.**     
2f40: 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68  [...]      Match
2f50: 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
2f60: 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73   from the enclos
2f70: 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20  ed list of.**   
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
2f90: 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
2fa0: 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61     [^...]     Ma
2fb0: 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
2fc0: 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65  ter not in the e
2fd0: 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  nclosed list..**
2fe0: 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 5b 2e 2e  .** With the [..
2ff0: 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61  .] and [^...] ma
3000: 74 63 68 69 6e 67 2c 20 61 20 27 5d 27 20 63 68  tching, a ']' ch
3010: 61 72 61 63 74 65 72 20 63 61 6e 20 62 65 20 69  aracter can be i
3020: 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68  ncluded.** in th
3030: 65 20 6c 69 73 74 20 62 79 20 6d 61 6b 69 6e 67  e list by making
3040: 20 69 74 20 74 68 65 20 66 69 72 73 74 20 63 68   it the first ch
3050: 61 72 61 63 74 65 72 20 61 66 74 65 72 20 27 5b  aracter after '[
3060: 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a 2a 2a 20  ' or '^'.  A.** 
3070: 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61 63 74  range of charact
3080: 65 72 73 20 63 61 6e 20 62 65 20 73 70 65 63 69  ers can be speci
3090: 66 69 65 64 20 75 73 69 6e 67 20 27 2d 27 2e 20  fied using '-'. 
30a0: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61   Example:.** "[a
30b0: 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20 61 6e 79  -z]" matches any
30c0: 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72 2d 63 61   single lower-ca
30d0: 73 65 20 6c 65 74 74 65 72 2e 20 20 54 6f 20 6d  se letter.  To m
30e0: 61 74 63 68 20 61 20 27 2d 27 2c 20 6d 61 6b 65  atch a '-', make
30f0: 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61 73 74 20  .** it the last 
3100: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65  character in the
3110: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   list..**.** Thi
3120: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 75  s routine is usu
3130: 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75 74 20  ally quick, but 
3140: 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e 20 74  can be N**2 in t
3150: 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e 0a 2a  he worst case..*
3160: 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20 74 6f 20 6d  *.** Hints: to m
3170: 61 74 63 68 20 27 2a 27 20 6f 72 20 27 3f 27 2c  atch '*' or '?',
3180: 20 70 75 74 20 74 68 65 6d 20 69 6e 20 22 5b 5d   put them in "[]
3190: 22 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  ".  Like this:.*
31a0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 62 63  *.**         abc
31b0: 5b 2a 5d 78 79 7a 20 20 20 20 20 20 20 20 4d 61  [*]xyz        Ma
31c0: 74 63 68 65 73 20 22 61 62 63 2a 78 79 7a 22 20  tches "abc*xyz" 
31d0: 6f 6e 6c 79 0a 2a 2f 0a 73 74 61 74 69 63 20 69  only.*/.static i
31e0: 6e 74 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72  nt patternCompar
31f0: 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  e(.  const u8 *z
3200: 50 61 74 74 65 72 6e 2c 20 20 20 20 20 20 20 20  Pattern,        
3210: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 6c 6f        /* The glo
3220: 62 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63  b pattern */.  c
3230: 6f 6e 73 74 20 75 38 20 2a 7a 53 74 72 69 6e 67  onst u8 *zString
3240: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3250: 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 20 74 6f  /* The string to
3260: 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
3270: 20 74 68 65 20 67 6c 6f 62 20 2a 2f 0a 20 20 63   the glob */.  c
3280: 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70  onst struct comp
3290: 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 2c 20  areInfo *pInfo, 
32a0: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
32b0: 62 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f 20 74  bout how to do t
32c0: 68 65 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  he compare */.  
32d0: 63 6f 6e 73 74 20 69 6e 74 20 65 73 63 20 20 20  const int esc   
32e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f0: 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63   /* The escape c
3300: 68 61 72 61 63 74 65 72 20 2a 2f 0a 29 7b 0a 20  haracter */.){. 
3310: 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e   int c, c2;.  in
3320: 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20  t invert;.  int 
3330: 73 65 65 6e 3b 0a 20 20 75 38 20 6d 61 74 63 68  seen;.  u8 match
3340: 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74  One = pInfo->mat
3350: 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61 74 63  chOne;.  u8 matc
3360: 68 41 6c 6c 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61  hAll = pInfo->ma
3370: 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d 61 74  tchAll;.  u8 mat
3380: 63 68 53 65 74 20 3d 20 70 49 6e 66 6f 2d 3e 6d  chSet = pInfo->m
3390: 61 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f  atchSet;.  u8 no
33a0: 43 61 73 65 20 3d 20 70 49 6e 66 6f 2d 3e 6e 6f  Case = pInfo->no
33b0: 43 61 73 65 3b 20 0a 20 20 69 6e 74 20 70 72 65  Case; .  int pre
33c0: 76 45 73 63 61 70 65 20 3d 20 30 3b 20 20 20 20  vEscape = 0;    
33d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
33e0: 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  previous charact
33f0: 65 72 20 77 61 73 20 27 65 73 63 61 70 65 27 20  er was 'escape' 
3400: 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20  */..  while( (c 
3410: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
3420: 64 28 7a 50 61 74 74 65 72 6e 2c 30 2c 26 7a 50  d(zPattern,0,&zP
3430: 61 74 74 65 72 6e 29 29 21 3d 30 20 29 7b 0a 20  attern))!=0 ){. 
3440: 20 20 20 69 66 28 20 21 70 72 65 76 45 73 63 61     if( !prevEsca
3450: 70 65 20 26 26 20 63 3d 3d 6d 61 74 63 68 41 6c  pe && c==matchAl
3460: 6c 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  l ){.      while
3470: 28 20 28 63 3d 73 71 6c 69 74 65 33 55 74 66 38  ( (c=sqlite3Utf8
3480: 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 30 2c  Read(zPattern,0,
3490: 26 7a 50 61 74 74 65 72 6e 29 29 20 3d 3d 20 6d  &zPattern)) == m
34a0: 61 74 63 68 41 6c 6c 0a 20 20 20 20 20 20 20 20  atchAll.        
34b0: 20 20 20 20 20 20 20 7c 7c 20 63 20 3d 3d 20 6d         || c == m
34c0: 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20  atchOne ){.     
34d0: 20 20 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f     if( c==matchO
34e0: 6e 65 20 26 26 20 73 71 6c 69 74 65 33 55 74 66  ne && sqlite3Utf
34f0: 38 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 20 30  8Read(zString, 0
3500: 2c 20 26 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29  , &zString)==0 )
3510: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
3520: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
3530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3540: 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
3550: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3560: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 65    }else if( c==e
3570: 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  sc ){.        c 
3580: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
3590: 64 28 7a 50 61 74 74 65 72 6e 2c 20 30 2c 20 26  d(zPattern, 0, &
35a0: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
35b0: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
35c0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
35d0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
35e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
35f0: 6d 61 74 63 68 53 65 74 20 29 7b 0a 20 20 20 20  matchSet ){.    
3600: 20 20 20 20 61 73 73 65 72 74 28 20 65 73 63 3d      assert( esc=
3610: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  =0 );         /*
3620: 20 54 68 69 73 20 69 73 20 47 4c 4f 42 2c 20 6e   This is GLOB, n
3630: 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20 20 20 20 20  ot LIKE */.     
3640: 20 20 20 61 73 73 65 72 74 28 20 6d 61 74 63 68     assert( match
3650: 53 65 74 3c 30 78 38 30 20 29 3b 20 20 2f 2a 20  Set<0x80 );  /* 
3660: 27 5b 27 20 69 73 20 61 20 73 69 6e 67 6c 65 2d  '[' is a single-
3670: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 2a  byte character *
3680: 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  /.        while(
3690: 20 2a 7a 53 74 72 69 6e 67 20 26 26 20 70 61 74   *zString && pat
36a0: 74 65 72 6e 43 6f 6d 70 61 72 65 28 26 7a 50 61  ternCompare(&zPa
36b0: 74 74 65 72 6e 5b 2d 31 5d 2c 7a 53 74 72 69 6e  ttern[-1],zStrin
36c0: 67 2c 70 49 6e 66 6f 2c 65 73 63 29 3d 3d 30 20  g,pInfo,esc)==0 
36d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  ){.          SQL
36e0: 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 53  ITE_SKIP_UTF8(zS
36f0: 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  tring);.        
3700: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
3710: 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b 0a 20 20   *zString!=0;.  
3720: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
3730: 65 28 20 28 63 32 20 3d 20 73 71 6c 69 74 65 33  e( (c2 = sqlite3
3740: 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67  Utf8Read(zString
3750: 2c 30 2c 26 7a 53 74 72 69 6e 67 29 29 21 3d 30  ,0,&zString))!=0
3760: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
3770: 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20  noCase ){.      
3780: 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c      GlogUpperToL
3790: 6f 77 65 72 28 63 32 29 3b 0a 20 20 20 20 20 20  ower(c2);.      
37a0: 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c      GlogUpperToL
37b0: 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 20 20 20  ower(c);.       
37c0: 20 20 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20     while( c2 != 
37d0: 30 20 26 26 20 63 32 20 21 3d 20 63 20 29 7b 0a  0 && c2 != c ){.
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 63 32 20 3d              c2 =
37f0: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
3800: 28 7a 53 74 72 69 6e 67 2c 20 30 2c 20 26 7a 53  (zString, 0, &zS
3810: 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  tring);.        
3820: 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c      GlogUpperToL
3830: 6f 77 65 72 28 63 32 29 3b 0a 20 20 20 20 20 20  ower(c2);.      
3840: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
3850: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
3860: 68 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26  hile( c2 != 0 &&
3870: 20 63 32 20 21 3d 20 63 20 29 7b 0a 20 20 20 20   c2 != c ){.    
3880: 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c          c2 = sql
3890: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 53 74  ite3Utf8Read(zSt
38a0: 72 69 6e 67 2c 20 30 2c 20 26 7a 53 74 72 69 6e  ring, 0, &zStrin
38b0: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
38c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38d0: 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65    if( c2==0 ) re
38e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
38f0: 69 66 28 20 70 61 74 74 65 72 6e 43 6f 6d 70 61  if( patternCompa
3900: 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a 53 74 72  re(zPattern,zStr
3910: 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63 29 20 29  ing,pInfo,esc) )
3920: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
3930: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
3940: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
3950: 20 21 70 72 65 76 45 73 63 61 70 65 20 26 26 20   !prevEscape && 
3960: 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20  c==matchOne ){. 
3970: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3980: 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67  Utf8Read(zString
3990: 2c 20 30 2c 20 26 7a 53 74 72 69 6e 67 29 3d 3d  , 0, &zString)==
39a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
39b0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
39c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
39d0: 6d 61 74 63 68 53 65 74 20 29 7b 0a 20 20 20 20  matchSet ){.    
39e0: 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20    int prior_c = 
39f0: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
3a00: 20 65 73 63 3d 3d 30 20 29 3b 20 20 20 20 2f 2a   esc==0 );    /*
3a10: 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72   This only occur
3a20: 73 20 66 6f 72 20 47 4c 4f 42 2c 20 6e 6f 74 20  s for GLOB, not 
3a30: 4c 49 4b 45 20 2a 2f 0a 20 20 20 20 20 20 73 65  LIKE */.      se
3a40: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  en = 0;.      in
3a50: 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vert = 0;.      
3a60: 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  c = sqlite3Utf8R
3a70: 65 61 64 28 7a 53 74 72 69 6e 67 2c 20 30 2c 20  ead(zString, 0, 
3a80: 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20  &zString);.     
3a90: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
3aa0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 63 32 20 3d  rn 0;.      c2 =
3ab0: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
3ac0: 28 7a 50 61 74 74 65 72 6e 2c 20 30 2c 20 26 7a  (zPattern, 0, &z
3ad0: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
3ae0: 69 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20  if( c2=='^' ){. 
3af0: 20 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20         invert = 
3b00: 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20  1;.        c2 = 
3b10: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
3b20: 7a 50 61 74 74 65 72 6e 2c 20 30 2c 20 26 7a 50  zPattern, 0, &zP
3b30: 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 7d  attern);.      }
3b40: 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27  .      if( c2=='
3b50: 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]' ){.        if
3b60: 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20  ( c==']' ) seen 
3b70: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20  = 1;.        c2 
3b80: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
3b90: 64 28 7a 50 61 74 74 65 72 6e 2c 20 30 2c 20 26  d(zPattern, 0, &
3ba0: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
3bb0: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
3bc0: 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b  c2 && c2!=']' ){
3bd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d  .        if( c2=
3be0: 3d 27 2d 27 20 26 26 20 7a 50 61 74 74 65 72 6e  ='-' && zPattern
3bf0: 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 50 61 74  [0]!=']' && zPat
3c00: 74 65 72 6e 5b 30 5d 21 3d 30 20 26 26 20 70 72  tern[0]!=0 && pr
3c10: 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20  ior_c>0 ){.     
3c20: 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65       c2 = sqlite
3c30: 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74 65  3Utf8Read(zPatte
3c40: 72 6e 2c 20 30 2c 20 26 7a 50 61 74 74 65 72 6e  rn, 0, &zPattern
3c50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
3c60: 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63   c>=prior_c && c
3c70: 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b  <=c2 ) seen = 1;
3c80: 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72  .          prior
3c90: 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  _c = 0;.        
3ca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3cb0: 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20   if( c==c2 ){.  
3cc0: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d            seen =
3cd0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
3ce0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
3cf0: 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20  c = c2;.        
3d00: 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 73  }.        c2 = s
3d10: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a  qlite3Utf8Read(z
3d20: 50 61 74 74 65 72 6e 2c 20 30 2c 20 26 7a 50 61  Pattern, 0, &zPa
3d30: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ttern);.      }.
3d40: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
3d50: 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72  || (seen ^ inver
3d60: 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
3d70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
3d80: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
3d90: 20 65 73 63 3d 3d 63 20 26 26 20 21 70 72 65 76   esc==c && !prev
3da0: 45 73 63 61 70 65 20 29 7b 0a 20 20 20 20 20 20  Escape ){.      
3db0: 70 72 65 76 45 73 63 61 70 65 20 3d 20 31 3b 0a  prevEscape = 1;.
3dc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3dd0: 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66   c2 = sqlite3Utf
3de0: 38 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 20 30  8Read(zString, 0
3df0: 2c 20 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  , &zString);.   
3e00: 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b     if( noCase ){
3e10: 0a 20 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70  .        GlogUpp
3e20: 65 72 54 6f 4c 6f 77 65 72 28 63 29 3b 0a 20 20  erToLower(c);.  
3e30: 20 20 20 20 20 20 47 6c 6f 67 55 70 70 65 72 54        GlogUpperT
3e40: 6f 4c 6f 77 65 72 28 63 32 29 3b 0a 20 20 20 20  oLower(c2);.    
3e50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 21    }.      if( c!
3e60: 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =c2 ){.        r
3e70: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
3e80: 0a 20 20 20 20 20 20 70 72 65 76 45 73 63 61 70  .      prevEscap
3e90: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
3ea0: 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69  .  return *zStri
3eb0: 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ng==0;.}../*.** 
3ec0: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
3ed0: 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 74   of times that t
3ee0: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
3ef0: 20 28 6f 72 20 47 4c 4f 42 20 77 68 69 63 68 20   (or GLOB which 
3f00: 69 73 0a 2a 2a 20 6a 75 73 74 20 61 20 76 61 72  is.** just a var
3f10: 69 61 74 69 6f 6e 20 6f 66 20 4c 49 4b 45 29 20  iation of LIKE) 
3f20: 67 65 74 73 20 63 61 6c 6c 65 64 2e 20 20 54 68  gets called.  Th
3f30: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
3f40: 65 73 74 69 6e 67 0a 2a 2a 20 6f 6e 6c 79 2e 0a  esting.** only..
3f50: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3f60: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
3f70: 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 3d 20 30  3_like_count = 0
3f80: 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ;.#endif.../*.**
3f90: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
3fa0: 6f 66 20 74 68 65 20 6c 69 6b 65 28 29 20 53 51  of the like() SQ
3fb0: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  L function.  Thi
3fc0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  s function imple
3fd0: 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 62 75 69  ments.** the bui
3fe0: 6c 64 2d 69 6e 20 4c 49 4b 45 20 6f 70 65 72 61  ld-in LIKE opera
3ff0: 74 6f 72 2e 20 20 54 68 65 20 66 69 72 73 74 20  tor.  The first 
4000: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
4010: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 0a  function is the.
4020: 2a 2a 20 70 61 74 74 65 72 6e 20 61 6e 64 20 74  ** pattern and t
4030: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4040: 6e 74 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  nt is the string
4050: 2e 20 20 53 6f 2c 20 74 68 65 20 53 51 4c 20 73  .  So, the SQL s
4060: 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a  tatements:.**.**
4070: 20 20 20 20 20 20 20 41 20 4c 49 4b 45 20 42 0a         A LIKE B.
4080: 2a 2a 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65  **.** is impleme
4090: 6e 74 65 64 20 61 73 20 6c 69 6b 65 28 42 2c 41  nted as like(B,A
40a0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 61  )..**.** This sa
40b0: 6d 65 20 66 75 6e 63 74 69 6f 6e 20 28 77 69 74  me function (wit
40c0: 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6f  h a different co
40d0: 6d 70 61 72 65 49 6e 66 6f 20 73 74 72 75 63 74  mpareInfo struct
40e0: 75 72 65 29 20 63 6f 6d 70 75 74 65 73 0a 2a 2a  ure) computes.**
40f0: 20 74 68 65 20 47 4c 4f 42 20 6f 70 65 72 61 74   the GLOB operat
4100: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
4110: 69 64 20 6c 69 6b 65 46 75 6e 63 28 0a 20 20 73  id likeFunc(.  s
4120: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
4130: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
4140: 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  argc, .  sqlite3
4150: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
4160: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
4170: 64 20 63 68 61 72 20 2a 7a 41 2c 20 2a 7a 42 3b  d char *zA, *zB;
4180: 0a 20 20 69 6e 74 20 65 73 63 61 70 65 20 3d 20  .  int escape = 
4190: 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
41a0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
41b0: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
41c0: 74 65 78 74 29 3b 0a 0a 20 20 7a 42 20 3d 20 73  text);..  zB = s
41d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
41e0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 41  t(argv[0]);.  zA
41f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4200: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
4210: 0a 20 20 2f 2a 20 4c 69 6d 69 74 20 74 68 65 20  .  /* Limit the 
4220: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 4c 49  length of the LI
4230: 4b 45 20 6f 72 20 47 4c 4f 42 20 70 61 74 74 65  KE or GLOB patte
4240: 72 6e 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62  rn to avoid prob
4250: 6c 65 6d 73 0a 20 20 2a 2a 20 6f 66 20 64 65 65  lems.  ** of dee
4260: 70 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64 20  p recursion and 
4270: 4e 2a 4e 20 62 65 68 61 76 69 6f 72 20 69 6e 20  N*N behavior in 
4280: 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 29  patternCompare()
4290: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
42a0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
42b0: 28 61 72 67 76 5b 30 5d 29 20 3e 0a 20 20 20 20  (argv[0]) >.    
42c0: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
42d0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
42e0: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
42f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
4300: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
4310: 74 65 78 74 2c 20 22 4c 49 4b 45 20 6f 72 20 47  text, "LIKE or G
4320: 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 6f 20  LOB pattern too 
4330: 63 6f 6d 70 6c 65 78 22 2c 20 2d 31 29 3b 0a 20  complex", -1);. 
4340: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
4350: 20 61 73 73 65 72 74 28 20 7a 42 3d 3d 73 71 6c   assert( zB==sql
4360: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
4370: 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20  argv[0]) );  /* 
4380: 45 6e 63 6f 64 69 6e 67 20 64 69 64 20 6e 6f 74  Encoding did not
4390: 20 63 68 61 6e 67 65 20 2a 2f 0a 0a 20 20 69 66   change */..  if
43a0: 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20  ( argc==3 ){.   
43b0: 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63   /* The escape c
43c0: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20  haracter string 
43d0: 6d 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66 20  must consist of 
43e0: 61 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20 63  a single UTF-8 c
43f0: 68 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a  haracter..    **
4400: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
4410: 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  rn an error..   
4420: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
4430: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 73  signed char *zEs
4440: 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  c = sqlite3_valu
4450: 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29 3b  e_text(argv[2]);
4460: 0a 20 20 20 20 69 66 28 20 7a 45 73 63 3d 3d 30  .    if( zEsc==0
4470: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
4480: 66 28 20 73 71 6c 69 74 65 33 55 74 66 38 43 68  f( sqlite3Utf8Ch
4490: 61 72 4c 65 6e 28 28 63 68 61 72 2a 29 7a 45 73  arLen((char*)zEs
44a0: 63 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20 20 20  c, -1)!=1 ){.   
44b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
44c0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
44d0: 20 0a 20 20 20 20 20 20 20 20 20 20 22 45 53 43   .          "ESC
44e0: 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  APE expression m
44f0: 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ust be a single 
4500: 63 68 61 72 61 63 74 65 72 22 2c 20 2d 31 29 3b  character", -1);
4510: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
4520: 20 20 20 7d 0a 20 20 20 20 65 73 63 61 70 65 20     }.    escape 
4530: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
4540: 64 28 7a 45 73 63 2c 20 30 2c 20 26 7a 45 73 63  d(zEsc, 0, &zEsc
4550: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 20  );.  }.  if( zA 
4560: 26 26 20 7a 42 20 29 7b 0a 20 20 20 20 73 74 72  && zB ){.    str
4570: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  uct compareInfo 
4580: 2a 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  *pInfo = sqlite3
4590: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
45a0: 78 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  xt);.#ifdef SQLI
45b0: 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
45c0: 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b  te3_like_count++
45d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
45e0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
45f0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 61  _int(context, pa
4600: 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a 42 2c  tternCompare(zB,
4610: 20 7a 41 2c 20 70 49 6e 66 6f 2c 20 65 73 63 61   zA, pInfo, esca
4620: 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pe));.  }.}../*.
4630: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
4640: 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c 49 46 28  n of the NULLIF(
4650: 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  x,y) function.  
4660: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
4670: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
4680: 65 6e 74 20 69 66 20 74 68 65 20 61 72 67 75 6d  ent if the argum
4690: 65 6e 74 73 20 61 72 65 20 64 69 66 66 65 72 65  ents are differe
46a0: 6e 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  nt.  The result 
46b0: 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a 2a  is NULL if the.*
46c0: 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  * arguments are 
46d0: 65 71 75 61 6c 20 74 6f 20 65 61 63 68 20 6f 74  equal to each ot
46e0: 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  her..*/.static v
46f0: 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e 63 28 0a  oid nullifFunc(.
4700: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
4710: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
4720: 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c  t NotUsed,.  sql
4730: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
4740: 76 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  v.){.  CollSeq *
4750: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
4760: 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f  etFuncCollSeq(co
4770: 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44  ntext);.  UNUSED
4780: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
4790: 65 64 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ed);.  if( sqlit
47a0: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72 67  e3MemCompare(arg
47b0: 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 2c 20 70  v[0], argv[1], p
47c0: 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Coll)!=0 ){.    
47d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
47e0: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
47f0: 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  gv[0]);.  }.}../
4800: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
4810: 69 6f 6e 20 6f 66 20 74 68 65 20 56 45 52 53 49  ion of the VERSI
4820: 4f 4e 28 2a 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ON(*) function. 
4830: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
4840: 68 65 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66  he version.** of
4850: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
4860: 61 72 79 20 74 68 61 74 20 69 73 20 72 75 6e 6e  ary that is runn
4870: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
4880: 6f 69 64 20 76 65 72 73 69 6f 6e 46 75 6e 63 28  oid versionFunc(
4890: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
48a0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
48b0: 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71  nt NotUsed,.  sq
48c0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f  lite3_value **No
48d0: 74 55 73 65 64 32 0a 29 7b 0a 20 20 55 4e 55 53  tUsed2.){.  UNUS
48e0: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
48f0: 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
4900: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
4910: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
4920: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
4930: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
4940: 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 20 41 72 72 61  TIC);.}../* Arra
4950: 79 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67  y for converting
4960: 20 66 72 6f 6d 20 68 61 6c 66 2d 62 79 74 65 73   from half-bytes
4970: 20 28 6e 79 62 62 6c 65 73 29 20 69 6e 74 6f 20   (nybbles) into 
4980: 41 53 43 49 49 20 68 65 78 0a 2a 2a 20 64 69 67  ASCII hex.** dig
4990: 69 74 73 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63  its. */.static c
49a0: 6f 6e 73 74 20 63 68 61 72 20 68 65 78 64 69 67  onst char hexdig
49b0: 69 74 73 5b 5d 20 3d 20 7b 0a 20 20 27 30 27 2c  its[] = {.  '0',
49c0: 20 27 31 27 2c 20 27 32 27 2c 20 27 33 27 2c 20   '1', '2', '3', 
49d0: 27 34 27 2c 20 27 35 27 2c 20 27 36 27 2c 20 27  '4', '5', '6', '
49e0: 37 27 2c 0a 20 20 27 38 27 2c 20 27 39 27 2c 20  7',.  '8', '9', 
49f0: 27 41 27 2c 20 27 42 27 2c 20 27 43 27 2c 20 27  'A', 'B', 'C', '
4a00: 44 27 2c 20 27 45 27 2c 20 27 46 27 20 0a 7d 3b  D', 'E', 'F' .};
4a10: 0a 0a 2f 2a 0a 2a 2a 20 45 58 50 45 52 49 4d 45  ../*.** EXPERIME
4a20: 4e 54 41 4c 20 2d 20 54 68 69 73 20 69 73 20 6e  NTAL - This is n
4a30: 6f 74 20 61 6e 20 6f 66 66 69 63 69 61 6c 20 66  ot an official f
4a40: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 69 6e  unction.  The in
4a50: 74 65 72 66 61 63 65 20 6d 61 79 0a 2a 2a 20 63  terface may.** c
4a60: 68 61 6e 67 65 2e 20 20 54 68 69 73 20 66 75 6e  hange.  This fun
4a70: 63 74 69 6f 6e 20 6d 61 79 20 64 69 73 61 70 70  ction may disapp
4a80: 65 61 72 2e 20 20 44 6f 20 6e 6f 74 20 77 72 69  ear.  Do not wri
4a90: 74 65 20 63 6f 64 65 20 74 68 61 74 20 64 65 70  te code that dep
4aa0: 65 6e 64 73 0a 2a 2a 20 6f 6e 20 74 68 69 73 20  ends.** on this 
4ab0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
4ac0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
4ad0: 66 20 74 68 65 20 51 55 4f 54 45 28 29 20 66 75  f the QUOTE() fu
4ae0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75  nction.  This fu
4af0: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73  nction takes a s
4b00: 69 6e 67 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  ingle.** argumen
4b10: 74 2e 20 20 49 66 20 74 68 65 20 61 72 67 75 6d  t.  If the argum
4b20: 65 6e 74 20 69 73 20 6e 75 6d 65 72 69 63 2c 20  ent is numeric, 
4b30: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
4b40: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 0a   is the same as.
4b50: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  ** the argument.
4b60: 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e    If the argumen
4b70: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
4b80: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
4b90: 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 4e 55  he string.** "NU
4ba0: 4c 4c 22 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  LL".  Otherwise,
4bb0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
4bc0: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 73 69 6e   enclosed in sin
4bd0: 67 6c 65 20 71 75 6f 74 65 73 20 77 69 74 68 0a  gle quotes with.
4be0: 2a 2a 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 20  ** single-quote 
4bf0: 65 73 63 61 70 65 73 2e 0a 2a 2f 0a 73 74 61 74  escapes..*/.stat
4c00: 69 63 20 76 6f 69 64 20 71 75 6f 74 65 46 75 6e  ic void quoteFun
4c10: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
4c20: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
4c30: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
4c40: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69  lue **argv){.  i
4c50: 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74 75  f( argc<1 ) retu
4c60: 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71  rn;.  switch( sq
4c70: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
4c80: 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20  (argv[0]) ){.   
4c90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
4ca0: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
4cb0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
4cc0: 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 22 2c 20  ontext, "NULL", 
4cd0: 34 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  4, SQLITE_STATIC
4ce0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4cf0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
4d00: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20  QLITE_INTEGER:. 
4d10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
4d20: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  LOAT: {.      sq
4d30: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
4d40: 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  ue(context, argv
4d50: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  [0]);.      brea
4d60: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4d70: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
4d80: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 65  .      char *zTe
4d90: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  xt = 0;.      ch
4da0: 61 72 20 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20  ar const *zBlob 
4db0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4dc0: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
4dd0: 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d       int nBlob =
4de0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
4df0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
4e00: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 42 6c       assert( zBl
4e10: 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  ob==sqlite3_valu
4e20: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20  e_blob(argv[0]) 
4e30: 29 3b 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e  ); /* No encodin
4e40: 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20  g change */.    
4e50: 20 20 7a 54 65 78 74 20 3d 20 28 63 68 61 72 20    zText = (char 
4e60: 2a 29 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28  *)contextMalloc(
4e70: 63 6f 6e 74 65 78 74 2c 20 28 32 2a 28 69 36 34  context, (2*(i64
4e80: 29 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a 20 20 20  )nBlob)+4); .   
4e90: 20 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a     if( zText ){.
4ea0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
4eb0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
4ec0: 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20  i<nBlob; i++){. 
4ed0: 20 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 28           zText[(
4ee0: 69 2a 32 29 2b 32 5d 20 3d 20 68 65 78 64 69 67  i*2)+2] = hexdig
4ef0: 69 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34  its[(zBlob[i]>>4
4f00: 29 26 30 78 30 46 5d 3b 0a 20 20 20 20 20 20 20  )&0x0F];.       
4f10: 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29 2b 33     zText[(i*2)+3
4f20: 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28 7a  ] = hexdigits[(z
4f30: 42 6c 6f 62 5b 69 5d 29 26 30 78 30 46 5d 3b 0a  Blob[i])&0x0F];.
4f40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4f50: 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32    zText[(nBlob*2
4f60: 29 2b 32 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20  )+2] = '\'';.   
4f70: 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f       zText[(nBlo
4f80: 62 2a 32 29 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a  b*2)+3] = '\0';.
4f90: 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 30 5d          zText[0]
4fa0: 20 3d 20 27 58 27 3b 0a 20 20 20 20 20 20 20 20   = 'X';.        
4fb0: 7a 54 65 78 74 5b 31 5d 20 3d 20 27 5c 27 27 3b  zText[1] = '\'';
4fc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4fd0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
4fe0: 74 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  text, zText, -1,
4ff0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
5000: 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  T);.        sqli
5010: 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74 29 3b  te3_free(zText);
5020: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5030: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5040: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
5050: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c  : {.      int i,
5060: 6a 3b 0a 20 20 20 20 20 20 75 36 34 20 6e 3b 0a  j;.      u64 n;.
5070: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
5080: 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 72 67 20  gned char *zArg 
5090: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
50a0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
50b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20       char *z;.. 
50c0: 20 20 20 20 20 69 66 28 20 7a 41 72 67 3d 3d 30       if( zArg==0
50d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
50e0: 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a   for(i=0, n=0; z
50f0: 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66  Arg[i]; i++){ if
5100: 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20  ( zArg[i]=='\'' 
5110: 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7a  ) n++; }.      z
5120: 20 3d 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63   = contextMalloc
5130: 28 63 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29  (context, ((i64)
5140: 69 29 2b 28 28 69 36 34 29 6e 29 2b 33 29 3b 0a  i)+((i64)n)+3);.
5150: 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20        if( z ){. 
5160: 20 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c         z[0] = '\
5170: 27 27 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  '';.        for(
5180: 69 3d 30 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b 69  i=0, j=1; zArg[i
5190: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
51a0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67     z[j++] = zArg
51b0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
51c0: 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27  f( zArg[i]=='\''
51d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
51e0: 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[j++] = '\'';. 
51f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5200: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a     }.        z[j
5210: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  ++] = '\'';.    
5220: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
5230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5240: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
5250: 74 2c 20 7a 2c 20 6a 2c 20 73 71 6c 69 74 65 33  t, z, j, sqlite3
5260: 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a  _free);.      }.
5270: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
5280: 2a 2a 20 54 68 65 20 68 65 78 28 29 20 66 75 6e  ** The hex() fun
5290: 63 74 69 6f 6e 2e 20 20 49 6e 74 65 72 70 72 65  ction.  Interpre
52a0: 74 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 61  t the argument a
52b0: 73 20 61 20 62 6c 6f 62 2e 20 20 52 65 74 75 72  s a blob.  Retur
52c0: 6e 0a 2a 2a 20 61 20 68 65 78 61 64 65 63 69 6d  n.** a hexadecim
52d0: 61 6c 20 72 65 6e 64 65 72 69 6e 67 20 61 73 20  al rendering as 
52e0: 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  text..*/.static 
52f0: 76 6f 69 64 20 68 65 78 46 75 6e 63 28 0a 20 20  void hexFunc(.  
5300: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5310: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
5320: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
5330: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
5340: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 6f    int i, n;.  co
5350: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
5360: 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 63 68 61 72  r *pBlob;.  char
5370: 20 2a 7a 48 65 78 2c 20 2a 7a 3b 0a 20 20 61 73   *zHex, *z;.  as
5380: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
5390: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
53a0: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 70 42 6c  TER(argc);.  pBl
53b0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
53c0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
53d0: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  n = sqlite3_
53e0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
53f0: 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [0]);.  assert( 
5400: 70 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f 76  pBlob==sqlite3_v
5410: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
5420: 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63  ]) );  /* No enc
5430: 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a  oding change */.
5440: 20 20 7a 20 3d 20 7a 48 65 78 20 3d 20 63 6f 6e    z = zHex = con
5450: 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65  textMalloc(conte
5460: 78 74 2c 20 28 28 69 36 34 29 6e 29 2a 32 20 2b  xt, ((i64)n)*2 +
5470: 20 31 29 3b 0a 20 20 69 66 28 20 7a 48 65 78 20   1);.  if( zHex 
5480: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
5490: 69 3c 6e 3b 20 69 2b 2b 2c 20 70 42 6c 6f 62 2b  i<n; i++, pBlob+
54a0: 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e  +){.      unsign
54b0: 65 64 20 63 68 61 72 20 63 20 3d 20 2a 70 42 6c  ed char c = *pBl
54c0: 6f 62 3b 0a 20 20 20 20 20 20 2a 28 7a 2b 2b 29  ob;.      *(z++)
54d0: 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28 63 3e   = hexdigits[(c>
54e0: 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20 20 20  >4)&0xf];.      
54f0: 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69 67 69  *(z++) = hexdigi
5500: 74 73 5b 63 26 30 78 66 5d 3b 0a 20 20 20 20 7d  ts[c&0xf];.    }
5510: 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20  .    *z = 0;.   
5520: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5530: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 48  text(context, zH
5540: 65 78 2c 20 6e 2a 32 2c 20 73 71 6c 69 74 65 33  ex, n*2, sqlite3
5550: 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _free);.  }.}../
5560: 2a 0a 2a 2a 20 54 68 65 20 7a 65 72 6f 62 6c 6f  *.** The zeroblo
5570: 62 28 4e 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  b(N) function re
5580: 74 75 72 6e 73 20 61 20 7a 65 72 6f 2d 66 69 6c  turns a zero-fil
5590: 6c 65 64 20 62 6c 6f 62 20 6f 66 20 73 69 7a 65  led blob of size
55a0: 20 4e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61   N bytes..*/.sta
55b0: 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 62 6c 6f  tic void zeroblo
55c0: 62 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  bFunc(.  sqlite3
55d0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
55e0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
55f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
5600: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 36 34 20 6e  *argv.){.  i64 n
5610: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
5620: 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==1 );.  UNUSED_
5630: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
5640: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
5650: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
5660: 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 53 51 4c  0]);.  if( n>SQL
5670: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29  ITE_MAX_LENGTH )
5680: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
5690: 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69  sult_error_toobi
56a0: 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  g(context);.  }e
56b0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
56c0: 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62 6c 6f 62  _result_zeroblob
56d0: 28 63 6f 6e 74 65 78 74 2c 20 28 69 6e 74 29 6e  (context, (int)n
56e0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
56f0: 54 68 65 20 72 65 70 6c 61 63 65 28 29 20 66 75  The replace() fu
5700: 6e 63 74 69 6f 6e 2e 20 20 54 68 72 65 65 20 61  nction.  Three a
5710: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 6c 6c  rguments are all
5720: 20 73 74 72 69 6e 67 73 3a 20 63 61 6c 6c 0a 2a   strings: call.*
5730: 2a 20 74 68 65 6d 20 41 2c 20 42 2c 20 61 6e 64  * them A, B, and
5740: 20 43 2e 20 54 68 65 20 72 65 73 75 6c 74 20 69   C. The result i
5750: 73 20 61 6c 73 6f 20 61 20 73 74 72 69 6e 67 20  s also a string 
5760: 77 68 69 63 68 20 69 73 20 64 65 72 69 76 65 64  which is derived
5770: 0a 2a 2a 20 66 72 6f 6d 20 41 20 62 79 20 72 65  .** from A by re
5780: 70 6c 61 63 69 6e 67 20 65 76 65 72 79 20 6f 63  placing every oc
5790: 63 75 72 61 6e 63 65 20 6f 66 20 42 20 77 69 74  curance of B wit
57a0: 68 20 43 2e 20 20 54 68 65 20 6d 61 74 63 68 0a  h C.  The match.
57b0: 2a 2a 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  ** must be exact
57c0: 2e 20 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  .  Collating seq
57d0: 75 65 6e 63 65 73 20 61 72 65 20 6e 6f 74 20 75  uences are not u
57e0: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sed..*/.static v
57f0: 6f 69 64 20 72 65 70 6c 61 63 65 46 75 6e 63 28  oid replaceFunc(
5800: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5810: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
5820: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
5830: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5840: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
5850: 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 72 3b 20  ned char *zStr; 
5860: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
5870: 70 75 74 20 73 74 72 69 6e 67 20 41 20 2a 2f 0a  put string A */.
5880: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
5890: 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b   char *zPattern;
58a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 74 74 65      /* The patte
58b0: 72 6e 20 73 74 72 69 6e 67 20 42 20 2a 2f 0a 20  rn string B */. 
58c0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
58d0: 63 68 61 72 20 2a 7a 52 65 70 3b 20 20 20 20 20  char *zRep;     
58e0: 20 20 20 2f 2a 20 54 68 65 20 72 65 70 6c 61 63     /* The replac
58f0: 65 6d 65 6e 74 20 73 74 72 69 6e 67 20 43 20 2a  ement string C *
5900: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
5910: 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20 20 20 20  r *zOut;        
5920: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74        /* The out
5930: 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74  put */.  int nSt
5940: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
5950: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 53 74    /* Size of zSt
5960: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74  r */.  int nPatt
5970: 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ern;            
5980: 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 50 61 74 74  /* Size of zPatt
5990: 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ern */.  int nRe
59a0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
59b0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 52 65    /* Size of zRe
59c0: 70 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 75 74 3b  p */.  i64 nOut;
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20  /* Maximum size 
59f0: 6f 66 20 7a 4f 75 74 20 2a 2f 0a 20 20 69 6e 74  of zOut */.  int
5a00: 20 6c 6f 6f 70 4c 69 6d 69 74 3b 20 20 20 20 20   loopLimit;     
5a10: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 7a 53        /* Last zS
5a20: 74 72 5b 5d 20 74 68 61 74 20 6d 69 67 68 74 20  tr[] that might 
5a30: 6d 61 74 63 68 20 7a 50 61 74 74 65 72 6e 5b 5d  match zPattern[]
5a40: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a60: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
5a70: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72  */..  assert( ar
5a80: 67 63 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45  gc==3 );.  UNUSE
5a90: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
5aa0: 29 3b 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c 69  );.  zStr = sqli
5ab0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5ac0: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[0]);.  if( z
5ad0: 53 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Str==0 ) return;
5ae0: 0a 20 20 6e 53 74 72 20 3d 20 73 71 6c 69 74 65  .  nStr = sqlite
5af0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
5b00: 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74  gv[0]);.  assert
5b10: 28 20 7a 53 74 72 3d 3d 73 71 6c 69 74 65 33 5f  ( zStr==sqlite3_
5b20: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5b30: 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e  0]) );  /* No en
5b40: 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f  coding change */
5b50: 0a 20 20 7a 50 61 74 74 65 72 6e 20 3d 20 73 71  .  zPattern = sq
5b60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5b70: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28  (argv[1]);.  if(
5b80: 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20 29 7b 0a   zPattern==0 ){.
5b90: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
5ba0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
5bb0: 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[1])==SQLITE_
5bc0: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 72 65 74 75  NULL );.    retu
5bd0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50  rn;.  }.  if( zP
5be0: 61 74 74 65 72 6e 5b 30 5d 3d 3d 30 20 29 7b 0a  attern[0]==0 ){.
5bf0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
5c00: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
5c10: 72 67 76 5b 31 5d 29 21 3d 53 51 4c 49 54 45 5f  rgv[1])!=SQLITE_
5c20: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 73 71 6c 69  NULL );.    sqli
5c30: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
5c40: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30  (context, argv[0
5c50: 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ]);.    return;.
5c60: 20 20 7d 0a 20 20 6e 50 61 74 74 65 72 6e 20 3d    }.  nPattern =
5c70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5c80: 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ytes(argv[1]);. 
5c90: 20 61 73 73 65 72 74 28 20 7a 50 61 74 74 65 72   assert( zPatter
5ca0: 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  n==sqlite3_value
5cb0: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 20 29  _text(argv[1]) )
5cc0: 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e  ;  /* No encodin
5cd0: 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a 52  g change */.  zR
5ce0: 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ep = sqlite3_val
5cf0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29  ue_text(argv[2])
5d00: 3b 0a 20 20 69 66 28 20 7a 52 65 70 3d 3d 30 20  ;.  if( zRep==0 
5d10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 52 65 70  ) return;.  nRep
5d20: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5d30: 5f 62 79 74 65 73 28 61 72 67 76 5b 32 5d 29 3b  _bytes(argv[2]);
5d40: 0a 20 20 61 73 73 65 72 74 28 20 7a 52 65 70 3d  .  assert( zRep=
5d50: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
5d60: 65 78 74 28 61 72 67 76 5b 32 5d 29 20 29 3b 0a  ext(argv[2]) );.
5d70: 20 20 6e 4f 75 74 20 3d 20 6e 53 74 72 20 2b 20    nOut = nStr + 
5d80: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 75  1;.  assert( nOu
5d90: 74 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  t<SQLITE_MAX_LEN
5da0: 47 54 48 20 29 3b 0a 20 20 7a 4f 75 74 20 3d 20  GTH );.  zOut = 
5db0: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
5dc0: 6e 74 65 78 74 2c 20 28 69 36 34 29 6e 4f 75 74  ntext, (i64)nOut
5dd0: 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30  );.  if( zOut==0
5de0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
5df0: 20 20 7d 0a 20 20 6c 6f 6f 70 4c 69 6d 69 74 20    }.  loopLimit 
5e00: 3d 20 6e 53 74 72 20 2d 20 6e 50 61 74 74 65 72  = nStr - nPatter
5e10: 6e 3b 20 20 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  n;  .  for(i=j=0
5e20: 3b 20 69 3c 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20  ; i<=loopLimit; 
5e30: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  i++){.    if( zS
5e40: 74 72 5b 69 5d 21 3d 7a 50 61 74 74 65 72 6e 5b  tr[i]!=zPattern[
5e50: 30 5d 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 7a 53  0] || memcmp(&zS
5e60: 74 72 5b 69 5d 2c 20 7a 50 61 74 74 65 72 6e 2c  tr[i], zPattern,
5e70: 20 6e 50 61 74 74 65 72 6e 29 20 29 7b 0a 20 20   nPattern) ){.  
5e80: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
5e90: 7a 53 74 72 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  zStr[i];.    }el
5ea0: 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 7a 4f  se{.      u8 *zO
5eb0: 6c 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ld;.      sqlite
5ec0: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
5ed0: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
5ee0: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  e(context);.    
5ef0: 20 20 6e 4f 75 74 20 2b 3d 20 6e 52 65 70 20 2d    nOut += nRep -
5f00: 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20   nPattern;.     
5f10: 20 69 66 28 20 6e 4f 75 74 3e 3d 64 62 2d 3e 61   if( nOut>=db->a
5f20: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5f30: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
5f40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5f50: 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69  sult_error_toobi
5f60: 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  g(context);.    
5f70: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5f80: 65 28 64 62 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  e(db, zOut);.   
5f90: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
5fa0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4f 6c 64 20     }.      zOld 
5fb0: 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 20 20 7a 4f  = zOut;.      zO
5fc0: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ut = sqlite3_rea
5fd0: 6c 6c 6f 63 28 7a 4f 75 74 2c 20 28 69 6e 74 29  lloc(zOut, (int)
5fe0: 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  nOut);.      if(
5ff0: 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   zOut==0 ){.    
6000: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6010: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
6020: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
6030: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6040: 62 2c 20 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20  b, zOld);.      
6050: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
6060: 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  }.      memcpy(&
6070: 7a 4f 75 74 5b 6a 5d 2c 20 7a 52 65 70 2c 20 6e  zOut[j], zRep, n
6080: 52 65 70 29 3b 0a 20 20 20 20 20 20 6a 20 2b 3d  Rep);.      j +=
6090: 20 6e 52 65 70 3b 0a 20 20 20 20 20 20 69 20 2b   nRep;.      i +
60a0: 3d 20 6e 50 61 74 74 65 72 6e 2d 31 3b 0a 20 20  = nPattern-1;.  
60b0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
60c0: 28 20 6a 2b 6e 53 74 72 2d 69 2b 31 3d 3d 6e 4f  ( j+nStr-i+1==nO
60d0: 75 74 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  ut );.  memcpy(&
60e0: 7a 4f 75 74 5b 6a 5d 2c 20 26 7a 53 74 72 5b 69  zOut[j], &zStr[i
60f0: 5d 2c 20 6e 53 74 72 2d 69 29 3b 0a 20 20 6a 20  ], nStr-i);.  j 
6100: 2b 3d 20 6e 53 74 72 20 2d 20 69 3b 0a 20 20 61  += nStr - i;.  a
6110: 73 73 65 72 74 28 20 6a 3c 3d 6e 4f 75 74 20 29  ssert( j<=nOut )
6120: 3b 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b  ;.  zOut[j] = 0;
6130: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6140: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6150: 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20 6a 2c 20  (char*)zOut, j, 
6160: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d  sqlite3_free);.}
6170: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
6180: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 54 52  tation of the TR
6190: 49 4d 28 29 2c 20 4c 54 52 49 4d 28 29 2c 20 61  IM(), LTRIM(), a
61a0: 6e 64 20 52 54 52 49 4d 28 29 20 66 75 6e 63 74  nd RTRIM() funct
61b0: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 75 73 65  ions..** The use
61c0: 72 64 61 74 61 20 69 73 20 30 78 31 20 66 6f 72  rdata is 0x1 for
61d0: 20 6c 65 66 74 20 74 72 69 6d 2c 20 30 78 32 20   left trim, 0x2 
61e0: 66 6f 72 20 72 69 67 68 74 20 74 72 69 6d 2c 20  for right trim, 
61f0: 30 78 33 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  0x3 for both..*/
6200: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 69  .static void tri
6210: 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  mFunc(.  sqlite3
6220: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6230: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
6240: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6250: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
6260: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6270: 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  zIn;         /* 
6280: 49 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a  Input string */.
6290: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
62a0: 20 63 68 61 72 20 2a 7a 43 68 61 72 53 65 74 3b   char *zCharSet;
62b0: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 63 68      /* Set of ch
62c0: 61 72 61 63 74 65 72 73 20 74 6f 20 74 72 69 6d  aracters to trim
62d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 3b 20 20   */.  int nIn;  
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6300: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 69 6e  r of bytes in in
6310: 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  put */.  int fla
6320: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
6330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a             /* 1:
6340: 20 74 72 69 6d 6c 65 66 74 20 20 32 3a 20 74 72   trimleft  2: tr
6350: 69 6d 72 69 67 68 74 20 20 33 3a 20 74 72 69 6d  imright  3: trim
6360: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
6390: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
63a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4c 65 6e  igned char *aLen
63b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
63c0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 65 61 63 68  * Length of each
63d0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 43   character in zC
63e0: 68 61 72 53 65 74 20 2a 2f 0a 20 20 75 6e 73 69  harSet */.  unsi
63f0: 67 6e 65 64 20 63 68 61 72 20 2a 2a 61 7a 43 68  gned char **azCh
6400: 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ar = 0;       /*
6410: 20 49 6e 64 69 76 69 64 75 61 6c 20 63 68 61 72   Individual char
6420: 61 63 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53  acters in zCharS
6430: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 61  et */.  int nCha
6440: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
6450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6460: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
6470: 73 20 69 6e 20 7a 43 68 61 72 53 65 74 20 2a 2f  s in zCharSet */
6480: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
6490: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
64a0: 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
64b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
64c0: 20 20 7d 0a 20 20 7a 49 6e 20 3d 20 73 71 6c 69    }.  zIn = sqli
64d0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
64e0: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[0]);.  if( z
64f0: 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  In==0 ) return;.
6500: 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f    nIn = sqlite3_
6510: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
6520: 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [0]);.  assert( 
6530: 7a 49 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  zIn==sqlite3_val
6540: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
6550: 20 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d   );.  if( argc==
6560: 31 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  1 ){.    static 
6570: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
6580: 68 61 72 20 6c 65 6e 4f 6e 65 5b 5d 20 3d 20 7b  har lenOne[] = {
6590: 20 31 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63   1 };.    static
65a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
65b0: 20 63 6f 6e 73 74 20 61 7a 4f 6e 65 5b 5d 20 3d   const azOne[] =
65c0: 20 7b 20 28 75 38 2a 29 22 20 22 20 7d 3b 0a 20   { (u8*)" " };. 
65d0: 20 20 20 6e 43 68 61 72 20 3d 20 31 3b 0a 20 20     nChar = 1;.  
65e0: 20 20 61 4c 65 6e 20 3d 20 28 75 38 2a 29 6c 65    aLen = (u8*)le
65f0: 6e 4f 6e 65 3b 0a 20 20 20 20 61 7a 43 68 61 72  nOne;.    azChar
6600: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
6610: 72 20 2a 2a 29 61 7a 4f 6e 65 3b 0a 20 20 20 20  r **)azOne;.    
6620: 7a 43 68 61 72 53 65 74 20 3d 20 30 3b 0a 20 20  zCharSet = 0;.  
6630: 7d 65 6c 73 65 20 69 66 28 20 28 7a 43 68 61 72  }else if( (zChar
6640: 53 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Set = sqlite3_va
6650: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
6660: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))==0 ){.    ret
6670: 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  urn;.  }else{.  
6680: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
6690: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 66 6f   char *z;.    fo
66a0: 72 28 7a 3d 7a 43 68 61 72 53 65 74 2c 20 6e 43  r(z=zCharSet, nC
66b0: 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68 61 72  har=0; *z; nChar
66c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54  ++){.      SQLIT
66d0: 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a  E_SKIP_UTF8(z);.
66e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43      }.    if( nC
66f0: 68 61 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 61  har>0 ){.      a
6700: 7a 43 68 61 72 20 3d 20 63 6f 6e 74 65 78 74 4d  zChar = contextM
6710: 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74 2c 20 28  alloc(context, (
6720: 28 69 36 34 29 6e 43 68 61 72 29 2a 28 73 69 7a  (i64)nChar)*(siz
6730: 65 6f 66 28 63 68 61 72 2a 29 2b 31 29 29 3b 0a  eof(char*)+1));.
6740: 20 20 20 20 20 20 69 66 28 20 61 7a 43 68 61 72        if( azChar
6750: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
6760: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
6770: 20 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 6e 73       aLen = (uns
6780: 69 67 6e 65 64 20 63 68 61 72 2a 29 26 61 7a 43  igned char*)&azC
6790: 68 61 72 5b 6e 43 68 61 72 5d 3b 0a 20 20 20 20  har[nChar];.    
67a0: 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74    for(z=zCharSet
67b0: 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e  , nChar=0; *z; n
67c0: 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Char++){.       
67d0: 20 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 20 3d   azChar[nChar] =
67e0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
67f0: 2a 29 7a 3b 0a 20 20 20 20 20 20 20 20 53 51 4c  *)z;.        SQL
6800: 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29  ITE_SKIP_UTF8(z)
6810: 3b 0a 20 20 20 20 20 20 20 20 61 4c 65 6e 5b 6e  ;.        aLen[n
6820: 43 68 61 72 5d 20 3d 20 28 75 38 29 28 7a 20 2d  Char] = (u8)(z -
6830: 20 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 29 3b   azChar[nChar]);
6840: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6850: 20 7d 0a 20 20 69 66 28 20 6e 43 68 61 72 3e 30   }.  if( nChar>0
6860: 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20   ){.    flags = 
6870: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
6880: 54 28 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  T(sqlite3_user_d
6890: 61 74 61 28 63 6f 6e 74 65 78 74 29 29 3b 0a 20  ata(context));. 
68a0: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 31     if( flags & 1
68b0: 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
68c0: 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   nIn>0 ){.      
68d0: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20    int len = 0;. 
68e0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
68f0: 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20  i<nChar; i++){. 
6900: 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 61           len = a
6910: 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Len[i];.        
6920: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 7a 49 6e    if( memcmp(zIn
6930: 2c 20 61 7a 43 68 61 72 5b 69 5d 2c 20 6c 65 6e  , azChar[i], len
6940: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
6950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6960: 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62  if( i>=nChar ) b
6970: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 49  reak;.        zI
6980: 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  n += len;.      
6990: 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20    nIn -= len;.  
69a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
69b0: 69 66 28 20 66 6c 61 67 73 20 26 20 32 20 29 7b  if( flags & 2 ){
69c0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49  .      while( nI
69d0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  n>0 ){.        i
69e0: 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nt len = 0;.    
69f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
6a00: 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Char; i++){.    
6a10: 20 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e        len = aLen
6a20: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
6a30: 66 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d  f( len<=nIn && m
6a40: 65 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d 6c  emcmp(&zIn[nIn-l
6a50: 65 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c 65  en],azChar[i],le
6a60: 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  n)==0 ) break;. 
6a70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6a80: 20 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20   if( i>=nChar ) 
6a90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e  break;.        n
6aa0: 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  In -= len;.     
6ab0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
6ac0: 20 7a 43 68 61 72 53 65 74 20 29 7b 0a 20 20 20   zCharSet ){.   
6ad0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6ae0: 61 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20  azChar);.    }. 
6af0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
6b00: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
6b10: 2c 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e 49  , (char*)zIn, nI
6b20: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
6b30: 45 4e 54 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  ENT);.}...#ifdef
6b40: 20 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a   SQLITE_SOUNDEX.
6b50: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
6b60: 65 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69  e soundex encodi
6b70: 6e 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a 2f  ng of a word..*/
6b80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75  .static void sou
6b90: 6e 64 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69  ndexFunc(.  sqli
6ba0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
6bb0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
6bc0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
6bd0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68  e **argv.){.  ch
6be0: 61 72 20 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20  ar zResult[8];. 
6bf0: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a   const u8 *zIn;.
6c00: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74    int i, j;.  st
6c10: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
6c20: 6e 65 64 20 63 68 61 72 20 69 43 6f 64 65 5b 5d  ned char iCode[]
6c30: 20 3d 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30   = {.    0, 0, 0
6c40: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6c50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6c60: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20  0, 0, 0,.    0, 
6c70: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6c80: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6c90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
6ca0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6cb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6cc0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6cd0: 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
6ce0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6cf0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6d00: 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31  , 0,.    0, 0, 1
6d10: 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c  , 2, 3, 0, 1, 2,
6d20: 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20   0, 0, 2, 2, 4, 
6d30: 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20  5, 5, 0,.    1, 
6d40: 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31  2, 6, 2, 3, 0, 1
6d50: 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c  , 0, 2, 0, 2, 0,
6d60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
6d70: 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20   0, 0, 1, 2, 3, 
6d80: 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32  0, 1, 2, 0, 0, 2
6d90: 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c  , 2, 4, 5, 5, 0,
6da0: 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c  .    1, 2, 6, 2,
6db0: 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20   3, 0, 1, 0, 2, 
6dc0: 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 2, 0, 0, 0, 0
6dd0: 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65  , 0,.  };.  asse
6de0: 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20  rt( argc==1 );. 
6df0: 20 7a 49 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69   zIn = (u8*)sqli
6e00: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6e10: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[0]);.  if( z
6e20: 49 6e 3d 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75  In==0 ) zIn = (u
6e30: 38 2a 29 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30  8*)"";.  for(i=0
6e40: 3b 20 7a 49 6e 5b 69 5d 20 26 26 20 21 73 71 6c  ; zIn[i] && !sql
6e50: 69 74 65 33 49 73 61 6c 70 68 61 28 7a 49 6e 5b  ite3Isalpha(zIn[
6e60: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66  i]); i++){}.  if
6e70: 28 20 7a 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20  ( zIn[i] ){.    
6e80: 75 38 20 70 72 65 76 63 6f 64 65 20 3d 20 69 43  u8 prevcode = iC
6e90: 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d  ode[zIn[i]&0x7f]
6ea0: 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 30 5d  ;.    zResult[0]
6eb0: 20 3d 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65   = sqlite3Touppe
6ec0: 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66  r(zIn[i]);.    f
6ed0: 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a  or(j=1; j<4 && z
6ee0: 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  In[i]; i++){.   
6ef0: 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 69 43     int code = iC
6f00: 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d  ode[zIn[i]&0x7f]
6f10: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 64 65  ;.      if( code
6f20: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  >0 ){.        if
6f30: 28 20 63 6f 64 65 21 3d 70 72 65 76 63 6f 64 65  ( code!=prevcode
6f40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72   ){.          pr
6f50: 65 76 63 6f 64 65 20 3d 20 63 6f 64 65 3b 0a 20  evcode = code;. 
6f60: 20 20 20 20 20 20 20 20 20 7a 52 65 73 75 6c 74           zResult
6f70: 5b 6a 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27  [j++] = code + '
6f80: 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0';.        }.  
6f90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6fa0: 20 20 20 70 72 65 76 63 6f 64 65 20 3d 20 30 3b     prevcode = 0;
6fb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6fc0: 20 20 20 77 68 69 6c 65 28 20 6a 3c 34 20 29 7b     while( j<4 ){
6fd0: 0a 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a  .      zResult[j
6fe0: 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 7d  ++] = '0';.    }
6ff0: 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 5d 20  .    zResult[j] 
7000: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
7010: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
7020: 74 65 78 74 2c 20 7a 52 65 73 75 6c 74 2c 20 34  text, zResult, 4
7030: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
7040: 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NT);.  }else{.  
7050: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7060: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 22  _text(context, "
7070: 3f 30 30 30 22 2c 20 34 2c 20 53 51 4c 49 54 45  ?000", 4, SQLITE
7080: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a  _STATIC);.  }.}.
7090: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
70a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
70b0: 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
70c0: 20 41 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   A function that
70d0: 20 6c 6f 61 64 73 20 61 20 73 68 61 72 65 64 2d   loads a shared-
70e0: 6c 69 62 72 61 72 79 20 65 78 74 65 6e 73 69 6f  library extensio
70f0: 6e 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 4e  n then returns N
7100: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ULL..*/.static v
7110: 6f 69 64 20 6c 6f 61 64 45 78 74 28 73 71 6c 69  oid loadExt(sqli
7120: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
7130: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
7140: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
7150: 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63  argv){.  const c
7160: 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28 63 6f  har *zFile = (co
7170: 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
7180: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
7190: 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20  gv[0]);.  const 
71a0: 63 68 61 72 20 2a 7a 50 72 6f 63 3b 0a 20 20 73  char *zProc;.  s
71b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
71c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
71d0: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
71e0: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
71f0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67   = 0;..  if( arg
7200: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 72 6f  c==2 ){.    zPro
7210: 63 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  c = (const char 
7220: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
7230: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  text(argv[1]);. 
7240: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f   }else{.    zPro
7250: 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  c = 0;.  }.  if(
7260: 20 7a 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65   zFile && sqlite
7270: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
7280: 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f  (db, zFile, zPro
7290: 63 2c 20 26 7a 45 72 72 4d 73 67 29 20 29 7b 0a  c, &zErrMsg) ){.
72a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
72b0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
72c0: 2c 20 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b 0a  , zErrMsg, -1);.
72d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
72e0: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 7d  (zErrMsg);.  }.}
72f0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
7300: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
7310: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
7320: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65  ucture holds the
7330: 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a   context of a.**
7340: 20 73 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20   sum() or avg() 
7350: 61 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74  aggregate comput
7360: 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65  ation..*/.typede
7370: 66 20 73 74 72 75 63 74 20 53 75 6d 43 74 78 20  f struct SumCtx 
7380: 53 75 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53  SumCtx;.struct S
7390: 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65  umCtx {.  double
73a0: 20 72 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20 46   rSum;      /* F
73b0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 73 75  loating point su
73c0: 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d 3b  m */.  i64 iSum;
73d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
73e0: 67 65 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20 20  ger sum */   .  
73f0: 69 36 34 20 63 6e 74 3b 20 20 20 20 20 20 20 20  i64 cnt;        
7400: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
7410: 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a  lements summed *
7420: 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c 6f 77 3b  /.  u8 overflow;
7430: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7440: 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f   integer overflo
7450: 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20 61  w seen */.  u8 a
7460: 70 70 72 6f 78 3b 20 20 20 20 20 20 20 20 2f 2a  pprox;        /*
7470: 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e 74   True if non-int
7480: 65 67 65 72 20 76 61 6c 75 65 20 77 61 73 20 69  eger value was i
7490: 6e 70 75 74 20 74 6f 20 74 68 65 20 73 75 6d 20  nput to the sum 
74a0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  */.};../*.** Rou
74b0: 74 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f  tines used to co
74c0: 6d 70 75 74 65 20 74 68 65 20 73 75 6d 2c 20 61  mpute the sum, a
74d0: 76 65 72 61 67 65 2c 20 61 6e 64 20 74 6f 74 61  verage, and tota
74e0: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55 4d  l..**.** The SUM
74f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c 6c  () function foll
7500: 6f 77 73 20 74 68 65 20 28 62 72 6f 6b 65 6e 29  ows the (broken)
7510: 20 53 51 4c 20 73 74 61 6e 64 61 72 64 20 77 68   SQL standard wh
7520: 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61  ich means.** tha
7530: 74 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c  t it returns NUL
7540: 4c 20 69 66 20 69 74 20 73 75 6d 73 20 6f 76 65  L if it sums ove
7550: 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54 4f  r no inputs.  TO
7560: 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30  TAL returns.** 0
7570: 2e 30 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  .0 in that case.
7580: 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20 54    In addition, T
7590: 4f 54 41 4c 20 61 6c 77 61 79 73 20 72 65 74 75  OTAL always retu
75a0: 72 6e 73 20 61 20 66 6c 6f 61 74 20 77 68 65 72  rns a float wher
75b0: 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20 72  e.** SUM might r
75c0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
75d0: 20 69 66 20 69 74 20 6e 65 76 65 72 20 65 6e 63   if it never enc
75e0: 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f 61 74 69  ounters a floati
75f0: 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
7600: 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76 65 72 20  e.  TOTAL never 
7610: 66 61 69 6c 73 2c 20 62 75 74 20 53 55 4d 20 6d  fails, but SUM m
7620: 69 67 68 74 20 74 68 72 6f 75 67 68 20 61 6e 20  ight through an 
7630: 65 78 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a 20  exception if.** 
7640: 69 74 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e 20  it overflows an 
7650: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
7660: 69 63 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28  ic void sumStep(
7670: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7680: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
7690: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
76a0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d  e **argv){.  Sum
76b0: 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79  Ctx *p;.  int ty
76c0: 70 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72  pe;.  assert( ar
76d0: 67 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45  gc==1 );.  UNUSE
76e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
76f0: 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  );.  p = sqlite3
7700: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
7710: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65  xt(context, size
7720: 6f 66 28 2a 70 29 29 3b 0a 20 20 74 79 70 65 20  of(*p));.  type 
7730: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
7740: 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61 72 67  numeric_type(arg
7750: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 20 26  v[0]);.  if( p &
7760: 26 20 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e  & type!=SQLITE_N
7770: 55 4c 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6e  ULL ){.    p->cn
7780: 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 74 79 70  t++;.    if( typ
7790: 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  e==SQLITE_INTEGE
77a0: 52 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76  R ){.      i64 v
77b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
77c0: 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b  _int64(argv[0]);
77d0: 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b  .      p->rSum +
77e0: 3d 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 28  = v;.      if( (
77f0: 70 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f 76 65  p->approx|p->ove
7800: 72 66 6c 6f 77 29 3d 3d 30 20 29 7b 0a 20 20 20  rflow)==0 ){.   
7810: 20 20 20 20 20 69 36 34 20 69 4e 65 77 53 75 6d       i64 iNewSum
7820: 20 3d 20 70 2d 3e 69 53 75 6d 20 2b 20 76 3b 0a   = p->iSum + v;.
7830: 20 20 20 20 20 20 20 20 69 6e 74 20 73 31 20 3d          int s1 =
7840: 20 28 69 6e 74 29 28 70 2d 3e 69 53 75 6d 20 3e   (int)(p->iSum >
7850: 3e 20 28 73 69 7a 65 6f 66 28 69 36 34 29 2a 38  > (sizeof(i64)*8
7860: 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  -1));.        in
7870: 74 20 73 32 20 3d 20 28 69 6e 74 29 28 76 20 20  t s2 = (int)(v  
7880: 20 20 20 20 20 3e 3e 20 28 73 69 7a 65 6f 66 28       >> (sizeof(
7890: 69 36 34 29 2a 38 2d 31 29 29 3b 0a 20 20 20 20  i64)*8-1));.    
78a0: 20 20 20 20 69 6e 74 20 73 33 20 3d 20 28 69 6e      int s3 = (in
78b0: 74 29 28 69 4e 65 77 53 75 6d 20 3e 3e 20 28 73  t)(iNewSum >> (s
78c0: 69 7a 65 6f 66 28 69 36 34 29 2a 38 2d 31 29 29  izeof(i64)*8-1))
78d0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 76 65  ;.        p->ove
78e0: 72 66 6c 6f 77 20 3d 20 28 28 73 31 26 73 32 26  rflow = ((s1&s2&
78f0: 7e 73 33 29 20 7c 20 28 7e 73 31 26 7e 73 32 26  ~s3) | (~s1&~s2&
7900: 73 33 29 29 3f 31 3a 30 3b 0a 20 20 20 20 20 20  s3))?1:0;.      
7910: 20 20 70 2d 3e 69 53 75 6d 20 3d 20 69 4e 65 77    p->iSum = iNew
7920: 53 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Sum;.      }.   
7930: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
7940: 3e 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33  >rSum += sqlite3
7950: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
7960: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d  gv[0]);.      p-
7970: 3e 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20 20 20  >approx = 1;.   
7980: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
7990: 76 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69 7a 65  void sumFinalize
79a0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
79b0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75   *context){.  Su
79c0: 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  mCtx *p;.  p = s
79d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
79e0: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
79f0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26  , 0);.  if( p &&
7a00: 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20   p->cnt>0 ){.   
7a10: 20 69 66 28 20 70 2d 3e 6f 76 65 72 66 6c 6f 77   if( p->overflow
7a20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7a30: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
7a40: 6f 6e 74 65 78 74 2c 22 69 6e 74 65 67 65 72 20  ontext,"integer 
7a50: 6f 76 65 72 66 6c 6f 77 22 2c 2d 31 29 3b 0a 20  overflow",-1);. 
7a60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
7a70: 61 70 70 72 6f 78 20 29 7b 0a 20 20 20 20 20 20  approx ){.      
7a80: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
7a90: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70  ouble(context, p
7aa0: 2d 3e 72 53 75 6d 29 3b 0a 20 20 20 20 7d 65 6c  ->rSum);.    }el
7ab0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
7ac0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
7ad0: 6f 6e 74 65 78 74 2c 20 70 2d 3e 69 53 75 6d 29  ontext, p->iSum)
7ae0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
7af0: 61 74 69 63 20 76 6f 69 64 20 61 76 67 46 69 6e  atic void avgFin
7b00: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
7b10: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
7b20: 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20  .  SumCtx *p;.  
7b30: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
7b40: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
7b50: 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28  ntext, 0);.  if(
7b60: 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29   p && p->cnt>0 )
7b70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
7b80: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
7b90: 65 78 74 2c 20 70 2d 3e 72 53 75 6d 2f 28 64 6f  ext, p->rSum/(do
7ba0: 75 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20  uble)p->cnt);.  
7bb0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
7bc0: 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 28 73 71  totalFinalize(sq
7bd0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7be0: 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74  ontext){.  SumCt
7bf0: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
7c00: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7c10: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
7c20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
7c30: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
7c40: 78 74 2c 20 70 20 3f 20 70 2d 3e 72 53 75 6d 20  xt, p ? p->rSum 
7c50: 3a 20 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  : 0.0);.}../*.**
7c60: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
7c70: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74  tructure keeps t
7c80: 72 61 63 6b 20 6f 66 20 73 74 61 74 65 20 69 6e  rack of state in
7c90: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
7ca0: 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20 61 67 67  e.** count() agg
7cb0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
7cc0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
7cd0: 63 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e  ct CountCtx Coun
7ce0: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f 75  tCtx;.struct Cou
7cf0: 6e 74 43 74 78 20 7b 0a 20 20 69 36 34 20 6e 3b  ntCtx {.  i64 n;
7d00: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  .};../*.** Routi
7d10: 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  nes to implement
7d20: 20 74 68 65 20 63 6f 75 6e 74 28 29 20 61 67 67   the count() agg
7d30: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
7d40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7d50: 63 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74 65  countStep(sqlite
7d60: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7d70: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
7d80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
7d90: 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  gv){.  CountCtx 
7da0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
7db0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
7dc0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
7dd0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
7de0: 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49  (argc==0 || SQLI
7df0: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
7e00: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
7e10: 5b 30 5d 29 29 20 26 26 20 70 20 29 7b 0a 20 20  [0])) && p ){.  
7e20: 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d 20    p->n++;.  }.} 
7e30: 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63    .static void c
7e40: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c  ountFinalize(sql
7e50: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
7e60: 6e 74 65 78 74 29 7b 0a 20 20 43 6f 75 6e 74 43  ntext){.  CountC
7e70: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
7e80: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
7e90: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
7ea0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  0);.  sqlite3_re
7eb0: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
7ec0: 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30  xt, p ? p->n : 0
7ed0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  );.}../*.** Rout
7ee0: 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ines to implemen
7ef0: 74 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28  t min() and max(
7f00: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
7f10: 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tions..*/.static
7f20: 20 76 6f 69 64 20 6d 69 6e 6d 61 78 53 74 65 70   void minmaxStep
7f30: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
7f40: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
7f50: 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20 0a 20   int NotUsed, . 
7f60: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7f70: 2a 61 72 67 76 0a 29 7b 0a 20 20 4d 65 6d 20 2a  *argv.){.  Mem *
7f80: 70 41 72 67 20 20 3d 20 28 4d 65 6d 20 2a 29 61  pArg  = (Mem *)a
7f90: 72 67 76 5b 30 5d 3b 0a 20 20 4d 65 6d 20 2a 70  rgv[0];.  Mem *p
7fa0: 42 65 73 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Best;.  UNUSED_P
7fb0: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
7fc0: 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
7fd0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
7fe0: 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  v[0])==SQLITE_NU
7ff0: 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  LL ) return;.  p
8000: 42 65 73 74 20 3d 20 28 4d 65 6d 20 2a 29 73 71  Best = (Mem *)sq
8010: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
8020: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
8030: 20 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29 29   sizeof(*pBest))
8040: 3b 0a 20 20 69 66 28 20 21 70 42 65 73 74 20 29  ;.  if( !pBest )
8050: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
8060: 70 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 7b 0a  pBest->flags ){.
8070: 20 20 20 20 69 6e 74 20 6d 61 78 3b 0a 20 20 20      int max;.   
8080: 20 69 6e 74 20 63 6d 70 3b 0a 20 20 20 20 43 6f   int cmp;.    Co
8090: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
80a0: 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c  qlite3GetFuncCol
80b0: 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20  lSeq(context);. 
80c0: 20 20 20 2f 2a 20 54 68 69 73 20 73 74 65 70 20     /* This step 
80d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
80e0: 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 6d 69   for both the mi
80f0: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67  n() and max() ag
8100: 67 72 65 67 61 74 65 73 2c 0a 20 20 20 20 2a 2a  gregates,.    **
8110: 20 74 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72   the only differ
8120: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65  ence between the
8130: 20 74 77 6f 20 62 65 69 6e 67 20 74 68 61 74 20   two being that 
8140: 74 68 65 20 73 65 6e 73 65 20 6f 66 20 74 68 65  the sense of the
8150: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73  .    ** comparis
8160: 6f 6e 20 69 73 20 69 6e 76 65 72 74 65 64 2e 20  on is inverted. 
8170: 46 6f 72 20 74 68 65 20 6d 61 78 28 29 20 61 67  For the max() ag
8180: 67 72 65 67 61 74 65 2c 20 74 68 65 0a 20 20 20  gregate, the.   
8190: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 73 65 72   ** sqlite3_user
81a0: 5f 64 61 74 61 28 29 20 66 75 6e 63 74 69 6f 6e  _data() function
81b0: 20 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20 2a   returns (void *
81c0: 29 2d 31 2e 20 46 6f 72 20 6d 69 6e 28 29 20 69  )-1. For min() i
81d0: 74 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 73  t.    ** returns
81e0: 20 28 76 6f 69 64 20 2a 29 64 62 2c 20 77 68 65   (void *)db, whe
81f0: 72 65 20 64 62 20 69 73 20 74 68 65 20 73 71 6c  re db is the sql
8200: 69 74 65 33 2a 20 64 61 74 61 62 61 73 65 20 70  ite3* database p
8210: 6f 69 6e 74 65 72 2e 0a 20 20 20 20 2a 2a 20 54  ointer..    ** T
8220: 68 65 72 65 66 6f 72 65 20 74 68 65 20 6e 65 78  herefore the nex
8230: 74 20 73 74 61 74 65 6d 65 6e 74 20 73 65 74 73  t statement sets
8240: 20 76 61 72 69 61 62 6c 65 20 27 6d 61 78 27 20   variable 'max' 
8250: 74 6f 20 31 20 66 6f 72 20 74 68 65 20 6d 61 78  to 1 for the max
8260: 28 29 0a 20 20 20 20 2a 2a 20 61 67 67 72 65 67  ().    ** aggreg
8270: 61 74 65 2c 20 6f 72 20 30 20 66 6f 72 20 6d 69  ate, or 0 for mi
8280: 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n()..    */.    
8290: 6d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 75 73  max = sqlite3_us
82a0: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
82b0: 21 3d 30 3b 0a 20 20 20 20 63 6d 70 20 3d 20 73  !=0;.    cmp = s
82c0: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
82d0: 28 70 42 65 73 74 2c 20 70 41 72 67 2c 20 70 43  (pBest, pArg, pC
82e0: 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 28 6d  oll);.    if( (m
82f0: 61 78 20 26 26 20 63 6d 70 3c 30 29 20 7c 7c 20  ax && cmp<0) || 
8300: 28 21 6d 61 78 20 26 26 20 63 6d 70 3e 30 29 20  (!max && cmp>0) 
8310: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8320: 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73  VdbeMemCopy(pBes
8330: 74 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a  t, pArg);.    }.
8340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
8350: 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
8360: 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20 20  pBest, pArg);.  
8370: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
8380: 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 28 73  minMaxFinalize(s
8390: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
83a0: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69  context){.  sqli
83b0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 73 3b  te3_value *pRes;
83c0: 0a 20 20 70 52 65 73 20 3d 20 28 73 71 6c 69 74  .  pRes = (sqlit
83d0: 65 33 5f 76 61 6c 75 65 20 2a 29 73 71 6c 69 74  e3_value *)sqlit
83e0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
83f0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
8400: 3b 0a 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a  ;.  if( pRes ){.
8410: 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 66 6c      if( pRes->fl
8420: 61 67 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ags ){.      sql
8430: 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
8440: 65 28 63 6f 6e 74 65 78 74 2c 20 70 52 65 73 29  e(context, pRes)
8450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8460: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
8470: 65 28 70 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(pRes);.  }.}..
8480: 2f 2a 0a 2a 2a 20 67 72 6f 75 70 5f 63 6f 6e 63  /*.** group_conc
8490: 61 74 28 45 58 50 52 2c 20 3f 53 45 50 41 52 41  at(EXPR, ?SEPARA
84a0: 54 4f 52 3f 29 0a 2a 2f 0a 73 74 61 74 69 63 20  TOR?).*/.static 
84b0: 76 6f 69 64 20 67 72 6f 75 70 43 6f 6e 63 61 74  void groupConcat
84c0: 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  Step(.  sqlite3_
84d0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
84e0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
84f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8500: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
8510: 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 53 74  char *zVal;.  St
8520: 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a  rAccum *pAccum;.
8530: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
8540: 65 70 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20  ep;.  int nVal, 
8550: 6e 53 65 70 2c 20 69 3b 0a 20 20 69 66 28 20 61  nSep, i;.  if( a
8560: 72 67 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  rgc==0 || sqlite
8570: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
8580: 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  v[0])==SQLITE_NU
8590: 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  LL ) return;.  p
85a0: 41 63 63 75 6d 20 3d 20 28 53 74 72 41 63 63 75  Accum = (StrAccu
85b0: 6d 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  m*)sqlite3_aggre
85c0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
85d0: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 41  text, sizeof(*pA
85e0: 63 63 75 6d 29 29 3b 0a 0a 20 20 69 66 28 20 70  ccum));..  if( p
85f0: 41 63 63 75 6d 20 29 7b 0a 20 20 20 20 73 71 6c  Accum ){.    sql
8600: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
8610: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
8620: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
8630: 20 20 20 70 41 63 63 75 6d 2d 3e 75 73 65 4d 61     pAccum->useMa
8640: 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 41  lloc = 1;.    pA
8650: 63 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 20 3d 20  ccum->mxAlloc = 
8660: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8670: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b  E_LIMIT_LENGTH];
8680: 0a 20 20 20 20 69 66 28 20 70 41 63 63 75 6d 2d  .    if( pAccum-
8690: 3e 6e 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20  >nChar ){.      
86a0: 69 66 28 20 61 72 67 63 3e 31 20 29 7b 0a 20 20  if( argc>1 ){.  
86b0: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 28 63 68        zSep = (ch
86c0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
86d0: 65 5f 74 65 78 74 28 61 72 67 76 5b 61 72 67 63  e_text(argv[argc
86e0: 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 53  -1]);.        nS
86f0: 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ep = sqlite3_val
8700: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 61 72  ue_bytes(argv[ar
8710: 67 63 2d 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65  gc-1]);.      }e
8720: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 65  lse{.        zSe
8730: 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20 20 20 20  p = ",";.       
8740: 20 6e 53 65 70 20 3d 20 31 3b 0a 20 20 20 20 20   nSep = 1;.     
8750: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8760: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
8770: 41 63 63 75 6d 2c 20 7a 53 65 70 2c 20 6e 53 65  Accum, zSep, nSe
8780: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  p);.    }.    i 
8790: 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  = 0;.    do{.   
87a0: 20 20 20 7a 56 61 6c 20 3d 20 28 63 68 61 72 2a     zVal = (char*
87b0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
87c0: 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  ext(argv[i]);.  
87d0: 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74      nVal = sqlit
87e0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
87f0: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  rgv[i]);.      s
8800: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
8810: 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a 56 61  pend(pAccum, zVa
8820: 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 20 20 20 20  l, nVal);.      
8830: 69 2b 2b 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  i++;.    }while(
8840: 20 69 3c 61 72 67 63 2d 31 20 29 3b 0a 20 20 7d   i<argc-1 );.  }
8850: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  .}.static void g
8860: 72 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69  roupConcatFinali
8870: 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
8880: 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
8890: 53 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d  StrAccum *pAccum
88a0: 3b 0a 20 20 70 41 63 63 75 6d 20 3d 20 73 71 6c  ;.  pAccum = sql
88b0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
88c0: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
88d0: 30 29 3b 0a 20 20 69 66 28 20 70 41 63 63 75 6d  0);.  if( pAccum
88e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 63 63   ){.    if( pAcc
88f0: 75 6d 2d 3e 74 6f 6f 42 69 67 20 29 7b 0a 20 20  um->tooBig ){.  
8900: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8910: 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28  lt_error_toobig(
8920: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65  context);.    }e
8930: 6c 73 65 20 69 66 28 20 70 41 63 63 75 6d 2d 3e  lse if( pAccum->
8940: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
8950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
8960: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
8970: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  (context);.    }
8980: 65 6c 73 65 7b 20 20 20 20 0a 20 20 20 20 20 20  else{    .      
8990: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
89a0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  ext(context, sql
89b0: 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
89c0: 73 68 28 70 41 63 63 75 6d 29 2c 20 2d 31 2c 20  sh(pAccum), -1, 
89d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
89e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
89f0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a  e3_free);.    }.
8a00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
8a10: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73  s function regis
8a20: 74 65 72 65 64 20 61 6c 6c 20 6f 66 20 74 68 65  tered all of the
8a30: 20 61 62 6f 76 65 20 43 20 66 75 6e 63 74 69 6f   above C functio
8a40: 6e 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75 6e  ns as SQL.** fun
8a50: 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 68  ctions.  This sh
8a60: 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79  ould be the only
8a70: 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73   routine in this
8a80: 20 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65 78   file with.** ex
8a90: 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e 0a  ternal linkage..
8aa0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
8ab0: 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
8ac0: 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20  nctions(sqlite3 
8ad0: 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  *db){.#ifndef SQ
8ae0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
8af0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 41 6c  ABLE.  sqlite3Al
8b00: 74 65 72 46 75 6e 63 74 69 6f 6e 73 28 64 62 29  terFunctions(db)
8b10: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  ;.#endif.  if( !
8b20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8b30: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
8b40: 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
8b50: 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  d_function(db, "
8b60: 4d 41 54 43 48 22 2c 20 32 29 3b 0a 20 20 20 20  MATCH", 2);.    
8b70: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
8b80: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d  TE_NOMEM || rc==
8b90: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
8ba0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8bb0: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 64  NOMEM ){.      d
8bc0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8bd0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 1;.    }.  }.#
8be0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45  ifdef SQLITE_SSE
8bf0: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
8c00: 53 73 65 46 75 6e 63 74 69 6f 6e 73 28 64 62 29  SseFunctions(db)
8c10: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
8c20: 2a 20 53 65 74 20 74 68 65 20 4c 49 4b 45 4f 50  * Set the LIKEOP
8c30: 54 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 32 2d  T flag on the 2-
8c40: 61 72 67 75 6d 65 6e 74 20 66 75 6e 63 74 69 6f  argument functio
8c50: 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  n with the given
8c60: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
8c70: 20 76 6f 69 64 20 73 65 74 4c 69 6b 65 4f 70 74   void setLikeOpt
8c80: 46 6c 61 67 28 73 71 6c 69 74 65 33 20 2a 64 62  Flag(sqlite3 *db
8c90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
8ca0: 61 6d 65 2c 20 75 38 20 66 6c 61 67 56 61 6c 29  ame, u8 flagVal)
8cb0: 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65  {.  FuncDef *pDe
8cc0: 66 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69  f;.  pDef = sqli
8cd0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
8ce0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  db, zName, sqlit
8cf0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
8d00: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d20: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
8d30: 30 29 3b 0a 20 20 69 66 28 20 70 44 65 66 20 29  0);.  if( pDef )
8d40: 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66 6c 61 67  {.    pDef->flag
8d50: 73 20 3d 20 66 6c 61 67 56 61 6c 3b 0a 20 20 7d  s = flagVal;.  }
8d60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
8d70: 65 72 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  er the built-in 
8d80: 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66 75  LIKE and GLOB fu
8d90: 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 63 61  nctions.  The ca
8da0: 73 65 53 65 6e 73 69 74 69 76 65 0a 2a 2a 20 70  seSensitive.** p
8db0: 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
8dc0: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
8dd0: 6f 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  ot the LIKE oper
8de0: 61 74 6f 72 20 69 73 20 63 61 73 65 0a 2a 2a 20  ator is case.** 
8df0: 73 65 6e 73 69 74 69 76 65 2e 20 20 47 4c 4f 42  sensitive.  GLOB
8e00: 20 69 73 20 61 6c 77 61 79 73 20 63 61 73 65 20   is always case 
8e10: 73 65 6e 73 69 74 69 76 65 2e 0a 2a 2f 0a 76 6f  sensitive..*/.vo
8e20: 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  id sqlite3Regist
8e30: 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28  erLikeFunctions(
8e40: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
8e50: 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 29 7b   caseSensitive){
8e60: 0a 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72  .  struct compar
8e70: 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  eInfo *pInfo;.  
8e80: 69 66 28 20 63 61 73 65 53 65 6e 73 69 74 69 76  if( caseSensitiv
8e90: 65 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d  e ){.    pInfo =
8ea0: 20 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65   (struct compare
8eb0: 49 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 41  Info*)&likeInfoA
8ec0: 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  lt;.  }else{.   
8ed0: 20 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63 74   pInfo = (struct
8ee0: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c   compareInfo*)&l
8ef0: 69 6b 65 49 6e 66 6f 4e 6f 72 6d 3b 0a 20 20 7d  ikeInfoNorm;.  }
8f00: 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  .  sqlite3Create
8f10: 46 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c  Func(db, "like",
8f20: 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
8f30: 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63   pInfo, likeFunc
8f40: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
8f50: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
8f60: 20 22 6c 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49   "like", 3, SQLI
8f70: 54 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20  TE_UTF8, pInfo, 
8f80: 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b  likeFunc, 0, 0);
8f90: 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  .  sqlite3Create
8fa0: 46 75 6e 63 28 64 62 2c 20 22 67 6c 6f 62 22 2c  Func(db, "glob",
8fb0: 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
8fc0: 20 0a 20 20 20 20 20 20 28 73 74 72 75 63 74 20   .      (struct 
8fd0: 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c  compareInfo*)&gl
8fe0: 6f 62 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63  obInfo, likeFunc
8ff0: 2c 20 30 2c 30 29 3b 0a 20 20 73 65 74 4c 69 6b  , 0,0);.  setLik
9000: 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22 67 6c  eOptFlag(db, "gl
9010: 6f 62 22 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  ob", SQLITE_FUNC
9020: 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46  _LIKE | SQLITE_F
9030: 55 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73 65 74  UNC_CASE);.  set
9040: 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20  LikeOptFlag(db, 
9050: 22 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20 20 63  "like", .      c
9060: 61 73 65 53 65 6e 73 69 74 69 76 65 20 3f 20 28  aseSensitive ? (
9070: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
9080: 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43   | SQLITE_FUNC_C
9090: 41 53 45 29 20 3a 20 53 51 4c 49 54 45 5f 46 55  ASE) : SQLITE_FU
90a0: 4e 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f 2a 0a  NC_LIKE);.}../*.
90b0: 2a 2a 20 70 45 78 70 72 20 70 6f 69 6e 74 73 20  ** pExpr points 
90c0: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
90d0: 20 77 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e 74   which implement
90e0: 73 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  s a function.  I
90f0: 66 0a 2a 2a 20 69 74 20 69 73 20 61 70 70 72 6f  f.** it is appro
9100: 70 72 69 61 74 65 20 74 6f 20 61 70 70 6c 79 20  priate to apply 
9110: 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a  the LIKE optimiz
9120: 61 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 66 75  ation to that fu
9130: 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 73  nction.** then s
9140: 65 74 20 61 57 63 5b 30 5d 20 74 68 72 6f 75 67  et aWc[0] throug
9150: 68 20 61 57 63 5b 32 5d 20 74 6f 20 74 68 65 20  h aWc[2] to the 
9160: 77 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74  wildcard charact
9170: 65 72 73 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  ers and.** retur
9180: 6e 20 54 52 55 45 2e 20 20 49 66 20 74 68 65 20  n TRUE.  If the 
9190: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  function is not 
91a0: 61 20 4c 49 4b 45 2d 73 74 79 6c 65 20 66 75 6e  a LIKE-style fun
91b0: 63 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20 72 65  ction then.** re
91c0: 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69  turn FALSE..*/.i
91d0: 6e 74 20 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  nt sqlite3IsLike
91e0: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
91f0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 45 78 70   *db, Expr *pExp
9200: 72 2c 20 69 6e 74 20 2a 70 49 73 4e 6f 63 61 73  r, int *pIsNocas
9210: 65 2c 20 63 68 61 72 20 2a 61 57 63 29 7b 0a 20  e, char *aWc){. 
9220: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a   FuncDef *pDef;.
9230: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
9240: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20  =TK_FUNCTION || 
9250: 21 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b  !pExpr->pList ){
9260: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9270: 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
9280: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
9290: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
92a0: 0a 20 20 7d 0a 20 20 70 44 65 66 20 3d 20 73 71  .  }.  pDef = sq
92b0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
92c0: 6e 28 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78  n(db, (char*)pEx
92d0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
92e0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 32 2c 0a  pr->token.n, 2,.
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
9310: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
9320: 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 28  if( pDef==0 || (
9330: 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
9340: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3d  LITE_FUNC_LIKE)=
9350: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
9360: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
9370: 65 20 6d 65 6d 63 70 79 28 29 20 73 74 61 74 65  e memcpy() state
9380: 6d 65 6e 74 20 61 73 73 75 6d 65 73 20 74 68 61  ment assumes tha
9390: 74 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63  t the wildcard c
93a0: 68 61 72 61 63 74 65 72 73 20 61 72 65 0a 20 20  haracters are.  
93b0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ** the first thr
93c0: 65 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ee statements in
93d0: 20 74 68 65 20 63 6f 6d 70 61 72 65 49 6e 66 6f   the compareInfo
93e0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
93f0: 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 28 29 20  .  ** asserts() 
9400: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72 69  that follow veri
9410: 66 79 20 74 68 61 74 20 61 73 73 75 6d 70 74 69  fy that assumpti
9420: 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  on.  */.  memcpy
9430: 28 61 57 63 2c 20 70 44 65 66 2d 3e 70 55 73 65  (aWc, pDef->pUse
9440: 72 44 61 74 61 2c 20 33 29 3b 0a 20 20 61 73 73  rData, 3);.  ass
9450: 65 72 74 28 20 28 63 68 61 72 2a 29 26 6c 69 6b  ert( (char*)&lik
9460: 65 49 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68 61  eInfoAlt == (cha
9470: 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e  r*)&likeInfoAlt.
9480: 6d 61 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61 73  matchAll );.  as
9490: 73 65 72 74 28 20 26 28 28 63 68 61 72 2a 29 26  sert( &((char*)&
94a0: 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d 20  likeInfoAlt)[1] 
94b0: 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49  == (char*)&likeI
94c0: 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65 20  nfoAlt.matchOne 
94d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28 28  );.  assert( &((
94e0: 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41  char*)&likeInfoA
94f0: 6c 74 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72 2a  lt)[2] == (char*
9500: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61  )&likeInfoAlt.ma
9510: 74 63 68 53 65 74 20 29 3b 0a 20 20 2a 70 49 73  tchSet );.  *pIs
9520: 4e 6f 63 61 73 65 20 3d 20 28 70 44 65 66 2d 3e  Nocase = (pDef->
9530: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
9540: 55 4e 43 5f 43 41 53 45 29 3d 3d 30 3b 0a 20 20  UNC_CASE)==0;.  
9550: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
9560: 2a 2a 20 41 6c 6c 20 61 6c 6c 20 6f 66 20 74 68  ** All all of th
9570: 65 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  e FuncDef struct
9580: 75 72 65 73 20 69 6e 20 74 68 65 20 61 42 75 69  ures in the aBui
9590: 6c 74 69 6e 46 75 6e 63 5b 5d 20 61 72 72 61 79  ltinFunc[] array
95a0: 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 74 68 65   above.** to the
95b0: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
95c0: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 54 68   hash table.  Th
95d0: 69 73 20 6f 63 63 75 72 73 20 61 74 20 73 74 61  is occurs at sta
95e0: 72 74 2d 74 69 6d 65 20 28 61 73 0a 2a 2a 20 61  rt-time (as.** a
95f0: 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66 20   consequence of 
9600: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
9610: 69 6e 69 74 69 61 6c 69 7a 65 28 29 29 2e 0a 2a  initialize())..*
9620: 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
9630: 72 6f 75 74 69 6e 65 20 72 75 6e 73 0a 2a 2f 0a  routine runs.*/.
9640: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67 69  void sqlite3Regi
9650: 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69  sterGlobalFuncti
9660: 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 0a  ons(void){.  /*.
9670: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
9680: 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 46  ng array holds F
9690: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
96a0: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
96b0: 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20   functions.  ** 
96c0: 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
96d0: 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  file..  **.  ** 
96e0: 54 68 65 20 61 72 72 61 79 20 63 61 6e 6e 6f 74  The array cannot
96f0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 73 69 6e   be constant sin
9700: 63 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ce changes are m
9710: 61 64 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ade to the.  ** 
9720: 46 75 6e 63 44 65 66 2e 70 48 61 73 68 20 65 6c  FuncDef.pHash el
9730: 65 6d 65 6e 74 73 20 61 74 20 73 74 61 72 74 2d  ements at start-
9740: 74 69 6d 65 2e 20 20 54 68 65 20 65 6c 65 6d 65  time.  The eleme
9750: 6e 74 73 20 6f 66 20 74 68 69 73 20 61 72 72 61  nts of this arra
9760: 79 0a 20 20 2a 2a 20 61 72 65 20 72 65 61 64 2d  y.  ** are read-
9770: 6f 6e 6c 79 20 61 66 74 65 72 20 69 6e 69 74 69  only after initi
9780: 61 6c 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d  alization is com
9790: 70 6c 65 74 65 2e 0a 20 20 2a 2f 0a 20 20 73 74  plete..  */.  st
97a0: 61 74 69 63 20 53 51 4c 49 54 45 5f 57 53 44 20  atic SQLITE_WSD 
97b0: 46 75 6e 63 44 65 66 20 61 42 75 69 6c 74 69 6e  FuncDef aBuiltin
97c0: 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 46  Func[] = {.    F
97d0: 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20  UNCTION(ltrim,  
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 31              1, 1
97f0: 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20  , 0, trimFunc   
9800: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
9810: 43 54 49 4f 4e 28 6c 74 72 69 6d 2c 20 20 20 20  CTION(ltrim,    
9820: 20 20 20 20 20 20 20 20 20 20 32 2c 20 31 2c 20            2, 1, 
9830: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
9840: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
9850: 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20 20 20  ION(rtrim,      
9860: 20 20 20 20 20 20 20 20 31 2c 20 32 2c 20 30 2c          1, 2, 0,
9870: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
9880: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
9890: 4e 28 72 74 72 69 6d 2c 20 20 20 20 20 20 20 20  N(rtrim,        
98a0: 20 20 20 20 20 20 32 2c 20 32 2c 20 30 2c 20 74        2, 2, 0, t
98b0: 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20  rimFunc         
98c0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
98d0: 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20  trim,           
98e0: 20 20 20 20 31 2c 20 33 2c 20 30 2c 20 74 72 69      1, 3, 0, tri
98f0: 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c  mFunc         ),
9900: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 72  .    FUNCTION(tr
9910: 69 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  im,             
9920: 20 20 32 2c 20 33 2c 20 30 2c 20 74 72 69 6d 46    2, 3, 0, trimF
9930: 75 6e 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20  unc         ),. 
9940: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c     FUNCTION(min,
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
9960: 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 46  1, 0, 1, minmaxF
9970: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
9980: 20 46 55 4e 43 54 49 4f 4e 28 6d 69 6e 2c 20 20   FUNCTION(min,  
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
99a0: 20 30 2c 20 31 2c 20 30 20 20 20 20 20 20 20 20   0, 1, 0        
99b0: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 41          ),.    A
99c0: 47 47 52 45 47 41 54 45 28 6d 69 6e 2c 20 20 20  GGREGATE(min,   
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
99e0: 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c  , 1, minmaxStep,
99f0: 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61        minMaxFina
9a00: 6c 69 7a 65 20 29 2c 0a 20 20 20 20 46 55 4e 43  lize ),.    FUNC
9a10: 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20 20  TION(max,       
9a20: 20 20 20 20 20 20 20 20 2d 31 2c 20 31 2c 20 31          -1, 1, 1
9a30: 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20 20 20 20  , minmaxFunc    
9a40: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
9a50: 4f 4e 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20  ON(max,         
9a60: 20 20 20 20 20 20 20 30 2c 20 31 2c 20 31 2c 20         0, 1, 1, 
9a70: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
9a80: 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54   ),.    AGGREGAT
9a90: 45 28 6d 61 78 2c 20 20 20 20 20 20 20 20 20 20  E(max,          
9aa0: 20 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 6d 69       1, 1, 1, mi
9ab0: 6e 6d 61 78 53 74 65 70 2c 20 20 20 20 20 20 6d  nmaxStep,      m
9ac0: 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 20 29 2c  inMaxFinalize ),
9ad0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 79  .    FUNCTION(ty
9ae0: 70 65 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  peof,           
9af0: 20 20 31 2c 20 30 2c 20 30 2c 20 74 79 70 65 6f    1, 0, 0, typeo
9b00: 66 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  fFunc       ),. 
9b10: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 65 6e 67     FUNCTION(leng
9b20: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
9b30: 31 2c 20 30 2c 20 30 2c 20 6c 65 6e 67 74 68 46  1, 0, 0, lengthF
9b40: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
9b50: 20 46 55 4e 43 54 49 4f 4e 28 73 75 62 73 74 72   FUNCTION(substr
9b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c  ,             2,
9b70: 20 30 2c 20 30 2c 20 73 75 62 73 74 72 46 75 6e   0, 0, substrFun
9b80: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  c       ),.    F
9b90: 55 4e 43 54 49 4f 4e 28 73 75 62 73 74 72 2c 20  UNCTION(substr, 
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 33 2c 20 30              3, 0
9bb0: 2c 20 30 2c 20 73 75 62 73 74 72 46 75 6e 63 20  , 0, substrFunc 
9bc0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
9bd0: 43 54 49 4f 4e 28 61 62 73 2c 20 20 20 20 20 20  CTION(abs,      
9be0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
9bf0: 30 2c 20 61 62 73 46 75 6e 63 20 20 20 20 20 20  0, absFunc      
9c00: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
9c10: 49 4f 4e 28 72 6f 75 6e 64 2c 20 20 20 20 20 20  ION(round,      
9c20: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
9c30: 20 72 6f 75 6e 64 46 75 6e 63 20 20 20 20 20 20   roundFunc      
9c40: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
9c50: 4e 28 72 6f 75 6e 64 2c 20 20 20 20 20 20 20 20  N(round,        
9c60: 20 20 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 72        2, 0, 0, r
9c70: 6f 75 6e 64 46 75 6e 63 20 20 20 20 20 20 20 20  oundFunc        
9c80: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
9c90: 75 70 70 65 72 2c 20 20 20 20 20 20 20 20 20 20  upper,          
9ca0: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 75 70 70      1, 0, 0, upp
9cb0: 65 72 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c  erFunc        ),
9cc0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f  .    FUNCTION(lo
9cd0: 77 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  wer,            
9ce0: 20 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 77 65 72    1, 0, 0, lower
9cf0: 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20  Func        ),. 
9d00: 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c     FUNCTION(coal
9d10: 65 73 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  esce,           
9d20: 31 2c 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20  1, 0, 0, 0      
9d30: 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20            ),.   
9d40: 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73   FUNCTION(coales
9d50: 63 65 2c 20 20 20 20 20 20 20 20 20 20 2d 31 2c  ce,          -1,
9d60: 20 30 2c 20 30 2c 20 69 66 6e 75 6c 6c 46 75 6e   0, 0, ifnullFun
9d70: 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  c       ),.    F
9d80: 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65  UNCTION(coalesce
9d90: 2c 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30  ,           0, 0
9da0: 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20  , 0, 0          
9db0: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
9dc0: 43 54 49 4f 4e 28 68 65 78 2c 20 20 20 20 20 20  CTION(hex,      
9dd0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
9de0: 30 2c 20 68 65 78 46 75 6e 63 20 20 20 20 20 20  0, hexFunc      
9df0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
9e00: 49 4f 4e 28 69 66 6e 75 6c 6c 2c 20 20 20 20 20  ION(ifnull,     
9e10: 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 31 2c          2, 0, 1,
9e20: 20 69 66 6e 75 6c 6c 46 75 6e 63 20 20 20 20 20   ifnullFunc     
9e30: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
9e40: 4e 28 72 61 6e 64 6f 6d 2c 20 20 20 20 20 20 20  N(random,       
9e50: 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 72        0, 0, 0, r
9e60: 61 6e 64 6f 6d 46 75 6e 63 20 20 20 20 20 20 20  andomFunc       
9e70: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
9e80: 72 61 6e 64 6f 6d 62 6c 6f 62 2c 20 20 20 20 20  randomblob,     
9e90: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 72 61 6e      1, 0, 0, ran
9ea0: 64 6f 6d 42 6c 6f 62 20 20 20 20 20 20 20 29 2c  domBlob       ),
9eb0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6e 75  .    FUNCTION(nu
9ec0: 6c 6c 69 66 2c 20 20 20 20 20 20 20 20 20 20 20  llif,           
9ed0: 20 20 32 2c 20 30 2c 20 31 2c 20 6e 75 6c 6c 69    2, 0, 1, nulli
9ee0: 66 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  fFunc       ),. 
9ef0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69     FUNCTION(sqli
9f00: 74 65 5f 76 65 72 73 69 6f 6e 2c 20 20 20 20 20  te_version,     
9f10: 30 2c 20 30 2c 20 30 2c 20 76 65 72 73 69 6f 6e  0, 0, 0, version
9f20: 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20  Func      ),.   
9f30: 20 46 55 4e 43 54 49 4f 4e 28 71 75 6f 74 65 2c   FUNCTION(quote,
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
9f50: 20 30 2c 20 30 2c 20 71 75 6f 74 65 46 75 6e 63   0, 0, quoteFunc
9f60: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
9f70: 55 4e 43 54 49 4f 4e 28 6c 61 73 74 5f 69 6e 73  UNCTION(last_ins
9f80: 65 72 74 5f 72 6f 77 69 64 2c 20 20 30 2c 20 30  ert_rowid,  0, 0
9f90: 2c 20 30 2c 20 6c 61 73 74 5f 69 6e 73 65 72 74  , 0, last_insert
9fa0: 5f 72 6f 77 69 64 29 2c 0a 20 20 20 20 46 55 4e  _rowid),.    FUN
9fb0: 43 54 49 4f 4e 28 63 68 61 6e 67 65 73 2c 20 20  CTION(changes,  
9fc0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
9fd0: 30 2c 20 63 68 61 6e 67 65 73 20 20 20 20 20 20  0, changes      
9fe0: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
9ff0: 49 4f 4e 28 74 6f 74 61 6c 5f 63 68 61 6e 67 65  ION(total_change
a000: 73 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c  s,      0, 0, 0,
a010: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20 20   total_changes  
a020: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
a030: 4e 28 72 65 70 6c 61 63 65 2c 20 20 20 20 20 20  N(replace,      
a040: 20 20 20 20 20 20 33 2c 20 30 2c 20 30 2c 20 72        3, 0, 0, r
a050: 65 70 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20  eplaceFunc      
a060: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
a070: 7a 65 72 6f 62 6c 6f 62 2c 20 20 20 20 20 20 20  zeroblob,       
a080: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 7a 65 72      1, 0, 0, zer
a090: 6f 62 6c 6f 62 46 75 6e 63 20 20 20 20 20 29 2c  oblobFunc     ),
a0a0: 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
a0b0: 5f 53 4f 55 4e 44 45 58 0a 20 20 20 20 46 55 4e  _SOUNDEX.    FUN
a0c0: 43 54 49 4f 4e 28 73 6f 75 6e 64 65 78 2c 20 20  CTION(soundex,  
a0d0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
a0e0: 30 2c 20 73 6f 75 6e 64 65 78 46 75 6e 63 20 20  0, soundexFunc  
a0f0: 20 20 20 20 29 2c 0a 20 20 23 65 6e 64 69 66 0a      ),.  #endif.
a100: 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45    #ifndef SQLITE
a110: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
a120: 53 49 4f 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f  SION.    FUNCTIO
a130: 4e 28 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  N(load_extension
a140: 2c 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c  ,     1, 0, 0, l
a150: 6f 61 64 45 78 74 20 20 20 20 20 20 20 20 20 20  oadExt          
a160: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
a170: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20  load_extension, 
a180: 20 20 20 20 32 2c 20 30 2c 20 30 2c 20 6c 6f 61      2, 0, 0, loa
a190: 64 45 78 74 20 20 20 20 20 20 20 20 20 20 29 2c  dExt          ),
a1a0: 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 41 47  .  #endif.    AG
a1b0: 47 52 45 47 41 54 45 28 73 75 6d 2c 20 20 20 20  GREGATE(sum,    
a1c0: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
a1d0: 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20   0, sumStep,    
a1e0: 20 20 20 20 20 73 75 6d 46 69 6e 61 6c 69 7a 65       sumFinalize
a1f0: 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45      ),.    AGGRE
a200: 47 41 54 45 28 74 6f 74 61 6c 2c 20 20 20 20 20  GATE(total,     
a210: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
a220: 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20 20   sumStep,       
a230: 20 20 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 20    totalFinalize 
a240: 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47     ),.    AGGREG
a250: 41 54 45 28 61 76 67 2c 20 20 20 20 20 20 20 20  ATE(avg,        
a260: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20         1, 0, 0, 
a270: 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20 20 20  sumStep,        
a280: 20 61 76 67 46 69 6e 61 6c 69 7a 65 20 20 20 20   avgFinalize    
a290: 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54 45  ),.    AGGREGATE
a2a0: 28 63 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20  (count,         
a2b0: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 63 6f 75      0, 0, 0, cou
a2c0: 6e 74 53 74 65 70 2c 20 20 20 20 20 20 20 63 6f  ntStep,       co
a2d0: 75 6e 74 46 69 6e 61 6c 69 7a 65 20 20 29 2c 0a  untFinalize  ),.
a2e0: 20 20 20 20 41 47 47 52 45 47 41 54 45 28 63 6f      AGGREGATE(co
a2f0: 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  unt,            
a300: 20 31 2c 20 30 2c 20 30 2c 20 63 6f 75 6e 74 53   1, 0, 0, countS
a310: 74 65 70 2c 20 20 20 20 20 20 20 63 6f 75 6e 74  tep,       count
a320: 46 69 6e 61 6c 69 7a 65 20 20 29 2c 0a 20 20 20  Finalize  ),.   
a330: 20 41 47 47 52 45 47 41 54 45 28 67 72 6f 75 70   AGGREGATE(group
a340: 5f 63 6f 6e 63 61 74 2c 20 20 20 20 20 2d 31 2c  _concat,     -1,
a350: 20 30 2c 20 30 2c 20 67 72 6f 75 70 43 6f 6e 63   0, 0, groupConc
a360: 61 74 53 74 65 70 2c 20 67 72 6f 75 70 43 6f 6e  atStep, groupCon
a370: 63 61 74 46 69 6e 61 6c 69 7a 65 29 2c 0a 20 20  catFinalize),.  
a380: 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 67 6c  .    LIKEFUNC(gl
a390: 6f 62 2c 20 32 2c 20 26 67 6c 6f 62 49 6e 66 6f  ob, 2, &globInfo
a3a0: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  , SQLITE_FUNC_LI
a3b0: 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  KE|SQLITE_FUNC_C
a3c0: 41 53 45 29 2c 0a 20 20 23 69 66 64 65 66 20 53  ASE),.  #ifdef S
a3d0: 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49  QLITE_CASE_SENSI
a3e0: 54 49 56 45 5f 4c 49 4b 45 0a 20 20 20 20 4c 49  TIVE_LIKE.    LI
a3f0: 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c 20  KEFUNC(like, 2, 
a400: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20 53 51  &likeInfoAlt, SQ
a410: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c 53  LITE_FUNC_LIKE|S
a420: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45 29  QLITE_FUNC_CASE)
a430: 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c  ,.    LIKEFUNC(l
a440: 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49 6e 66  ike, 3, &likeInf
a450: 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46 55 4e  oAlt, SQLITE_FUN
a460: 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55  C_LIKE|SQLITE_FU
a470: 4e 43 5f 43 41 53 45 29 2c 0a 20 20 23 65 6c 73  NC_CASE),.  #els
a480: 65 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 6c  e.    LIKEFUNC(l
a490: 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e 66  ike, 2, &likeInf
a4a0: 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46 55  oNorm, SQLITE_FU
a4b0: 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20 20 20 4c 49  NC_LIKE),.    LI
a4c0: 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c 20  KEFUNC(like, 3, 
a4d0: 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20 53  &likeInfoNorm, S
a4e0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29  QLITE_FUNC_LIKE)
a4f0: 2c 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d 3b 0a  ,.  #endif.  };.
a500: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 75 6e 63  .  int i;.  Func
a510: 44 65 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d  DefHash *pHash =
a520: 20 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66   &GLOBAL(FuncDef
a530: 48 61 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f  Hash, sqlite3Glo
a540: 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20  balFunctions);. 
a550: 20 46 75 6e 63 44 65 66 20 2a 61 46 75 6e 63 20   FuncDef *aFunc 
a560: 3d 20 28 46 75 6e 63 44 65 66 2a 29 26 47 4c 4f  = (FuncDef*)&GLO
a570: 42 41 4c 28 46 75 6e 63 44 65 66 2c 20 61 42 75  BAL(FuncDef, aBu
a580: 69 6c 74 69 6e 46 75 6e 63 29 3b 0a 0a 20 20 66  iltinFunc);..  f
a590: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
a5a0: 69 7a 65 28 61 42 75 69 6c 74 69 6e 46 75 6e 63  ize(aBuiltinFunc
a5b0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
a5c0: 69 74 65 33 46 75 6e 63 44 65 66 49 6e 73 65 72  ite3FuncDefInser
a5d0: 74 28 70 48 61 73 68 2c 20 26 61 46 75 6e 63 5b  t(pHash, &aFunc[
a5e0: 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  i]);.  }.  sqlit
a5f0: 65 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69  e3RegisterDateTi
a600: 6d 65 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 7d  meFunctions();.}
a610: 0a                                               .