/ Hex Artifact Content
Login

Artifact ac12ea20d1087b99b8806d380914fd0cbb985c06:


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 33 33 20 32 30 30 39 2f 30 34 2f 31 35  1.233 2009/04/15
02a0: 20 31 35 3a 31 36 3a 35 33 20 64 72 68 20 45 78   15:16:53 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 20 20  2 = len-p1;.    
14e0: 69 66 28 20 70 32 3c 30 20 29 20 70 32 20 3d 20  if( p2<0 ) p2 = 
14f0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 30 74  0;.  }.  if( p0t
1500: 79 70 65 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype!=SQLITE_BLOB
1510: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a   ){.    while( *
1520: 7a 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20  z && p1 ){.     
1530: 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46   SQLITE_SKIP_UTF
1540: 38 28 7a 29 3b 0a 20 20 20 20 20 20 70 31 2d 2d  8(z);.      p1--
1550: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1560: 7a 32 3d 7a 3b 20 2a 7a 32 20 26 26 20 70 32 3b  z2=z; *z2 && p2;
1570: 20 70 32 2d 2d 29 7b 0a 20 20 20 20 20 20 53 51   p2--){.      SQ
1580: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
1590: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  2);.    }.    sq
15a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
15b0: 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  t(context, (char
15c0: 2a 29 7a 2c 20 28 69 6e 74 29 28 7a 32 2d 7a 29  *)z, (int)(z2-z)
15d0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
15e0: 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NT);.  }else{.  
15f0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1600: 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28  _blob(context, (
1610: 63 68 61 72 2a 29 26 7a 5b 70 31 5d 2c 20 28 69  char*)&z[p1], (i
1620: 6e 74 29 70 32 2c 20 53 51 4c 49 54 45 5f 54 52  nt)p2, SQLITE_TR
1630: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a  ANSIENT);.  }.}.
1640: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1650: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 75  ation of the rou
1660: 6e 64 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f  nd() function.*/
1670: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1680: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1690: 49 4e 54 0a 73 74 61 74 69 63 20 76 6f 69 64 20  INT.static void 
16a0: 72 6f 75 6e 64 46 75 6e 63 28 73 71 6c 69 74 65  roundFunc(sqlite
16b0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
16c0: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
16d0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
16e0: 67 76 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  gv){.  int n = 0
16f0: 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20  ;.  double r;.  
1700: 63 68 61 72 20 7a 42 75 66 5b 35 30 30 5d 3b 20  char zBuf[500]; 
1710: 20 2f 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20   /* larger than 
1720: 74 68 65 20 25 66 20 72 65 70 72 65 73 65 6e 74  the %f represent
1730: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 72  ation of the lar
1740: 67 65 73 74 20 64 6f 75 62 6c 65 20 2a 2f 0a 20  gest double */. 
1750: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
1760: 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20   || argc==2 );. 
1770: 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a   if( argc==2 ){.
1780: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
1790: 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL==sqlite3_val
17a0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29  ue_type(argv[1])
17b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e   ) return;.    n
17c0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
17d0: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  _int(argv[1]);. 
17e0: 20 20 20 69 66 28 20 6e 3e 33 30 20 29 20 6e 20     if( n>30 ) n 
17f0: 3d 20 33 30 3b 0a 20 20 20 20 69 66 28 20 6e 3c  = 30;.    if( n<
1800: 30 20 29 20 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20  0 ) n = 0;.  }. 
1810: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
1820: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
1830: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
1840: 72 65 74 75 72 6e 3b 0a 20 20 72 20 3d 20 73 71  return;.  r = sq
1850: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
1860: 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73  le(argv[0]);.  s
1870: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1880: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75  sizeof(zBuf),zBu
1890: 66 2c 22 25 2e 2a 66 22 2c 6e 2c 72 29 3b 0a 20  f,"%.*f",n,r);. 
18a0: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 42 75   sqlite3AtoF(zBu
18b0: 66 2c 20 26 72 29 3b 0a 20 20 73 71 6c 69 74 65  f, &r);.  sqlite
18c0: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
18d0: 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 7d 0a 23  context, r);.}.#
18e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  endif../*.** All
18f0: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
1900: 73 20 6f 66 20 73 70 61 63 65 20 75 73 69 6e 67  s of space using
1910: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1920: 29 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 6c 6c  ). If the.** all
1930: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 63  ocation fails, c
1940: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 72 65 73 75  all sqlite3_resu
1950: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 29  lt_error_nomem()
1960: 20 74 6f 20 6e 6f 74 69 66 79 0a 2a 2a 20 74 68   to notify.** th
1970: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
1980: 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 28 29 20  e that malloc() 
1990: 68 61 73 20 66 61 69 6c 65 64 20 61 6e 64 20 72  has failed and r
19a0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20 49  eturn NULL..** I
19b0: 66 20 6e 42 79 74 65 20 69 73 20 6c 61 72 67 65  f nByte is large
19c0: 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d  r than the maxim
19d0: 75 6d 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f  um string or blo
19e0: 62 20 6c 65 6e 67 74 68 2c 20 74 68 65 6e 0a 2a  b length, then.*
19f0: 2a 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49 54  * raise an SQLIT
1a00: 45 5f 54 4f 4f 42 49 47 20 65 78 63 65 70 74 69  E_TOOBIG excepti
1a10: 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  on and return NU
1a20: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
1a30: 69 64 20 2a 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f  id *contextMallo
1a40: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
1a50: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 36 34 20  t *context, i64 
1a60: 6e 42 79 74 65 29 7b 0a 20 20 63 68 61 72 20 2a  nByte){.  char *
1a70: 7a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  z;.  sqlite3 *db
1a80: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
1a90: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
1aa0: 74 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28  text);.  assert(
1ab0: 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20 74 65   nByte>0 );.  te
1ac0: 73 74 63 61 73 65 28 20 6e 42 79 74 65 3d 3d 64  stcase( nByte==d
1ad0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
1ae0: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
1af0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 42  ;.  testcase( nB
1b00: 79 74 65 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  yte==db->aLimit[
1b10: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
1b20: 47 54 48 5d 2b 31 20 29 3b 0a 20 20 69 66 28 20  GTH]+1 );.  if( 
1b30: 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74  nByte>db->aLimit
1b40: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
1b50: 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c  NGTH] ){.    sql
1b60: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
1b70: 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74  r_toobig(context
1b80: 29 3b 0a 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20  );.    z = 0;.  
1b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
1ba0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e  qlite3Malloc((in
1bb0: 74 29 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  t)nByte);.    if
1bc0: 28 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  ( !z ){.      sq
1bd0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1be0: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
1bf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1c00: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
1c10: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1c20: 20 6f 66 20 74 68 65 20 75 70 70 65 72 28 29 20   of the upper() 
1c30: 61 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c 20  and lower() SQL 
1c40: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  functions..*/.st
1c50: 61 74 69 63 20 76 6f 69 64 20 75 70 70 65 72 46  atic void upperF
1c60: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
1c70: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
1c80: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
1c90: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
1ca0: 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e   char *z1;.  con
1cb0: 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69  st char *z2;.  i
1cc0: 6e 74 20 69 2c 20 6e 3b 0a 20 20 55 4e 55 53 45  nt i, n;.  UNUSE
1cd0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
1ce0: 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72 2a  );.  z2 = (char*
1cf0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1d00: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
1d10: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
1d20: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
1d30: 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  ;.  /* Verify th
1d40: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f  at the call to _
1d50: 62 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f 74  bytes() does not
1d60: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
1d70: 5f 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72 20  _text() pointer 
1d80: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32 3d  */.  assert( z2=
1d90: 3d 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  =(char*)sqlite3_
1da0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
1db0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32 20  0]) );.  if( z2 
1dc0: 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74  ){.    z1 = cont
1dd0: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
1de0: 74 2c 20 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a  t, ((i64)n)+1);.
1df0: 20 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20 20      if( z1 ){.  
1e00: 20 20 20 20 6d 65 6d 63 70 79 28 7a 31 2c 20 7a      memcpy(z1, z
1e10: 32 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 66  2, n+1);.      f
1e20: 6f 72 28 69 3d 30 3b 20 7a 31 5b 69 5d 3b 20 69  or(i=0; z1[i]; i
1e30: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 31 5b  ++){.        z1[
1e40: 69 5d 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74  i] = (char)sqlit
1e50: 65 33 54 6f 75 70 70 65 72 28 7a 31 5b 69 5d 29  e3Toupper(z1[i])
1e60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e70: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
1e80: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 31 2c  ext(context, z1,
1e90: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
1ea0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
1eb0: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 77 65  static void lowe
1ec0: 72 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  rFunc(sqlite3_co
1ed0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
1ee0: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
1ef0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
1f00: 0a 20 20 75 38 20 2a 7a 31 3b 0a 20 20 63 6f 6e  .  u8 *z1;.  con
1f10: 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69  st char *z2;.  i
1f20: 6e 74 20 69 2c 20 6e 3b 0a 20 20 55 4e 55 53 45  nt i, n;.  UNUSE
1f30: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
1f40: 29 3b 0a 20 20 7a 32 20 3d 20 28 63 68 61 72 2a  );.  z2 = (char*
1f50: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1f60: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
1f70: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
1f80: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
1f90: 3b 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  ;.  /* Verify th
1fa0: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 5f  at the call to _
1fb0: 62 79 74 65 73 28 29 20 64 6f 65 73 20 6e 6f 74  bytes() does not
1fc0: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
1fd0: 5f 74 65 78 74 28 29 20 70 6f 69 6e 74 65 72 20  _text() pointer 
1fe0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 32 3d  */.  assert( z2=
1ff0: 3d 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  =(char*)sqlite3_
2000: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
2010: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 32 20  0]) );.  if( z2 
2020: 29 7b 0a 20 20 20 20 7a 31 20 3d 20 63 6f 6e 74  ){.    z1 = cont
2030: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
2040: 74 2c 20 28 28 69 36 34 29 6e 29 2b 31 29 3b 0a  t, ((i64)n)+1);.
2050: 20 20 20 20 69 66 28 20 7a 31 20 29 7b 0a 20 20      if( z1 ){.  
2060: 20 20 20 20 6d 65 6d 63 70 79 28 7a 31 2c 20 7a      memcpy(z1, z
2070: 32 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 66  2, n+1);.      f
2080: 6f 72 28 69 3d 30 3b 20 7a 31 5b 69 5d 3b 20 69  or(i=0; z1[i]; i
2090: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 31 5b  ++){.        z1[
20a0: 69 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f  i] = sqlite3Tolo
20b0: 77 65 72 28 7a 31 5b 69 5d 29 3b 0a 20 20 20 20  wer(z1[i]);.    
20c0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
20d0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
20e0: 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29 7a  ntext, (char *)z
20f0: 31 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66  1, -1, sqlite3_f
2100: 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ree);.    }.  }.
2110: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2120: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
2130: 46 4e 55 4c 4c 28 29 2c 20 4e 56 4c 28 29 2c 20  FNULL(), NVL(), 
2140: 61 6e 64 20 43 4f 41 4c 45 53 43 45 28 29 20 66  and COALESCE() f
2150: 75 6e 63 74 69 6f 6e 73 2e 20 20 0a 2a 2a 20 41  unctions.  .** A
2160: 6c 6c 20 74 68 72 65 65 20 64 6f 20 74 68 65 20  ll three do the 
2170: 73 61 6d 65 20 74 68 69 6e 67 2e 20 20 54 68 65  same thing.  The
2180: 79 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 72  y return the fir
2190: 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 61  st non-NULL.** a
21a0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
21b0: 69 63 20 76 6f 69 64 20 69 66 6e 75 6c 6c 46 75  ic void ifnullFu
21c0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
21d0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
21e0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
21f0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
2200: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  gv.){.  int i;. 
2210: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
2220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2230: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
2240: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
2250: 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20  argv[i]) ){.    
2260: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2270: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
2280: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
2290: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
22a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
22b0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e 64  entation of rand
22c0: 6f 6d 28 29 2e 20 20 52 65 74 75 72 6e 20 61 20  om().  Return a 
22d0: 72 61 6e 64 6f 6d 20 69 6e 74 65 67 65 72 2e 20  random integer. 
22e0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
22f0: 20 72 61 6e 64 6f 6d 46 75 6e 63 28 0a 20 20 73   randomFunc(.  s
2300: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2310: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e  context,.  int N
2320: 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65  otUsed,.  sqlite
2330: 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65  3_value **NotUse
2340: 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65 5f 69  d2.){.  sqlite_i
2350: 6e 74 36 34 20 72 3b 0a 20 20 55 4e 55 53 45 44  nt64 r;.  UNUSED
2360: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
2370: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
2380: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
2390: 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20  ness(sizeof(r), 
23a0: 26 72 29 3b 0a 20 20 69 66 28 20 72 3c 30 20 29  &r);.  if( r<0 )
23b0: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 6e 65 65 64  {.    /* We need
23c0: 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72 61   to prevent a ra
23d0: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 6f 66 20 30  ndom number of 0
23e0: 78 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30  x800000000000000
23f0: 30 20 0a 20 20 20 20 2a 2a 20 28 6f 72 20 2d 39  0 .    ** (or -9
2400: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
2410: 30 38 29 20 73 69 6e 63 65 20 77 68 65 6e 20 79  08) since when y
2420: 6f 75 20 64 6f 20 61 62 73 28 29 20 6f 66 20 74  ou do abs() of t
2430: 68 61 74 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  hat.    ** numbe
2440: 72 20 6f 66 20 79 6f 75 20 67 65 74 20 74 68 65  r of you get the
2450: 20 73 61 6d 65 20 76 61 6c 75 65 20 62 61 63 6b   same value back
2460: 20 61 67 61 69 6e 2e 20 20 54 6f 20 64 6f 20 74   again.  To do t
2470: 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20  his.    ** in a 
2480: 77 61 79 20 74 68 61 74 20 69 73 20 74 65 73 74  way that is test
2490: 61 62 6c 65 2c 20 6d 61 73 6b 20 74 68 65 20 73  able, mask the s
24a0: 69 67 6e 20 62 69 74 20 6f 66 66 20 6f 66 20 6e  ign bit off of n
24b0: 65 67 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 76  egative.    ** v
24c0: 61 6c 75 65 73 2c 20 72 65 73 75 6c 74 69 6e 67  alues, resulting
24d0: 20 69 6e 20 61 20 70 6f 73 69 74 69 76 65 20 76   in a positive v
24e0: 61 6c 75 65 2e 20 20 54 68 65 6e 20 74 61 6b 65  alue.  Then take
24f0: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 32 73 20   the .    ** 2s 
2500: 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68  complement of th
2510: 61 74 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  at positive valu
2520: 65 2e 20 20 54 68 65 20 65 6e 64 20 72 65 73 75  e.  The end resu
2530: 6c 74 20 63 61 6e 0a 20 20 20 20 2a 2a 20 74 68  lt can.    ** th
2540: 65 72 65 66 6f 72 65 20 62 65 20 6e 6f 20 6c 65  erefore be no le
2550: 73 73 20 74 68 61 6e 20 2d 39 32 32 33 33 37 32  ss than -9223372
2560: 30 33 36 38 35 34 37 37 35 38 30 37 2e 0a 20 20  036854775807..  
2570: 20 20 2a 2f 0a 20 20 20 20 72 20 3d 20 2d 28 72    */.    r = -(r
2580: 20 5e 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e   ^ (((sqlite3_in
2590: 74 36 34 29 31 29 3c 3c 36 33 29 29 3b 0a 20 20  t64)1)<<63));.  
25a0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
25b0: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
25c0: 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , r);.}../*.** I
25d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
25e0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 4e 29 2e 20   randomblob(N). 
25f0: 20 52 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d   Return a random
2600: 20 62 6c 6f 62 0a 2a 2a 20 74 68 61 74 20 69 73   blob.** that is
2610: 20 4e 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a   N bytes long..*
2620: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61  /.static void ra
2630: 6e 64 6f 6d 42 6c 6f 62 28 0a 20 20 73 71 6c 69  ndomBlob(.  sqli
2640: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
2650: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
2660: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
2670: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
2680: 74 20 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t n;.  unsigned 
2690: 63 68 61 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  char *p;.  asser
26a0: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
26b0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
26c0: 28 61 72 67 63 29 3b 0a 20 20 6e 20 3d 20 73 71  (argc);.  n = sq
26d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
26e0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
26f0: 6e 3c 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 31  n<1 ){.    n = 1
2700: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 63 6f 6e 74  ;.  }.  p = cont
2710: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
2720: 74 2c 20 6e 29 3b 0a 20 20 69 66 28 20 70 20 29  t, n);.  if( p )
2730: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  {.    sqlite3_ra
2740: 6e 64 6f 6d 6e 65 73 73 28 6e 2c 20 70 29 3b 0a  ndomness(n, p);.
2750: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2760: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
2770: 20 28 63 68 61 72 2a 29 70 2c 20 6e 2c 20 73 71   (char*)p, n, sq
2780: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
2790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
27a0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
27b0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
27c0: 64 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  d() SQL function
27d0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a  .  The return.**
27e0: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
27f0: 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  me as the sqlite
2800: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
2810: 77 69 64 28 29 20 41 50 49 20 66 75 6e 63 74 69  wid() API functi
2820: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
2830: 69 64 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  id last_insert_r
2840: 6f 77 69 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  owid(.  sqlite3_
2850: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
2860: 2c 20 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64  , .  int NotUsed
2870: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
2880: 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b  ue **NotUsed2.){
2890: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
28a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
28b0: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
28c0: 78 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  xt);.  UNUSED_PA
28d0: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
28e0: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 73  , NotUsed2);.  s
28f0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
2900: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  t64(context, sql
2910: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
2920: 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 7d 0a 0a  _rowid(db));.}..
2930: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
2940: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 61 6e  tion of the chan
2950: 67 65 73 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ges() SQL functi
2960: 6f 6e 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  on.  The return 
2970: 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20  value is the.** 
2980: 73 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69  same as the sqli
2990: 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 41 50  te3_changes() AP
29a0: 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  I function..*/.s
29b0: 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67  tatic void chang
29c0: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  es(.  sqlite3_co
29d0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
29e0: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
29f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2a00: 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73  *NotUsed2.){.  s
2a10: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
2a20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
2a30: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
2a40: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2a50: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
2a60: 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c 69 74  tUsed2);.  sqlit
2a70: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
2a80: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63  ntext, sqlite3_c
2a90: 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a  hanges(db));.}..
2aa0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
2ab0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 6f 74 61  tion of the tota
2ac0: 6c 5f 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20  l_changes() SQL 
2ad0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72  function.  The r
2ae0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 0a 2a  eturn value is.*
2af0: 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  * the same as th
2b00: 65 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  e sqlite3_total_
2b10: 63 68 61 6e 67 65 73 28 29 20 41 50 49 20 66 75  changes() API fu
2b20: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2b30: 63 20 76 6f 69 64 20 74 6f 74 61 6c 5f 63 68 61  c void total_cha
2b40: 6e 67 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  nges(.  sqlite3_
2b50: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
2b60: 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c  ,.  int NotUsed,
2b70: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2b80: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
2b90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
2ba0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
2bb0: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
2bc0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2bd0: 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
2be0: 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 73 71 6c  NotUsed2);.  sql
2bf0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
2c00: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
2c10: 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 64  _total_changes(d
2c20: 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  b));.}../*.** A 
2c30: 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e 69  structure defini
2c40: 6e 67 20 68 6f 77 20 74 6f 20 64 6f 20 47 4c 4f  ng how to do GLO
2c50: 42 2d 73 74 79 6c 65 20 63 6f 6d 70 61 72 69 73  B-style comparis
2c60: 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63  ons..*/.struct c
2c70: 6f 6d 70 61 72 65 49 6e 66 6f 20 7b 0a 20 20 75  ompareInfo {.  u
2c80: 38 20 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38  8 matchAll;.  u8
2c90: 20 6d 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20   matchOne;.  u8 
2ca0: 6d 61 74 63 68 53 65 74 3b 0a 20 20 75 38 20 6e  matchSet;.  u8 n
2cb0: 6f 43 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  oCase;.};../*.**
2cc0: 20 46 6f 72 20 4c 49 4b 45 20 61 6e 64 20 47 4c   For LIKE and GL
2cd0: 4f 42 20 6d 61 74 63 68 69 6e 67 20 6f 6e 20 45  OB matching on E
2ce0: 42 43 44 49 43 20 6d 61 63 68 69 6e 65 73 2c 20  BCDIC machines, 
2cf0: 61 73 73 75 6d 65 20 74 68 61 74 20 65 76 65 72  assume that ever
2d00: 79 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 69  y.** character i
2d10: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 62 79  s exactly one by
2d20: 74 65 20 69 6e 20 73 69 7a 65 2e 20 20 41 6c 73  te in size.  Als
2d30: 6f 2c 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72  o, all character
2d40: 73 20 61 72 65 0a 2a 2a 20 61 62 6c 65 20 74 6f  s are.** able to
2d50: 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2d60: 75 70 70 65 72 2d 63 61 73 65 2d 74 6f 2d 6c 6f  upper-case-to-lo
2d70: 77 65 72 2d 63 61 73 65 20 6d 61 70 70 69 6e 67  wer-case mapping
2d80: 73 20 69 6e 20 45 42 43 44 49 43 0a 2a 2a 20 77  s in EBCDIC.** w
2d90: 68 65 72 65 61 73 20 6f 6e 6c 79 20 63 68 61 72  hereas only char
2da0: 61 63 74 65 72 73 20 6c 65 73 73 20 74 68 61 6e  acters less than
2db0: 20 30 78 38 30 20 64 6f 20 69 6e 20 41 53 43 49   0x80 do in ASCI
2dc0: 49 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  I..*/.#if define
2dd0: 64 28 53 51 4c 49 54 45 5f 45 42 43 44 49 43 29  d(SQLITE_EBCDIC)
2de0: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
2df0: 33 55 74 66 38 52 65 61 64 28 41 2c 43 29 20 20  3Utf8Read(A,C)  
2e00: 20 20 28 2a 28 41 2b 2b 29 29 0a 23 20 64 65 66    (*(A++)).# def
2e10: 69 6e 65 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c  ine GlogUpperToL
2e20: 6f 77 65 72 28 41 29 20 20 20 20 20 41 20 3d 20  ower(A)     A = 
2e30: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
2e40: 77 65 72 5b 41 5d 0a 23 65 6c 73 65 0a 23 20 64  wer[A].#else.# d
2e50: 65 66 69 6e 65 20 47 6c 6f 67 55 70 70 65 72 54  efine GlogUpperT
2e60: 6f 4c 6f 77 65 72 28 41 29 20 20 20 20 20 69 66  oLower(A)     if
2e70: 28 20 41 3c 30 78 38 30 20 29 7b 20 41 20 3d 20  ( A<0x80 ){ A = 
2e80: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
2e90: 77 65 72 5b 41 5d 3b 20 7d 0a 23 65 6e 64 69 66  wer[A]; }.#endif
2ea0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  ..static const s
2eb0: 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66  truct compareInf
2ec0: 6f 20 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b 20 27  o globInfo = { '
2ed0: 2a 27 2c 20 27 3f 27 2c 20 27 5b 27 2c 20 30 20  *', '?', '[', 0 
2ee0: 7d 3b 0a 2f 2a 20 54 68 65 20 63 6f 72 72 65 63  };./* The correc
2ef0: 74 20 53 51 4c 2d 39 32 20 62 65 68 61 76 69 6f  t SQL-92 behavio
2f00: 72 20 69 73 20 66 6f 72 20 74 68 65 20 4c 49 4b  r is for the LIK
2f10: 45 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 69 67  E operator to ig
2f20: 6e 6f 72 65 0a 2a 2a 20 63 61 73 65 2e 20 20 54  nore.** case.  T
2f30: 68 75 73 20 20 27 61 27 20 4c 49 4b 45 20 27 41  hus  'a' LIKE 'A
2f40: 27 20 77 6f 75 6c 64 20 62 65 20 74 72 75 65 2e  ' would be true.
2f50: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
2f60: 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49   struct compareI
2f70: 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d  nfo likeInfoNorm
2f80: 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20 20   = { '%', '_',  
2f90: 20 30 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66 20 53   0, 1 };./* If S
2fa0: 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e 53 49  QLITE_CASE_SENSI
2fb0: 54 49 56 45 5f 4c 49 4b 45 20 69 73 20 64 65 66  TIVE_LIKE is def
2fc0: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 20 4c  ined, then the L
2fd0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  IKE operator.** 
2fe0: 69 73 20 63 61 73 65 20 73 65 6e 73 69 74 69 76  is case sensitiv
2ff0: 65 20 63 61 75 73 69 6e 67 20 27 61 27 20 4c 49  e causing 'a' LI
3000: 4b 45 20 27 41 27 20 74 6f 20 62 65 20 66 61 6c  KE 'A' to be fal
3010: 73 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  se */.static con
3020: 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72  st struct compar
3030: 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 41 6c  eInfo likeInfoAl
3040: 74 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20  t = { '%', '_', 
3050: 20 20 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a    0, 0 };../*.**
3060: 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46   Compare two UTF
3070: 2d 38 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65  -8 strings for e
3080: 71 75 61 6c 69 74 79 20 77 68 65 72 65 20 74 68  quality where th
3090: 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20 63  e first string c
30a0: 61 6e 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c  an.** potentiall
30b0: 79 20 62 65 20 61 20 22 67 6c 6f 62 22 20 65 78  y be a "glob" ex
30c0: 70 72 65 73 73 69 6f 6e 2e 20 20 52 65 74 75 72  pression.  Retur
30d0: 6e 20 74 72 75 65 20 28 31 29 20 69 66 20 74 68  n true (1) if th
30e0: 65 79 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  ey.** are the sa
30f0: 6d 65 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29  me and false (0)
3100: 20 69 66 20 74 68 65 79 20 61 72 65 20 64 69 66   if they are dif
3110: 66 65 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c  ferent..**.** Gl
3120: 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a  obbing rules:.**
3130: 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20  .**      '*'    
3140: 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73     Matches any s
3150: 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20  equence of zero 
3160: 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65  or more characte
3170: 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  rs..**.**      '
3180: 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  ?'       Matches
3190: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61   exactly one cha
31a0: 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  racter..**.**   
31b0: 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74    [...]      Mat
31c0: 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74  ches one charact
31d0: 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c  er from the encl
31e0: 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20  osed list of.** 
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
3200: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  haracters..**.**
3210: 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20       [^...]     
3220: 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72  Matches one char
3230: 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65  acter not in the
3240: 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a   enclosed list..
3250: 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 5b  **.** With the [
3260: 2e 2e 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20  ...] and [^...] 
3270: 6d 61 74 63 68 69 6e 67 2c 20 61 20 27 5d 27 20  matching, a ']' 
3280: 63 68 61 72 61 63 74 65 72 20 63 61 6e 20 62 65  character can be
3290: 20 69 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20   included.** in 
32a0: 74 68 65 20 6c 69 73 74 20 62 79 20 6d 61 6b 69  the list by maki
32b0: 6e 67 20 69 74 20 74 68 65 20 66 69 72 73 74 20  ng it the first 
32c0: 63 68 61 72 61 63 74 65 72 20 61 66 74 65 72 20  character after 
32d0: 27 5b 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a 2a  '[' or '^'.  A.*
32e0: 2a 20 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61  * range of chara
32f0: 63 74 65 72 73 20 63 61 6e 20 62 65 20 73 70 65  cters can be spe
3300: 63 69 66 69 65 64 20 75 73 69 6e 67 20 27 2d 27  cified using '-'
3310: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22  .  Example:.** "
3320: 5b 61 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20 61  [a-z]" matches a
3330: 6e 79 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72 2d  ny single lower-
3340: 63 61 73 65 20 6c 65 74 74 65 72 2e 20 20 54 6f  case letter.  To
3350: 20 6d 61 74 63 68 20 61 20 27 2d 27 2c 20 6d 61   match a '-', ma
3360: 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61 73  ke.** it the las
3370: 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74  t character in t
3380: 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  he list..**.** T
3390: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
33a0: 73 75 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75  sually quick, bu
33b0: 74 20 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e  t can be N**2 in
33c0: 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e   the worst case.
33d0: 0a 2a 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20 74 6f  .**.** Hints: to
33e0: 20 6d 61 74 63 68 20 27 2a 27 20 6f 72 20 27 3f   match '*' or '?
33f0: 27 2c 20 70 75 74 20 74 68 65 6d 20 69 6e 20 22  ', put them in "
3400: 5b 5d 22 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  []".  Like this:
3410: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  .**.**         a
3420: 62 63 5b 2a 5d 78 79 7a 20 20 20 20 20 20 20 20  bc[*]xyz        
3430: 4d 61 74 63 68 65 73 20 22 61 62 63 2a 78 79 7a  Matches "abc*xyz
3440: 22 20 6f 6e 6c 79 0a 2a 2f 0a 73 74 61 74 69 63  " only.*/.static
3450: 20 69 6e 74 20 70 61 74 74 65 72 6e 43 6f 6d 70   int patternComp
3460: 61 72 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20  are(.  const u8 
3470: 2a 7a 50 61 74 74 65 72 6e 2c 20 20 20 20 20 20  *zPattern,      
3480: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67          /* The g
3490: 6c 6f 62 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20  lob pattern */. 
34a0: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 53 74 72 69   const u8 *zStri
34b0: 6e 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ng,             
34c0: 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 20    /* The string 
34d0: 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
34e0: 73 74 20 74 68 65 20 67 6c 6f 62 20 2a 2f 0a 20  st the glob */. 
34f0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f   const struct co
3500: 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f  mpareInfo *pInfo
3510: 2c 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  , /* Information
3520: 20 61 62 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f   about how to do
3530: 20 74 68 65 20 63 6f 6d 70 61 72 65 20 2a 2f 0a   the compare */.
3540: 20 20 63 6f 6e 73 74 20 69 6e 74 20 65 73 63 20    const int esc 
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 20 20 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65     /* The escape
3570: 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 29 7b   character */.){
3580: 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20  .  int c, c2;.  
3590: 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e  int invert;.  in
35a0: 74 20 73 65 65 6e 3b 0a 20 20 75 38 20 6d 61 74  t seen;.  u8 mat
35b0: 63 68 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d 3e 6d  chOne = pInfo->m
35c0: 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61  atchOne;.  u8 ma
35d0: 74 63 68 41 6c 6c 20 3d 20 70 49 6e 66 6f 2d 3e  tchAll = pInfo->
35e0: 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d  matchAll;.  u8 m
35f0: 61 74 63 68 53 65 74 20 3d 20 70 49 6e 66 6f 2d  atchSet = pInfo-
3600: 3e 6d 61 74 63 68 53 65 74 3b 0a 20 20 75 38 20  >matchSet;.  u8 
3610: 6e 6f 43 61 73 65 20 3d 20 70 49 6e 66 6f 2d 3e  noCase = pInfo->
3620: 6e 6f 43 61 73 65 3b 20 0a 20 20 69 6e 74 20 70  noCase; .  int p
3630: 72 65 76 45 73 63 61 70 65 20 3d 20 30 3b 20 20  revEscape = 0;  
3640: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
3650: 65 20 70 72 65 76 69 6f 75 73 20 63 68 61 72 61  e previous chara
3660: 63 74 65 72 20 77 61 73 20 27 65 73 63 61 70 65  cter was 'escape
3670: 27 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 28  ' */..  while( (
3680: 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  c = sqlite3Utf8R
3690: 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 26 7a 50  ead(zPattern,&zP
36a0: 61 74 74 65 72 6e 29 29 21 3d 30 20 29 7b 0a 20  attern))!=0 ){. 
36b0: 20 20 20 69 66 28 20 21 70 72 65 76 45 73 63 61     if( !prevEsca
36c0: 70 65 20 26 26 20 63 3d 3d 6d 61 74 63 68 41 6c  pe && c==matchAl
36d0: 6c 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  l ){.      while
36e0: 28 20 28 63 3d 73 71 6c 69 74 65 33 55 74 66 38  ( (c=sqlite3Utf8
36f0: 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 26 7a  Read(zPattern,&z
3700: 50 61 74 74 65 72 6e 29 29 20 3d 3d 20 6d 61 74  Pattern)) == mat
3710: 63 68 41 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  chAll.          
3720: 20 20 20 20 20 7c 7c 20 63 20 3d 3d 20 6d 61 74       || c == mat
3730: 63 68 4f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  chOne ){.       
3740: 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 4f 6e 65   if( c==matchOne
3750: 20 26 26 20 73 71 6c 69 74 65 33 55 74 66 38 52   && sqlite3Utf8R
3760: 65 61 64 28 7a 53 74 72 69 6e 67 2c 20 26 7a 53  ead(zString, &zS
3770: 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a 20 20 20  tring)==0 ){.   
3780: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
3790: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37a0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
37b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
37c0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 1;.      }el
37d0: 73 65 20 69 66 28 20 63 3d 3d 65 73 63 20 29 7b  se if( c==esc ){
37e0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
37f0: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50 61  ite3Utf8Read(zPa
3800: 74 74 65 72 6e 2c 20 26 7a 50 61 74 74 65 72 6e  ttern, &zPattern
3810: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
3820: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
3830: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
3840: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
3850: 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 53 65 74   if( c==matchSet
3860: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
3870: 72 74 28 20 65 73 63 3d 3d 30 20 29 3b 20 20 20  rt( esc==0 );   
3880: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
3890: 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45 20   GLOB, not LIKE 
38a0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
38b0: 74 28 20 6d 61 74 63 68 53 65 74 3c 30 78 38 30  t( matchSet<0x80
38c0: 20 29 3b 20 20 2f 2a 20 27 5b 27 20 69 73 20 61   );  /* '[' is a
38d0: 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 63 68 61   single-byte cha
38e0: 72 61 63 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  racter */.      
38f0: 20 20 77 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e    while( *zStrin
3900: 67 20 26 26 20 70 61 74 74 65 72 6e 43 6f 6d 70  g && patternComp
3910: 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 2d 31  are(&zPattern[-1
3920: 5d 2c 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c  ],zString,pInfo,
3930: 65 73 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  esc)==0 ){.     
3940: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50       SQLITE_SKIP
3950: 5f 55 54 46 38 28 7a 53 74 72 69 6e 67 29 3b 0a  _UTF8(zString);.
3960: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3970: 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e    return *zStrin
3980: 67 21 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  g!=0;.      }.  
3990: 20 20 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d      while( (c2 =
39a0: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
39b0: 28 7a 53 74 72 69 6e 67 2c 26 7a 53 74 72 69 6e  (zString,&zStrin
39c0: 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  g))!=0 ){.      
39d0: 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a    if( noCase ){.
39e0: 20 20 20 20 20 20 20 20 20 20 47 6c 6f 67 55 70            GlogUp
39f0: 70 65 72 54 6f 4c 6f 77 65 72 28 63 32 29 3b 0a  perToLower(c2);.
3a00: 20 20 20 20 20 20 20 20 20 20 47 6c 6f 67 55 70            GlogUp
3a10: 70 65 72 54 6f 4c 6f 77 65 72 28 63 29 3b 0a 20  perToLower(c);. 
3a20: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
3a30: 63 32 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d  c2 != 0 && c2 !=
3a40: 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   c ){.          
3a50: 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74    c2 = sqlite3Ut
3a60: 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67 2c 20  f8Read(zString, 
3a70: 26 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20  &zString);.     
3a80: 20 20 20 20 20 20 20 47 6c 6f 67 55 70 70 65 72         GlogUpper
3a90: 54 6f 4c 6f 77 65 72 28 63 32 29 3b 0a 20 20 20  ToLower(c2);.   
3aa0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3ab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3ac0: 20 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20 30    while( c2 != 0
3ad0: 20 26 26 20 63 32 20 21 3d 20 63 20 29 7b 0a 20   && c2 != c ){. 
3ae0: 20 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20             c2 = 
3af0: 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28  sqlite3Utf8Read(
3b00: 7a 53 74 72 69 6e 67 2c 20 26 7a 53 74 72 69 6e  zString, &zStrin
3b10: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
3b20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3b30: 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65    if( c2==0 ) re
3b40: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
3b50: 69 66 28 20 70 61 74 74 65 72 6e 43 6f 6d 70 61  if( patternCompa
3b60: 72 65 28 7a 50 61 74 74 65 72 6e 2c 7a 53 74 72  re(zPattern,zStr
3b70: 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63 29 20 29  ing,pInfo,esc) )
3b80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
3b90: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
3ba0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
3bb0: 20 21 70 72 65 76 45 73 63 61 70 65 20 26 26 20   !prevEscape && 
3bc0: 63 3d 3d 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20  c==matchOne ){. 
3bd0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3be0: 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67  Utf8Read(zString
3bf0: 2c 20 26 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29  , &zString)==0 )
3c00: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3c10: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
3c20: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 6d 61 74  }else if( c==mat
3c30: 63 68 53 65 74 20 29 7b 0a 20 20 20 20 20 20 69  chSet ){.      i
3c40: 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a  nt prior_c = 0;.
3c50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 73        assert( es
3c60: 63 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 54 68  c==0 );    /* Th
3c70: 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 66  is only occurs f
3c80: 6f 72 20 47 4c 4f 42 2c 20 6e 6f 74 20 4c 49 4b  or GLOB, not LIK
3c90: 45 20 2a 2f 0a 20 20 20 20 20 20 73 65 65 6e 20  E */.      seen 
3ca0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72  = 0;.      inver
3cb0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d  t = 0;.      c =
3cc0: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
3cd0: 28 7a 53 74 72 69 6e 67 2c 20 26 7a 53 74 72 69  (zString, &zStri
3ce0: 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ng);.      if( c
3cf0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3d00: 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74        c2 = sqlit
3d10: 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  e3Utf8Read(zPatt
3d20: 65 72 6e 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b  ern, &zPattern);
3d30: 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27  .      if( c2=='
3d40: 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ^' ){.        in
3d50: 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  vert = 1;.      
3d60: 20 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74    c2 = sqlite3Ut
3d70: 66 38 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c  f8Read(zPattern,
3d80: 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20   &zPattern);.   
3d90: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
3da0: 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20  2==']' ){.      
3db0: 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73    if( c==']' ) s
3dc0: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
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 50 61 74 74 65 72 6e 2c 20  8Read(zPattern, 
3df0: 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  &zPattern);.    
3e00: 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
3e10: 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29   c2 && c2!=']' )
3e20: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32  {.        if( c2
3e30: 3d 3d 27 2d 27 20 26 26 20 7a 50 61 74 74 65 72  =='-' && zPatter
3e40: 6e 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 50 61  n[0]!=']' && zPa
3e50: 74 74 65 72 6e 5b 30 5d 21 3d 30 20 26 26 20 70  ttern[0]!=0 && p
3e60: 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20  rior_c>0 ){.    
3e70: 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74        c2 = sqlit
3e80: 65 33 55 74 66 38 52 65 61 64 28 7a 50 61 74 74  e3Utf8Read(zPatt
3e90: 65 72 6e 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b  ern, &zPattern);
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
3eb0: 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d  >=prior_c && c<=
3ec0: 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20  c2 ) seen = 1;. 
3ed0: 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
3ee0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
3ef0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
3f00: 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20  f( c==c2 ){.    
3f10: 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31          seen = 1
3f20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3f30: 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20          prior_c 
3f40: 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = c2;.        }.
3f50: 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c          c2 = sql
3f60: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50 61  ite3Utf8Read(zPa
3f70: 74 74 65 72 6e 2c 20 26 7a 50 61 74 74 65 72 6e  ttern, &zPattern
3f80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3f90: 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73   if( c2==0 || (s
3fa0: 65 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30  een ^ invert)==0
3fb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
3fc0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
3fd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 73 63 3d    }else if( esc=
3fe0: 3d 63 20 26 26 20 21 70 72 65 76 45 73 63 61 70  =c && !prevEscap
3ff0: 65 20 29 7b 0a 20 20 20 20 20 20 70 72 65 76 45  e ){.      prevE
4000: 73 63 61 70 65 20 3d 20 31 3b 0a 20 20 20 20 7d  scape = 1;.    }
4010: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 32 20 3d  else{.      c2 =
4020: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
4030: 28 7a 53 74 72 69 6e 67 2c 20 26 7a 53 74 72 69  (zString, &zStri
4040: 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ng);.      if( n
4050: 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  oCase ){.       
4060: 20 47 6c 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65   GlogUpperToLowe
4070: 72 28 63 29 3b 0a 20 20 20 20 20 20 20 20 47 6c  r(c);.        Gl
4080: 6f 67 55 70 70 65 72 54 6f 4c 6f 77 65 72 28 63  ogUpperToLower(c
4090: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
40a0: 20 20 69 66 28 20 63 21 3d 63 32 20 29 7b 0a 20    if( c!=c2 ){. 
40b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
40c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
40d0: 72 65 76 45 73 63 61 70 65 20 3d 20 30 3b 0a 20  revEscape = 0;. 
40e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
40f0: 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 3b 0a 7d  n *zString==0;.}
4100: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
4110: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
4120: 73 20 74 68 61 74 20 74 68 65 20 4c 49 4b 45 20  s that the LIKE 
4130: 6f 70 65 72 61 74 6f 72 20 28 6f 72 20 47 4c 4f  operator (or GLO
4140: 42 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6a 75  B which is.** ju
4150: 73 74 20 61 20 76 61 72 69 61 74 69 6f 6e 20 6f  st a variation o
4160: 66 20 4c 49 4b 45 29 20 67 65 74 73 20 63 61 6c  f LIKE) gets cal
4170: 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 75 73  led.  This is us
4180: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
4190: 2a 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  * only..*/.#ifde
41a0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
41b0: 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63  t sqlite3_like_c
41c0: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
41d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  .../*.** Impleme
41e0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
41f0: 69 6b 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ike() SQL functi
4200: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
4210: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  on implements.**
4220: 20 74 68 65 20 62 75 69 6c 64 2d 69 6e 20 4c 49   the build-in LI
4230: 4b 45 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68  KE operator.  Th
4240: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
4250: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
4260: 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 74 74 65   is the.** patte
4270: 72 6e 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  rn and the secon
4280: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
4290: 65 20 73 74 72 69 6e 67 2e 20 20 53 6f 2c 20 74  e string.  So, t
42a0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
42b0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41  s:.**.**       A
42c0: 20 4c 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69 73   LIKE B.**.** is
42d0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
42e0: 6c 69 6b 65 28 42 2c 41 29 2e 0a 2a 2a 0a 2a 2a  like(B,A)..**.**
42f0: 20 54 68 69 73 20 73 61 6d 65 20 66 75 6e 63 74   This same funct
4300: 69 6f 6e 20 28 77 69 74 68 20 61 20 64 69 66 66  ion (with a diff
4310: 65 72 65 6e 74 20 63 6f 6d 70 61 72 65 49 6e 66  erent compareInf
4320: 6f 20 73 74 72 75 63 74 75 72 65 29 20 63 6f 6d  o structure) com
4330: 70 75 74 65 73 0a 2a 2a 20 74 68 65 20 47 4c 4f  putes.** the GLO
4340: 42 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73  B operator..*/.s
4350: 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6b 65 46  tatic void likeF
4360: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
4370: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
4380: 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20   .  int argc, . 
4390: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
43a0: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
43b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
43c0: 7a 41 2c 20 2a 7a 42 3b 0a 20 20 69 6e 74 20 65  zA, *zB;.  int e
43d0: 73 63 61 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  scape = 0;.  int
43e0: 20 6e 50 61 74 3b 0a 20 20 73 71 6c 69 74 65 33   nPat;.  sqlite3
43f0: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
4400: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
4410: 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 7a 42  (context);..  zB
4420: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4430: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
4440: 20 20 7a 41 20 3d 20 73 71 6c 69 74 65 33 5f 76    zA = sqlite3_v
4450: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
4460: 5d 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6d 69 74 20  ]);..  /* Limit 
4470: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
4480: 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70  e LIKE or GLOB p
4490: 61 74 74 65 72 6e 20 74 6f 20 61 76 6f 69 64 20  attern to avoid 
44a0: 70 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 6f 66  problems.  ** of
44b0: 20 64 65 65 70 20 72 65 63 75 72 73 69 6f 6e 20   deep recursion 
44c0: 61 6e 64 20 4e 2a 4e 20 62 65 68 61 76 69 6f 72  and N*N behavior
44d0: 20 69 6e 20 70 61 74 74 65 72 6e 43 6f 6d 70 61   in patternCompa
44e0: 72 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61  re()..  */.  nPa
44f0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
4500: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
4510: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
4520: 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  at==db->aLimit[S
4530: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
4540: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
4550: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
4560: 6e 50 61 74 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  nPat==db->aLimit
4570: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49  [SQLITE_LIMIT_LI
4580: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
4590: 48 5d 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  H]+1 );.  if( nP
45a0: 61 74 20 3e 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  at > db->aLimit[
45b0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
45c0: 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
45d0: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
45e0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
45f0: 6e 74 65 78 74 2c 20 22 4c 49 4b 45 20 6f 72 20  ntext, "LIKE or 
4600: 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 6f  GLOB pattern too
4610: 20 63 6f 6d 70 6c 65 78 22 2c 20 2d 31 29 3b 0a   complex", -1);.
4620: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4630: 20 20 61 73 73 65 72 74 28 20 7a 42 3d 3d 73 71    assert( zB==sq
4640: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
4650: 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a  (argv[0]) );  /*
4660: 20 45 6e 63 6f 64 69 6e 67 20 64 69 64 20 6e 6f   Encoding did no
4670: 74 20 63 68 61 6e 67 65 20 2a 2f 0a 0a 20 20 69  t change */..  i
4680: 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20  f( argc==3 ){.  
4690: 20 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20    /* The escape 
46a0: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
46b0: 20 6d 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66   must consist of
46c0: 20 61 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20   a single UTF-8 
46d0: 63 68 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a  character..    *
46e0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
46f0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
4700: 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75    */.    const u
4710: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45  nsigned char *zE
4720: 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  sc = sqlite3_val
4730: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29  ue_text(argv[2])
4740: 3b 0a 20 20 20 20 69 66 28 20 7a 45 73 63 3d 3d  ;.    if( zEsc==
4750: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
4760: 69 66 28 20 73 71 6c 69 74 65 33 55 74 66 38 43  if( sqlite3Utf8C
4770: 68 61 72 4c 65 6e 28 28 63 68 61 72 2a 29 7a 45  harLen((char*)zE
4780: 73 63 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20 20  sc, -1)!=1 ){.  
4790: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
47a0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
47b0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 45 53  , .          "ES
47c0: 43 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20  CAPE expression 
47d0: 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65  must be a single
47e0: 20 63 68 61 72 61 63 74 65 72 22 2c 20 2d 31 29   character", -1)
47f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
4800: 20 20 20 20 7d 0a 20 20 20 20 65 73 63 61 70 65      }.    escape
4810: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
4820: 61 64 28 7a 45 73 63 2c 20 26 7a 45 73 63 29 3b  ad(zEsc, &zEsc);
4830: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 20 26 26  .  }.  if( zA &&
4840: 20 7a 42 20 29 7b 0a 20 20 20 20 73 74 72 75 63   zB ){.    struc
4850: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70  t compareInfo *p
4860: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 5f 75  Info = sqlite3_u
4870: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
4880: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
4890: 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65  _TEST.    sqlite
48a0: 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_like_count++;.
48b0: 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20  #endif.    .    
48c0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
48d0: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 61 74 74  nt(context, patt
48e0: 65 72 6e 43 6f 6d 70 61 72 65 28 7a 42 2c 20 7a  ernCompare(zB, z
48f0: 41 2c 20 70 49 6e 66 6f 2c 20 65 73 63 61 70 65  A, pInfo, escape
4900: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
4910: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
4920: 6f 66 20 74 68 65 20 4e 55 4c 4c 49 46 28 78 2c  of the NULLIF(x,
4930: 79 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  y) function.  Th
4940: 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20  e result is the 
4950: 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
4960: 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  t if the argumen
4970: 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
4980: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
4990: 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a 2a 2a 20   NULL if the.** 
49a0: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 65 71  arguments are eq
49b0: 75 61 6c 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ual to each othe
49c0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
49d0: 64 20 6e 75 6c 6c 69 66 46 75 6e 63 28 0a 20 20  d nullifFunc(.  
49e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
49f0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
4a00: 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74  NotUsed,.  sqlit
4a10: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
4a20: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
4a30: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
4a40: 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74  FuncCollSeq(cont
4a50: 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ext);.  UNUSED_P
4a60: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
4a70: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
4a80: 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72 67 76 5b  MemCompare(argv[
4a90: 30 5d 2c 20 61 72 67 76 5b 31 5d 2c 20 70 43 6f  0], argv[1], pCo
4aa0: 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  ll)!=0 ){.    sq
4ab0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
4ac0: 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  ue(context, argv
4ad0: 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  [0]);.  }.}../*.
4ae0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
4af0: 6e 20 6f 66 20 74 68 65 20 56 45 52 53 49 4f 4e  n of the VERSION
4b00: 28 2a 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  (*) function.  T
4b10: 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65  he result is the
4b20: 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74   version.** of t
4b30: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
4b40: 79 20 74 68 61 74 20 69 73 20 72 75 6e 6e 69 6e  y that is runnin
4b50: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
4b60: 64 20 76 65 72 73 69 6f 6e 46 75 6e 63 28 0a 20  d versionFunc(. 
4b70: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
4b80: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
4b90: 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69   NotUsed,.  sqli
4ba0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55  te3_value **NotU
4bb0: 73 65 64 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44  sed2.){.  UNUSED
4bc0: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
4bd0: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
4be0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4bf0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  _text(context, s
4c00: 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 20  qlite3_version, 
4c10: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
4c20: 43 29 3b 0a 7d 0a 0a 2f 2a 20 41 72 72 61 79 20  C);.}../* Array 
4c30: 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 66  for converting f
4c40: 72 6f 6d 20 68 61 6c 66 2d 62 79 74 65 73 20 28  rom half-bytes (
4c50: 6e 79 62 62 6c 65 73 29 20 69 6e 74 6f 20 41 53  nybbles) into AS
4c60: 43 49 49 20 68 65 78 0a 2a 2a 20 64 69 67 69 74  CII hex.** digit
4c70: 73 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s. */.static con
4c80: 73 74 20 63 68 61 72 20 68 65 78 64 69 67 69 74  st char hexdigit
4c90: 73 5b 5d 20 3d 20 7b 0a 20 20 27 30 27 2c 20 27  s[] = {.  '0', '
4ca0: 31 27 2c 20 27 32 27 2c 20 27 33 27 2c 20 27 34  1', '2', '3', '4
4cb0: 27 2c 20 27 35 27 2c 20 27 36 27 2c 20 27 37 27  ', '5', '6', '7'
4cc0: 2c 0a 20 20 27 38 27 2c 20 27 39 27 2c 20 27 41  ,.  '8', '9', 'A
4cd0: 27 2c 20 27 42 27 2c 20 27 43 27 2c 20 27 44 27  ', 'B', 'C', 'D'
4ce0: 2c 20 27 45 27 2c 20 27 46 27 20 0a 7d 3b 0a 0a  , 'E', 'F' .};..
4cf0: 2f 2a 0a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54  /*.** EXPERIMENT
4d00: 41 4c 20 2d 20 54 68 69 73 20 69 73 20 6e 6f 74  AL - This is not
4d10: 20 61 6e 20 6f 66 66 69 63 69 61 6c 20 66 75 6e   an official fun
4d20: 63 74 69 6f 6e 2e 20 20 54 68 65 20 69 6e 74 65  ction.  The inte
4d30: 72 66 61 63 65 20 6d 61 79 0a 2a 2a 20 63 68 61  rface may.** cha
4d40: 6e 67 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74  nge.  This funct
4d50: 69 6f 6e 20 6d 61 79 20 64 69 73 61 70 70 65 61  ion may disappea
4d60: 72 2e 20 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  r.  Do not write
4d70: 20 63 6f 64 65 20 74 68 61 74 20 64 65 70 65 6e   code that depen
4d80: 64 73 0a 2a 2a 20 6f 6e 20 74 68 69 73 20 66 75  ds.** on this fu
4d90: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6d  nction..**.** Im
4da0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
4db0: 74 68 65 20 51 55 4f 54 45 28 29 20 66 75 6e 63  the QUOTE() func
4dc0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63  tion.  This func
4dd0: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
4de0: 67 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  gle.** argument.
4df0: 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e    If the argumen
4e00: 74 20 69 73 20 6e 75 6d 65 72 69 63 2c 20 74 68  t is numeric, th
4e10: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
4e20: 73 20 74 68 65 20 73 61 6d 65 20 61 73 0a 2a 2a  s the same as.**
4e30: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20   the argument.  
4e40: 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  If the argument 
4e50: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 74  is NULL, the ret
4e60: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
4e70: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 4e 55 4c 4c   string.** "NULL
4e80: 22 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ".  Otherwise, t
4e90: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65  he argument is e
4ea0: 6e 63 6c 6f 73 65 64 20 69 6e 20 73 69 6e 67 6c  nclosed in singl
4eb0: 65 20 71 75 6f 74 65 73 20 77 69 74 68 0a 2a 2a  e quotes with.**
4ec0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 20 65 73   single-quote es
4ed0: 63 61 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  capes..*/.static
4ee0: 20 76 6f 69 64 20 71 75 6f 74 65 46 75 6e 63 28   void quoteFunc(
4ef0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
4f00: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
4f10: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
4f20: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 61 73 73  e **argv){.  ass
4f30: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a  ert( argc==1 );.
4f40: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
4f50: 45 52 28 61 72 67 63 29 3b 0a 20 20 73 77 69 74  ER(argc);.  swit
4f60: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
4f70: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20  e_type(argv[0]) 
4f80: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
4f90: 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TE_INTEGER:.    
4fa0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
4fb0: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
4fc0: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
4fd0: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d  context, argv[0]
4fe0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4ff0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
5000: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
5010: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20      char *zText 
5020: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
5030: 63 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73  const *zBlob = s
5040: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
5050: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  b(argv[0]);.    
5060: 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71    int nBlob = sq
5070: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
5080: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  s(argv[0]);.    
5090: 20 20 61 73 73 65 72 74 28 20 7a 42 6c 6f 62 3d    assert( zBlob=
50a0: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  =sqlite3_value_b
50b0: 6c 6f 62 28 61 72 67 76 5b 30 5d 29 20 29 3b 20  lob(argv[0]) ); 
50c0: 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63  /* No encoding c
50d0: 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 7a  hange */.      z
50e0: 54 65 78 74 20 3d 20 28 63 68 61 72 20 2a 29 63  Text = (char *)c
50f0: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e  ontextMalloc(con
5100: 74 65 78 74 2c 20 28 32 2a 28 69 36 34 29 6e 42  text, (2*(i64)nB
5110: 6c 6f 62 29 2b 34 29 3b 20 0a 20 20 20 20 20 20  lob)+4); .      
5120: 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20  if( zText ){.   
5130: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
5140: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
5150: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Blob; i++){.    
5160: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32        zText[(i*2
5170: 29 2b 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73  )+2] = hexdigits
5180: 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30  [(zBlob[i]>>4)&0
5190: 78 30 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  x0F];.          
51a0: 7a 54 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d  zText[(i*2)+3] =
51b0: 20 68 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f   hexdigits[(zBlo
51c0: 62 5b 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20  b[i])&0x0F];.   
51d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
51e0: 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32  Text[(nBlob*2)+2
51f0: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20  ] = '\'';.      
5200: 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32    zText[(nBlob*2
5210: 29 2b 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  )+3] = '\0';.   
5220: 20 20 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20       zText[0] = 
5230: 27 58 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  'X';.        zTe
5240: 78 74 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  xt[1] = '\'';.  
5250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5260: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
5270: 74 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51  t, zText, -1, SQ
5280: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
5290: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
52a0: 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
52b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
52c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
52d0: 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
52e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 6a 3b 0a  .      int i,j;.
52f0: 20 20 20 20 20 20 75 36 34 20 6e 3b 0a 20 20 20        u64 n;.   
5300: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
5310: 64 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 73  d char *zArg = s
5320: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5330: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
5340: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20    char *z;..    
5350: 20 20 69 66 28 20 7a 41 72 67 3d 3d 30 20 29 20    if( zArg==0 ) 
5360: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f  return;.      fo
5370: 72 28 69 3d 30 2c 20 6e 3d 30 3b 20 7a 41 72 67  r(i=0, n=0; zArg
5380: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a  [i]; i++){ if( z
5390: 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e  Arg[i]=='\'' ) n
53a0: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20  ++; }.      z = 
53b0: 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63 6f  contextMalloc(co
53c0: 6e 74 65 78 74 2c 20 28 28 69 36 34 29 69 29 2b  ntext, ((i64)i)+
53d0: 28 28 69 36 34 29 6e 29 2b 33 29 3b 0a 20 20 20  ((i64)n)+3);.   
53e0: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
53f0: 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c 27 27 3b      z[0] = '\'';
5400: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
5410: 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d 3b 20  , j=1; zArg[i]; 
5420: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
5430: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b 69 5d  z[j++] = zArg[i]
5440: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5450: 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  zArg[i]=='\'' ){
5460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  .            z[j
5470: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  ++] = '\'';.    
5480: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5490: 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  }.        z[j++]
54a0: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
54b0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[j] = 0;.     
54c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
54d0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
54e0: 7a 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72  z, j, sqlite3_fr
54f0: 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ee);.      }.   
5500: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5510: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5520: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
5530: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
5540: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
5550: 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  _NULL );.      s
5560: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
5570: 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c  xt(context, "NUL
5580: 4c 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54  L", 4, SQLITE_ST
5590: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
55a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
55b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 78 28 29  ./*.** The hex()
55c0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 6e 74 65   function.  Inte
55d0: 72 70 72 65 74 20 74 68 65 20 61 72 67 75 6d 65  rpret the argume
55e0: 6e 74 20 61 73 20 61 20 62 6c 6f 62 2e 20 20 52  nt as a blob.  R
55f0: 65 74 75 72 6e 0a 2a 2a 20 61 20 68 65 78 61 64  eturn.** a hexad
5600: 65 63 69 6d 61 6c 20 72 65 6e 64 65 72 69 6e 67  ecimal rendering
5610: 20 61 73 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61   as text..*/.sta
5620: 74 69 63 20 76 6f 69 64 20 68 65 78 46 75 6e 63  tic void hexFunc
5630: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
5640: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
5650: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
5660: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5670: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  .){.  int i, n;.
5680: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
5690: 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20   char *pBlob;.  
56a0: 63 68 61 72 20 2a 7a 48 65 78 2c 20 2a 7a 3b 0a  char *zHex, *z;.
56b0: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
56c0: 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  1 );.  UNUSED_PA
56d0: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
56e0: 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   pBlob = sqlite3
56f0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
5700: 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  [0]);.  n = sqli
5710: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
5720: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65  argv[0]);.  asse
5730: 72 74 28 20 70 42 6c 6f 62 3d 3d 73 71 6c 69 74  rt( pBlob==sqlit
5740: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
5750: 67 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f  gv[0]) );  /* No
5760: 20 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65   encoding change
5770: 20 2a 2f 0a 20 20 7a 20 3d 20 7a 48 65 78 20 3d   */.  z = zHex =
5780: 20 63 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 63   contextMalloc(c
5790: 6f 6e 74 65 78 74 2c 20 28 28 69 36 34 29 6e 29  ontext, ((i64)n)
57a0: 2a 32 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 7a  *2 + 1);.  if( z
57b0: 48 65 78 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Hex ){.    for(i
57c0: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 42  =0; i<n; i++, pB
57d0: 6c 6f 62 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e  lob++){.      un
57e0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20  signed char c = 
57f0: 2a 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 2a 28  *pBlob;.      *(
5800: 7a 2b 2b 29 20 3d 20 68 65 78 64 69 67 69 74 73  z++) = hexdigits
5810: 5b 28 63 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20  [(c>>4)&0xf];.  
5820: 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78      *(z++) = hex
5830: 64 69 67 69 74 73 5b 63 26 30 78 66 5d 3b 0a 20  digits[c&0xf];. 
5840: 20 20 20 7d 0a 20 20 20 20 2a 7a 20 3d 20 30 3b     }.    *z = 0;
5850: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
5860: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
5870: 2c 20 7a 48 65 78 2c 20 6e 2a 32 2c 20 73 71 6c  , zHex, n*2, sql
5880: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a  ite3_free);.  }.
5890: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 7a 65 72  }../*.** The zer
58a0: 6f 62 6c 6f 62 28 4e 29 20 66 75 6e 63 74 69 6f  oblob(N) functio
58b0: 6e 20 72 65 74 75 72 6e 73 20 61 20 7a 65 72 6f  n returns a zero
58c0: 2d 66 69 6c 6c 65 64 20 62 6c 6f 62 20 6f 66 20  -filled blob of 
58d0: 73 69 7a 65 20 4e 20 62 79 74 65 73 2e 0a 2a 2f  size N bytes..*/
58e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
58f0: 6f 62 6c 6f 62 46 75 6e 63 28 0a 20 20 73 71 6c  oblobFunc(.  sql
5900: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
5910: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
5920: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
5930: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
5940: 36 34 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  64 n;.  sqlite3 
5950: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
5960: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
5970: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 61 73 73 65  context);.  asse
5980: 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20  rt( argc==1 );. 
5990: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
59a0: 52 28 61 72 67 63 29 3b 0a 20 20 6e 20 3d 20 73  R(argc);.  n = s
59b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
59c0: 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 74  64(argv[0]);.  t
59d0: 65 73 74 63 61 73 65 28 20 6e 3d 3d 64 62 2d 3e  estcase( n==db->
59e0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
59f0: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20  MIT_LENGTH] );. 
5a00: 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 64 62   testcase( n==db
5a10: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
5a20: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 2b 31 20  LIMIT_LENGTH]+1 
5a30: 29 3b 0a 20 20 69 66 28 20 6e 3e 64 62 2d 3e 61  );.  if( n>db->a
5a40: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5a50: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
5a60: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5a70: 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f  _error_toobig(co
5a80: 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  ntext);.  }else{
5a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
5aa0: 75 6c 74 5f 7a 65 72 6f 62 6c 6f 62 28 63 6f 6e  ult_zeroblob(con
5ab0: 74 65 78 74 2c 20 28 69 6e 74 29 6e 29 3b 0a 20  text, (int)n);. 
5ac0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
5ad0: 72 65 70 6c 61 63 65 28 29 20 66 75 6e 63 74 69  replace() functi
5ae0: 6f 6e 2e 20 20 54 68 72 65 65 20 61 72 67 75 6d  on.  Three argum
5af0: 65 6e 74 73 20 61 72 65 20 61 6c 6c 20 73 74 72  ents are all str
5b00: 69 6e 67 73 3a 20 63 61 6c 6c 0a 2a 2a 20 74 68  ings: call.** th
5b10: 65 6d 20 41 2c 20 42 2c 20 61 6e 64 20 43 2e 20  em A, B, and C. 
5b20: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  The result is al
5b30: 73 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  so a string whic
5b40: 68 20 69 73 20 64 65 72 69 76 65 64 0a 2a 2a 20  h is derived.** 
5b50: 66 72 6f 6d 20 41 20 62 79 20 72 65 70 6c 61 63  from A by replac
5b60: 69 6e 67 20 65 76 65 72 79 20 6f 63 63 75 72 61  ing every occura
5b70: 6e 63 65 20 6f 66 20 42 20 77 69 74 68 20 43 2e  nce of B with C.
5b80: 20 20 54 68 65 20 6d 61 74 63 68 0a 2a 2a 20 6d    The match.** m
5b90: 75 73 74 20 62 65 20 65 78 61 63 74 2e 20 20 43  ust be exact.  C
5ba0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
5bb0: 65 73 20 61 72 65 20 6e 6f 74 20 75 73 65 64 2e  es are not used.
5bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5bd0: 72 65 70 6c 61 63 65 46 75 6e 63 28 0a 20 20 73  replaceFunc(.  s
5be0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5bf0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
5c00: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
5c10: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
5c20: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
5c30: 63 68 61 72 20 2a 7a 53 74 72 3b 20 20 20 20 20  char *zStr;     
5c40: 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20     /* The input 
5c50: 73 74 72 69 6e 67 20 41 20 2a 2f 0a 20 20 63 6f  string A */.  co
5c60: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
5c70: 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20 20  r *zPattern;    
5c80: 2f 2a 20 54 68 65 20 70 61 74 74 65 72 6e 20 73  /* The pattern s
5c90: 74 72 69 6e 67 20 42 20 2a 2f 0a 20 20 63 6f 6e  tring B */.  con
5ca0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
5cb0: 20 2a 7a 52 65 70 3b 20 20 20 20 20 20 20 20 2f   *zRep;        /
5cc0: 2a 20 54 68 65 20 72 65 70 6c 61 63 65 6d 65 6e  * The replacemen
5cd0: 74 20 73 74 72 69 6e 67 20 43 20 2a 2f 0a 20 20  t string C */.  
5ce0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
5cf0: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
5d00: 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
5d10: 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 72 3b 20 20  */.  int nStr;  
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d30: 20 53 69 7a 65 20 6f 66 20 7a 53 74 72 20 2a 2f   Size of zStr */
5d40: 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b  .  int nPattern;
5d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5d60: 69 7a 65 20 6f 66 20 7a 50 61 74 74 65 72 6e 20  ize of zPattern 
5d70: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 70 3b 20 20  */.  int nRep;  
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d90: 20 53 69 7a 65 20 6f 66 20 7a 52 65 70 20 2a 2f   Size of zRep */
5da0: 0a 20 20 69 36 34 20 6e 4f 75 74 3b 20 20 20 20  .  i64 nOut;    
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
5dc0: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 7a  aximum size of z
5dd0: 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6f  Out */.  int loo
5de0: 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
5df0: 20 20 2f 2a 20 4c 61 73 74 20 7a 53 74 72 5b 5d    /* Last zStr[]
5e00: 20 74 68 61 74 20 6d 69 67 68 74 20 6d 61 74 63   that might matc
5e10: 68 20 7a 50 61 74 74 65 72 6e 5b 5d 20 2a 2f 0a  h zPattern[] */.
5e20: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
5e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
5e40: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 0a  op counters */..
5e50: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
5e60: 33 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  3 );.  UNUSED_PA
5e70: 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20  RAMETER(argc);. 
5e80: 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f   zStr = sqlite3_
5e90: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5ea0: 30 5d 29 3b 0a 20 20 69 66 28 20 7a 53 74 72 3d  0]);.  if( zStr=
5eb0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e  =0 ) return;.  n
5ec0: 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Str = sqlite3_va
5ed0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
5ee0: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53  ]);.  assert( zS
5ef0: 74 72 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  tr==sqlite3_valu
5f00: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20  e_text(argv[0]) 
5f10: 29 3b 20 20 2f 2a 20 4e 6f 20 65 6e 63 6f 64 69  );  /* No encodi
5f20: 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 7a  ng change */.  z
5f30: 50 61 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65  Pattern = sqlite
5f40: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5f50: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50 61  v[1]);.  if( zPa
5f60: 74 74 65 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ttern==0 ){.    
5f70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5f80: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
5f90: 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  1])==SQLITE_NULL
5fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
5fb0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
5fc0: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
5fd0: 74 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  t)->mallocFailed
5fe0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
5ff0: 20 20 7d 0a 20 20 69 66 28 20 7a 50 61 74 74 65    }.  if( zPatte
6000: 72 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  rn[0]==0 ){.    
6010: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6020: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
6030: 31 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  1])!=SQLITE_NULL
6040: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
6050: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
6060: 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  text, argv[0]);.
6070: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6080: 20 20 6e 50 61 74 74 65 72 6e 20 3d 20 73 71 6c    nPattern = sql
6090: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
60a0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73 73  (argv[1]);.  ass
60b0: 65 72 74 28 20 7a 50 61 74 74 65 72 6e 3d 3d 73  ert( zPattern==s
60c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
60d0: 74 28 61 72 67 76 5b 31 5d 29 20 29 3b 20 20 2f  t(argv[1]) );  /
60e0: 2a 20 4e 6f 20 65 6e 63 6f 64 69 6e 67 20 63 68  * No encoding ch
60f0: 61 6e 67 65 20 2a 2f 0a 20 20 7a 52 65 70 20 3d  ange */.  zRep =
6100: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6110: 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ext(argv[2]);.  
6120: 69 66 28 20 7a 52 65 70 3d 3d 30 20 29 20 72 65  if( zRep==0 ) re
6130: 74 75 72 6e 3b 0a 20 20 6e 52 65 70 20 3d 20 73  turn;.  nRep = s
6140: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6150: 65 73 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 61  es(argv[2]);.  a
6160: 73 73 65 72 74 28 20 7a 52 65 70 3d 3d 73 71 6c  ssert( zRep==sql
6170: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6180: 61 72 67 76 5b 32 5d 29 20 29 3b 0a 20 20 6e 4f  argv[2]) );.  nO
6190: 75 74 20 3d 20 6e 53 74 72 20 2b 20 31 3b 0a 20  ut = nStr + 1;. 
61a0: 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3c 53 51   assert( nOut<SQ
61b0: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
61c0: 29 3b 0a 20 20 7a 4f 75 74 20 3d 20 63 6f 6e 74  );.  zOut = cont
61d0: 65 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78  extMalloc(contex
61e0: 74 2c 20 28 69 36 34 29 6e 4f 75 74 29 3b 0a 20  t, (i64)nOut);. 
61f0: 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a   if( zOut==0 ){.
6200: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6210: 20 20 6c 6f 6f 70 4c 69 6d 69 74 20 3d 20 6e 53    loopLimit = nS
6220: 74 72 20 2d 20 6e 50 61 74 74 65 72 6e 3b 20 20  tr - nPattern;  
6230: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
6240: 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20 69 2b 2b 29  =loopLimit; i++)
6250: 7b 0a 20 20 20 20 69 66 28 20 7a 53 74 72 5b 69  {.    if( zStr[i
6260: 5d 21 3d 7a 50 61 74 74 65 72 6e 5b 30 5d 20 7c  ]!=zPattern[0] |
6270: 7c 20 6d 65 6d 63 6d 70 28 26 7a 53 74 72 5b 69  | memcmp(&zStr[i
6280: 5d 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e 50 61  ], zPattern, nPa
6290: 74 74 65 72 6e 29 20 29 7b 0a 20 20 20 20 20 20  ttern) ){.      
62a0: 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 53 74 72  zOut[j++] = zStr
62b0: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
62c0: 20 20 20 20 20 20 75 38 20 2a 7a 4f 6c 64 3b 0a        u8 *zOld;.
62d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
62e0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
62f0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
6300: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 4f  ntext);.      nO
6310: 75 74 20 2b 3d 20 6e 52 65 70 20 2d 20 6e 50 61  ut += nRep - nPa
6320: 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 74 65 73  ttern;.      tes
6330: 74 63 61 73 65 28 20 6e 4f 75 74 2d 31 3d 3d 64  tcase( nOut-1==d
6340: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
6350: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
6360: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6370: 28 20 6e 4f 75 74 2d 32 3d 3d 64 62 2d 3e 61 4c  ( nOut-2==db->aL
6380: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
6390: 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 20  T_LENGTH] );.   
63a0: 20 20 20 69 66 28 20 6e 4f 75 74 2d 31 3e 64 62     if( nOut-1>db
63b0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
63c0: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
63d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
63e0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f  _result_error_to
63f0: 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20  obig(context);. 
6400: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
6410: 46 72 65 65 28 64 62 2c 20 7a 4f 75 74 29 3b 0a  Free(db, zOut);.
6420: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
6430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4f        }.      zO
6440: 6c 64 20 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 20  ld = zOut;.     
6450: 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   zOut = sqlite3_
6460: 72 65 61 6c 6c 6f 63 28 7a 4f 75 74 2c 20 28 69  realloc(zOut, (i
6470: 6e 74 29 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  nt)nOut);.      
6480: 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20  if( zOut==0 ){. 
6490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
64a0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
64b0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
64c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
64d0: 65 28 64 62 2c 20 7a 4f 6c 64 29 3b 0a 20 20 20  e(db, zOld);.   
64e0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
64f0: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
6500: 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a 52 65 70  y(&zOut[j], zRep
6510: 2c 20 6e 52 65 70 29 3b 0a 20 20 20 20 20 20 6a  , nRep);.      j
6520: 20 2b 3d 20 6e 52 65 70 3b 0a 20 20 20 20 20 20   += nRep;.      
6530: 69 20 2b 3d 20 6e 50 61 74 74 65 72 6e 2d 31 3b  i += nPattern-1;
6540: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
6550: 65 72 74 28 20 6a 2b 6e 53 74 72 2d 69 2b 31 3d  ert( j+nStr-i+1=
6560: 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d 65 6d 63 70  =nOut );.  memcp
6570: 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26 7a 53 74  y(&zOut[j], &zSt
6580: 72 5b 69 5d 2c 20 6e 53 74 72 2d 69 29 3b 0a 20  r[i], nStr-i);. 
6590: 20 6a 20 2b 3d 20 6e 53 74 72 20 2d 20 69 3b 0a   j += nStr - i;.
65a0: 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 6e 4f 75    assert( j<=nOu
65b0: 74 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d  t );.  zOut[j] =
65c0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
65d0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
65e0: 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20  t, (char*)zOut, 
65f0: 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  j, sqlite3_free)
6600: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
6610: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
6620: 20 54 52 49 4d 28 29 2c 20 4c 54 52 49 4d 28 29   TRIM(), LTRIM()
6630: 2c 20 61 6e 64 20 52 54 52 49 4d 28 29 20 66 75  , and RTRIM() fu
6640: 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20  nctions..** The 
6650: 75 73 65 72 64 61 74 61 20 69 73 20 30 78 31 20  userdata is 0x1 
6660: 66 6f 72 20 6c 65 66 74 20 74 72 69 6d 2c 20 30  for left trim, 0
6670: 78 32 20 66 6f 72 20 72 69 67 68 74 20 74 72 69  x2 for right tri
6680: 6d 2c 20 30 78 33 20 66 6f 72 20 62 6f 74 68 2e  m, 0x3 for both.
6690: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
66a0: 74 72 69 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69  trimFunc(.  sqli
66b0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
66c0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
66d0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
66e0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
66f0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
6700: 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20 20 20 20  r *zIn;         
6710: 2f 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67 20  /* Input string 
6720: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  */.  const unsig
6730: 6e 65 64 20 63 68 61 72 20 2a 7a 43 68 61 72 53  ned char *zCharS
6740: 65 74 3b 20 20 20 20 2f 2a 20 53 65 74 20 6f 66  et;    /* Set of
6750: 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 74   characters to t
6760: 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  rim */.  int nIn
6770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6790: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
67a0: 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20   input */.  int 
67b0: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
67d0: 20 31 3a 20 74 72 69 6d 6c 65 66 74 20 20 32 3a   1: trimleft  2:
67e0: 20 74 72 69 6d 72 69 67 68 74 20 20 33 3a 20 74   trimright  3: t
67f0: 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  rim */.  int i; 
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
6820: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
6830: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
6840: 4c 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Len = 0;        
6850: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 65    /* Length of e
6860: 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e  ach character in
6870: 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20 75   zCharSet */.  u
6880: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 61  nsigned char **a
6890: 7a 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20  zChar = 0;      
68a0: 20 2f 2a 20 49 6e 64 69 76 69 64 75 61 6c 20 63   /* Individual c
68b0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43 68  haracters in zCh
68c0: 61 72 53 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  arSet */.  int n
68d0: 43 68 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  Char;           
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
68f0: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
6900: 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65 74  ters in zCharSet
6910: 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   */..  if( sqlit
6920: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
6930: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
6940: 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
6950: 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20 3d 20 73  n;.  }.  zIn = s
6960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6970: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
6980: 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72  ( zIn==0 ) retur
6990: 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74  n;.  nIn = sqlit
69a0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
69b0: 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72  rgv[0]);.  asser
69c0: 74 28 20 7a 49 6e 3d 3d 73 71 6c 69 74 65 33 5f  t( zIn==sqlite3_
69d0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
69e0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 61 72 67  0]) );.  if( arg
69f0: 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 74 61 74  c==1 ){.    stat
6a00: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
6a10: 64 20 63 68 61 72 20 6c 65 6e 4f 6e 65 5b 5d 20  d char lenOne[] 
6a20: 3d 20 7b 20 31 20 7d 3b 0a 20 20 20 20 73 74 61  = { 1 };.    sta
6a30: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61  tic unsigned cha
6a40: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4f 6e 65 5b  r * const azOne[
6a50: 5d 20 3d 20 7b 20 28 75 38 2a 29 22 20 22 20 7d  ] = { (u8*)" " }
6a60: 3b 0a 20 20 20 20 6e 43 68 61 72 20 3d 20 31 3b  ;.    nChar = 1;
6a70: 0a 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 38 2a  .    aLen = (u8*
6a80: 29 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20 61 7a 43  )lenOne;.    azC
6a90: 68 61 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  har = (unsigned 
6aa0: 63 68 61 72 20 2a 2a 29 61 7a 4f 6e 65 3b 0a 20  char **)azOne;. 
6ab0: 20 20 20 7a 43 68 61 72 53 65 74 20 3d 20 30 3b     zCharSet = 0;
6ac0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 43  .  }else if( (zC
6ad0: 68 61 72 53 65 74 20 3d 20 73 71 6c 69 74 65 33  harSet = sqlite3
6ae0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
6af0: 5b 31 5d 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  [1]))==0 ){.    
6b00: 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b  return;.  }else{
6b10: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
6b20: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  ned char *z;.   
6b30: 20 66 6f 72 28 7a 3d 7a 43 68 61 72 53 65 74 2c   for(z=zCharSet,
6b40: 20 6e 43 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43   nChar=0; *z; nC
6b50: 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20 53 51  har++){.      SQ
6b60: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
6b70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
6b80: 20 6e 43 68 61 72 3e 30 20 29 7b 0a 20 20 20 20   nChar>0 ){.    
6b90: 20 20 61 7a 43 68 61 72 20 3d 20 63 6f 6e 74 65    azChar = conte
6ba0: 78 74 4d 61 6c 6c 6f 63 28 63 6f 6e 74 65 78 74  xtMalloc(context
6bb0: 2c 20 28 28 69 36 34 29 6e 43 68 61 72 29 2a 28  , ((i64)nChar)*(
6bc0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 31 29  sizeof(char*)+1)
6bd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 43  );.      if( azC
6be0: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  har==0 ){.      
6bf0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
6c00: 7d 0a 20 20 20 20 20 20 61 4c 65 6e 20 3d 20 28  }.      aLen = (
6c10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
6c20: 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 3b 0a 20  azChar[nChar];. 
6c30: 20 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72       for(z=zChar
6c40: 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a  Set, nChar=0; *z
6c50: 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20  ; nChar++){.    
6c60: 20 20 20 20 61 7a 43 68 61 72 5b 6e 43 68 61 72      azChar[nChar
6c70: 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ] = (unsigned ch
6c80: 61 72 20 2a 29 7a 3b 0a 20 20 20 20 20 20 20 20  ar *)z;.        
6c90: 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38  SQLITE_SKIP_UTF8
6ca0: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 4c 65  (z);.        aLe
6cb0: 6e 5b 6e 43 68 61 72 5d 20 3d 20 28 75 38 29 28  n[nChar] = (u8)(
6cc0: 7a 20 2d 20 61 7a 43 68 61 72 5b 6e 43 68 61 72  z - azChar[nChar
6cd0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
6ce0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 68 61  }.  }.  if( nCha
6cf0: 72 3e 30 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  r>0 ){.    flags
6d00: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
6d10: 5f 49 4e 54 28 73 71 6c 69 74 65 33 5f 75 73 65  _INT(sqlite3_use
6d20: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 29  r_data(context))
6d30: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  ;.    if( flags 
6d40: 26 20 31 20 29 7b 0a 20 20 20 20 20 20 77 68 69  & 1 ){.      whi
6d50: 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  le( nIn>0 ){.   
6d60: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30       int len = 0
6d70: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
6d80: 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29  0; i<nChar; i++)
6d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20  {.          len 
6da0: 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20 20  = aLen[i];.     
6db0: 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e 49       if( len<=nI
6dc0: 6e 20 26 26 20 6d 65 6d 63 6d 70 28 7a 49 6e 2c  n && memcmp(zIn,
6dd0: 20 61 7a 43 68 61 72 5b 69 5d 2c 20 6c 65 6e 29   azChar[i], len)
6de0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
6df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
6e00: 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62 72  f( i>=nChar ) br
6e10: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 49 6e  eak;.        zIn
6e20: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20   += len;.       
6e30: 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20   nIn -= len;.   
6e40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6e50: 66 28 20 66 6c 61 67 73 20 26 20 32 20 29 7b 0a  f( flags & 2 ){.
6e60: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 49 6e        while( nIn
6e70: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  >0 ){.        in
6e80: 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  t len = 0;.     
6e90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
6ea0: 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  har; i++){.     
6eb0: 20 20 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b       len = aLen[
6ec0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
6ed0: 28 20 6c 65 6e 3c 3d 6e 49 6e 20 26 26 20 6d 65  ( len<=nIn && me
6ee0: 6d 63 6d 70 28 26 7a 49 6e 5b 6e 49 6e 2d 6c 65  mcmp(&zIn[nIn-le
6ef0: 6e 5d 2c 61 7a 43 68 61 72 5b 69 5d 2c 6c 65 6e  n],azChar[i],len
6f00: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
6f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6f20: 69 66 28 20 69 3e 3d 6e 43 68 61 72 20 29 20 62  if( i>=nChar ) b
6f30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e 49  reak;.        nI
6f40: 6e 20 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  n -= len;.      
6f50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
6f60: 7a 43 68 61 72 53 65 74 20 29 7b 0a 20 20 20 20  zCharSet ){.    
6f70: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
6f80: 7a 43 68 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  zChar);.    }.  
6f90: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
6fa0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
6fb0: 20 28 63 68 61 72 2a 29 7a 49 6e 2c 20 6e 49 6e   (char*)zIn, nIn
6fc0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
6fd0: 4e 54 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  NT);.}...#ifdef 
6fe0: 53 51 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 2f  SQLITE_SOUNDEX./
6ff0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
7000: 20 73 6f 75 6e 64 65 78 20 65 6e 63 6f 64 69 6e   soundex encodin
7010: 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a 2f 0a  g of a word..*/.
7020: 73 74 61 74 69 63 20 76 6f 69 64 20 73 6f 75 6e  static void soun
7030: 64 65 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  dexFunc(.  sqlit
7040: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7050: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
7060: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
7070: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61   **argv.){.  cha
7080: 72 20 7a 52 65 73 75 6c 74 5b 38 5d 3b 0a 20 20  r zResult[8];.  
7090: 63 6f 6e 73 74 20 75 38 20 2a 7a 49 6e 3b 0a 20  const u8 *zIn;. 
70a0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 61   int i, j;.  sta
70b0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
70c0: 65 64 20 63 68 61 72 20 69 43 6f 64 65 5b 5d 20  ed char iCode[] 
70d0: 3d 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c  = {.    0, 0, 0,
70e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
70f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
7100: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30  , 0, 0,.    0, 0
7110: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
7120: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
7130: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
7140: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
7150: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
7160: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
7170: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
7180: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
7190: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
71a0: 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c   0,.    0, 0, 1,
71b0: 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20   2, 3, 0, 1, 2, 
71c0: 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35  0, 0, 2, 2, 4, 5
71d0: 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32  , 5, 0,.    1, 2
71e0: 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c  , 6, 2, 3, 0, 1,
71f0: 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20   0, 2, 0, 2, 0, 
7200: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
7210: 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30  0, 0, 1, 2, 3, 0
7220: 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c  , 1, 2, 0, 0, 2,
7230: 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a   2, 4, 5, 5, 0,.
7240: 20 20 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20      1, 2, 6, 2, 
7250: 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30  3, 0, 1, 0, 2, 0
7260: 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 2, 0, 0, 0, 0,
7270: 20 30 2c 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72   0,.  };.  asser
7280: 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
7290: 7a 49 6e 20 3d 20 28 75 38 2a 29 73 71 6c 69 74  zIn = (u8*)sqlit
72a0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
72b0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49  gv[0]);.  if( zI
72c0: 6e 3d 3d 30 20 29 20 7a 49 6e 20 3d 20 28 75 38  n==0 ) zIn = (u8
72d0: 2a 29 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  *)"";.  for(i=0;
72e0: 20 7a 49 6e 5b 69 5d 20 26 26 20 21 73 71 6c 69   zIn[i] && !sqli
72f0: 74 65 33 49 73 61 6c 70 68 61 28 7a 49 6e 5b 69  te3Isalpha(zIn[i
7300: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  ]); i++){}.  if(
7310: 20 7a 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 75   zIn[i] ){.    u
7320: 38 20 70 72 65 76 63 6f 64 65 20 3d 20 69 43 6f  8 prevcode = iCo
7330: 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b  de[zIn[i]&0x7f];
7340: 0a 20 20 20 20 7a 52 65 73 75 6c 74 5b 30 5d 20  .    zResult[0] 
7350: 3d 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72  = sqlite3Toupper
7360: 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66 6f  (zIn[i]);.    fo
7370: 72 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a 49  r(j=1; j<4 && zI
7380: 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  n[i]; i++){.    
7390: 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 69 43 6f    int code = iCo
73a0: 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b  de[zIn[i]&0x7f];
73b0: 0a 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 3e  .      if( code>
73c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
73d0: 20 63 6f 64 65 21 3d 70 72 65 76 63 6f 64 65 20   code!=prevcode 
73e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65  ){.          pre
73f0: 76 63 6f 64 65 20 3d 20 63 6f 64 65 3b 0a 20 20  vcode = code;.  
7400: 20 20 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b          zResult[
7410: 6a 2b 2b 5d 20 3d 20 63 6f 64 65 20 2b 20 27 30  j++] = code + '0
7420: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
7430: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7440: 20 20 70 72 65 76 63 6f 64 65 20 3d 20 30 3b 0a    prevcode = 0;.
7450: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7460: 20 20 77 68 69 6c 65 28 20 6a 3c 34 20 29 7b 0a    while( j<4 ){.
7470: 20 20 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 2b        zResult[j+
7480: 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 7d 0a  +] = '0';.    }.
7490: 20 20 20 20 7a 52 65 73 75 6c 74 5b 6a 5d 20 3d      zResult[j] =
74a0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
74b0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
74c0: 65 78 74 2c 20 7a 52 65 73 75 6c 74 2c 20 34 2c  ext, zResult, 4,
74d0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
74e0: 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  T);.  }else{.   
74f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7500: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 3f  text(context, "?
7510: 30 30 30 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  000", 4, SQLITE_
7520: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
7530: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
7540: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
7550: 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
7560: 41 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  A function that 
7570: 6c 6f 61 64 73 20 61 20 73 68 61 72 65 64 2d 6c  loads a shared-l
7580: 69 62 72 61 72 79 20 65 78 74 65 6e 73 69 6f 6e  ibrary extension
7590: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 4e 55   then returns NU
75a0: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  LL..*/.static vo
75b0: 69 64 20 6c 6f 61 64 45 78 74 28 73 71 6c 69 74  id loadExt(sqlit
75c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
75d0: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
75e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
75f0: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  rgv){.  const ch
7600: 61 72 20 2a 7a 46 69 6c 65 20 3d 20 28 63 6f 6e  ar *zFile = (con
7610: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
7620: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
7630: 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63  v[0]);.  const c
7640: 68 61 72 20 2a 7a 50 72 6f 63 3b 0a 20 20 73 71  har *zProc;.  sq
7650: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
7660: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
7670: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
7680: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
7690: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  = 0;..  if( argc
76a0: 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63  ==2 ){.    zProc
76b0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
76c0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
76d0: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
76e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 63  }else{.    zProc
76f0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
7700: 7a 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33  zFile && sqlite3
7710: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
7720: 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63  db, zFile, zProc
7730: 2c 20 26 7a 45 72 72 4d 73 67 29 20 29 7b 0a 20  , &zErrMsg) ){. 
7740: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7750: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
7760: 20 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b 0a 20   zErrMsg, -1);. 
7770: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7780: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a  zErrMsg);.  }.}.
7790: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
77a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
77b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
77c0: 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20  cture holds the 
77d0: 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20  context of a.** 
77e0: 73 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20 61  sum() or avg() a
77f0: 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74 61  ggregate computa
7800: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
7810: 20 73 74 72 75 63 74 20 53 75 6d 43 74 78 20 53   struct SumCtx S
7820: 75 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53 75  umCtx;.struct Su
7830: 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20  mCtx {.  double 
7840: 72 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20 46 6c  rSum;      /* Fl
7850: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 73 75 6d  oating point sum
7860: 20 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d 3b 20   */.  i64 iSum; 
7870: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
7880: 65 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20 20 69  er sum */   .  i
7890: 36 34 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  64 cnt;         
78a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
78b0: 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a 2f  ements summed */
78c0: 0a 20 20 75 38 20 6f 76 65 72 66 6c 6f 77 3b 20  .  u8 overflow; 
78d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
78e0: 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77  integer overflow
78f0: 20 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20 61 70   seen */.  u8 ap
7900: 70 72 6f 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  prox;        /* 
7910: 54 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e 74 65  True if non-inte
7920: 67 65 72 20 76 61 6c 75 65 20 77 61 73 20 69 6e  ger value was in
7930: 70 75 74 20 74 6f 20 74 68 65 20 73 75 6d 20 2a  put to the sum *
7940: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  /.};../*.** Rout
7950: 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ines used to com
7960: 70 75 74 65 20 74 68 65 20 73 75 6d 2c 20 61 76  pute the sum, av
7970: 65 72 61 67 65 2c 20 61 6e 64 20 74 6f 74 61 6c  erage, and total
7980: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55 4d 28  ..**.** The SUM(
7990: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c 6c 6f  ) function follo
79a0: 77 73 20 74 68 65 20 28 62 72 6f 6b 65 6e 29 20  ws the (broken) 
79b0: 53 51 4c 20 73 74 61 6e 64 61 72 64 20 77 68 69  SQL standard whi
79c0: 63 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ch means.** that
79d0: 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c   it returns NULL
79e0: 20 69 66 20 69 74 20 73 75 6d 73 20 6f 76 65 72   if it sums over
79f0: 20 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54 4f 54   no inputs.  TOT
7a00: 41 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30 2e  AL returns.** 0.
7a10: 30 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20  0 in that case. 
7a20: 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20 54 4f   In addition, TO
7a30: 54 41 4c 20 61 6c 77 61 79 73 20 72 65 74 75 72  TAL always retur
7a40: 6e 73 20 61 20 66 6c 6f 61 74 20 77 68 65 72 65  ns a float where
7a50: 0a 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20 72 65  .** SUM might re
7a60: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
7a70: 69 66 20 69 74 20 6e 65 76 65 72 20 65 6e 63 6f  if it never enco
7a80: 75 6e 74 65 72 73 20 61 20 66 6c 6f 61 74 69 6e  unters a floatin
7a90: 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
7aa0: 2e 20 20 54 4f 54 41 4c 20 6e 65 76 65 72 20 66  .  TOTAL never f
7ab0: 61 69 6c 73 2c 20 62 75 74 20 53 55 4d 20 6d 69  ails, but SUM mi
7ac0: 67 68 74 20 74 68 72 6f 75 67 68 20 61 6e 20 65  ght through an e
7ad0: 78 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a 20 69  xception if.** i
7ae0: 74 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e 20 69  t overflows an i
7af0: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nteger..*/.stati
7b00: 63 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28 73  c void sumStep(s
7b10: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7b20: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
7b30: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
7b40: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d 43   **argv){.  SumC
7b50: 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79 70  tx *p;.  int typ
7b60: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  e;.  assert( arg
7b70: 63 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==1 );.  UNUSED
7b80: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
7b90: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
7ba0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
7bb0: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
7bc0: 66 28 2a 70 29 29 3b 0a 20 20 74 79 70 65 20 3d  f(*p));.  type =
7bd0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e   sqlite3_value_n
7be0: 75 6d 65 72 69 63 5f 74 79 70 65 28 61 72 67 76  umeric_type(argv
7bf0: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 20 26 26  [0]);.  if( p &&
7c00: 20 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 4e 55   type!=SQLITE_NU
7c10: 4c 4c 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6e 74  LL ){.    p->cnt
7c20: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 74 79 70 65  ++;.    if( type
7c30: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
7c40: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 20   ){.      i64 v 
7c50: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
7c60: 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a  int64(argv[0]);.
7c70: 20 20 20 20 20 20 70 2d 3e 72 53 75 6d 20 2b 3d        p->rSum +=
7c80: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   v;.      if( (p
7c90: 2d 3e 61 70 70 72 6f 78 7c 70 2d 3e 6f 76 65 72  ->approx|p->over
7ca0: 66 6c 6f 77 29 3d 3d 30 20 29 7b 0a 20 20 20 20  flow)==0 ){.    
7cb0: 20 20 20 20 69 36 34 20 69 4e 65 77 53 75 6d 20      i64 iNewSum 
7cc0: 3d 20 70 2d 3e 69 53 75 6d 20 2b 20 76 3b 0a 20  = p->iSum + v;. 
7cd0: 20 20 20 20 20 20 20 69 6e 74 20 73 31 20 3d 20         int s1 = 
7ce0: 28 69 6e 74 29 28 70 2d 3e 69 53 75 6d 20 3e 3e  (int)(p->iSum >>
7cf0: 20 28 73 69 7a 65 6f 66 28 69 36 34 29 2a 38 2d   (sizeof(i64)*8-
7d00: 31 29 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  1));.        int
7d10: 20 73 32 20 3d 20 28 69 6e 74 29 28 76 20 20 20   s2 = (int)(v   
7d20: 20 20 20 20 3e 3e 20 28 73 69 7a 65 6f 66 28 69      >> (sizeof(i
7d30: 36 34 29 2a 38 2d 31 29 29 3b 0a 20 20 20 20 20  64)*8-1));.     
7d40: 20 20 20 69 6e 74 20 73 33 20 3d 20 28 69 6e 74     int s3 = (int
7d50: 29 28 69 4e 65 77 53 75 6d 20 3e 3e 20 28 73 69  )(iNewSum >> (si
7d60: 7a 65 6f 66 28 69 36 34 29 2a 38 2d 31 29 29 3b  zeof(i64)*8-1));
7d70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 76 65 72  .        p->over
7d80: 66 6c 6f 77 20 3d 20 28 28 73 31 26 73 32 26 7e  flow = ((s1&s2&~
7d90: 73 33 29 20 7c 20 28 7e 73 31 26 7e 73 32 26 73  s3) | (~s1&~s2&s
7da0: 33 29 29 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  3))?1:0;.       
7db0: 20 70 2d 3e 69 53 75 6d 20 3d 20 69 4e 65 77 53   p->iSum = iNewS
7dc0: 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  um;.      }.    
7dd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
7de0: 72 53 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33 5f  rSum += sqlite3_
7df0: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
7e00: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  v[0]);.      p->
7e10: 61 70 70 72 6f 78 20 3d 20 31 3b 0a 20 20 20 20  approx = 1;.    
7e20: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
7e30: 6f 69 64 20 73 75 6d 46 69 6e 61 6c 69 7a 65 28  oid sumFinalize(
7e40: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7e50: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d  *context){.  Sum
7e60: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
7e70: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
7e80: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
7e90: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
7ea0: 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20  p->cnt>0 ){.    
7eb0: 69 66 28 20 70 2d 3e 6f 76 65 72 66 6c 6f 77 20  if( p->overflow 
7ec0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7ed0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
7ee0: 6e 74 65 78 74 2c 22 69 6e 74 65 67 65 72 20 6f  ntext,"integer o
7ef0: 76 65 72 66 6c 6f 77 22 2c 2d 31 29 3b 0a 20 20  verflow",-1);.  
7f00: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 61    }else if( p->a
7f10: 70 70 72 6f 78 20 29 7b 0a 20 20 20 20 20 20 73  pprox ){.      s
7f20: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
7f30: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 2d  uble(context, p-
7f40: 3e 72 53 75 6d 29 3b 0a 20 20 20 20 7d 65 6c 73  >rSum);.    }els
7f50: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
7f60: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
7f70: 6e 74 65 78 74 2c 20 70 2d 3e 69 53 75 6d 29 3b  ntext, p->iSum);
7f80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
7f90: 74 69 63 20 76 6f 69 64 20 61 76 67 46 69 6e 61  tic void avgFina
7fa0: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
7fb0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
7fc0: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70    SumCtx *p;.  p
7fd0: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
7fe0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
7ff0: 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  text, 0);.  if( 
8000: 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30 20 29 7b  p && p->cnt>0 ){
8010: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8020: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
8030: 78 74 2c 20 70 2d 3e 72 53 75 6d 2f 28 64 6f 75  xt, p->rSum/(dou
8040: 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a 20 20 7d  ble)p->cnt);.  }
8050: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
8060: 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 28 73 71 6c  otalFinalize(sql
8070: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
8080: 6e 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78  ntext){.  SumCtx
8090: 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   *p;.  p = sqlit
80a0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
80b0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29  text(context, 0)
80c0: 3b 0a 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30  ;.  /* (double)0
80d0: 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49   In case of SQLI
80e0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
80f0: 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 73  _POINT... */.  s
8100: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
8110: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70 20  uble(context, p 
8120: 3f 20 70 2d 3e 72 53 75 6d 20 3a 20 28 64 6f 75  ? p->rSum : (dou
8130: 62 6c 65 29 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ble)0);.}../*.**
8140: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
8150: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74  tructure keeps t
8160: 72 61 63 6b 20 6f 66 20 73 74 61 74 65 20 69 6e  rack of state in
8170: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
8180: 65 0a 2a 2a 20 63 6f 75 6e 74 28 29 20 61 67 67  e.** count() agg
8190: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
81a0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
81b0: 63 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e  ct CountCtx Coun
81c0: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f 75  tCtx;.struct Cou
81d0: 6e 74 43 74 78 20 7b 0a 20 20 69 36 34 20 6e 3b  ntCtx {.  i64 n;
81e0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  .};../*.** Routi
81f0: 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  nes to implement
8200: 20 74 68 65 20 63 6f 75 6e 74 28 29 20 61 67 67   the count() agg
8210: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
8220: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8230: 63 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74 65  countStep(sqlite
8240: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
8250: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
8260: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
8270: 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  gv){.  CountCtx 
8280: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
8290: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
82a0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
82b0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
82c0: 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49  (argc==0 || SQLI
82d0: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
82e0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
82f0: 5b 30 5d 29 29 20 26 26 20 70 20 29 7b 0a 20 20  [0])) && p ){.  
8300: 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 0a 23    p->n++;.  }..#
8310: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8320: 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
8330: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 61  /* The sqlite3_a
8340: 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29  ggregate_count()
8350: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 70   function is dep
8360: 72 65 63 61 74 65 64 2e 20 20 42 75 74 20 6a 75  recated.  But ju
8370: 73 74 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  st to make.  ** 
8380: 73 75 72 65 20 69 74 20 73 74 69 6c 6c 20 6f 70  sure it still op
8390: 65 72 61 74 65 73 20 63 6f 72 72 65 63 74 6c 79  erates correctly
83a0: 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 69 74  , verify that it
83b0: 73 20 63 6f 75 6e 74 20 61 67 72 65 65 73 20 77  s count agrees w
83c0: 69 74 68 20 6f 75 72 20 0a 20 20 2a 2a 20 69 6e  ith our .  ** in
83d0: 74 65 72 6e 61 6c 20 63 6f 75 6e 74 20 77 68 65  ternal count whe
83e0: 6e 20 75 73 69 6e 67 20 63 6f 75 6e 74 28 2a 29  n using count(*)
83f0: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 74 6f   and when the to
8400: 74 61 6c 20 63 6f 75 6e 74 20 63 61 6e 20 62 65  tal count can be
8410: 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 65 64 20  .  ** expressed 
8420: 61 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  as a 32-bit inte
8430: 67 65 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ger. */.  assert
8440: 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 70 3d 3d  ( argc==1 || p==
8450: 30 20 7c 7c 20 70 2d 3e 6e 3e 30 78 37 66 66 66  0 || p->n>0x7fff
8460: 66 66 66 66 0a 20 20 20 20 20 20 20 20 20 20 7c  ffff.          |
8470: 7c 20 70 2d 3e 6e 3d 3d 73 71 6c 69 74 65 33 5f  | p->n==sqlite3_
8480: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
8490: 63 6f 6e 74 65 78 74 29 20 29 3b 0a 23 65 6e 64  context) );.#end
84a0: 69 66 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76  if.}   .static v
84b0: 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a  oid countFinaliz
84c0: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
84d0: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 43  t *context){.  C
84e0: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
84f0: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
8500: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
8510: 65 78 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ext, 0);.  sqlit
8520: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
8530: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
8540: 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n : 0);.}../*.**
8550: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70   Routines to imp
8560: 6c 65 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e 64  lement min() and
8570: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
8580: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   functions..*/.s
8590: 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61  tatic void minma
85a0: 78 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  xStep(.  sqlite3
85b0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
85c0: 74 2c 20 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  t, .  int NotUse
85d0: 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  d, .  sqlite3_va
85e0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
85f0: 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20 28 4d 65  Mem *pArg  = (Me
8600: 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a 20 20 4d  m *)argv[0];.  M
8610: 65 6d 20 2a 70 42 65 73 74 3b 0a 20 20 55 4e 55  em *pBest;.  UNU
8620: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
8630: 74 55 73 65 64 29 3b 0a 0a 20 20 69 66 28 20 73  tUsed);..  if( s
8640: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8650: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
8660: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
8670: 3b 0a 20 20 70 42 65 73 74 20 3d 20 28 4d 65 6d  ;.  pBest = (Mem
8680: 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65   *)sqlite3_aggre
8690: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
86a0: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42  text, sizeof(*pB
86b0: 65 73 74 29 29 3b 0a 20 20 69 66 28 20 21 70 42  est));.  if( !pB
86c0: 65 73 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  est ) return;.. 
86d0: 20 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67   if( pBest->flag
86e0: 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78  s ){.    int max
86f0: 3b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20  ;.    int cmp;. 
8700: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
8710: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75  l = sqlite3GetFu
8720: 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78  ncCollSeq(contex
8730: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  t);.    /* This 
8740: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73  step function is
8750: 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
8760: 68 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78  he min() and max
8770: 28 29 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20  () aggregates,. 
8780: 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64     ** the only d
8790: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
87a0: 6e 20 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20  n the two being 
87b0: 74 68 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f  that the sense o
87c0: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  f the.    ** com
87d0: 70 61 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72  parison is inver
87e0: 74 65 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78  ted. For the max
87f0: 28 29 20 61 67 67 72 65 67 61 74 65 2c 20 74 68  () aggregate, th
8800: 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
8810: 5f 75 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e  _user_data() fun
8820: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76  ction returns (v
8830: 6f 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69  oid *)-1. For mi
8840: 6e 28 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65  n() it.    ** re
8850: 74 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62  turns (void *)db
8860: 2c 20 77 68 65 72 65 20 64 62 20 69 73 20 74 68  , where db is th
8870: 65 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62  e sqlite3* datab
8880: 61 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20  ase pointer..   
8890: 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68   ** Therefore th
88a0: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
88b0: 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 27   sets variable '
88c0: 6d 61 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68  max' to 1 for th
88d0: 65 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61  e max().    ** a
88e0: 67 67 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66  ggregate, or 0 f
88f0: 6f 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  or min()..    */
8900: 0a 20 20 20 20 6d 61 78 20 3d 20 73 71 6c 69 74  .    max = sqlit
8910: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
8920: 74 65 78 74 29 21 3d 30 3b 0a 20 20 20 20 63 6d  text)!=0;.    cm
8930: 70 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  p = sqlite3MemCo
8940: 6d 70 61 72 65 28 70 42 65 73 74 2c 20 70 41 72  mpare(pBest, pAr
8950: 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  g, pColl);.    i
8960: 66 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30  f( (max && cmp<0
8970: 29 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d  ) || (!max && cm
8980: 70 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  p>0) ){.      sq
8990: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
89a0: 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20  (pBest, pArg);. 
89b0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
89c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
89d0: 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41 72 67  Copy(pBest, pArg
89e0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
89f0: 76 6f 69 64 20 6d 69 6e 4d 61 78 46 69 6e 61 6c  void minMaxFinal
8a00: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
8a10: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
8a20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8a30: 70 52 65 73 3b 0a 20 20 70 52 65 73 20 3d 20 28  pRes;.  pRes = (
8a40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 29  sqlite3_value *)
8a50: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
8a60: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
8a70: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 52 65  t, 0);.  if( pRe
8a80: 73 20 29 7b 0a 20 20 20 20 69 66 28 20 41 4c 57  s ){.    if( ALW
8a90: 41 59 53 28 70 52 65 73 2d 3e 66 6c 61 67 73 29  AYS(pRes->flags)
8aa0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8ab0: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
8ac0: 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b 0a 20  ontext, pRes);. 
8ad0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8ae0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
8af0: 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Res);.  }.}../*.
8b00: 2a 2a 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  ** group_concat(
8b10: 45 58 50 52 2c 20 3f 53 45 50 41 52 41 54 4f 52  EXPR, ?SEPARATOR
8b20: 3f 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ?).*/.static voi
8b30: 64 20 67 72 6f 75 70 43 6f 6e 63 61 74 53 74 65  d groupConcatSte
8b40: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p(.  sqlite3_con
8b50: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
8b60: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
8b70: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
8b80: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  v.){.  const cha
8b90: 72 20 2a 7a 56 61 6c 3b 0a 20 20 53 74 72 41 63  r *zVal;.  StrAc
8ba0: 63 75 6d 20 2a 70 41 63 63 75 6d 3b 0a 20 20 63  cum *pAccum;.  c
8bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b  onst char *zSep;
8bc0: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 6e 53 65  .  int nVal, nSe
8bd0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  p;.  assert( arg
8be0: 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20  c==1 || argc==2 
8bf0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
8c00: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8c10: 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
8c20: 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 41  L ) return;.  pA
8c30: 63 63 75 6d 20 3d 20 28 53 74 72 41 63 63 75 6d  ccum = (StrAccum
8c40: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
8c50: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
8c60: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 41 63  ext, sizeof(*pAc
8c70: 63 75 6d 29 29 3b 0a 0a 20 20 69 66 28 20 70 41  cum));..  if( pA
8c80: 63 63 75 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69  ccum ){.    sqli
8c90: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
8ca0: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
8cb0: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
8cc0: 20 20 70 41 63 63 75 6d 2d 3e 75 73 65 4d 61 6c    pAccum->useMal
8cd0: 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 41 63  loc = 1;.    pAc
8ce0: 63 75 6d 2d 3e 6d 78 41 6c 6c 6f 63 20 3d 20 64  cum->mxAlloc = d
8cf0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8d00: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a  _LIMIT_LENGTH];.
8d10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
8d20: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
8d30: 63 6f 6e 74 65 78 74 29 3e 31 20 29 7b 0a 20 20  context)>1 ){.  
8d40: 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20      if( argc==2 
8d50: 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20  ){.        zSep 
8d60: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
8d70: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8d80: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 53  [1]);.        nS
8d90: 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ep = sqlite3_val
8da0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d  ue_bytes(argv[1]
8db0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8dc0: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
8dd0: 2c 22 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 70  ,";.        nSep
8de0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
8df0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
8e00: 63 75 6d 41 70 70 65 6e 64 28 70 41 63 63 75 6d  cumAppend(pAccum
8e10: 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3b 0a 20  , zSep, nSep);. 
8e20: 20 20 20 7d 0a 20 20 20 20 7a 56 61 6c 20 3d 20     }.    zVal = 
8e30: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
8e40: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
8e50: 5d 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d 20 73  ]);.    nVal = s
8e60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
8e70: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
8e80: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
8e90: 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 7a  Append(pAccum, z
8ea0: 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 7d 0a  Val, nVal);.  }.
8eb0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 72  }.static void gr
8ec0: 6f 75 70 43 6f 6e 63 61 74 46 69 6e 61 6c 69 7a  oupConcatFinaliz
8ed0: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
8ee0: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53  t *context){.  S
8ef0: 74 72 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 3b  trAccum *pAccum;
8f00: 0a 20 20 70 41 63 63 75 6d 20 3d 20 73 71 6c 69  .  pAccum = sqli
8f10: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
8f20: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
8f30: 29 3b 0a 20 20 69 66 28 20 70 41 63 63 75 6d 20  );.  if( pAccum 
8f40: 29 7b 0a 20 20 20 20 69 66 28 20 70 41 63 63 75  ){.    if( pAccu
8f50: 6d 2d 3e 74 6f 6f 42 69 67 20 29 7b 0a 20 20 20  m->tooBig ){.   
8f60: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8f70: 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63  t_error_toobig(c
8f80: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c  ontext);.    }el
8f90: 73 65 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 6d  se if( pAccum->m
8fa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
8fb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8fc0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
8fd0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65  context);.    }e
8fe0: 6c 73 65 7b 20 20 20 20 0a 20 20 20 20 20 20 73  lse{    .      s
8ff0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
9000: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  xt(context, sqli
9010: 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
9020: 68 28 70 41 63 63 75 6d 29 2c 20 2d 31 2c 20 0a  h(pAccum), -1, .
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9050: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  3_free);.    }. 
9060: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
9070: 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74   function regist
9080: 65 72 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 20  ered all of the 
9090: 61 62 6f 76 65 20 43 20 66 75 6e 63 74 69 6f 6e  above C function
90a0: 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63  s as SQL.** func
90b0: 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 68 6f  tions.  This sho
90c0: 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20  uld be the only 
90d0: 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73 20  routine in this 
90e0: 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65 78 74  file with.** ext
90f0: 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e 0a 2a  ernal linkage..*
9100: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
9110: 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e  gisterBuiltinFun
9120: 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a  ctions(sqlite3 *
9130: 64 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  db){.#ifndef SQL
9140: 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
9150: 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 41 6c 74  BLE.  sqlite3Alt
9160: 65 72 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  erFunctions(db);
9170: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 64  .#endif.  if( !d
9180: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9190: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
91a0: 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64  sqlite3_overload
91b0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 4d  _function(db, "M
91c0: 41 54 43 48 22 2c 20 32 29 3b 0a 20 20 20 20 61  ATCH", 2);.    a
91d0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
91e0: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53  E_NOMEM || rc==S
91f0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9200: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
9210: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 64 62  OMEM ){.      db
9220: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
9230: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69   1;.    }.  }.#i
9240: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a  fdef SQLITE_SSE.
9250: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
9260: 73 65 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  seFunctions(db);
9270: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
9280: 20 53 65 74 20 74 68 65 20 4c 49 4b 45 4f 50 54   Set the LIKEOPT
9290: 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 32 2d 61   flag on the 2-a
92a0: 72 67 75 6d 65 6e 74 20 66 75 6e 63 74 69 6f 6e  rgument function
92b0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
92c0: 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  name..*/.static 
92d0: 76 6f 69 64 20 73 65 74 4c 69 6b 65 4f 70 74 46  void setLikeOptF
92e0: 6c 61 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  lag(sqlite3 *db,
92f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
9300: 6d 65 2c 20 75 38 20 66 6c 61 67 56 61 6c 29 7b  me, u8 flagVal){
9310: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66  .  FuncDef *pDef
9320: 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74  ;.  pDef = sqlit
9330: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
9340: 62 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65  b, zName, sqlite
9350: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
9360: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
9380: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
9390: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
93a0: 70 44 65 66 29 20 29 7b 0a 20 20 20 20 70 44 65  pDef) ){.    pDe
93b0: 66 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 56  f->flags = flagV
93c0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
93d0: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 62 75   Register the bu
93e0: 69 6c 74 2d 69 6e 20 4c 49 4b 45 20 61 6e 64 20  ilt-in LIKE and 
93f0: 47 4c 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20  GLOB functions. 
9400: 20 54 68 65 20 63 61 73 65 53 65 6e 73 69 74 69   The caseSensiti
9410: 76 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ve.** parameter 
9420: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
9430: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 4c 49  er or not the LI
9440: 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63  KE operator is c
9450: 61 73 65 0a 2a 2a 20 73 65 6e 73 69 74 69 76 65  ase.** sensitive
9460: 2e 20 20 47 4c 4f 42 20 69 73 20 61 6c 77 61 79  .  GLOB is alway
9470: 73 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65  s case sensitive
9480: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9490: 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75 6e  3RegisterLikeFun
94a0: 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a  ctions(sqlite3 *
94b0: 64 62 2c 20 69 6e 74 20 63 61 73 65 53 65 6e 73  db, int caseSens
94c0: 69 74 69 76 65 29 7b 0a 20 20 73 74 72 75 63 74  itive){.  struct
94d0: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49   compareInfo *pI
94e0: 6e 66 6f 3b 0a 20 20 69 66 28 20 63 61 73 65 53  nfo;.  if( caseS
94f0: 65 6e 73 69 74 69 76 65 20 29 7b 0a 20 20 20 20  ensitive ){.    
9500: 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63 74 20  pInfo = (struct 
9510: 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c 69  compareInfo*)&li
9520: 6b 65 49 6e 66 6f 41 6c 74 3b 0a 20 20 7d 65 6c  keInfoAlt;.  }el
9530: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20  se{.    pInfo = 
9540: 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49  (struct compareI
9550: 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 4e 6f  nfo*)&likeInfoNo
9560: 72 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rm;.  }.  sqlite
9570: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
9580: 22 6c 69 6b 65 22 2c 20 32 2c 20 53 51 4c 49 54  "like", 2, SQLIT
9590: 45 5f 41 4e 59 2c 20 70 49 6e 66 6f 2c 20 6c 69  E_ANY, pInfo, li
95a0: 6b 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  keFunc, 0, 0);. 
95b0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
95c0: 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20 33  nc(db, "like", 3
95d0: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 70 49  , SQLITE_ANY, pI
95e0: 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30  nfo, likeFunc, 0
95f0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  , 0);.  sqlite3C
9600: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 22 67  reateFunc(db, "g
9610: 6c 6f 62 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  lob", 2, SQLITE_
9620: 41 4e 59 2c 20 0a 20 20 20 20 20 20 28 73 74 72  ANY, .      (str
9630: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a  uct compareInfo*
9640: 29 26 67 6c 6f 62 49 6e 66 6f 2c 20 6c 69 6b 65  )&globInfo, like
9650: 46 75 6e 63 2c 20 30 2c 30 29 3b 0a 20 20 73 65  Func, 0,0);.  se
9660: 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c  tLikeOptFlag(db,
9670: 20 22 67 6c 6f 62 22 2c 20 53 51 4c 49 54 45 5f   "glob", SQLITE_
9680: 46 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49  FUNC_LIKE | SQLI
9690: 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3b 0a 20  TE_FUNC_CASE);. 
96a0: 20 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28   setLikeOptFlag(
96b0: 64 62 2c 20 22 6c 69 6b 65 22 2c 20 0a 20 20 20  db, "like", .   
96c0: 20 20 20 63 61 73 65 53 65 6e 73 69 74 69 76 65     caseSensitive
96d0: 20 3f 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ? (SQLITE_FUNC_
96e0: 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55  LIKE | SQLITE_FU
96f0: 4e 43 5f 43 41 53 45 29 20 3a 20 53 51 4c 49 54  NC_CASE) : SQLIT
9700: 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d 0a  E_FUNC_LIKE);.}.
9710: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f 69  ./*.** pExpr poi
9720: 6e 74 73 20 74 6f 20 61 6e 20 65 78 70 72 65 73  nts to an expres
9730: 73 69 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c 65  sion which imple
9740: 6d 65 6e 74 73 20 61 20 66 75 6e 63 74 69 6f 6e  ments a function
9750: 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69 73 20 61  .  If.** it is a
9760: 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 61 70  ppropriate to ap
9770: 70 6c 79 20 74 68 65 20 4c 49 4b 45 20 6f 70 74  ply the LIKE opt
9780: 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68 61  imization to tha
9790: 74 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68  t function.** th
97a0: 65 6e 20 73 65 74 20 61 57 63 5b 30 5d 20 74 68  en set aWc[0] th
97b0: 72 6f 75 67 68 20 61 57 63 5b 32 5d 20 74 6f 20  rough aWc[2] to 
97c0: 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68 61  the wildcard cha
97d0: 72 61 63 74 65 72 73 20 61 6e 64 0a 2a 2a 20 72  racters and.** r
97e0: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
97f0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
9800: 6e 6f 74 20 61 20 4c 49 4b 45 2d 73 74 79 6c 65  not a LIKE-style
9810: 20 66 75 6e 63 74 69 6f 6e 20 74 68 65 6e 0a 2a   function then.*
9820: 2a 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  * return FALSE..
9830: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
9840: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71 6c  LikeFunction(sql
9850: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
9860: 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 49 73 4e  pExpr, int *pIsN
9870: 6f 63 61 73 65 2c 20 63 68 61 72 20 2a 61 57 63  ocase, char *aWc
9880: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44  ){.  FuncDef *pD
9890: 65 66 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  ef;.  if( pExpr-
98a0: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
98b0: 20 0a 20 20 20 7c 7c 20 21 70 45 78 70 72 2d 3e   .   || !pExpr->
98c0: 78 2e 70 4c 69 73 74 20 0a 20 20 20 7c 7c 20 70  x.pList .   || p
98d0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
98e0: 45 78 70 72 21 3d 32 0a 20 20 29 7b 0a 20 20 20  Expr!=2.  ){.   
98f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
9900: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
9910: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
9920: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
9930: 3b 0a 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74  ;.  pDef = sqlit
9940: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
9950: 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  b, (char*)pExpr-
9960: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
9970: 3e 74 6f 6b 65 6e 2e 6e 2c 20 32 2c 0a 20 20 20  >token.n, 2,.   
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
99a0: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 69 66 28  _UTF8, 0);.  if(
99b0: 20 4e 45 56 45 52 28 70 44 65 66 3d 3d 30 29 20   NEVER(pDef==0) 
99c0: 7c 7c 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  || (pDef->flags 
99d0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49  & SQLITE_FUNC_LI
99e0: 4b 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  KE)==0 ){.    re
99f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
9a00: 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 73  * The memcpy() s
9a10: 74 61 74 65 6d 65 6e 74 20 61 73 73 75 6d 65 73  tatement assumes
9a20: 20 74 68 61 74 20 74 68 65 20 77 69 6c 64 63 61   that the wildca
9a30: 72 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72  rd characters ar
9a40: 65 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  e.  ** the first
9a50: 20 74 68 72 65 65 20 73 74 61 74 65 6d 65 6e 74   three statement
9a60: 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 61 72 65  s in the compare
9a70: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
9a80: 20 54 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   The.  ** assert
9a90: 73 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  s() that follow 
9aa0: 76 65 72 69 66 79 20 74 68 61 74 20 61 73 73 75  verify that assu
9ab0: 6d 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65  mption.  */.  me
9ac0: 6d 63 70 79 28 61 57 63 2c 20 70 44 65 66 2d 3e  mcpy(aWc, pDef->
9ad0: 70 55 73 65 72 44 61 74 61 2c 20 33 29 3b 0a 20  pUserData, 3);. 
9ae0: 20 61 73 73 65 72 74 28 20 28 63 68 61 72 2a 29   assert( (char*)
9af0: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 20 3d 3d 20  &likeInfoAlt == 
9b00: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
9b10: 41 6c 74 2e 6d 61 74 63 68 41 6c 6c 20 29 3b 0a  Alt.matchAll );.
9b20: 20 20 61 73 73 65 72 74 28 20 26 28 28 63 68 61    assert( &((cha
9b30: 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29  r*)&likeInfoAlt)
9b40: 5b 31 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c  [1] == (char*)&l
9b50: 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68  ikeInfoAlt.match
9b60: 4f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  One );.  assert(
9b70: 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49   &((char*)&likeI
9b80: 6e 66 6f 41 6c 74 29 5b 32 5d 20 3d 3d 20 28 63  nfoAlt)[2] == (c
9b90: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
9ba0: 74 2e 6d 61 74 63 68 53 65 74 20 29 3b 0a 20 20  t.matchSet );.  
9bb0: 2a 70 49 73 4e 6f 63 61 73 65 20 3d 20 28 70 44  *pIsNocase = (pD
9bc0: 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
9bd0: 54 45 5f 46 55 4e 43 5f 43 41 53 45 29 3d 3d 30  TE_FUNC_CASE)==0
9be0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
9bf0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 61 6c 6c 20 6f  ./*.** All all o
9c00: 66 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74  f the FuncDef st
9c10: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
9c20: 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 61  aBuiltinFunc[] a
9c30: 72 72 61 79 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  rray above.** to
9c40: 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63   the global func
9c50: 74 69 6f 6e 20 68 61 73 68 20 74 61 62 6c 65 2e  tion hash table.
9c60: 20 20 54 68 69 73 20 6f 63 63 75 72 73 20 61 74    This occurs at
9c70: 20 73 74 61 72 74 2d 74 69 6d 65 20 28 61 73 0a   start-time (as.
9c80: 2a 2a 20 61 20 63 6f 6e 73 65 71 75 65 6e 63 65  ** a consequence
9c90: 20 6f 66 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   of calling sqli
9ca0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
9cb0: 29 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  )..**.** After t
9cc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
9cd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9ce0: 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75  RegisterGlobalFu
9cf0: 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  nctions(void){. 
9d00: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c   /*.  ** The fol
9d10: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
9d20: 64 73 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ds FuncDef struc
9d30: 74 75 72 65 73 20 66 6f 72 20 61 6c 6c 20 6f 66  tures for all of
9d40: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20   the functions. 
9d50: 20 2a 2a 20 64 65 66 69 6e 65 64 20 69 6e 20 74   ** defined in t
9d60: 68 69 73 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20  his file..  **. 
9d70: 20 2a 2a 20 54 68 65 20 61 72 72 61 79 20 63 61   ** The array ca
9d80: 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  nnot be constant
9d90: 20 73 69 6e 63 65 20 63 68 61 6e 67 65 73 20 61   since changes a
9da0: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 0a 20  re made to the. 
9db0: 20 2a 2a 20 46 75 6e 63 44 65 66 2e 70 48 61 73   ** FuncDef.pHas
9dc0: 68 20 65 6c 65 6d 65 6e 74 73 20 61 74 20 73 74  h elements at st
9dd0: 61 72 74 2d 74 69 6d 65 2e 20 20 54 68 65 20 65  art-time.  The e
9de0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 69 73 20  lements of this 
9df0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 72 65 20 72  array.  ** are r
9e00: 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 69  ead-only after i
9e10: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 69 73  nitialization is
9e20: 20 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 2a 2f 0a   complete..  */.
9e30: 20 20 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f    static SQLITE_
9e40: 57 53 44 20 46 75 6e 63 44 65 66 20 61 42 75 69  WSD FuncDef aBui
9e50: 6c 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20  ltinFunc[] = {. 
9e60: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69     FUNCTION(ltri
9e70: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
9e80: 31 2c 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e  1, 1, 0, trimFun
9e90: 63 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  c         ),.   
9ea0: 20 46 55 4e 43 54 49 4f 4e 28 6c 74 72 69 6d 2c   FUNCTION(ltrim,
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c                2,
9ec0: 20 31 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20   1, 0, trimFunc 
9ed0: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
9ee0: 55 4e 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20  UNCTION(rtrim,  
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 32              1, 2
9f00: 2c 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20  , 0, trimFunc   
9f10: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
9f20: 43 54 49 4f 4e 28 72 74 72 69 6d 2c 20 20 20 20  CTION(rtrim,    
9f30: 20 20 20 20 20 20 20 20 20 20 32 2c 20 32 2c 20            2, 2, 
9f40: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
9f50: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
9f60: 49 4f 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20  ION(trim,       
9f70: 20 20 20 20 20 20 20 20 31 2c 20 33 2c 20 30 2c          1, 3, 0,
9f80: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
9f90: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
9fa0: 4e 28 74 72 69 6d 2c 20 20 20 20 20 20 20 20 20  N(trim,         
9fb0: 20 20 20 20 20 20 32 2c 20 33 2c 20 30 2c 20 74        2, 3, 0, t
9fc0: 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20  rimFunc         
9fd0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
9fe0: 6d 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  min,            
9ff0: 20 20 20 2d 31 2c 20 30 2c 20 31 2c 20 6d 69 6e     -1, 0, 1, min
a000: 6d 61 78 46 75 6e 63 20 20 20 20 20 20 20 29 2c  maxFunc       ),
a010: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6d 69  .    FUNCTION(mi
a020: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
a030: 20 20 30 2c 20 30 2c 20 31 2c 20 30 20 20 20 20    0, 0, 1, 0    
a040: 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20              ),. 
a050: 20 20 20 41 47 47 52 45 47 41 54 45 28 6d 69 6e     AGGREGATE(min
a060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a070: 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 53  1, 0, 1, minmaxS
a080: 74 65 70 2c 20 20 20 20 20 20 6d 69 6e 4d 61 78  tep,      minMax
a090: 46 69 6e 61 6c 69 7a 65 20 29 2c 0a 20 20 20 20  Finalize ),.    
a0a0: 46 55 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20  FUNCTION(max,   
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
a0c0: 31 2c 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e 63  1, 1, minmaxFunc
a0d0: 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55         ),.    FU
a0e0: 4e 43 54 49 4f 4e 28 6d 61 78 2c 20 20 20 20 20  NCTION(max,     
a0f0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c             0, 1,
a100: 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20 20   1, 0           
a110: 20 20 20 20 20 29 2c 0a 20 20 20 20 41 47 47 52       ),.    AGGR
a120: 45 47 41 54 45 28 6d 61 78 2c 20 20 20 20 20 20  EGATE(max,      
a130: 20 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20 31           1, 1, 1
a140: 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20 20  , minmaxStep,   
a150: 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a     minMaxFinaliz
a160: 65 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f  e ),.    FUNCTIO
a170: 4e 28 74 79 70 65 6f 66 2c 20 20 20 20 20 20 20  N(typeof,       
a180: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 74        1, 0, 0, t
a190: 79 70 65 6f 66 46 75 6e 63 20 20 20 20 20 20 20  ypeofFunc       
a1a0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
a1b0: 6c 65 6e 67 74 68 2c 20 20 20 20 20 20 20 20 20  length,         
a1c0: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 65 6e      1, 0, 0, len
a1d0: 67 74 68 46 75 6e 63 20 20 20 20 20 20 20 29 2c  gthFunc       ),
a1e0: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 75  .    FUNCTION(su
a1f0: 62 73 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  bstr,           
a200: 20 20 32 2c 20 30 2c 20 30 2c 20 73 75 62 73 74    2, 0, 0, subst
a210: 72 46 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20  rFunc       ),. 
a220: 20 20 20 46 55 4e 43 54 49 4f 4e 28 73 75 62 73     FUNCTION(subs
a230: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
a240: 33 2c 20 30 2c 20 30 2c 20 73 75 62 73 74 72 46  3, 0, 0, substrF
a250: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
a260: 20 46 55 4e 43 54 49 4f 4e 28 61 62 73 2c 20 20   FUNCTION(abs,  
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
a280: 20 30 2c 20 30 2c 20 61 62 73 46 75 6e 63 20 20   0, 0, absFunc  
a290: 20 20 20 20 20 20 20 20 29 2c 0a 23 69 66 6e 64          ),.#ifnd
a2a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
a2b0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
a2c0: 20 20 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64    FUNCTION(round
a2d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
a2e0: 2c 20 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e  , 0, 0, roundFun
a2f0: 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20  c        ),.    
a300: 46 55 4e 43 54 49 4f 4e 28 72 6f 75 6e 64 2c 20  FUNCTION(round, 
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
a320: 30 2c 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20  0, 0, roundFunc 
a330: 20 20 20 20 20 20 20 29 2c 0a 23 65 6e 64 69 66         ),.#endif
a340: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 75 70  .    FUNCTION(up
a350: 70 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  per,            
a360: 20 20 31 2c 20 30 2c 20 30 2c 20 75 70 70 65 72    1, 0, 0, upper
a370: 46 75 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20  Func        ),. 
a380: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f 77 65     FUNCTION(lowe
a390: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
a3a0: 31 2c 20 30 2c 20 30 2c 20 6c 6f 77 65 72 46 75  1, 0, 0, lowerFu
a3b0: 6e 63 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20  nc        ),.   
a3c0: 20 46 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73   FUNCTION(coales
a3d0: 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c  ce,           1,
a3e0: 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20   0, 0, 0        
a3f0: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46          ),.    F
a400: 55 4e 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65  UNCTION(coalesce
a410: 2c 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30  ,          -1, 0
a420: 2c 20 30 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20  , 0, ifnullFunc 
a430: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
a440: 43 54 49 4f 4e 28 63 6f 61 6c 65 73 63 65 2c 20  CTION(coalesce, 
a450: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
a460: 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  0, 0            
a470: 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54      ),.    FUNCT
a480: 49 4f 4e 28 68 65 78 2c 20 20 20 20 20 20 20 20  ION(hex,        
a490: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
a4a0: 20 68 65 78 46 75 6e 63 20 20 20 20 20 20 20 20   hexFunc        
a4b0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
a4c0: 4e 28 69 66 6e 75 6c 6c 2c 20 20 20 20 20 20 20  N(ifnull,       
a4d0: 20 20 20 20 20 20 32 2c 20 30 2c 20 31 2c 20 69        2, 0, 1, i
a4e0: 66 6e 75 6c 6c 46 75 6e 63 20 20 20 20 20 20 20  fnullFunc       
a4f0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
a500: 72 61 6e 64 6f 6d 2c 20 20 20 20 20 20 20 20 20  random,         
a510: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 72 61 6e      0, 0, 0, ran
a520: 64 6f 6d 46 75 6e 63 20 20 20 20 20 20 20 29 2c  domFunc       ),
a530: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 72 61  .    FUNCTION(ra
a540: 6e 64 6f 6d 62 6c 6f 62 2c 20 20 20 20 20 20 20  ndomblob,       
a550: 20 20 31 2c 20 30 2c 20 30 2c 20 72 61 6e 64 6f    1, 0, 0, rando
a560: 6d 42 6c 6f 62 20 20 20 20 20 20 20 29 2c 0a 20  mBlob       ),. 
a570: 20 20 20 46 55 4e 43 54 49 4f 4e 28 6e 75 6c 6c     FUNCTION(null
a580: 69 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  if,             
a590: 32 2c 20 30 2c 20 31 2c 20 6e 75 6c 6c 69 66 46  2, 0, 1, nullifF
a5a0: 75 6e 63 20 20 20 20 20 20 20 29 2c 0a 20 20 20  unc       ),.   
a5b0: 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65   FUNCTION(sqlite
a5c0: 5f 76 65 72 73 69 6f 6e 2c 20 20 20 20 20 30 2c  _version,     0,
a5d0: 20 30 2c 20 30 2c 20 76 65 72 73 69 6f 6e 46 75   0, 0, versionFu
a5e0: 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  nc      ),.    F
a5f0: 55 4e 43 54 49 4f 4e 28 71 75 6f 74 65 2c 20 20  UNCTION(quote,  
a600: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
a610: 2c 20 30 2c 20 71 75 6f 74 65 46 75 6e 63 20 20  , 0, quoteFunc  
a620: 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e        ),.    FUN
a630: 43 54 49 4f 4e 28 6c 61 73 74 5f 69 6e 73 65 72  CTION(last_inser
a640: 74 5f 72 6f 77 69 64 2c 20 20 30 2c 20 30 2c 20  t_rowid,  0, 0, 
a650: 30 2c 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  0, last_insert_r
a660: 6f 77 69 64 29 2c 0a 20 20 20 20 46 55 4e 43 54  owid),.    FUNCT
a670: 49 4f 4e 28 63 68 61 6e 67 65 73 2c 20 20 20 20  ION(changes,    
a680: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c          0, 0, 0,
a690: 20 63 68 61 6e 67 65 73 20 20 20 20 20 20 20 20   changes        
a6a0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
a6b0: 4e 28 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 2c  N(total_changes,
a6c0: 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 74        0, 0, 0, t
a6d0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20 20 20 20  otal_changes    
a6e0: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
a6f0: 72 65 70 6c 61 63 65 2c 20 20 20 20 20 20 20 20  replace,        
a700: 20 20 20 20 33 2c 20 30 2c 20 30 2c 20 72 65 70      3, 0, 0, rep
a710: 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20 29 2c  laceFunc      ),
a720: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 7a 65  .    FUNCTION(ze
a730: 72 6f 62 6c 6f 62 2c 20 20 20 20 20 20 20 20 20  roblob,         
a740: 20 20 31 2c 20 30 2c 20 30 2c 20 7a 65 72 6f 62    1, 0, 0, zerob
a750: 6c 6f 62 46 75 6e 63 20 20 20 20 20 29 2c 0a 20  lobFunc     ),. 
a760: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53   #ifdef SQLITE_S
a770: 4f 55 4e 44 45 58 0a 20 20 20 20 46 55 4e 43 54  OUNDEX.    FUNCT
a780: 49 4f 4e 28 73 6f 75 6e 64 65 78 2c 20 20 20 20  ION(soundex,    
a790: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c          1, 0, 0,
a7a0: 20 73 6f 75 6e 64 65 78 46 75 6e 63 20 20 20 20   soundexFunc    
a7b0: 20 20 29 2c 0a 20 20 23 65 6e 64 69 66 0a 20 20    ),.  #endif.  
a7c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a7d0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
a7e0: 4f 4e 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ON.    FUNCTION(
a7f0: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20  load_extension, 
a800: 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 6c 6f 61      1, 0, 0, loa
a810: 64 45 78 74 20 20 20 20 20 20 20 20 20 20 29 2c  dExt          ),
a820: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6c 6f  .    FUNCTION(lo
a830: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20  ad_extension,   
a840: 20 20 32 2c 20 30 2c 20 30 2c 20 6c 6f 61 64 45    2, 0, 0, loadE
a850: 78 74 20 20 20 20 20 20 20 20 20 20 29 2c 0a 20  xt          ),. 
a860: 20 23 65 6e 64 69 66 0a 20 20 20 20 41 47 47 52   #endif.    AGGR
a870: 45 47 41 54 45 28 73 75 6d 2c 20 20 20 20 20 20  EGATE(sum,      
a880: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 30           1, 0, 0
a890: 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20  , sumStep,      
a8a0: 20 20 20 73 75 6d 46 69 6e 61 6c 69 7a 65 20 20     sumFinalize  
a8b0: 20 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41    ),.    AGGREGA
a8c0: 54 45 28 74 6f 74 61 6c 2c 20 20 20 20 20 20 20  TE(total,       
a8d0: 20 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73        1, 0, 0, s
a8e0: 75 6d 53 74 65 70 2c 20 20 20 20 20 20 20 20 20  umStep,         
a8f0: 74 6f 74 61 6c 46 69 6e 61 6c 69 7a 65 20 20 20  totalFinalize   
a900: 20 29 2c 0a 20 20 20 20 41 47 47 52 45 47 41 54   ),.    AGGREGAT
a910: 45 28 61 76 67 2c 20 20 20 20 20 20 20 20 20 20  E(avg,          
a920: 20 20 20 20 20 31 2c 20 30 2c 20 30 2c 20 73 75       1, 0, 0, su
a930: 6d 53 74 65 70 2c 20 20 20 20 20 20 20 20 20 61  mStep,         a
a940: 76 67 46 69 6e 61 6c 69 7a 65 20 20 20 20 29 2c  vgFinalize    ),
a950: 0a 20 2f 2a 20 41 47 47 52 45 47 41 54 45 28 63  . /* AGGREGATE(c
a960: 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ount,           
a970: 20 20 30 2c 20 30 2c 20 30 2c 20 63 6f 75 6e 74    0, 0, 0, count
a980: 53 74 65 70 2c 20 20 20 20 20 20 20 63 6f 75 6e  Step,       coun
a990: 74 46 69 6e 61 6c 69 7a 65 20 20 29 2c 20 2a 2f  tFinalize  ), */
a9a0: 0a 20 20 20 20 7b 30 2c 53 51 4c 49 54 45 5f 55  .    {0,SQLITE_U
a9b0: 54 46 38 2c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  TF8,SQLITE_FUNC_
a9c0: 43 4f 55 4e 54 2c 30 2c 30 2c 30 2c 63 6f 75 6e  COUNT,0,0,0,coun
a9d0: 74 53 74 65 70 2c 63 6f 75 6e 74 46 69 6e 61 6c  tStep,countFinal
a9e0: 69 7a 65 2c 22 63 6f 75 6e 74 22 2c 30 7d 2c 0a  ize,"count",0},.
a9f0: 20 20 20 20 41 47 47 52 45 47 41 54 45 28 63 6f      AGGREGATE(co
aa00: 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  unt,            
aa10: 20 31 2c 20 30 2c 20 30 2c 20 63 6f 75 6e 74 53   1, 0, 0, countS
aa20: 74 65 70 2c 20 20 20 20 20 20 20 63 6f 75 6e 74  tep,       count
aa30: 46 69 6e 61 6c 69 7a 65 20 20 29 2c 0a 20 20 20  Finalize  ),.   
aa40: 20 41 47 47 52 45 47 41 54 45 28 67 72 6f 75 70   AGGREGATE(group
aa50: 5f 63 6f 6e 63 61 74 2c 20 20 20 20 20 20 31 2c  _concat,      1,
aa60: 20 30 2c 20 30 2c 20 67 72 6f 75 70 43 6f 6e 63   0, 0, groupConc
aa70: 61 74 53 74 65 70 2c 20 67 72 6f 75 70 43 6f 6e  atStep, groupCon
aa80: 63 61 74 46 69 6e 61 6c 69 7a 65 29 2c 0a 20 20  catFinalize),.  
aa90: 20 20 41 47 47 52 45 47 41 54 45 28 67 72 6f 75    AGGREGATE(grou
aaa0: 70 5f 63 6f 6e 63 61 74 2c 20 20 20 20 20 20 32  p_concat,      2
aab0: 2c 20 30 2c 20 30 2c 20 67 72 6f 75 70 43 6f 6e  , 0, 0, groupCon
aac0: 63 61 74 53 74 65 70 2c 20 67 72 6f 75 70 43 6f  catStep, groupCo
aad0: 6e 63 61 74 46 69 6e 61 6c 69 7a 65 29 2c 0a 20  ncatFinalize),. 
aae0: 20 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28 67   .    LIKEFUNC(g
aaf0: 6c 6f 62 2c 20 32 2c 20 26 67 6c 6f 62 49 6e 66  lob, 2, &globInf
ab00: 6f 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  o, SQLITE_FUNC_L
ab10: 49 4b 45 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  IKE|SQLITE_FUNC_
ab20: 43 41 53 45 29 2c 0a 20 20 23 69 66 64 65 66 20  CASE),.  #ifdef 
ab30: 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e 53  SQLITE_CASE_SENS
ab40: 49 54 49 56 45 5f 4c 49 4b 45 0a 20 20 20 20 4c  ITIVE_LIKE.    L
ab50: 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 32 2c  IKEFUNC(like, 2,
ab60: 20 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2c 20 53   &likeInfoAlt, S
ab70: 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 7c  QLITE_FUNC_LIKE|
ab80: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 41 53 45  SQLITE_FUNC_CASE
ab90: 29 2c 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28  ),.    LIKEFUNC(
aba0: 6c 69 6b 65 2c 20 33 2c 20 26 6c 69 6b 65 49 6e  like, 3, &likeIn
abb0: 66 6f 41 6c 74 2c 20 53 51 4c 49 54 45 5f 46 55  foAlt, SQLITE_FU
abc0: 4e 43 5f 4c 49 4b 45 7c 53 51 4c 49 54 45 5f 46  NC_LIKE|SQLITE_F
abd0: 55 4e 43 5f 43 41 53 45 29 2c 0a 20 20 23 65 6c  UNC_CASE),.  #el
abe0: 73 65 0a 20 20 20 20 4c 49 4b 45 46 55 4e 43 28  se.    LIKEFUNC(
abf0: 6c 69 6b 65 2c 20 32 2c 20 26 6c 69 6b 65 49 6e  like, 2, &likeIn
ac00: 66 6f 4e 6f 72 6d 2c 20 53 51 4c 49 54 45 5f 46  foNorm, SQLITE_F
ac10: 55 4e 43 5f 4c 49 4b 45 29 2c 0a 20 20 20 20 4c  UNC_LIKE),.    L
ac20: 49 4b 45 46 55 4e 43 28 6c 69 6b 65 2c 20 33 2c  IKEFUNC(like, 3,
ac30: 20 26 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 2c 20   &likeInfoNorm, 
ac40: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
ac50: 29 2c 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d 3b  ),.  #endif.  };
ac60: 0a 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 75 6e  ..  int i;.  Fun
ac70: 63 44 65 66 48 61 73 68 20 2a 70 48 61 73 68 20  cDefHash *pHash 
ac80: 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65  = &GLOBAL(FuncDe
ac90: 66 48 61 73 68 2c 20 73 71 6c 69 74 65 33 47 6c  fHash, sqlite3Gl
aca0: 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a  obalFunctions);.
acb0: 20 20 46 75 6e 63 44 65 66 20 2a 61 46 75 6e 63    FuncDef *aFunc
acc0: 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 26 47 4c   = (FuncDef*)&GL
acd0: 4f 42 41 4c 28 46 75 6e 63 44 65 66 2c 20 61 42  OBAL(FuncDef, aB
ace0: 75 69 6c 74 69 6e 46 75 6e 63 29 3b 0a 0a 20 20  uiltinFunc);..  
acf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
ad00: 53 69 7a 65 28 61 42 75 69 6c 74 69 6e 46 75 6e  Size(aBuiltinFun
ad10: 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  c); i++){.    sq
ad20: 6c 69 74 65 33 46 75 6e 63 44 65 66 49 6e 73 65  lite3FuncDefInse
ad30: 72 74 28 70 48 61 73 68 2c 20 26 61 46 75 6e 63  rt(pHash, &aFunc
ad40: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
ad50: 74 65 33 52 65 67 69 73 74 65 72 44 61 74 65 54  te3RegisterDateT
ad60: 69 6d 65 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a  imeFunctions();.
ad70: 7d 0a                                            }.