/ Hex Artifact Content
Login

Artifact bd94a8aabeecc741df71afba856133738f1c1638:


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 31 36 34 20 32 30 30 37 2f 30 38 2f 31 36  1.164 2007/08/16
02a0: 20 30 34 3a 33 30 3a 34 30 20 64 72 68 20 45 78   04:30:40 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 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
02e0: 0a 2f 2a 20 23 69 6e 63 6c 75 64 65 20 3c 6d 61  ./* #include <ma
02f0: 74 68 2e 68 3e 20 2a 2f 0a 23 69 6e 63 6c 75 64  th.h> */.#includ
0300: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e  e <stdlib.h>.#in
0310: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
0320: 0a 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49  .#include "vdbeI
0330: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
0340: 6f 73 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  os.h".../*.** Re
0350: 74 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69  turn the collati
0360: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  ng function asso
0370: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 66 75  ciated with a fu
0380: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
0390: 63 20 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  c CollSeq *sqlit
03a0: 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71  e3GetFuncCollSeq
03b0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
03c0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 72 65   *context){.  re
03d0: 74 75 72 6e 20 63 6f 6e 74 65 78 74 2d 3e 70 43  turn context->pC
03e0: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  oll;.}../*.** Im
03f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
0400: 74 68 65 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  the non-aggregat
0410: 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28  e min() and max(
0420: 29 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2f 0a 73  ) functions.*/.s
0430: 74 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61  tatic void minma
0440: 78 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  xFunc(.  sqlite3
0450: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
0460: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
0470: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0480: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69  *argv.){.  int i
0490: 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 20 20 20  ;.  int mask;   
04a0: 20 2f 2a 20 30 20 66 6f 72 20 6d 69 6e 28 29 20   /* 0 for min() 
04b0: 6f 72 20 30 78 66 66 66 66 66 66 66 66 20 66 6f  or 0xffffffff fo
04c0: 72 20 6d 61 78 28 29 20 2a 2f 0a 20 20 69 6e 74  r max() */.  int
04d0: 20 69 42 65 73 74 3b 0a 20 20 43 6f 6c 6c 53 65   iBest;.  CollSe
04e0: 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 69 66 28  q *pColl;..  if(
04f0: 20 61 72 67 63 3d 3d 30 20 29 20 72 65 74 75 72   argc==0 ) retur
0500: 6e 3b 0a 20 20 6d 61 73 6b 20 3d 20 73 71 6c 69  n;.  mask = sqli
0510: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
0520: 6e 74 65 78 74 29 3d 3d 30 20 3f 20 30 20 3a 20  ntext)==0 ? 0 : 
0530: 2d 31 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  -1;.  pColl = sq
0540: 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c  lite3GetFuncColl
0550: 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  Seq(context);.  
0560: 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 20 29 3b  assert( pColl );
0570: 0a 20 20 61 73 73 65 72 74 28 20 6d 61 73 6b 3d  .  assert( mask=
0580: 3d 2d 31 20 7c 7c 20 6d 61 73 6b 3d 3d 30 20 29  =-1 || mask==0 )
0590: 3b 0a 20 20 69 42 65 73 74 20 3d 20 30 3b 0a 20  ;.  iBest = 0;. 
05a0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
05b0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
05c0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
05d0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
05e0: 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
05f0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0600: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
0610: 5b 69 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [i])==SQLITE_NUL
0620: 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  L ) return;.    
0630: 69 66 28 20 28 73 71 6c 69 74 65 33 4d 65 6d 43  if( (sqlite3MemC
0640: 6f 6d 70 61 72 65 28 61 72 67 76 5b 69 42 65 73  ompare(argv[iBes
0650: 74 5d 2c 20 61 72 67 76 5b 69 5d 2c 20 70 43 6f  t], argv[i], pCo
0660: 6c 6c 29 5e 6d 61 73 6b 29 3e 3d 30 20 29 7b 0a  ll)^mask)>=0 ){.
0670: 20 20 20 20 20 20 69 42 65 73 74 20 3d 20 69 3b        iBest = i;
0680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
0690: 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
06a0: 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  e(context, argv[
06b0: 69 42 65 73 74 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iBest]);.}../*.*
06c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70  * Return the typ
06d0: 65 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  e of the argumen
06e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
06f0: 64 20 74 79 70 65 6f 66 46 75 6e 63 28 0a 20 20  d typeofFunc(.  
0700: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
0710: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
0720: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
0730: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
0740: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
0750: 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 73  = 0;.  switch( s
0760: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
0770: 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20  e(argv[0]) ){.  
0780: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
0790: 4c 4c 3a 20 20 20 20 7a 20 3d 20 22 6e 75 6c 6c  LL:    z = "null
07a0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
07b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
07c0: 45 47 45 52 3a 20 7a 20 3d 20 22 69 6e 74 65 67  EGER: z = "integ
07d0: 65 72 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  er"; break;.    
07e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
07f0: 3a 20 20 20 20 7a 20 3d 20 22 74 65 78 74 22 3b  :    z = "text";
0800: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0810: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
0820: 3a 20 20 20 7a 20 3d 20 22 72 65 61 6c 22 3b 20  :   z = "real"; 
0830: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0840: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
0850: 20 20 20 7a 20 3d 20 22 62 6c 6f 62 22 3b 20 20     z = "blob";  
0860: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73    break;.  }.  s
0870: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
0880: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 2d  xt(context, z, -
0890: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
08a0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  );.}.../*.** Imp
08b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
08c0: 68 65 20 6c 65 6e 67 74 68 28 29 20 66 75 6e 63  he length() func
08d0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
08e0: 6f 69 64 20 6c 65 6e 67 74 68 46 75 6e 63 28 0a  oid lengthFunc(.
08f0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
0900: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
0910: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
0920: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
0930: 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20  {.  int len;..  
0940: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
0950: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c  );.  switch( sql
0960: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
0970: 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20  argv[0]) ){.    
0980: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
0990: 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
09a0: 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  E_INTEGER:.    c
09b0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
09c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
09d0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
09e0: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
09f0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
0a00: 5d 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ]));.      break
0a10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
0a20: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a   SQLITE_TEXT: {.
0a30: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
0a40: 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73  gned char *z = s
0a50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
0a60: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
0a70: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
0a80: 75 72 6e 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d  urn;.      len =
0a90: 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
0aa0: 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 6c   *z ){.        l
0ab0: 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 53 51  en++;.        SQ
0ac0: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
0ad0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
0ae0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0af0: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6c 65 6e  int(context, len
0b00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
0b10: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
0b20: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
0b30: 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63  e3_result_null(c
0b40: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 62  ontext);.      b
0b50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
0b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
0b70: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61  ntation of the a
0b80: 62 73 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f  bs() function.*/
0b90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 62 73  .static void abs
0ba0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
0bb0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
0bc0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
0bd0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
0be0: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
0bf0: 31 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  1 );.  switch( s
0c00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
0c10: 65 28 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20  e(argv[0]) ){.  
0c20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
0c30: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  TEGER: {.      i
0c40: 36 34 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65  64 iVal = sqlite
0c50: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
0c60: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66  gv[0]);.      if
0c70: 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iVal<0 ){.    
0c80: 20 20 20 20 69 66 28 20 28 69 56 61 6c 3c 3c 31      if( (iVal<<1
0c90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
0ca0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0cb0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
0cc0: 22 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f  "integer overflo
0cd0: 77 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  w", -1);.       
0ce0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
0cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 56 61     }.        iVa
0d00: 6c 20 3d 20 2d 69 56 61 6c 3b 0a 20 20 20 20 20  l = -iVal;.     
0d10: 20 7d 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65   } .      sqlite
0d20: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
0d30: 6f 6e 74 65 78 74 2c 20 69 56 61 6c 29 3b 0a 20  ontext, iVal);. 
0d40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0d50: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
0d60: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
0d70: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e  sqlite3_result_n
0d80: 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ull(context);.  
0d90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0da0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
0db0: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 56 61        double rVa
0dc0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
0dd0: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d  e_double(argv[0]
0de0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 56 61  );.      if( rVa
0df0: 6c 3c 30 20 29 20 72 56 61 6c 20 3d 20 2d 72 56  l<0 ) rVal = -rV
0e00: 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  al;.      sqlite
0e10: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
0e20: 63 6f 6e 74 65 78 74 2c 20 72 56 61 6c 29 3b 0a  context, rVal);.
0e30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0e40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
0e50: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
0e60: 66 20 74 68 65 20 73 75 62 73 74 72 28 29 20 66  f the substr() f
0e70: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 73  unction..**.** s
0e80: 75 62 73 74 72 28 78 2c 70 31 2c 70 32 29 20 20  ubstr(x,p1,p2)  
0e90: 72 65 74 75 72 6e 73 20 70 32 20 63 68 61 72 61  returns p2 chara
0ea0: 63 74 65 72 73 20 6f 66 20 78 5b 5d 20 62 65 67  cters of x[] beg
0eb0: 69 6e 6e 69 6e 67 20 77 69 74 68 20 70 31 2e 0a  inning with p1..
0ec0: 2a 2a 20 70 31 20 69 73 20 31 2d 69 6e 64 65 78  ** p1 is 1-index
0ed0: 65 64 2e 20 20 53 6f 20 73 75 62 73 74 72 28 78  ed.  So substr(x
0ee0: 2c 31 2c 31 29 20 72 65 74 75 72 6e 73 20 74 68  ,1,1) returns th
0ef0: 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
0f00: 72 0a 2a 2a 20 6f 66 20 78 2e 20 20 49 66 20 78  r.** of x.  If x
0f10: 20 69 73 20 74 65 78 74 2c 20 74 68 65 6e 20 77   is text, then w
0f20: 65 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74  e actually count
0f30: 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72   UTF-8 character
0f40: 73 2e 0a 2a 2a 20 49 66 20 78 20 69 73 20 61 20  s..** If x is a 
0f50: 62 6c 6f 62 2c 20 74 68 65 6e 20 77 65 20 63 6f  blob, then we co
0f60: 75 6e 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  unt bytes..**.**
0f70: 20 49 66 20 70 31 20 69 73 20 6e 65 67 61 74 69   If p1 is negati
0f80: 76 65 2c 20 74 68 65 6e 20 77 65 20 62 65 67 69  ve, then we begi
0f90: 6e 20 61 62 73 28 70 31 29 20 66 72 6f 6d 20 74  n abs(p1) from t
0fa0: 68 65 20 65 6e 64 20 6f 66 20 78 5b 5d 2e 0a 2a  he end of x[]..*
0fb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
0fc0: 62 73 74 72 46 75 6e 63 28 0a 20 20 73 71 6c 69  bstrFunc(.  sqli
0fd0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
0fe0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
0ff0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
1000: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
1010: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1020: 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  r *z;.  const un
1030: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 32 3b  signed char *z2;
1040: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e  .  int len;.  in
1050: 74 20 70 30 74 79 70 65 3b 0a 20 20 69 36 34 20  t p0type;.  i64 
1060: 70 31 2c 20 70 32 3b 0a 0a 20 20 61 73 73 65 72  p1, p2;..  asser
1070: 74 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20  t( argc==3 );.  
1080: 70 30 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  p0type = sqlite3
1090: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
10a0: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 30 74 79  [0]);.  if( p0ty
10b0: 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe==SQLITE_BLOB 
10c0: 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c  ){.    len = sql
10d0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
10e0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 7a  (argv[0]);.    z
10f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1100: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
1110: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72      if( z==0 ) r
1120: 65 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72  eturn;.    asser
1130: 74 28 20 6c 65 6e 3d 3d 73 71 6c 69 74 65 33 5f  t( len==sqlite3_
1140: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
1150: 5b 30 5d 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  [0]) );.  }else{
1160: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
1170: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1180: 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  [0]);.    if( z=
1190: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
11a0: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 66 6f   len = 0;.    fo
11b0: 72 28 7a 32 3d 7a 3b 20 2a 7a 32 3b 20 6c 65 6e  r(z2=z; *z2; len
11c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54  ++){.      SQLIT
11d0: 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 32 29 3b  E_SKIP_UTF8(z2);
11e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 31 20  .    }.  }.  p1 
11f0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1200: 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  int(argv[1]);.  
1210: 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  p2 = sqlite3_val
1220: 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29 3b  ue_int(argv[2]);
1230: 0a 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20  .  if( p1<0 ){. 
1240: 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b 0a 20 20     p1 += len;.  
1250: 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20 20    if( p1<0 ){.  
1260: 20 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a 20 20      p2 += p1;.  
1270: 20 20 20 20 70 31 20 3d 20 30 3b 0a 20 20 20 20      p1 = 0;.    
1280: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 31  }.  }else if( p1
1290: 3e 30 20 29 7b 0a 20 20 20 20 70 31 2d 2d 3b 0a  >0 ){.    p1--;.
12a0: 20 20 7d 0a 20 20 69 66 28 20 70 31 2b 70 32 3e    }.  if( p1+p2>
12b0: 6c 65 6e 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  len ){.    p2 = 
12c0: 6c 65 6e 2d 70 31 3b 0a 20 20 7d 0a 20 20 69 66  len-p1;.  }.  if
12d0: 28 20 70 30 74 79 70 65 21 3d 53 51 4c 49 54 45  ( p0type!=SQLITE
12e0: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 77 68 69  _BLOB ){.    whi
12f0: 6c 65 28 20 2a 7a 20 26 26 20 70 31 20 29 7b 0a  le( *z && p1 ){.
1300: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49        SQLITE_SKI
1310: 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 20  P_UTF8(z);.     
1320: 20 70 31 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20   p1--;.    }.   
1330: 20 66 6f 72 28 7a 32 3d 7a 3b 20 2a 7a 32 20 26   for(z2=z; *z2 &
1340: 26 20 70 32 3b 20 70 32 2d 2d 29 7b 0a 20 20 20  & p2; p2--){.   
1350: 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55     SQLITE_SKIP_U
1360: 54 46 38 28 7a 32 29 3b 0a 20 20 20 20 7d 0a 20  TF8(z2);.    }. 
1370: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1380: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
1390: 28 63 68 61 72 2a 29 7a 2c 20 7a 32 2d 7a 2c 20  (char*)z, z2-z, 
13a0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
13b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
13c0: 69 66 28 20 70 32 3c 30 20 29 20 70 32 20 3d 20  if( p2<0 ) p2 = 
13d0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
13e0: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
13f0: 78 74 2c 20 28 63 68 61 72 2a 29 26 7a 5b 70 31  xt, (char*)&z[p1
1400: 5d 2c 20 70 32 2c 20 53 51 4c 49 54 45 5f 54 52  ], p2, SQLITE_TR
1410: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a  ANSIENT);.  }.}.
1420: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1430: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 75  ation of the rou
1440: 6e 64 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f  nd() function.*/
1450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 75  .static void rou
1460: 6e 64 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ndFunc(sqlite3_c
1470: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1480: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
1490: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
14a0: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
14b0: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61   double r;.  cha
14c0: 72 20 7a 42 75 66 5b 35 30 30 5d 3b 20 20 2f 2a  r zBuf[500];  /*
14d0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
14e0: 20 25 66 20 72 65 70 72 65 73 65 6e 74 61 74 69   %f representati
14f0: 6f 6e 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  on of the larges
1500: 74 20 64 6f 75 62 6c 65 20 2a 2f 0a 20 20 61 73  t double */.  as
1510: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c  sert( argc==1 ||
1520: 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66   argc==2 );.  if
1530: 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20  ( argc==2 ){.   
1540: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c   if( SQLITE_NULL
1550: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
1560: 74 79 70 65 28 61 72 67 76 5b 31 5d 29 20 29 20  type(argv[1]) ) 
1570: 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20 3d 20  return;.    n = 
1580: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
1590: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  t(argv[1]);.    
15a0: 69 66 28 20 6e 3e 33 30 20 29 20 6e 20 3d 20 33  if( n>30 ) n = 3
15b0: 30 3b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29  0;.    if( n<0 )
15c0: 20 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66   n = 0;.  }.  if
15d0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
15e0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53  type(argv[0])==S
15f0: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74  QLITE_NULL ) ret
1600: 75 72 6e 3b 0a 20 20 72 20 3d 20 73 71 6c 69 74  urn;.  r = sqlit
1610: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
1620: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c 69  argv[0]);.  sqli
1630: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1640: 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22  eof(zBuf),zBuf,"
1650: 25 2e 2a 66 22 2c 6e 2c 72 29 3b 0a 20 20 73 71  %.*f",n,r);.  sq
1660: 6c 69 74 65 33 41 74 6f 46 28 7a 42 75 66 2c 20  lite3AtoF(zBuf, 
1670: 26 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  &r);.  sqlite3_r
1680: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
1690: 74 65 78 74 2c 20 72 29 3b 0a 7d 0a 0a 2f 2a 0a  text, r);.}../*.
16a0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
16b0: 6e 20 6f 66 20 74 68 65 20 75 70 70 65 72 28 29  n of the upper()
16c0: 20 61 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c   and lower() SQL
16d0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   functions..*/.s
16e0: 74 61 74 69 63 20 76 6f 69 64 20 75 70 70 65 72  tatic void upper
16f0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
1700: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
1710: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
1720: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
1730: 20 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f    char *z1;.  co
1740: 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  nst char *z2;.  
1750: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
1760: 61 72 67 63 3c 31 20 7c 7c 20 53 51 4c 49 54 45  argc<1 || SQLITE
1770: 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76  _NULL==sqlite3_v
1780: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
1790: 5d 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  ]) ) return;.  z
17a0: 32 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  2 = (char*)sqlit
17b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
17c0: 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71  gv[0]);.  n = sq
17d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
17e0: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a  s(argv[0]);.  /*
17f0: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1800: 20 63 61 6c 6c 20 74 6f 20 5f 62 79 74 65 73 28   call to _bytes(
1810: 29 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61 6c  ) does not inval
1820: 69 64 61 74 65 20 74 68 65 20 5f 74 65 78 74 28  idate the _text(
1830: 29 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 61  ) pointer */.  a
1840: 73 73 65 72 74 28 20 7a 32 3d 3d 28 63 68 61 72  ssert( z2==(char
1850: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1860: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b  text(argv[0]) );
1870: 0a 20 20 69 66 28 20 7a 32 20 29 7b 0a 20 20 20  .  if( z2 ){.   
1880: 20 7a 31 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61   z1 = sqlite3_ma
1890: 6c 6c 6f 63 28 6e 2b 31 29 3b 0a 20 20 20 20 69  lloc(n+1);.    i
18a0: 66 28 20 7a 31 20 29 7b 0a 20 20 20 20 20 20 6d  f( z1 ){.      m
18b0: 65 6d 63 70 79 28 7a 31 2c 20 7a 32 2c 20 6e 2b  emcpy(z1, z2, n+
18c0: 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  1);.      for(i=
18d0: 30 3b 20 7a 31 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  0; z1[i]; i++){.
18e0: 20 20 20 20 20 20 20 20 7a 31 5b 69 5d 20 3d 20          z1[i] = 
18f0: 74 6f 75 70 70 65 72 28 7a 31 5b 69 5d 29 3b 0a  toupper(z1[i]);.
1900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1910: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
1920: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 31 2c 20 2d  t(context, z1, -
1930: 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
1940: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
1950: 61 74 69 63 20 76 6f 69 64 20 6c 6f 77 65 72 46  atic void lowerF
1960: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
1970: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
1980: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
1990: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
19a0: 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 63 6f 6e   char *z1;.  con
19b0: 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69  st char *z2;.  i
19c0: 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 61  nt i, n;.  if( a
19d0: 72 67 63 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f  rgc<1 || SQLITE_
19e0: 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61  NULL==sqlite3_va
19f0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
1a00: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 32  ) ) return;.  z2
1a10: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
1a20: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
1a30: 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  v[0]);.  n = sql
1a40: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
1a50: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 2f 2a 20  (argv[0]);.  /* 
1a60: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1a70: 63 61 6c 6c 20 74 6f 20 5f 62 79 74 65 73 28 29  call to _bytes()
1a80: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61 6c 69   does not invali
1a90: 64 61 74 65 20 74 68 65 20 5f 74 65 78 74 28 29  date the _text()
1aa0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 61 73   pointer */.  as
1ab0: 73 65 72 74 28 20 7a 32 3d 3d 28 63 68 61 72 2a  sert( z2==(char*
1ac0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1ad0: 65 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 0a  ext(argv[0]) );.
1ae0: 20 20 69 66 28 20 7a 32 20 29 7b 0a 20 20 20 20    if( z2 ){.    
1af0: 7a 31 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  z1 = sqlite3_mal
1b00: 6c 6f 63 28 6e 2b 31 29 3b 0a 20 20 20 20 69 66  loc(n+1);.    if
1b10: 28 20 7a 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  ( z1 ){.      me
1b20: 6d 63 70 79 28 7a 31 2c 20 7a 32 2c 20 6e 2b 31  mcpy(z1, z2, n+1
1b30: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1b40: 3b 20 7a 31 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  ; z1[i]; i++){. 
1b50: 20 20 20 20 20 20 20 7a 31 5b 69 5d 20 3d 20 74         z1[i] = t
1b60: 6f 6c 6f 77 65 72 28 7a 31 5b 69 5d 29 3b 0a 20  olower(z1[i]);. 
1b70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1b80: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
1b90: 28 63 6f 6e 74 65 78 74 2c 20 7a 31 2c 20 2d 31  (context, z1, -1
1ba0: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
1bb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1bc0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1bd0: 6f 6e 20 6f 66 20 74 68 65 20 49 46 4e 55 4c 4c  on of the IFNULL
1be0: 28 29 2c 20 4e 56 4c 28 29 2c 20 61 6e 64 20 43  (), NVL(), and C
1bf0: 4f 41 4c 45 53 43 45 28 29 20 66 75 6e 63 74 69  OALESCE() functi
1c00: 6f 6e 73 2e 20 20 0a 2a 2a 20 41 6c 6c 20 74 68  ons.  .** All th
1c10: 72 65 65 20 64 6f 20 74 68 65 20 73 61 6d 65 20  ree do the same 
1c20: 74 68 69 6e 67 2e 20 20 54 68 65 79 20 72 65 74  thing.  They ret
1c30: 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 6e 6f  urn the first no
1c40: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 61 72 67 75 6d 65  n-NULL.** argume
1c50: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
1c60: 69 64 20 69 66 6e 75 6c 6c 46 75 6e 63 28 0a 20  id ifnullFunc(. 
1c70: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1c80: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
1c90: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
1ca0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
1cb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1cc0: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
1cd0: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
1ce0: 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f  E_NULL!=sqlite3_
1cf0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
1d00: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  i]) ){.      sql
1d10: 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
1d20: 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  e(context, argv[
1d30: 69 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  i]);.      break
1d40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1d50: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1d60: 69 6f 6e 20 6f 66 20 72 61 6e 64 6f 6d 28 29 2e  ion of random().
1d70: 20 20 52 65 74 75 72 6e 20 61 20 72 61 6e 64 6f    Return a rando
1d80: 6d 20 69 6e 74 65 67 65 72 2e 20 20 0a 2a 2f 0a  m integer.  .*/.
1d90: 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64  static void rand
1da0: 6f 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  omFunc(.  sqlite
1db0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
1dc0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
1dd0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1de0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1df0: 74 65 5f 69 6e 74 36 34 20 72 3b 0a 20 20 73 71  te_int64 r;.  sq
1e00: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
1e10: 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a  sizeof(r), &r);.
1e20: 20 20 69 66 28 20 28 72 3c 3c 31 29 3d 3d 30 20    if( (r<<1)==0 
1e30: 29 20 72 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  ) r = 0;  /* Pre
1e40: 76 65 6e 74 20 30 78 38 30 30 30 2e 2e 2e 2e 20  vent 0x8000.... 
1e50: 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 6f  as the result so
1e60: 20 74 68 61 74 20 77 65 20 2a 2f 0a 20 20 20 20   that we */.    
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 20 20 20 20 2f 2a 20 63 61 6e 20 61 6c 77        /* can alw
1e90: 61 79 73 20 64 6f 20 61 62 73 28 29 20 6f 66 20  ays do abs() of 
1ea0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
1eb0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
1ec0: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 72 29  nt64(context, r)
1ed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
1ee0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 61 6e  mentation of ran
1ef0: 64 6f 6d 62 6c 6f 62 28 4e 29 2e 20 20 52 65 74  domblob(N).  Ret
1f00: 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 62 6c 6f  urn a random blo
1f10: 62 0a 2a 2a 20 74 68 61 74 20 69 73 20 4e 20 62  b.** that is N b
1f20: 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74  ytes long..*/.st
1f30: 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d  atic void random
1f40: 42 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 5f  Blob(.  sqlite3_
1f50: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1f60: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1f70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1f80: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  argv.){.  int n;
1f90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fa0: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61   *p;.  assert( a
1fb0: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20  rgc==1 );.  n = 
1fc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
1fd0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
1fe0: 28 20 6e 3c 31 20 29 7b 0a 20 20 20 20 6e 20 3d  ( n<1 ){.    n =
1ff0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e   1;.  }.  if( n>
2000: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
2010: 48 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  H ){.    sqlite3
2020: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f  _result_error_to
2030: 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20  obig(context);. 
2040: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2050: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
2060: 6c 6f 63 28 6e 29 3b 0a 20 20 69 66 28 20 70 20  loc(n);.  if( p 
2070: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61  ){.    sqlite3Ra
2080: 6e 64 6f 6d 6e 65 73 73 28 6e 2c 20 70 29 3b 0a  ndomness(n, p);.
2090: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
20a0: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
20b0: 20 28 63 68 61 72 2a 29 70 2c 20 6e 2c 20 73 71   (char*)p, n, sq
20c0: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
20d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
20e0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
20f0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
2100: 64 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  d() SQL function
2110: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a  .  The return.**
2120: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
2130: 6d 65 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  me as the sqlite
2140: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
2150: 77 69 64 28 29 20 41 50 49 20 66 75 6e 63 74 69  wid() API functi
2160: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
2170: 69 64 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  id last_insert_r
2180: 6f 77 69 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  owid(.  sqlite3_
2190: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
21a0: 2c 20 0a 20 20 69 6e 74 20 61 72 67 2c 20 0a 20  , .  int arg, . 
21b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
21c0: 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
21d0: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
21e0: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
21f0: 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  xt);.  sqlite3_r
2200: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
2210: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73  ext, sqlite3_las
2220: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64  t_insert_rowid(d
2230: 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  b));.}../*.** Im
2240: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2250: 74 68 65 20 63 68 61 6e 67 65 73 28 29 20 53 51  the changes() SQ
2260: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  L function.  The
2270: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
2280: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
2290: 74 68 65 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  the sqlite3_chan
22a0: 67 65 73 28 29 20 41 50 49 20 66 75 6e 63 74 69  ges() API functi
22b0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
22c0: 69 64 20 63 68 61 6e 67 65 73 28 0a 20 20 73 71  id changes(.  sq
22d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
22e0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
22f0: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
2300: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ue **argv.){.  s
2310: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
2320: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
2330: 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74  ontext);.  sqlit
2340: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
2350: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 63  ntext, sqlite3_c
2360: 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a  hanges(db));.}..
2370: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
2380: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 6f 74 61  tion of the tota
2390: 6c 5f 63 68 61 6e 67 65 73 28 29 20 53 51 4c 20  l_changes() SQL 
23a0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 72  function.  The r
23b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 0a 2a  eturn value is.*
23c0: 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  * the same as th
23d0: 65 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  e sqlite3_total_
23e0: 63 68 61 6e 67 65 73 28 29 20 41 50 49 20 66 75  changes() API fu
23f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2400: 63 20 76 6f 69 64 20 74 6f 74 61 6c 5f 63 68 61  c void total_cha
2410: 6e 67 65 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  nges(.  sqlite3_
2420: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
2430: 2c 0a 20 20 69 6e 74 20 61 72 67 2c 0a 20 20 73  ,.  int arg,.  s
2440: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2450: 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
2460: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 75   *db = sqlite3_u
2470: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
2480: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
2490: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
24a0: 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
24b0: 68 61 6e 67 65 73 28 64 62 29 29 3b 0a 7d 0a 0a  hanges(db));.}..
24c0: 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72  /*.** A structur
24d0: 65 20 64 65 66 69 6e 69 6e 67 20 68 6f 77 20 74  e defining how t
24e0: 6f 20 64 6f 20 47 4c 4f 42 2d 73 74 79 6c 65 20  o do GLOB-style 
24f0: 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2f 0a  comparisons..*/.
2500: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
2510: 66 6f 20 7b 0a 20 20 75 38 20 6d 61 74 63 68 41  fo {.  u8 matchA
2520: 6c 6c 3b 0a 20 20 75 38 20 6d 61 74 63 68 4f 6e  ll;.  u8 matchOn
2530: 65 3b 0a 20 20 75 38 20 6d 61 74 63 68 53 65 74  e;.  u8 matchSet
2540: 3b 0a 20 20 75 38 20 6e 6f 43 61 73 65 3b 0a 7d  ;.  u8 noCase;.}
2550: 3b 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ;..static const 
2560: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
2570: 66 6f 20 67 6c 6f 62 49 6e 66 6f 20 3d 20 7b 20  fo globInfo = { 
2580: 27 2a 27 2c 20 27 3f 27 2c 20 27 5b 27 2c 20 30  '*', '?', '[', 0
2590: 20 7d 3b 0a 2f 2a 20 54 68 65 20 63 6f 72 72 65   };./* The corre
25a0: 63 74 20 53 51 4c 2d 39 32 20 62 65 68 61 76 69  ct SQL-92 behavi
25b0: 6f 72 20 69 73 20 66 6f 72 20 74 68 65 20 4c 49  or is for the LI
25c0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 69  KE operator to i
25d0: 67 6e 6f 72 65 0a 2a 2a 20 63 61 73 65 2e 20 20  gnore.** case.  
25e0: 54 68 75 73 20 20 27 61 27 20 4c 49 4b 45 20 27  Thus  'a' LIKE '
25f0: 41 27 20 77 6f 75 6c 64 20 62 65 20 74 72 75 65  A' would be true
2600: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  . */.static cons
2610: 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65  t struct compare
2620: 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 4e 6f 72  Info likeInfoNor
2630: 6d 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c 20  m = { '%', '_', 
2640: 20 20 30 2c 20 31 20 7d 3b 0a 2f 2a 20 49 66 20    0, 1 };./* If 
2650: 53 51 4c 49 54 45 5f 43 41 53 45 5f 53 45 4e 53  SQLITE_CASE_SENS
2660: 49 54 49 56 45 5f 4c 49 4b 45 20 69 73 20 64 65  ITIVE_LIKE is de
2670: 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 20  fined, then the 
2680: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  LIKE operator.**
2690: 20 69 73 20 63 61 73 65 20 73 65 6e 73 69 74 69   is case sensiti
26a0: 76 65 20 63 61 75 73 69 6e 67 20 27 61 27 20 4c  ve causing 'a' L
26b0: 49 4b 45 20 27 41 27 20 74 6f 20 62 65 20 66 61  IKE 'A' to be fa
26c0: 6c 73 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  lse */.static co
26d0: 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61  nst struct compa
26e0: 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f 41  reInfo likeInfoA
26f0: 6c 74 20 3d 20 7b 20 27 25 27 2c 20 27 5f 27 2c  lt = { '%', '_',
2700: 20 20 20 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a     0, 0 };../*.*
2710: 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 55 54  * Compare two UT
2720: 46 2d 38 20 73 74 72 69 6e 67 73 20 66 6f 72 20  F-8 strings for 
2730: 65 71 75 61 6c 69 74 79 20 77 68 65 72 65 20 74  equality where t
2740: 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20  he first string 
2750: 63 61 6e 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c  can.** potential
2760: 6c 79 20 62 65 20 61 20 22 67 6c 6f 62 22 20 65  ly be a "glob" e
2770: 78 70 72 65 73 73 69 6f 6e 2e 20 20 52 65 74 75  xpression.  Retu
2780: 72 6e 20 74 72 75 65 20 28 31 29 20 69 66 20 74  rn true (1) if t
2790: 68 65 79 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  hey.** are the s
27a0: 61 6d 65 20 61 6e 64 20 66 61 6c 73 65 20 28 30  ame and false (0
27b0: 29 20 69 66 20 74 68 65 79 20 61 72 65 20 64 69  ) if they are di
27c0: 66 66 65 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47  fferent..**.** G
27d0: 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  lobbing rules:.*
27e0: 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20  *.**      '*'   
27f0: 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
2800: 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f  sequence of zero
2810: 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74   or more charact
2820: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ers..**.**      
2830: 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '?'       Matche
2840: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68  s exactly one ch
2850: 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  aracter..**.**  
2860: 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61     [...]      Ma
2870: 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
2880: 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63  ter from the enc
2890: 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a  losed list of.**
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a  characters..**.*
28c0: 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20  *     [^...]    
28d0: 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61   Matches one cha
28e0: 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68  racter not in th
28f0: 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e  e enclosed list.
2900: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65 20  .**.** With the 
2910: 5b 2e 2e 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d  [...] and [^...]
2920: 20 6d 61 74 63 68 69 6e 67 2c 20 61 20 27 5d 27   matching, a ']'
2930: 20 63 68 61 72 61 63 74 65 72 20 63 61 6e 20 62   character can b
2940: 65 20 69 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e  e included.** in
2950: 20 74 68 65 20 6c 69 73 74 20 62 79 20 6d 61 6b   the list by mak
2960: 69 6e 67 20 69 74 20 74 68 65 20 66 69 72 73 74  ing it the first
2970: 20 63 68 61 72 61 63 74 65 72 20 61 66 74 65 72   character after
2980: 20 27 5b 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a   '[' or '^'.  A.
2990: 2a 2a 20 72 61 6e 67 65 20 6f 66 20 63 68 61 72  ** range of char
29a0: 61 63 74 65 72 73 20 63 61 6e 20 62 65 20 73 70  acters can be sp
29b0: 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 27 2d  ecified using '-
29c0: 27 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20  '.  Example:.** 
29d0: 22 5b 61 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20  "[a-z]" matches 
29e0: 61 6e 79 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72  any single lower
29f0: 2d 63 61 73 65 20 6c 65 74 74 65 72 2e 20 20 54  -case letter.  T
2a00: 6f 20 6d 61 74 63 68 20 61 20 27 2d 27 2c 20 6d  o match a '-', m
2a10: 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61  ake.** it the la
2a20: 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  st character in 
2a30: 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  the list..**.** 
2a40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2a50: 75 73 75 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62  usually quick, b
2a60: 75 74 20 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69  ut can be N**2 i
2a70: 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65  n the worst case
2a80: 2e 0a 2a 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20 74  ..**.** Hints: t
2a90: 6f 20 6d 61 74 63 68 20 27 2a 27 20 6f 72 20 27  o match '*' or '
2aa0: 3f 27 2c 20 70 75 74 20 74 68 65 6d 20 69 6e 20  ?', put them in 
2ab0: 22 5b 5d 22 2e 20 20 4c 69 6b 65 20 74 68 69 73  "[]".  Like this
2ac0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
2ad0: 61 62 63 5b 2a 5d 78 79 7a 20 20 20 20 20 20 20  abc[*]xyz       
2ae0: 20 4d 61 74 63 68 65 73 20 22 61 62 63 2a 78 79   Matches "abc*xy
2af0: 7a 22 20 6f 6e 6c 79 0a 2a 2f 0a 73 74 61 74 69  z" only.*/.stati
2b00: 63 20 69 6e 74 20 70 61 74 74 65 72 6e 43 6f 6d  c int patternCom
2b10: 70 61 72 65 28 0a 20 20 63 6f 6e 73 74 20 75 38  pare(.  const u8
2b20: 20 2a 7a 50 61 74 74 65 72 6e 2c 20 20 20 20 20   *zPattern,     
2b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2b40: 67 6c 6f 62 20 70 61 74 74 65 72 6e 20 2a 2f 0a  glob pattern */.
2b50: 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 53 74 72    const u8 *zStr
2b60: 69 6e 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  ing,            
2b70: 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67     /* The string
2b80: 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
2b90: 6e 73 74 20 74 68 65 20 67 6c 6f 62 20 2a 2f 0a  nst the glob */.
2ba0: 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63    const struct c
2bb0: 6f 6d 70 61 72 65 49 6e 66 6f 20 2a 70 49 6e 66  ompareInfo *pInf
2bc0: 6f 2c 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  o, /* Informatio
2bd0: 6e 20 61 62 6f 75 74 20 68 6f 77 20 74 6f 20 64  n about how to d
2be0: 6f 20 74 68 65 20 63 6f 6d 70 61 72 65 20 2a 2f  o the compare */
2bf0: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 65 73 63  .  const int esc
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 2f 2a 20 54 68 65 20 65 73 63 61 70      /* The escap
2c20: 65 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 29  e character */.)
2c30: 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20  {.  int c, c2;. 
2c40: 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69   int invert;.  i
2c50: 6e 74 20 73 65 65 6e 3b 0a 20 20 75 38 20 6d 61  nt seen;.  u8 ma
2c60: 74 63 68 4f 6e 65 20 3d 20 70 49 6e 66 6f 2d 3e  tchOne = pInfo->
2c70: 6d 61 74 63 68 4f 6e 65 3b 0a 20 20 75 38 20 6d  matchOne;.  u8 m
2c80: 61 74 63 68 41 6c 6c 20 3d 20 70 49 6e 66 6f 2d  atchAll = pInfo-
2c90: 3e 6d 61 74 63 68 41 6c 6c 3b 0a 20 20 75 38 20  >matchAll;.  u8 
2ca0: 6d 61 74 63 68 53 65 74 20 3d 20 70 49 6e 66 6f  matchSet = pInfo
2cb0: 2d 3e 6d 61 74 63 68 53 65 74 3b 0a 20 20 75 38  ->matchSet;.  u8
2cc0: 20 6e 6f 43 61 73 65 20 3d 20 70 49 6e 66 6f 2d   noCase = pInfo-
2cd0: 3e 6e 6f 43 61 73 65 3b 20 0a 20 20 69 6e 74 20  >noCase; .  int 
2ce0: 70 72 65 76 45 73 63 61 70 65 20 3d 20 30 3b 20  prevEscape = 0; 
2cf0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2d00: 68 65 20 70 72 65 76 69 6f 75 73 20 63 68 61 72  he previous char
2d10: 61 63 74 65 72 20 77 61 73 20 27 65 73 63 61 70  acter was 'escap
2d20: 65 27 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20  e' */..  while( 
2d30: 28 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  (c = sqlite3Utf8
2d40: 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 30 2c  Read(zPattern,0,
2d50: 26 7a 50 61 74 74 65 72 6e 29 29 21 3d 30 20 29  &zPattern))!=0 )
2d60: 7b 0a 20 20 20 20 69 66 28 20 21 70 72 65 76 45  {.    if( !prevE
2d70: 73 63 61 70 65 20 26 26 20 63 3d 3d 6d 61 74 63  scape && c==matc
2d80: 68 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 77 68  hAll ){.      wh
2d90: 69 6c 65 28 20 28 63 3d 73 71 6c 69 74 65 33 55  ile( (c=sqlite3U
2da0: 74 66 38 52 65 61 64 28 7a 50 61 74 74 65 72 6e  tf8Read(zPattern
2db0: 2c 30 2c 26 7a 50 61 74 74 65 72 6e 29 29 20 3d  ,0,&zPattern)) =
2dc0: 3d 20 6d 61 74 63 68 41 6c 6c 0a 20 20 20 20 20  = matchAll.     
2dd0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 63 20 3d            || c =
2de0: 3d 20 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20  = matchOne ){.  
2df0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 6d 61 74        if( c==mat
2e00: 63 68 4f 6e 65 20 26 26 20 73 71 6c 69 74 65 33  chOne && sqlite3
2e10: 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67  Utf8Read(zString
2e20: 2c 20 30 2c 20 26 7a 53 74 72 69 6e 67 29 3d 3d  , 0, &zString)==
2e30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
2e40: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
2e50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2e60: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
2e70: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2e80: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
2e90: 3d 3d 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20  ==esc ){.       
2ea0: 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38   c = sqlite3Utf8
2eb0: 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 30  Read(zPattern, 0
2ec0: 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  , &zPattern);.  
2ed0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
2ee0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2ef0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
2f00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2f10: 63 3d 3d 6d 61 74 63 68 53 65 74 20 29 7b 0a 20  c==matchSet ){. 
2f20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
2f30: 73 63 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  sc==0 );        
2f40: 20 2f 2a 20 54 68 69 73 20 69 73 20 47 4c 4f 42   /* This is GLOB
2f50: 2c 20 6e 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20 20  , not LIKE */.  
2f60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61        assert( ma
2f70: 74 63 68 53 65 74 3c 30 78 38 30 20 29 3b 20 20  tchSet<0x80 );  
2f80: 2f 2a 20 27 5b 27 20 69 73 20 61 20 73 69 6e 67  /* '[' is a sing
2f90: 6c 65 2d 62 79 74 65 20 63 68 61 72 61 63 74 65  le-byte characte
2fa0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69  r */.        whi
2fb0: 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20 26 26 20  le( *zString && 
2fc0: 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 26  patternCompare(&
2fd0: 7a 50 61 74 74 65 72 6e 5b 2d 31 5d 2c 7a 53 74  zPattern[-1],zSt
2fe0: 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73 63 29 3d  ring,pInfo,esc)=
2ff0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3000: 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38  SQLITE_SKIP_UTF8
3010: 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20  (zString);.     
3020: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
3030: 75 72 6e 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b  urn *zString!=0;
3040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
3050: 68 69 6c 65 28 20 28 63 32 20 3d 20 73 71 6c 69  hile( (c2 = sqli
3060: 74 65 33 55 74 66 38 52 65 61 64 28 7a 53 74 72  te3Utf8Read(zStr
3070: 69 6e 67 2c 30 2c 26 7a 53 74 72 69 6e 67 29 29  ing,0,&zString))
3080: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
3090: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
30a0: 20 20 20 20 20 20 20 63 32 20 3d 20 63 32 3c 30         c2 = c2<0
30b0: 78 38 30 20 3f 20 73 71 6c 69 74 65 33 55 70 70  x80 ? sqlite3Upp
30c0: 65 72 54 6f 4c 6f 77 65 72 5b 63 32 5d 20 3a 20  erToLower[c2] : 
30d0: 63 32 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  c2;.          c 
30e0: 3d 20 63 3c 30 78 38 30 20 3f 20 73 71 6c 69 74  = c<0x80 ? sqlit
30f0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63  e3UpperToLower[c
3100: 5d 20 3a 20 63 3b 0a 20 20 20 20 20 20 20 20 20  ] : c;.         
3110: 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20 30 20   while( c2 != 0 
3120: 26 26 20 63 32 20 21 3d 20 63 20 29 7b 0a 20 20  && c2 != c ){.  
3130: 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73            c2 = s
3140: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a  qlite3Utf8Read(z
3150: 53 74 72 69 6e 67 2c 20 30 2c 20 26 7a 53 74 72  String, 0, &zStr
3160: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ing);.          
3170: 20 20 69 66 28 20 63 32 3c 30 78 38 30 20 29 20    if( c2<0x80 ) 
3180: 63 32 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65  c2 = sqlite3Uppe
3190: 72 54 6f 4c 6f 77 65 72 5b 63 32 5d 3b 0a 20 20  rToLower[c2];.  
31a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31c0: 20 20 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20     while( c2 != 
31d0: 30 20 26 26 20 63 32 20 21 3d 20 63 20 29 7b 0a  0 && c2 != c ){.
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 63 32 20 3d              c2 =
31f0: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
3200: 28 7a 53 74 72 69 6e 67 2c 20 30 2c 20 26 7a 53  (zString, 0, &zS
3210: 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  tring);.        
3220: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
3230: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
3240: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
3250: 20 20 20 20 69 66 28 20 70 61 74 74 65 72 6e 43      if( patternC
3260: 6f 6d 70 61 72 65 28 7a 50 61 74 74 65 72 6e 2c  ompare(zPattern,
3270: 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73  zString,pInfo,es
3280: 63 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  c) ) return 1;. 
3290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
32a0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
32b0: 20 69 66 28 20 21 70 72 65 76 45 73 63 61 70 65   if( !prevEscape
32c0: 20 26 26 20 63 3d 3d 6d 61 74 63 68 4f 6e 65 20   && c==matchOne 
32d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
32e0: 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 53 74  ite3Utf8Read(zSt
32f0: 72 69 6e 67 2c 20 30 2c 20 26 7a 53 74 72 69 6e  ring, 0, &zStrin
3300: 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)==0 ){.       
3310: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
3320: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
3330: 20 63 3d 3d 6d 61 74 63 68 53 65 74 20 29 7b 0a   c==matchSet ){.
3340: 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 5f        int prior_
3350: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  c = 0;.      ass
3360: 65 72 74 28 20 65 73 63 3d 3d 30 20 29 3b 20 20  ert( esc==0 );  
3370: 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 6f    /* This only o
3380: 63 63 75 72 73 20 66 6f 72 20 47 4c 4f 42 2c 20  ccurs for GLOB, 
3390: 6e 6f 74 20 4c 49 4b 45 20 2a 2f 0a 20 20 20 20  not LIKE */.    
33a0: 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20    seen = 0;.    
33b0: 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20    invert = 0;.  
33c0: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
33d0: 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e 67 2c  tf8Read(zString,
33e0: 20 30 2c 20 26 7a 53 74 72 69 6e 67 29 3b 0a 20   0, &zString);. 
33f0: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
3400: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
3410: 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  c2 = sqlite3Utf8
3420: 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 30  Read(zPattern, 0
3430: 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  , &zPattern);.  
3440: 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20      if( c2=='^' 
3450: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 65 72  ){.        inver
3460: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63  t = 1;.        c
3470: 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52  2 = sqlite3Utf8R
3480: 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 30 2c  ead(zPattern, 0,
3490: 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20   &zPattern);.   
34a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
34b0: 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20  2==']' ){.      
34c0: 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73    if( c==']' ) s
34d0: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
34e0: 20 63 32 20 3d 20 73 71 6c 69 74 65 33 55 74 66   c2 = sqlite3Utf
34f0: 38 52 65 61 64 28 7a 50 61 74 74 65 72 6e 2c 20  8Read(zPattern, 
3500: 30 2c 20 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20  0, &zPattern);. 
3510: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
3520: 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d  le( c2 && c2!=']
3530: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
3540: 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 50 61 74   c2=='-' && zPat
3550: 74 65 72 6e 5b 30 5d 21 3d 27 5d 27 20 26 26 20  tern[0]!=']' && 
3560: 7a 50 61 74 74 65 72 6e 5b 30 5d 21 3d 30 20 26  zPattern[0]!=0 &
3570: 26 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20  & prior_c>0 ){. 
3580: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
3590: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 50  lite3Utf8Read(zP
35a0: 61 74 74 65 72 6e 2c 20 30 2c 20 26 7a 50 61 74  attern, 0, &zPat
35b0: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tern);.         
35c0: 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20   if( c>=prior_c 
35d0: 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20  && c<=c2 ) seen 
35e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
35f0: 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20  rior_c = 0;.    
3600: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3610: 20 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29       if( c==c2 )
3620: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
3630: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
3640: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72    }.          pr
3650: 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20  ior_c = c2;.    
3660: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32      }.        c2
3670: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
3680: 61 64 28 7a 50 61 74 74 65 72 6e 2c 20 30 2c 20  ad(zPattern, 0, 
3690: 26 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  &zPattern);.    
36a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32    }.      if( c2
36b0: 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69  ==0 || (seen ^ i
36c0: 6e 76 65 72 74 29 3d 3d 30 20 29 7b 0a 20 20 20  nvert)==0 ){.   
36d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
36e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
36f0: 20 69 66 28 20 65 73 63 3d 3d 63 20 26 26 20 21   if( esc==c && !
3700: 70 72 65 76 45 73 63 61 70 65 20 29 7b 0a 20 20  prevEscape ){.  
3710: 20 20 20 20 70 72 65 76 45 73 63 61 70 65 20 3d      prevEscape =
3720: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
3730: 20 20 20 20 20 63 32 20 3d 20 73 71 6c 69 74 65       c2 = sqlite
3740: 33 55 74 66 38 52 65 61 64 28 7a 53 74 72 69 6e  3Utf8Read(zStrin
3750: 67 2c 20 30 2c 20 26 7a 53 74 72 69 6e 67 29 3b  g, 0, &zString);
3760: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
3770: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  e ){.        c =
3780: 20 63 3c 30 78 38 30 20 3f 20 73 71 6c 69 74 65   c<0x80 ? sqlite
3790: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d  3UpperToLower[c]
37a0: 20 3a 20 63 3b 0a 20 20 20 20 20 20 20 20 63 32   : c;.        c2
37b0: 20 3d 20 63 32 3c 30 78 38 30 20 3f 20 73 71 6c   = c2<0x80 ? sql
37c0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
37d0: 5b 63 32 5d 20 3a 20 63 32 3b 0a 20 20 20 20 20  [c2] : c2;.     
37e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d   }.      if( c!=
37f0: 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  c2 ){.        re
3800: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3810: 20 20 20 20 20 20 70 72 65 76 45 73 63 61 70 65        prevEscape
3820: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
3830: 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e    return *zStrin
3840: 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  g==0;.}../*.** C
3850: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
3860: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 74 68  of times that th
3870: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
3880: 28 6f 72 20 47 4c 4f 42 20 77 68 69 63 68 20 69  (or GLOB which i
3890: 73 0a 2a 2a 20 6a 75 73 74 20 61 20 76 61 72 69  s.** just a vari
38a0: 61 74 69 6f 6e 20 6f 66 20 4c 49 4b 45 29 20 67  ation of LIKE) g
38b0: 65 74 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ets called.  Thi
38c0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
38d0: 73 74 69 6e 67 0a 2a 2a 20 6f 6e 6c 79 2e 0a 2a  sting.** only..*
38e0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
38f0: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
3900: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 3d 20 30 3b  _like_count = 0;
3910: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
3920: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
3930: 66 20 74 68 65 20 6c 69 6b 65 28 29 20 53 51 4c  f the like() SQL
3940: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
3950: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
3960: 65 6e 74 73 0a 2a 2a 20 74 68 65 20 62 75 69 6c  ents.** the buil
3970: 64 2d 69 6e 20 4c 49 4b 45 20 6f 70 65 72 61 74  d-in LIKE operat
3980: 6f 72 2e 20 20 54 68 65 20 66 69 72 73 74 20 61  or.  The first a
3990: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
39a0: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 0a 2a  unction is the.*
39b0: 2a 20 70 61 74 74 65 72 6e 20 61 6e 64 20 74 68  * pattern and th
39c0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
39d0: 74 20 69 73 20 74 68 65 20 73 74 72 69 6e 67 2e  t is the string.
39e0: 20 20 53 6f 2c 20 74 68 65 20 53 51 4c 20 73 74    So, the SQL st
39f0: 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  atements:.**.** 
3a00: 20 20 20 20 20 20 41 20 4c 49 4b 45 20 42 0a 2a        A LIKE B.*
3a10: 2a 0a 2a 2a 20 69 73 20 69 6d 70 6c 65 6d 65 6e  *.** is implemen
3a20: 74 65 64 20 61 73 20 6c 69 6b 65 28 42 2c 41 29  ted as like(B,A)
3a30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 61 6d  ..**.** This sam
3a40: 65 20 66 75 6e 63 74 69 6f 6e 20 28 77 69 74 68  e function (with
3a50: 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6d   a different com
3a60: 70 61 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  pareInfo structu
3a70: 72 65 29 20 63 6f 6d 70 75 74 65 73 0a 2a 2a 20  re) computes.** 
3a80: 74 68 65 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f  the GLOB operato
3a90: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
3aa0: 64 20 6c 69 6b 65 46 75 6e 63 28 0a 20 20 73 71  d likeFunc(.  sq
3ab0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3ac0: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
3ad0: 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  rgc, .  sqlite3_
3ae0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
3af0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
3b00: 20 63 68 61 72 20 2a 7a 41 2c 20 2a 7a 42 3b 0a   char *zA, *zB;.
3b10: 20 20 69 6e 74 20 65 73 63 61 70 65 20 3d 20 30    int escape = 0
3b20: 3b 0a 0a 20 20 7a 42 20 3d 20 73 71 6c 69 74 65  ;..  zB = sqlite
3b30: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
3b40: 76 5b 30 5d 29 3b 0a 20 20 7a 41 20 3d 20 73 71  v[0]);.  zA = sq
3b50: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
3b60: 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a  (argv[1]);..  /*
3b70: 20 4c 69 6d 69 74 20 74 68 65 20 6c 65 6e 67 74   Limit the lengt
3b80: 68 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72  h of the LIKE or
3b90: 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f   GLOB pattern to
3ba0: 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a   avoid problems.
3bb0: 20 20 2a 2a 20 6f 66 20 64 65 65 70 20 72 65 63    ** of deep rec
3bc0: 75 72 73 69 6f 6e 20 61 6e 64 20 4e 2a 4e 20 62  ursion and N*N b
3bd0: 65 68 61 76 69 6f 72 20 69 6e 20 70 61 74 74 65  ehavior in patte
3be0: 72 6e 43 6f 6d 70 61 72 65 28 29 2e 0a 20 20 2a  rnCompare()..  *
3bf0: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
3c00: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
3c10: 5b 30 5d 29 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  [0])>SQLITE_MAX_
3c20: 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
3c30: 47 54 48 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  GTH ){.    sqlit
3c40: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
3c50: 63 6f 6e 74 65 78 74 2c 20 22 4c 49 4b 45 20 6f  context, "LIKE o
3c60: 72 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 74  r GLOB pattern t
3c70: 6f 6f 20 63 6f 6d 70 6c 65 78 22 2c 20 2d 31 29  oo complex", -1)
3c80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
3c90: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 42 3d 3d  }.  assert( zB==
3ca0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
3cb0: 78 74 28 61 72 67 76 5b 30 5d 29 20 29 3b 20 20  xt(argv[0]) );  
3cc0: 2f 2a 20 45 6e 63 6f 64 69 6e 67 20 64 69 64 20  /* Encoding did 
3cd0: 6e 6f 74 20 63 68 61 6e 67 65 20 2a 2f 0a 0a 20  not change */.. 
3ce0: 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a   if( argc==3 ){.
3cf0: 20 20 20 20 2f 2a 20 54 68 65 20 65 73 63 61 70      /* The escap
3d00: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
3d10: 6e 67 20 6d 75 73 74 20 63 6f 6e 73 69 73 74 20  ng must consist 
3d20: 6f 66 20 61 20 73 69 6e 67 6c 65 20 55 54 46 2d  of a single UTF-
3d30: 38 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20 20  8 character..   
3d40: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72   ** Otherwise, r
3d50: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  eturn an error..
3d60: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74      */.    const
3d70: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3d80: 7a 45 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 76  zEsc = sqlite3_v
3d90: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32  alue_text(argv[2
3da0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 73 63  ]);.    if( zEsc
3db0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3dc0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 55 74 66    if( sqlite3Utf
3dd0: 38 43 68 61 72 4c 65 6e 28 28 63 68 61 72 2a 29  8CharLen((char*)
3de0: 7a 45 73 63 2c 20 2d 31 29 21 3d 31 20 29 7b 0a  zEsc, -1)!=1 ){.
3df0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3e00: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
3e10: 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  xt, .          "
3e20: 45 53 43 41 50 45 20 65 78 70 72 65 73 73 69 6f  ESCAPE expressio
3e30: 6e 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67  n must be a sing
3e40: 6c 65 20 63 68 61 72 61 63 74 65 72 22 2c 20 2d  le character", -
3e50: 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
3e60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 73 63 61  ;.    }.    esca
3e70: 70 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  pe = sqlite3Utf8
3e80: 52 65 61 64 28 7a 45 73 63 2c 20 30 2c 20 26 7a  Read(zEsc, 0, &z
3e90: 45 73 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Esc);.  }.  if( 
3ea0: 7a 41 20 26 26 20 7a 42 20 29 7b 0a 20 20 20 20  zA && zB ){.    
3eb0: 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e  struct compareIn
3ec0: 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 73 71 6c 69  fo *pInfo = sqli
3ed0: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
3ee0: 6e 74 65 78 74 29 3b 0a 23 69 66 64 65 66 20 53  ntext);.#ifdef S
3ef0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
3f00: 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e  qlite3_like_coun
3f10: 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t++;.#endif.    
3f20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
3f30: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
3f40: 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28   patternCompare(
3f50: 7a 42 2c 20 7a 41 2c 20 70 49 6e 66 6f 2c 20 65  zB, zA, pInfo, e
3f60: 73 63 61 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  scape));.  }.}..
3f70: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
3f80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c  tion of the NULL
3f90: 49 46 28 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e  IF(x,y) function
3fa0: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
3fb0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
3fc0: 67 75 6d 65 6e 74 20 69 66 20 74 68 65 20 61 72  gument if the ar
3fd0: 67 75 6d 65 6e 74 73 20 61 72 65 20 64 69 66 66  guments are diff
3fe0: 65 72 65 6e 74 2e 20 20 54 68 65 20 72 65 73 75  erent.  The resu
3ff0: 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  lt is NULL if th
4000: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 61  e.** arguments a
4010: 72 65 20 65 71 75 61 6c 20 74 6f 20 65 61 63 68  re equal to each
4020: 20 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   other..*/.stati
4030: 63 20 76 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e  c void nullifFun
4040: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
4050: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
4060: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
4070: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
4080: 76 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  v.){.  CollSeq *
4090: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
40a0: 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f  etFuncCollSeq(co
40b0: 6e 74 65 78 74 29 3b 0a 20 20 69 66 28 20 73 71  ntext);.  if( sq
40c0: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
40d0: 61 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d  argv[0], argv[1]
40e0: 2c 20 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20  , pColl)!=0 ){. 
40f0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4100: 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  t_value(context,
4110: 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d   argv[0]);.  }.}
4120: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
4130: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 56 45  tation of the VE
4140: 52 53 49 4f 4e 28 2a 29 20 66 75 6e 63 74 69 6f  RSION(*) functio
4150: 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69  n.  The result i
4160: 73 20 74 68 65 20 76 65 72 73 69 6f 6e 0a 2a 2a  s the version.**
4170: 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c   of the SQLite l
4180: 69 62 72 61 72 79 20 74 68 61 74 20 69 73 20 72  ibrary that is r
4190: 75 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  unning..*/.stati
41a0: 63 20 76 6f 69 64 20 76 65 72 73 69 6f 6e 46 75  c void versionFu
41b0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
41c0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
41d0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
41e0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
41f0: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  gv.){.  sqlite3_
4200: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
4210: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 65 72  ext, sqlite3_ver
4220: 73 69 6f 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45  sion, -1, SQLITE
4230: 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 20  _STATIC);.}../* 
4240: 41 72 72 61 79 20 66 6f 72 20 63 6f 6e 76 65 72  Array for conver
4250: 74 69 6e 67 20 66 72 6f 6d 20 68 61 6c 66 2d 62  ting from half-b
4260: 79 74 65 73 20 28 6e 79 62 62 6c 65 73 29 20 69  ytes (nybbles) i
4270: 6e 74 6f 20 41 53 43 49 49 20 68 65 78 0a 2a 2a  nto ASCII hex.**
4280: 20 64 69 67 69 74 73 2e 20 2a 2f 0a 73 74 61 74   digits. */.stat
4290: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 68 65  ic const char he
42a0: 78 64 69 67 69 74 73 5b 5d 20 3d 20 7b 0a 20 20  xdigits[] = {.  
42b0: 27 30 27 2c 20 27 31 27 2c 20 27 32 27 2c 20 27  '0', '1', '2', '
42c0: 33 27 2c 20 27 34 27 2c 20 27 35 27 2c 20 27 36  3', '4', '5', '6
42d0: 27 2c 20 27 37 27 2c 0a 20 20 27 38 27 2c 20 27  ', '7',.  '8', '
42e0: 39 27 2c 20 27 41 27 2c 20 27 42 27 2c 20 27 43  9', 'A', 'B', 'C
42f0: 27 2c 20 27 44 27 2c 20 27 45 27 2c 20 27 46 27  ', 'D', 'E', 'F'
4300: 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 58 50 45   .};../*.** EXPE
4310: 52 49 4d 45 4e 54 41 4c 20 2d 20 54 68 69 73 20  RIMENTAL - This 
4320: 69 73 20 6e 6f 74 20 61 6e 20 6f 66 66 69 63 69  is not an offici
4330: 61 6c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  al function.  Th
4340: 65 20 69 6e 74 65 72 66 61 63 65 20 6d 61 79 0a  e interface may.
4350: 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54 68 69 73  ** change.  This
4360: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 69   function may di
4370: 73 61 70 70 65 61 72 2e 20 20 44 6f 20 6e 6f 74  sappear.  Do not
4380: 20 77 72 69 74 65 20 63 6f 64 65 20 74 68 61 74   write code that
4390: 20 64 65 70 65 6e 64 73 0a 2a 2a 20 6f 6e 20 74   depends.** on t
43a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
43b0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
43c0: 6f 6e 20 6f 66 20 74 68 65 20 51 55 4f 54 45 28  on of the QUOTE(
43d0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  ) function.  Thi
43e0: 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  s function takes
43f0: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 61 72 67   a single.** arg
4400: 75 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61  ument.  If the a
4410: 72 67 75 6d 65 6e 74 20 69 73 20 6e 75 6d 65 72  rgument is numer
4420: 69 63 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  ic, the return v
4430: 61 6c 75 65 20 69 73 20 74 68 65 20 73 61 6d 65  alue is the same
4440: 20 61 73 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d   as.** the argum
4450: 65 6e 74 2e 20 20 49 66 20 74 68 65 20 61 72 67  ent.  If the arg
4460: 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
4470: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
4480: 69 73 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  is the string.**
4490: 20 22 4e 55 4c 4c 22 2e 20 20 4f 74 68 65 72 77   "NULL".  Otherw
44a0: 69 73 65 2c 20 74 68 65 20 61 72 67 75 6d 65 6e  ise, the argumen
44b0: 74 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e  t is enclosed in
44c0: 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 77   single quotes w
44d0: 69 74 68 0a 2a 2a 20 73 69 6e 67 6c 65 2d 71 75  ith.** single-qu
44e0: 6f 74 65 20 65 73 63 61 70 65 73 2e 0a 2a 2f 0a  ote escapes..*/.
44f0: 73 74 61 74 69 63 20 76 6f 69 64 20 71 75 6f 74  static void quot
4500: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
4510: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
4520: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
4530: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
4540: 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20  .  if( argc<1 ) 
4550: 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68  return;.  switch
4560: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
4570: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 7b  type(argv[0]) ){
4580: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4590: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
45a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
45b0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c  xt(context, "NUL
45c0: 4c 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 53 54  L", 4, SQLITE_ST
45d0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
45e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
45f0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
4600: 52 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  R:.    case SQLI
4610: 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
4620: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4630: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
4640: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
4650: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4660: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f   case SQLITE_BLO
4670: 42 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  B: {.      char 
4680: 2a 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  *zText = 0;.    
4690: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 42    char const *zB
46a0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
46b0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
46c0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c  );.      int nBl
46d0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
46e0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
46f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
4700: 20 7a 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33 5f   zBlob==sqlite3_
4710: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
4720: 30 5d 29 20 29 3b 20 2f 2a 20 4e 6f 20 65 6e 63  0]) ); /* No enc
4730: 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a 2f 0a  oding change */.
4740: 0a 20 20 20 20 20 20 69 66 28 20 32 2a 6e 42 6c  .      if( 2*nBl
4750: 6f 62 2b 34 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  ob+4>SQLITE_MAX_
4760: 4c 45 4e 47 54 48 20 29 7b 0a 20 20 20 20 20 20  LENGTH ){.      
4770: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4780: 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f  _error_toobig(co
4790: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
47a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
47b0: 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 28 63        zText = (c
47c0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
47d0: 6c 6c 6f 63 28 28 32 2a 6e 42 6c 6f 62 29 2b 34  lloc((2*nBlob)+4
47e0: 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 21 7a  ); .      if( !z
47f0: 54 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Text ){.        
4800: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
4810: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 6f  rror(context, "o
4820: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20 2d  ut of memory", -
4830: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
4840: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
4850: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
4860: 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a   i<nBlob; i++){.
4870: 20 20 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b            zText[
4880: 28 69 2a 32 29 2b 32 5d 20 3d 20 68 65 78 64 69  (i*2)+2] = hexdi
4890: 67 69 74 73 5b 28 7a 42 6c 6f 62 5b 69 5d 3e 3e  gits[(zBlob[i]>>
48a0: 34 29 26 30 78 30 46 5d 3b 0a 20 20 20 20 20 20  4)&0x0F];.      
48b0: 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29 2b      zText[(i*2)+
48c0: 33 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28  3] = hexdigits[(
48d0: 7a 42 6c 6f 62 5b 69 5d 29 26 30 78 30 46 5d 3b  zBlob[i])&0x0F];
48e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
48f0: 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a     zText[(nBlob*
4900: 32 29 2b 32 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  2)+2] = '\'';.  
4910: 20 20 20 20 20 20 7a 54 65 78 74 5b 28 6e 42 6c        zText[(nBl
4920: 6f 62 2a 32 29 2b 33 5d 20 3d 20 27 5c 30 27 3b  ob*2)+3] = '\0';
4930: 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74 5b 30  .        zText[0
4940: 5d 20 3d 20 27 58 27 3b 0a 20 20 20 20 20 20 20  ] = 'X';.       
4950: 20 7a 54 65 78 74 5b 31 5d 20 3d 20 27 5c 27 27   zText[1] = '\''
4960: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4970: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
4980: 6e 74 65 78 74 2c 20 7a 54 65 78 74 2c 20 2d 31  ntext, zText, -1
4990: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
49a0: 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  NT);.        sql
49b0: 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74 29  ite3_free(zText)
49c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
49d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
49e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
49f0: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  T: {.      int i
4a00: 2c 6a 3b 0a 20 20 20 20 20 20 75 36 34 20 6e 3b  ,j;.      u64 n;
4a10: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
4a20: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 72 67  igned char *zArg
4a30: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4a40: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
4a50: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a        char *z;..
4a60: 20 20 20 20 20 20 69 66 28 20 7a 41 72 67 3d 3d        if( zArg==
4a70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
4a80: 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 30 3b 20    for(i=0, n=0; 
4a90: 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69  zArg[i]; i++){ i
4aa0: 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27  f( zArg[i]=='\''
4ab0: 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20 20   ) n++; }.      
4ac0: 69 66 28 20 69 2b 6e 2b 33 3e 53 51 4c 49 54 45  if( i+n+3>SQLITE
4ad0: 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 7b 0a 20  _MAX_LENGTH ){. 
4ae0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
4af0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62  esult_error_toob
4b00: 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ig(context);.   
4b10: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
4b20: 20 20 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73     }.      z = s
4b30: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 69  qlite3_malloc( i
4b40: 2b 6e 2b 33 20 29 3b 0a 20 20 20 20 20 20 69 66  +n+3 );.      if
4b50: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
4b60: 0a 20 20 20 20 20 20 7a 5b 30 5d 20 3d 20 27 5c  .      z[0] = '\
4b70: 27 27 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  '';.      for(i=
4b80: 30 2c 20 6a 3d 31 3b 20 7a 41 72 67 5b 69 5d 3b  0, j=1; zArg[i];
4b90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a   i++){.        z
4ba0: 5b 6a 2b 2b 5d 20 3d 20 7a 41 72 67 5b 69 5d 3b  [j++] = zArg[i];
4bb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 72  .        if( zAr
4bc0: 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  g[i]=='\'' ){.  
4bd0: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
4be0: 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 7d   '\'';.        }
4bf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
4c00: 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [j++] = '\'';.  
4c10: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
4c20: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4c30: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
4c40: 20 7a 2c 20 6a 2c 20 53 51 4c 49 54 45 5f 54 52   z, j, SQLITE_TR
4c50: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
4c60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
4c70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4c80: 0a 2a 2a 20 54 68 65 20 68 65 78 28 29 20 66 75  .** The hex() fu
4c90: 6e 63 74 69 6f 6e 2e 20 20 49 6e 74 65 72 70 72  nction.  Interpr
4ca0: 65 74 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  et the argument 
4cb0: 61 73 20 61 20 62 6c 6f 62 2e 20 20 52 65 74 75  as a blob.  Retu
4cc0: 72 6e 0a 2a 2a 20 61 20 68 65 78 61 64 65 63 69  rn.** a hexadeci
4cd0: 6d 61 6c 20 72 65 6e 64 65 72 69 6e 67 20 61 73  mal rendering as
4ce0: 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   text..*/.static
4cf0: 20 76 6f 69 64 20 68 65 78 46 75 6e 63 28 0a 20   void hexFunc(. 
4d00: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
4d10: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
4d20: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
4d30: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
4d40: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63  .  int i, n;.  c
4d50: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4d60: 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 63 68 61  ar *pBlob;.  cha
4d70: 72 20 2a 7a 48 65 78 2c 20 2a 7a 3b 0a 20 20 61  r *zHex, *z;.  a
4d80: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
4d90: 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69  ;.  pBlob = sqli
4da0: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
4db0: 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73  rgv[0]);.  n = s
4dc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
4dd0: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  es(argv[0]);.  i
4de0: 66 28 20 6e 2a 32 2b 31 3e 53 51 4c 49 54 45 5f  f( n*2+1>SQLITE_
4df0: 4d 41 58 5f 4c 45 4e 47 54 48 20 29 7b 0a 20 20  MAX_LENGTH ){.  
4e00: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4e10: 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f  _error_toobig(co
4e20: 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75  ntext);.    retu
4e30: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
4e40: 28 20 70 42 6c 6f 62 3d 3d 73 71 6c 69 74 65 33  ( pBlob==sqlite3
4e50: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
4e60: 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20 65  [0]) );  /* No e
4e70: 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20 2a  ncoding change *
4e80: 2f 0a 20 20 7a 20 3d 20 7a 48 65 78 20 3d 20 73  /.  z = zHex = s
4e90: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 2a  qlite3_malloc(n*
4ea0: 32 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 7a 48  2 + 1);.  if( zH
4eb0: 65 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ex==0 ) return;.
4ec0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
4ed0: 69 2b 2b 2c 20 70 42 6c 6f 62 2b 2b 29 7b 0a 20  i++, pBlob++){. 
4ee0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
4ef0: 20 63 20 3d 20 2a 70 42 6c 6f 62 3b 0a 20 20 20   c = *pBlob;.   
4f00: 20 2a 28 7a 2b 2b 29 20 3d 20 68 65 78 64 69 67   *(z++) = hexdig
4f10: 69 74 73 5b 28 63 3e 3e 34 29 26 30 78 66 5d 3b  its[(c>>4)&0xf];
4f20: 0a 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 68 65  .    *(z++) = he
4f30: 78 64 69 67 69 74 73 5b 63 26 30 78 66 5d 3b 0a  xdigits[c&0xf];.
4f40: 20 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 20 20    }.  *z = 0;.  
4f50: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4f60: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 48 65  ext(context, zHe
4f70: 78 2c 20 6e 2a 32 2c 20 73 71 6c 69 74 65 33 5f  x, n*2, sqlite3_
4f80: 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  free);.}../*.** 
4f90: 54 68 65 20 7a 65 72 6f 62 6c 6f 62 28 4e 29 20  The zeroblob(N) 
4fa0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
4fb0: 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 62   a zero-filled b
4fc0: 6c 6f 62 20 6f 66 20 73 69 7a 65 20 4e 20 62 79  lob of size N by
4fd0: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
4fe0: 6f 69 64 20 7a 65 72 6f 62 6c 6f 62 46 75 6e 63  oid zeroblobFunc
4ff0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
5000: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
5010: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
5020: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5030: 0a 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61  .){.  i64 n;.  a
5040: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
5050: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  n = sqlite3_
5060: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
5070: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 53 51  [0]);.  if( n>SQ
5080: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
5090: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
50a0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62  esult_error_toob
50b0: 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ig(context);.  }
50c0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
50d0: 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62 6c 6f  3_result_zeroblo
50e0: 62 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20  b(context, n);. 
50f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
5100: 72 65 70 6c 61 63 65 28 29 20 66 75 6e 63 74 69  replace() functi
5110: 6f 6e 2e 20 20 54 68 72 65 65 20 61 72 67 75 6d  on.  Three argum
5120: 65 6e 74 73 20 61 72 65 20 61 6c 6c 20 73 74 72  ents are all str
5130: 69 6e 67 73 3a 20 63 61 6c 6c 0a 2a 2a 20 74 68  ings: call.** th
5140: 65 6d 20 41 2c 20 42 2c 20 61 6e 64 20 43 2e 20  em A, B, and C. 
5150: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  The result is al
5160: 73 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  so a string whic
5170: 68 20 69 73 20 64 65 72 69 76 65 64 0a 2a 2a 20  h is derived.** 
5180: 66 72 6f 6d 20 41 20 62 79 20 72 65 70 6c 61 63  from A by replac
5190: 69 6e 67 20 65 76 65 72 79 20 6f 63 63 75 72 61  ing every occura
51a0: 6e 63 65 20 6f 66 20 42 20 77 69 74 68 20 43 2e  nce of B with C.
51b0: 20 20 54 68 65 20 6d 61 74 63 68 0a 2a 2a 20 6d    The match.** m
51c0: 75 73 74 20 62 65 20 65 78 61 63 74 2e 20 20 43  ust be exact.  C
51d0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
51e0: 65 73 20 61 72 65 20 6e 6f 74 20 75 73 65 64 2e  es are not used.
51f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5200: 72 65 70 6c 61 63 65 46 75 6e 63 28 0a 20 20 73  replaceFunc(.  s
5210: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5220: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
5230: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
5240: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
5250: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
5260: 63 68 61 72 20 2a 7a 53 74 72 3b 20 20 20 20 20  char *zStr;     
5270: 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20     /* The input 
5280: 73 74 72 69 6e 67 20 41 20 2a 2f 0a 20 20 63 6f  string A */.  co
5290: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
52a0: 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20 20  r *zPattern;    
52b0: 2f 2a 20 54 68 65 20 70 61 74 74 65 72 6e 20 73  /* The pattern s
52c0: 74 72 69 6e 67 20 42 20 2a 2f 0a 20 20 63 6f 6e  tring B */.  con
52d0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
52e0: 20 2a 7a 52 65 70 3b 20 20 20 20 20 20 20 20 2f   *zRep;        /
52f0: 2a 20 54 68 65 20 72 65 70 6c 61 63 65 6d 65 6e  * The replacemen
5300: 74 20 73 74 72 69 6e 67 20 43 20 2a 2f 0a 20 20  t string C */.  
5310: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
5320: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
5330: 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
5340: 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 72 3b 20 20  */.  int nStr;  
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5360: 20 53 69 7a 65 20 6f 66 20 7a 53 74 72 20 2a 2f   Size of zStr */
5370: 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b  .  int nPattern;
5380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5390: 69 7a 65 20 6f 66 20 7a 50 61 74 74 65 72 6e 20  ize of zPattern 
53a0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 70 3b 20 20  */.  int nRep;  
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
53c0: 20 53 69 7a 65 20 6f 66 20 7a 52 65 70 20 2a 2f   Size of zRep */
53d0: 0a 20 20 69 36 34 20 6e 4f 75 74 3b 20 20 20 20  .  i64 nOut;    
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
53f0: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 7a  aximum size of z
5400: 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 6f  Out */.  int loo
5410: 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
5420: 20 20 2f 2a 20 4c 61 73 74 20 7a 53 74 72 5b 5d    /* Last zStr[]
5430: 20 74 68 61 74 20 6d 69 67 68 74 20 6d 61 74 63   that might matc
5440: 68 20 7a 50 61 74 74 65 72 6e 5b 5d 20 2a 2f 0a  h zPattern[] */.
5450: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
5460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
5470: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 0a  op counters */..
5480: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
5490: 33 20 29 3b 0a 20 20 7a 53 74 72 20 3d 20 73 71  3 );.  zStr = sq
54a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
54b0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
54c0: 20 7a 53 74 72 3d 3d 30 20 29 20 72 65 74 75 72   zStr==0 ) retur
54d0: 6e 3b 0a 20 20 6e 53 74 72 20 3d 20 73 71 6c 69  n;.  nStr = sqli
54e0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
54f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65  argv[0]);.  asse
5500: 72 74 28 20 7a 53 74 72 3d 3d 73 71 6c 69 74 65  rt( zStr==sqlite
5510: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5520: 76 5b 30 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20  v[0]) );  /* No 
5530: 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20  encoding change 
5540: 2a 2f 0a 20 20 7a 50 61 74 74 65 72 6e 20 3d 20  */.  zPattern = 
5550: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
5560: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  xt(argv[1]);.  i
5570: 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20 7c  f( zPattern==0 |
5580: 7c 20 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 30  | zPattern[0]==0
5590: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 50 61   ) return;.  nPa
55a0: 74 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ttern = sqlite3_
55b0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
55c0: 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  [1]);.  assert( 
55d0: 7a 50 61 74 74 65 72 6e 3d 3d 73 71 6c 69 74 65  zPattern==sqlite
55e0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
55f0: 76 5b 31 5d 29 20 29 3b 20 20 2f 2a 20 4e 6f 20  v[1]) );  /* No 
5600: 65 6e 63 6f 64 69 6e 67 20 63 68 61 6e 67 65 20  encoding change 
5610: 2a 2f 0a 20 20 7a 52 65 70 20 3d 20 73 71 6c 69  */.  zRep = sqli
5620: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5630: 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[2]);.  if( z
5640: 52 65 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Rep==0 ) return;
5650: 0a 20 20 6e 52 65 70 20 3d 20 73 71 6c 69 74 65  .  nRep = sqlite
5660: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
5670: 67 76 5b 32 5d 29 3b 0a 20 20 61 73 73 65 72 74  gv[2]);.  assert
5680: 28 20 7a 52 65 70 3d 3d 73 71 6c 69 74 65 33 5f  ( zRep==sqlite3_
5690: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
56a0: 32 5d 29 20 29 3b 0a 20 20 6e 4f 75 74 20 3d 20  2]) );.  nOut = 
56b0: 6e 53 74 72 20 2b 20 31 3b 0a 20 20 61 73 73 65  nStr + 1;.  asse
56c0: 72 74 28 20 6e 4f 75 74 3c 53 51 4c 49 54 45 5f  rt( nOut<SQLITE_
56d0: 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  MAX_LENGTH );.  
56e0: 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zOut = sqlite3_m
56f0: 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4f 75 74 29  alloc((int)nOut)
5700: 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20  ;.  if( zOut==0 
5710: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
5720: 20 7d 0a 20 20 6c 6f 6f 70 4c 69 6d 69 74 20 3d   }.  loopLimit =
5730: 20 6e 53 74 72 20 2d 20 6e 50 61 74 74 65 72 6e   nStr - nPattern
5740: 3b 20 20 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ;  .  for(i=j=0;
5750: 20 69 3c 3d 6c 6f 6f 70 4c 69 6d 69 74 3b 20 69   i<=loopLimit; i
5760: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 74  ++){.    if( zSt
5770: 72 5b 69 5d 21 3d 7a 50 61 74 74 65 72 6e 5b 30  r[i]!=zPattern[0
5780: 5d 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 7a 53 74  ] || memcmp(&zSt
5790: 72 5b 69 5d 2c 20 7a 50 61 74 74 65 72 6e 2c 20  r[i], zPattern, 
57a0: 6e 50 61 74 74 65 72 6e 29 20 29 7b 0a 20 20 20  nPattern) ){.   
57b0: 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a     zOut[j++] = z
57c0: 53 74 72 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  Str[i];.    }els
57d0: 65 7b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d  e{.      nOut +=
57e0: 20 6e 52 65 70 20 2d 20 6e 50 61 74 74 65 72 6e   nRep - nPattern
57f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74  ;.      if( nOut
5800: 3e 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  >=SQLITE_MAX_LEN
5810: 47 54 48 20 29 7b 0a 20 20 20 20 20 20 20 20 73  GTH ){.        s
5820: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5830: 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65  ror_toobig(conte
5840: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  xt);.        sql
5850: 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
5860: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
5870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
5880: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  Out = sqlite3_re
5890: 61 6c 6c 6f 63 28 7a 4f 75 74 2c 20 28 69 6e 74  alloc(zOut, (int
58a0: 29 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66  )nOut);.      if
58b0: 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  ( zOut==0 ){.   
58c0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
58d0: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
58e0: 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 7a 52 65 70  y(&zOut[j], zRep
58f0: 2c 20 6e 52 65 70 29 3b 0a 20 20 20 20 20 20 6a  , nRep);.      j
5900: 20 2b 3d 20 6e 52 65 70 3b 0a 20 20 20 20 20 20   += nRep;.      
5910: 69 20 2b 3d 20 6e 50 61 74 74 65 72 6e 2d 31 3b  i += nPattern-1;
5920: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
5930: 65 72 74 28 20 6a 2b 6e 53 74 72 2d 69 2b 31 3d  ert( j+nStr-i+1=
5940: 3d 6e 4f 75 74 20 29 3b 0a 20 20 6d 65 6d 63 70  =nOut );.  memcp
5950: 79 28 26 7a 4f 75 74 5b 6a 5d 2c 20 26 7a 53 74  y(&zOut[j], &zSt
5960: 72 5b 69 5d 2c 20 6e 53 74 72 2d 69 29 3b 0a 20  r[i], nStr-i);. 
5970: 20 6a 20 2b 3d 20 6e 53 74 72 20 2d 20 69 3b 0a   j += nStr - i;.
5980: 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 6e 4f 75    assert( j<=nOu
5990: 74 20 29 3b 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d  t );.  zOut[j] =
59a0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
59b0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
59c0: 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20  t, (char*)zOut, 
59d0: 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  j, sqlite3_free)
59e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
59f0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
5a00: 20 54 52 49 4d 28 29 2c 20 4c 54 52 49 4d 28 29   TRIM(), LTRIM()
5a10: 2c 20 61 6e 64 20 52 54 52 49 4d 28 29 20 66 75  , and RTRIM() fu
5a20: 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20  nctions..** The 
5a30: 75 73 65 72 64 61 74 61 20 69 73 20 30 78 31 20  userdata is 0x1 
5a40: 66 6f 72 20 6c 65 66 74 20 74 72 69 6d 2c 20 30  for left trim, 0
5a50: 78 32 20 66 6f 72 20 72 69 67 68 74 20 74 72 69  x2 for right tri
5a60: 6d 2c 20 30 78 33 20 66 6f 72 20 62 6f 74 68 2e  m, 0x3 for both.
5a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a80: 74 72 69 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69  trimFunc(.  sqli
5a90: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5aa0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
5ab0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5ac0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
5ad0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
5ae0: 72 20 2a 7a 49 6e 3b 20 20 20 20 20 20 20 20 20  r *zIn;         
5af0: 2f 2a 20 49 6e 70 75 74 20 73 74 72 69 6e 67 20  /* Input string 
5b00: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  */.  const unsig
5b10: 6e 65 64 20 63 68 61 72 20 2a 7a 43 68 61 72 53  ned char *zCharS
5b20: 65 74 3b 20 20 20 20 2f 2a 20 53 65 74 20 6f 66  et;    /* Set of
5b30: 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 74   characters to t
5b40: 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  rim */.  int nIn
5b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5b70: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
5b80: 20 69 6e 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20   input */.  int 
5b90: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5bb0: 20 31 3a 20 74 72 69 6d 6c 65 66 74 20 20 32 3a   1: trimleft  2:
5bc0: 20 74 72 69 6d 72 69 67 68 74 20 20 33 3a 20 74   trimright  3: t
5bd0: 72 69 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  rim */.  int i; 
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
5c00: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
5c10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
5c20: 4c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Len;            
5c30: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 65    /* Length of e
5c40: 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e  ach character in
5c50: 20 7a 43 68 61 72 53 65 74 20 2a 2f 0a 20 20 63   zCharSet */.  c
5c60: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5c70: 61 72 20 2a 2a 61 7a 43 68 61 72 3b 20 20 20 20  ar **azChar;    
5c80: 20 2f 2a 20 49 6e 64 69 76 69 64 75 61 6c 20 63   /* Individual c
5c90: 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 43 68  haracters in zCh
5ca0: 61 72 53 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  arSet */.  int n
5cb0: 43 68 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  Char;           
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5cd0: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
5ce0: 74 65 72 73 20 69 6e 20 7a 43 68 61 72 53 65 74  ters in zCharSet
5cf0: 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   */..  if( sqlit
5d00: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
5d10: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
5d20: 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
5d30: 6e 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20 3d 20 73  n;.  }.  zIn = s
5d40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5d50: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
5d60: 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72  ( zIn==0 ) retur
5d70: 6e 3b 0a 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74  n;.  nIn = sqlit
5d80: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
5d90: 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72  rgv[0]);.  asser
5da0: 74 28 20 7a 49 6e 3d 3d 73 71 6c 69 74 65 33 5f  t( zIn==sqlite3_
5db0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5dc0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 61 72 67  0]) );.  if( arg
5dd0: 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 74 61 74  c==1 ){.    stat
5de0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
5df0: 64 20 63 68 61 72 20 6c 65 6e 4f 6e 65 5b 5d 20  d char lenOne[] 
5e00: 3d 20 7b 20 31 20 7d 3b 0a 20 20 20 20 73 74 61  = { 1 };.    sta
5e10: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
5e20: 65 64 20 63 68 61 72 20 2a 61 7a 4f 6e 65 5b 5d  ed char *azOne[]
5e30: 20 3d 20 7b 20 28 75 38 2a 29 22 20 22 20 7d 3b   = { (u8*)" " };
5e40: 0a 20 20 20 20 6e 43 68 61 72 20 3d 20 31 3b 0a  .    nChar = 1;.
5e50: 20 20 20 20 61 4c 65 6e 20 3d 20 28 75 38 2a 29      aLen = (u8*)
5e60: 6c 65 6e 4f 6e 65 3b 0a 20 20 20 20 61 7a 43 68  lenOne;.    azCh
5e70: 61 72 20 3d 20 61 7a 4f 6e 65 3b 0a 20 20 20 20  ar = azOne;.    
5e80: 7a 43 68 61 72 53 65 74 20 3d 20 30 3b 0a 20 20  zCharSet = 0;.  
5e90: 7d 65 6c 73 65 20 69 66 28 20 28 7a 43 68 61 72  }else if( (zChar
5ea0: 53 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Set = sqlite3_va
5eb0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
5ec0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))==0 ){.    ret
5ed0: 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  urn;.  }else{.  
5ee0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
5ef0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 66 6f   char *z;.    fo
5f00: 72 28 7a 3d 7a 43 68 61 72 53 65 74 2c 20 6e 43  r(z=zCharSet, nC
5f10: 68 61 72 3d 30 3b 20 2a 7a 3b 20 6e 43 68 61 72  har=0; *z; nChar
5f20: 2b 2b 29 7b 0a 20 20 20 20 20 20 53 51 4c 49 54  ++){.      SQLIT
5f30: 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a  E_SKIP_UTF8(z);.
5f40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43      }.    if( nC
5f50: 68 61 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 61  har>0 ){.      a
5f60: 7a 43 68 61 72 20 3d 20 73 71 6c 69 74 65 33 5f  zChar = sqlite3_
5f70: 6d 61 6c 6c 6f 63 28 20 6e 43 68 61 72 2a 28 73  malloc( nChar*(s
5f80: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2b 31 29 20  izeof(char*)+1) 
5f90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 43  );.      if( azC
5fa0: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  har==0 ){.      
5fb0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
5fc0: 7d 0a 20 20 20 20 20 20 61 4c 65 6e 20 3d 20 28  }.      aLen = (
5fd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
5fe0: 61 7a 43 68 61 72 5b 6e 43 68 61 72 5d 3b 0a 20  azChar[nChar];. 
5ff0: 20 20 20 20 20 66 6f 72 28 7a 3d 7a 43 68 61 72       for(z=zChar
6000: 53 65 74 2c 20 6e 43 68 61 72 3d 30 3b 20 2a 7a  Set, nChar=0; *z
6010: 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20  ; nChar++){.    
6020: 20 20 20 20 61 7a 43 68 61 72 5b 6e 43 68 61 72      azChar[nChar
6030: 5d 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20 53  ] = z;.        S
6040: 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28  QLITE_SKIP_UTF8(
6050: 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 4c 65 6e  z);.        aLen
6060: 5b 6e 43 68 61 72 5d 20 3d 20 7a 20 2d 20 61 7a  [nChar] = z - az
6070: 43 68 61 72 5b 6e 43 68 61 72 5d 3b 0a 20 20 20  Char[nChar];.   
6080: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6090: 20 69 66 28 20 6e 43 68 61 72 3e 30 20 29 7b 0a   if( nChar>0 ){.
60a0: 20 20 20 20 66 6c 61 67 73 20 3d 20 28 69 6e 74      flags = (int
60b0: 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
60c0: 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ta(context);.   
60d0: 20 69 66 28 20 66 6c 61 67 73 20 26 20 31 20 29   if( flags & 1 )
60e0: 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e  {.      while( n
60f0: 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  In>0 ){.        
6100: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20  int len;.       
6110: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61   for(i=0; i<nCha
6120: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
6130: 20 20 20 6c 65 6e 20 3d 20 61 4c 65 6e 5b 69 5d     len = aLen[i]
6140: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6150: 6d 65 6d 63 6d 70 28 7a 49 6e 2c 20 61 7a 43 68  memcmp(zIn, azCh
6160: 61 72 5b 69 5d 2c 20 6c 65 6e 29 3d 3d 30 20 29  ar[i], len)==0 )
6170: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6180: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
6190: 3d 6e 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a  =nChar ) break;.
61a0: 20 20 20 20 20 20 20 20 7a 49 6e 20 2b 3d 20 6c          zIn += l
61b0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20  en;.        nIn 
61c0: 2d 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a  -= len;.      }.
61d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 6c      }.    if( fl
61e0: 61 67 73 20 26 20 32 20 29 7b 0a 20 20 20 20 20  ags & 2 ){.     
61f0: 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b   while( nIn>0 ){
6200: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  .        int len
6210: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
6220: 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29  0; i<nChar; i++)
6230: 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20  {.          len 
6240: 3d 20 61 4c 65 6e 5b 69 5d 3b 0a 20 20 20 20 20  = aLen[i];.     
6250: 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 3d 6e 49       if( len<=nI
6260: 6e 20 26 26 20 6d 65 6d 63 6d 70 28 26 7a 49 6e  n && memcmp(&zIn
6270: 5b 6e 49 6e 2d 6c 65 6e 5d 2c 61 7a 43 68 61 72  [nIn-len],azChar
6280: 5b 69 5d 2c 6c 65 6e 29 3d 3d 30 20 29 20 62 72  [i],len)==0 ) br
6290: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
62a0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43         if( i>=nC
62b0: 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  har ) break;.   
62c0: 20 20 20 20 20 6e 49 6e 20 2d 3d 20 6c 65 6e 3b       nIn -= len;
62d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
62e0: 20 20 20 69 66 28 20 7a 43 68 61 72 53 65 74 20     if( zCharSet 
62f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6300: 5f 66 72 65 65 28 61 7a 43 68 61 72 29 3b 0a 20  _free(azChar);. 
6310: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
6320: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
6330: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a  ontext, (char*)z
6340: 49 6e 2c 20 6e 49 6e 2c 20 53 51 4c 49 54 45 5f  In, nIn, SQLITE_
6350: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 23  TRANSIENT);.}..#
6360: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 4f 55  ifdef SQLITE_SOU
6370: 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  NDEX./*.** Compu
6380: 74 65 20 74 68 65 20 73 6f 75 6e 64 65 78 20 65  te the soundex e
6390: 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 77 6f 72  ncoding of a wor
63a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
63b0: 64 20 73 6f 75 6e 64 65 78 46 75 6e 63 28 0a 20  d soundexFunc(. 
63c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
63d0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
63e0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
63f0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
6400: 0a 20 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b  .  char zResult[
6410: 38 5d 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  8];.  const u8 *
6420: 7a 49 6e 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  zIn;.  int i, j;
6430: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
6440: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 43  unsigned char iC
6450: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c  ode[] = {.    0,
6460: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
6470: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6480: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
6490: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
64a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
64b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
64c0: 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,.    0, 0, 0, 0
64d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
64e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
64f0: 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20  0, 0,.    0, 0, 
6500: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6510: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6520: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c   0, 0, 0,.    0,
6530: 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20   0, 1, 2, 3, 0, 
6540: 31 2c 20 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32  1, 2, 0, 0, 2, 2
6550: 2c 20 34 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20  , 4, 5, 5, 0,.  
6560: 20 20 31 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c    1, 2, 6, 2, 3,
6570: 20 30 2c 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20   0, 1, 0, 2, 0, 
6580: 32 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  2, 0, 0, 0, 0, 0
6590: 2c 0a 20 20 20 20 30 2c 20 30 2c 20 31 2c 20 32  ,.    0, 0, 1, 2
65a0: 2c 20 33 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c  , 3, 0, 1, 2, 0,
65b0: 20 30 2c 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20   0, 2, 2, 4, 5, 
65c0: 35 2c 20 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20  5, 0,.    1, 2, 
65d0: 36 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30  6, 2, 3, 0, 1, 0
65e0: 2c 20 32 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c  , 2, 0, 2, 0, 0,
65f0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a 20   0, 0, 0,.  };. 
6600: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
6610: 20 29 3b 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a   );.  zIn = (u8*
6620: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6630: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
6640: 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 7a 49 6e  if( zIn==0 ) zIn
6650: 20 3d 20 28 75 38 2a 29 22 22 3b 0a 20 20 66 6f   = (u8*)"";.  fo
6660: 72 28 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26 26  r(i=0; zIn[i] &&
6670: 20 21 69 73 61 6c 70 68 61 28 7a 49 6e 5b 69 5d   !isalpha(zIn[i]
6680: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  ); i++){}.  if( 
6690: 7a 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 75 38  zIn[i] ){.    u8
66a0: 20 70 72 65 76 63 6f 64 65 20 3d 20 69 43 6f 64   prevcode = iCod
66b0: 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d 3b 0a  e[zIn[i]&0x7f];.
66c0: 20 20 20 20 7a 52 65 73 75 6c 74 5b 30 5d 20 3d      zResult[0] =
66d0: 20 74 6f 75 70 70 65 72 28 7a 49 6e 5b 69 5d 29   toupper(zIn[i])
66e0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  ;.    for(j=1; j
66f0: 3c 34 20 26 26 20 7a 49 6e 5b 69 5d 3b 20 69 2b  <4 && zIn[i]; i+
6700: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  +){.      int co
6710: 64 65 20 3d 20 69 43 6f 64 65 5b 7a 49 6e 5b 69  de = iCode[zIn[i
6720: 5d 26 30 78 37 66 5d 3b 0a 20 20 20 20 20 20 69  ]&0x7f];.      i
6730: 66 28 20 63 6f 64 65 3e 30 20 29 7b 0a 20 20 20  f( code>0 ){.   
6740: 20 20 20 20 20 69 66 28 20 63 6f 64 65 21 3d 70       if( code!=p
6750: 72 65 76 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  revcode ){.     
6760: 20 20 20 20 20 70 72 65 76 63 6f 64 65 20 3d 20       prevcode = 
6770: 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  code;.          
6780: 7a 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63  zResult[j++] = c
6790: 6f 64 65 20 2b 20 27 30 27 3b 0a 20 20 20 20 20  ode + '0';.     
67a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
67b0: 7b 0a 20 20 20 20 20 20 20 20 70 72 65 76 63 6f  {.        prevco
67c0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  de = 0;.      }.
67d0: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
67e0: 20 6a 3c 34 20 29 7b 0a 20 20 20 20 20 20 7a 52   j<4 ){.      zR
67f0: 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 27 30 27  esult[j++] = '0'
6800: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 73  ;.    }.    zRes
6810: 75 6c 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  ult[j] = 0;.    
6820: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
6830: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52 65  ext(context, zRe
6840: 73 75 6c 74 2c 20 34 2c 20 53 51 4c 49 54 45 5f  sult, 4, SQLITE_
6850: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65  TRANSIENT);.  }e
6860: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
6870: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
6880: 74 65 78 74 2c 20 22 3f 30 30 30 22 2c 20 34 2c  text, "?000", 4,
6890: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
68a0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
68b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
68c0: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
68d0: 4e 0a 2f 2a 0a 2a 2a 20 41 20 66 75 6e 63 74 69  N./*.** A functi
68e0: 6f 6e 20 74 68 61 74 20 6c 6f 61 64 73 20 61 20  on that loads a 
68f0: 73 68 61 72 65 64 2d 6c 69 62 72 61 72 79 20 65  shared-library e
6900: 78 74 65 6e 73 69 6f 6e 20 74 68 65 6e 20 72 65  xtension then re
6910: 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  turns NULL..*/.s
6920: 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 61 64 45  tatic void loadE
6930: 78 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  xt(sqlite3_conte
6940: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
6950: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
6960: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
6970: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
6980: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
6990: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
69a0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
69b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
69c0: 6f 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  oc;.  sqlite3 *d
69d0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  b = sqlite3_user
69e0: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a  _data(context);.
69f0: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
6a00: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  = 0;..  if( argc
6a10: 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63  ==2 ){.    zProc
6a20: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
6a30: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6a40: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
6a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 63  }else{.    zProc
6a60: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
6a70: 7a 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33  zFile && sqlite3
6a80: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
6a90: 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63  db, zFile, zProc
6aa0: 2c 20 26 7a 45 72 72 4d 73 67 29 20 29 7b 0a 20  , &zErrMsg) ){. 
6ab0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6ac0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
6ad0: 20 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b 0a 20   zErrMsg, -1);. 
6ae0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6af0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a  zErrMsg);.  }.}.
6b00: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
6b10: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
6b20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67   This function g
6b30: 65 6e 65 72 61 74 65 73 20 61 20 73 74 72 69 6e  enerates a strin
6b40: 67 20 6f 66 20 72 61 6e 64 6f 6d 20 63 68 61 72  g of random char
6b50: 61 63 74 65 72 73 2e 20 20 55 73 65 64 20 66 6f  acters.  Used fo
6b60: 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20  r.** generating 
6b70: 74 65 73 74 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  test data..*/.st
6b80: 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64 53 74  atic void randSt
6b90: 72 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  r(sqlite3_contex
6ba0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
6bb0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
6bc0: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 73  lue **argv){.  s
6bd0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
6be0: 67 6e 65 64 20 63 68 61 72 20 7a 53 72 63 5b 5d  gned char zSrc[]
6bf0: 20 3d 20 0a 20 20 20 20 20 22 61 62 63 64 65 66   = .     "abcdef
6c00: 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
6c10: 77 78 79 7a 22 0a 20 20 20 20 20 22 41 42 43 44  wxyz".     "ABCD
6c20: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
6c30: 55 56 57 58 59 5a 22 0a 20 20 20 20 20 22 30 31  UVWXYZ".     "01
6c40: 32 33 34 35 36 37 38 39 22 0a 20 20 20 20 20 22  23456789".     "
6c50: 2e 2d 21 2c 3a 2a 5e 2b 3d 5f 7c 3f 2f 3c 3e 20  .-!,:*^+=_|?/<> 
6c60: 22 3b 0a 20 20 69 6e 74 20 69 4d 69 6e 2c 20 69  ";.  int iMin, i
6c70: 4d 61 78 2c 20 6e 2c 20 72 2c 20 69 3b 0a 20 20  Max, n, r, i;.  
6c80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 42  unsigned char zB
6c90: 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28 20  uf[1000];.  if( 
6ca0: 61 72 67 63 3e 3d 31 20 29 7b 0a 20 20 20 20 69  argc>=1 ){.    i
6cb0: 4d 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Min = sqlite3_va
6cc0: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29  lue_int(argv[0])
6cd0: 3b 0a 20 20 20 20 69 66 28 20 69 4d 69 6e 3c 30  ;.    if( iMin<0
6ce0: 20 29 20 69 4d 69 6e 20 3d 20 30 3b 0a 20 20 20   ) iMin = 0;.   
6cf0: 20 69 66 28 20 69 4d 69 6e 3e 3d 73 69 7a 65 6f   if( iMin>=sizeo
6d00: 66 28 7a 42 75 66 29 20 29 20 69 4d 69 6e 20 3d  f(zBuf) ) iMin =
6d10: 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 3b   sizeof(zBuf)-1;
6d20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4d  .  }else{.    iM
6d30: 69 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  in = 1;.  }.  if
6d40: 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20  ( argc>=2 ){.   
6d50: 20 69 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f   iMax = sqlite3_
6d60: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31  value_int(argv[1
6d70: 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4d 61 78  ]);.    if( iMax
6d80: 3c 69 4d 69 6e 20 29 20 69 4d 61 78 20 3d 20 69  <iMin ) iMax = i
6d90: 4d 69 6e 3b 0a 20 20 20 20 69 66 28 20 69 4d 61  Min;.    if( iMa
6da0: 78 3e 3d 73 69 7a 65 6f 66 28 7a 42 75 66 29 20  x>=sizeof(zBuf) 
6db0: 29 20 69 4d 61 78 20 3d 20 73 69 7a 65 6f 66 28  ) iMax = sizeof(
6dc0: 7a 42 75 66 29 2d 31 3b 0a 20 20 7d 65 6c 73 65  zBuf)-1;.  }else
6dd0: 7b 0a 20 20 20 20 69 4d 61 78 20 3d 20 35 30 3b  {.    iMax = 50;
6de0: 0a 20 20 7d 0a 20 20 6e 20 3d 20 69 4d 69 6e 3b  .  }.  n = iMin;
6df0: 0a 20 20 69 66 28 20 69 4d 61 78 3e 69 4d 69 6e  .  if( iMax>iMin
6e00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
6e10: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
6e20: 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 72 20  (r), &r);.    r 
6e30: 26 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20  &= 0x7fffffff;. 
6e40: 20 20 20 6e 20 2b 3d 20 72 25 28 69 4d 61 78 20     n += r%(iMax 
6e50: 2b 20 31 20 2d 20 69 4d 69 6e 29 3b 0a 20 20 7d  + 1 - iMin);.  }
6e60: 0a 20 20 61 73 73 65 72 74 28 20 6e 3c 73 69 7a  .  assert( n<siz
6e70: 65 6f 66 28 7a 42 75 66 29 20 29 3b 0a 20 20 73  eof(zBuf) );.  s
6e80: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
6e90: 28 6e 2c 20 7a 42 75 66 29 3b 0a 20 20 66 6f 72  (n, zBuf);.  for
6ea0: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
6eb0: 0a 20 20 20 20 7a 42 75 66 5b 69 5d 20 3d 20 7a  .    zBuf[i] = z
6ec0: 53 72 63 5b 7a 42 75 66 5b 69 5d 25 28 73 69 7a  Src[zBuf[i]%(siz
6ed0: 65 6f 66 28 7a 53 72 63 29 2d 31 29 5d 3b 0a 20  eof(zSrc)-1)];. 
6ee0: 20 7d 0a 20 20 7a 42 75 66 5b 6e 5d 20 3d 20 30   }.  zBuf[n] = 0
6ef0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
6f00: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
6f10: 20 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 6e 2c   (char*)zBuf, n,
6f20: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
6f30: 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  T);.}.#endif /* 
6f40: 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a  SQLITE_TEST */..
6f50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
6f60: 53 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ST./*.** The fol
6f70: 6c 6f 77 69 6e 67 20 74 77 6f 20 53 51 4c 20 66  lowing two SQL f
6f80: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  unctions are use
6f90: 64 20 74 6f 20 74 65 73 74 20 72 65 74 75 72 6e  d to test return
6fa0: 69 6e 67 20 61 20 74 65 78 74 0a 2a 2a 20 72 65  ing a text.** re
6fb0: 73 75 6c 74 20 77 69 74 68 20 61 20 64 65 73 74  sult with a dest
6fc0: 72 75 63 74 6f 72 2e 20 46 75 6e 63 74 69 6f 6e  ructor. Function
6fd0: 20 27 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f   'test_destructo
6fe0: 72 27 20 74 61 6b 65 73 20 6f 6e 65 20 61 72 67  r' takes one arg
6ff0: 75 6d 65 6e 74 0a 2a 2a 20 61 6e 64 20 72 65 74  ument.** and ret
7000: 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 61 72  urns the same ar
7010: 67 75 6d 65 6e 74 20 69 6e 74 65 72 70 72 65 74  gument interpret
7020: 65 64 20 61 73 20 54 45 58 54 2e 20 41 20 64 65  ed as TEXT. A de
7030: 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 70  structor is.** p
7040: 61 73 73 65 64 20 77 69 74 68 20 74 68 65 20 73  assed with the s
7050: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
7060: 78 74 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  xt() call..**.**
7070: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 27 74   SQL function 't
7080: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  est_destructor_c
7090: 6f 75 6e 74 27 20 72 65 74 75 72 6e 73 20 74 68  ount' returns th
70a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  e number of outs
70b0: 74 61 6e 64 69 6e 67 20 0a 2a 2a 20 61 6c 6c 6f  tanding .** allo
70c0: 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20  cations made by 
70d0: 27 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72  'test_destructor
70e0: 27 3b 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  ';.**.** WARNING
70f0: 3a 20 4e 6f 74 20 74 68 72 65 61 64 73 61 66 65  : Not threadsafe
7100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7110: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  test_destructor_
7120: 63 6f 75 6e 74 5f 76 61 72 20 3d 20 30 3b 0a 73  count_var = 0;.s
7130: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
7140: 75 63 74 6f 72 28 76 6f 69 64 20 2a 70 29 7b 0a  uctor(void *p){.
7150: 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 28    char *zVal = (
7160: 63 68 61 72 20 2a 29 70 3b 0a 20 20 61 73 73 65  char *)p;.  asse
7170: 72 74 28 7a 56 61 6c 29 3b 0a 20 20 7a 56 61 6c  rt(zVal);.  zVal
7180: 2d 2d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  --;.  sqlite3_fr
7190: 65 65 28 7a 56 61 6c 29 3b 0a 20 20 74 65 73 74  ee(zVal);.  test
71a0: 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e  _destructor_coun
71b0: 74 5f 76 61 72 2d 2d 3b 0a 7d 0a 73 74 61 74 69  t_var--;.}.stati
71c0: 63 20 76 6f 69 64 20 74 65 73 74 5f 64 65 73 74  c void test_dest
71d0: 72 75 63 74 6f 72 28 0a 20 20 73 71 6c 69 74 65  ructor(.  sqlite
71e0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
71f0: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
7200: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
7210: 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 2a  argv.){.  char *
7220: 7a 56 61 6c 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  zVal;.  int len;
7230: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7240: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
7250: 74 61 28 70 43 74 78 29 3b 0a 20 0a 20 20 74 65  ta(pCtx);. .  te
7260: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  st_destructor_co
7270: 75 6e 74 5f 76 61 72 2b 2b 3b 0a 20 20 61 73 73  unt_var++;.  ass
7280: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
7290: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
72a0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
72b0: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
72c0: 20 72 65 74 75 72 6e 3b 0a 20 20 6c 65 6e 20 3d   return;.  len =
72d0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74   sqlite3ValueByt
72e0: 65 73 28 61 72 67 76 5b 30 5d 2c 20 45 4e 43 28  es(argv[0], ENC(
72f0: 64 62 29 29 3b 20 0a 20 20 7a 56 61 6c 20 3d 20  db)); .  zVal = 
7300: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e  sqliteMalloc(len
7310: 2b 33 29 3b 0a 20 20 7a 56 61 6c 5b 6c 65 6e 5d  +3);.  zVal[len]
7320: 20 3d 20 30 3b 0a 20 20 7a 56 61 6c 5b 6c 65 6e   = 0;.  zVal[len
7330: 2d 31 5d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  -1] = 0;.  asser
7340: 74 28 20 7a 56 61 6c 20 29 3b 0a 20 20 7a 56 61  t( zVal );.  zVa
7350: 6c 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 56  l++;.  memcpy(zV
7360: 61 6c 2c 20 73 71 6c 69 74 65 33 56 61 6c 75 65  al, sqlite3Value
7370: 54 65 78 74 28 61 72 67 76 5b 30 5d 2c 20 45 4e  Text(argv[0], EN
7380: 43 28 64 62 29 29 2c 20 6c 65 6e 29 3b 0a 20 20  C(db)), len);.  
7390: 69 66 28 20 45 4e 43 28 64 62 29 3d 3d 53 51 4c  if( ENC(db)==SQL
73a0: 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20  ITE_UTF8 ){.    
73b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
73c0: 65 78 74 28 70 43 74 78 2c 20 7a 56 61 6c 2c 20  ext(pCtx, zVal, 
73d0: 2d 31 2c 20 64 65 73 74 72 75 63 74 6f 72 29 3b  -1, destructor);
73e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
73f0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c  OMIT_UTF16.  }el
7400: 73 65 20 69 66 28 20 45 4e 43 28 64 62 29 3d 3d  se if( ENC(db)==
7410: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 29  SQLITE_UTF16LE )
7420: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
7430: 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 70 43  sult_text16le(pC
7440: 74 78 2c 20 7a 56 61 6c 2c 20 2d 31 2c 20 64 65  tx, zVal, -1, de
7450: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 7d 65 6c  structor);.  }el
7460: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
7470: 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28  result_text16be(
7480: 70 43 74 78 2c 20 7a 56 61 6c 2c 20 2d 31 2c 20  pCtx, zVal, -1, 
7490: 64 65 73 74 72 75 63 74 6f 72 29 3b 0a 23 65 6e  destructor);.#en
74a0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
74b0: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 7d 0a  IT_UTF16 */.  }.
74c0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  }.static void te
74d0: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  st_destructor_co
74e0: 75 6e 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unt(.  sqlite3_c
74f0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
7500: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
7510: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
7520: 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  v.){.  sqlite3_r
7530: 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20  esult_int(pCtx, 
7540: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  test_destructor_
7550: 63 6f 75 6e 74 5f 76 61 72 29 3b 0a 7d 0a 23 65  count_var);.}.#e
7560: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
7570: 45 53 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  EST */..#ifdef S
7580: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
7590: 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 65   Routines for te
75a0: 73 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  sting the sqlite
75b0: 33 5f 67 65 74 5f 61 75 78 64 61 74 61 28 29 20  3_get_auxdata() 
75c0: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f  and sqlite3_set_
75d0: 61 75 78 64 61 74 61 28 29 0a 2a 2a 20 69 6e 74  auxdata().** int
75e0: 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erface..**.** Th
75f0: 65 20 74 65 73 74 5f 61 75 78 64 61 74 61 28 29  e test_auxdata()
7600: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 74   SQL function at
7610: 74 65 6d 70 74 73 20 74 6f 20 72 65 67 69 73 74  tempts to regist
7620: 65 72 20 65 61 63 68 20 6f 66 20 69 74 73 20 61  er each of its a
7630: 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 61 73 20 61  rguments.** as a
7640: 75 78 69 6c 69 61 72 79 20 64 61 74 61 2e 20 20  uxiliary data.  
7650: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
7660: 70 72 69 6f 72 20 72 65 67 69 73 74 72 61 74 69  prior registrati
7670: 6f 6e 73 20 6f 66 20 61 75 78 20 64 61 74 61 20  ons of aux data 
7680: 66 6f 72 0a 2a 2a 20 74 68 61 74 20 61 72 67 75  for.** that argu
7690: 6d 65 6e 74 20 28 6d 65 61 6e 69 6e 67 20 74 68  ment (meaning th
76a0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  e argument is no
76b0: 74 20 61 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20  t a constant or 
76c0: 74 68 69 73 20 69 73 20 69 74 73 20 66 69 72 73  this is its firs
76d0: 74 0a 2a 2a 20 63 61 6c 6c 29 20 74 68 65 6e 20  t.** call) then 
76e0: 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 74  the result for t
76f0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
7700: 30 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  0.  If there is 
7710: 61 20 70 72 69 6f 72 0a 2a 2a 20 72 65 67 69 73  a prior.** regis
7720: 74 72 61 74 69 6f 6e 2c 20 74 68 65 20 72 65 73  tration, the res
7730: 75 6c 74 20 66 6f 72 20 74 68 61 74 20 61 72 67  ult for that arg
7740: 75 6d 65 6e 74 20 69 73 20 31 2e 20 20 54 68 65  ument is 1.  The
7750: 20 6f 76 65 72 61 6c 6c 20 72 65 73 75 6c 74 0a   overall result.
7760: 2a 2a 20 69 73 20 74 68 65 20 69 6e 64 69 76 69  ** is the indivi
7770: 64 75 61 6c 20 61 72 67 75 6d 65 6e 74 20 72 65  dual argument re
7780: 73 75 6c 74 73 20 73 65 70 61 72 61 74 65 64 20  sults separated 
7790: 62 79 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  by spaces..*/.st
77a0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 5f 74  atic void free_t
77b0: 65 73 74 5f 61 75 78 64 61 74 61 28 76 6f 69 64  est_auxdata(void
77c0: 20 2a 70 29 20 7b 73 71 6c 69 74 65 33 5f 66 72   *p) {sqlite3_fr
77d0: 65 65 28 70 29 3b 7d 0a 73 74 61 74 69 63 20 76  ee(p);}.static v
77e0: 6f 69 64 20 74 65 73 74 5f 61 75 78 64 61 74 61  oid test_auxdata
77f0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
7800: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
7810: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
7820: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
7830: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
7840: 72 20 2a 7a 52 65 74 20 3d 20 73 71 6c 69 74 65  r *zRet = sqlite
7850: 4d 61 6c 6c 6f 63 28 6e 41 72 67 2a 32 29 3b 0a  Malloc(nArg*2);.
7860: 20 20 69 66 28 20 21 7a 52 65 74 20 29 20 72 65    if( !zRet ) re
7870: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
7880: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
7890: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
78a0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
78b0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
78c0: 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a  v[i]);.    if( z
78d0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
78e0: 7a 41 75 78 20 3d 20 73 71 6c 69 74 65 33 5f 67  zAux = sqlite3_g
78f0: 65 74 5f 61 75 78 64 61 74 61 28 70 43 74 78 2c  et_auxdata(pCtx,
7900: 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   i);.      if( z
7910: 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Aux ){.        z
7920: 52 65 74 5b 69 2a 32 5d 20 3d 20 27 31 27 3b 0a  Ret[i*2] = '1';.
7930: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
7940: 6d 70 28 7a 41 75 78 2c 20 7a 29 20 29 7b 0a 20  mp(zAux, z) ){. 
7950: 20 20 20 20 20 20 20 20 20 66 72 65 65 5f 74 65           free_te
7960: 73 74 5f 61 75 78 64 61 74 61 28 28 76 6f 69 64  st_auxdata((void
7970: 20 2a 29 7a 52 65 74 29 3b 0a 20 20 20 20 20 20   *)zRet);.      
7980: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7990: 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 22  lt_error(pCtx, "
79a0: 41 75 78 69 6c 61 72 79 20 64 61 74 61 20 63 6f  Auxilary data co
79b0: 72 72 75 70 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a  rruption", -1);.
79c0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
79d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
79e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
79f0: 20 7a 52 65 74 5b 69 2a 32 5d 20 3d 20 27 30 27   zRet[i*2] = '0'
7a00: 3b 0a 20 20 20 20 20 20 20 20 7a 41 75 78 20 3d  ;.        zAux =
7a10: 20 73 71 6c 69 74 65 33 53 74 72 44 75 70 28 7a   sqlite3StrDup(z
7a20: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7a30: 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 70  e3_set_auxdata(p
7a40: 43 74 78 2c 20 69 2c 20 7a 41 75 78 2c 20 66 72  Ctx, i, zAux, fr
7a50: 65 65 5f 74 65 73 74 5f 61 75 78 64 61 74 61 29  ee_test_auxdata)
7a60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7a70: 7a 52 65 74 5b 69 2a 32 2b 31 5d 20 3d 20 27 20  zRet[i*2+1] = ' 
7a80: 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  ';.    }.  }.  s
7a90: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
7aa0: 78 74 28 70 43 74 78 2c 20 7a 52 65 74 2c 20 32  xt(pCtx, zRet, 2
7ab0: 2a 6e 41 72 67 2d 31 2c 20 66 72 65 65 5f 74 65  *nArg-1, free_te
7ac0: 73 74 5f 61 75 78 64 61 74 61 29 3b 0a 7d 0a 23  st_auxdata);.}.#
7ad0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7ae0: 54 45 53 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20  TEST */..#ifdef 
7af0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
7b00: 2a 20 41 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  * A function to 
7b10: 74 65 73 74 20 65 72 72 6f 72 20 72 65 70 6f 72  test error repor
7b20: 74 69 6e 67 20 66 72 6f 6d 20 75 73 65 72 20 66  ting from user f
7b30: 75 6e 63 74 69 6f 6e 73 2e 20 54 68 69 73 20 66  unctions. This f
7b40: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  unction.** retur
7b50: 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 69 74 27  ns a copy of it'
7b60: 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  s first argument
7b70: 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f   as an error..*/
7b80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
7b90: 74 5f 65 72 72 6f 72 28 0a 20 20 73 71 6c 69 74  t_error(.  sqlit
7ba0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
7bb0: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
7bc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7bd0: 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
7be0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
7bf0: 70 43 74 78 2c 20 28 63 68 61 72 2a 29 73 71 6c  pCtx, (char*)sql
7c00: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
7c10: 61 72 67 76 5b 30 5d 29 2c 20 30 29 3b 0a 7d 0a  argv[0]), 0);.}.
7c20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7c30: 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _TEST */../*.** 
7c40: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
7c50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
7c60: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65  ucture holds the
7c70: 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a   context of a.**
7c80: 20 73 75 6d 28 29 20 6f 72 20 61 76 67 28 29 20   sum() or avg() 
7c90: 61 67 67 72 65 67 61 74 65 20 63 6f 6d 70 75 74  aggregate comput
7ca0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65  ation..*/.typede
7cb0: 66 20 73 74 72 75 63 74 20 53 75 6d 43 74 78 20  f struct SumCtx 
7cc0: 53 75 6d 43 74 78 3b 0a 73 74 72 75 63 74 20 53  SumCtx;.struct S
7cd0: 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65  umCtx {.  double
7ce0: 20 72 53 75 6d 3b 20 20 20 20 20 20 2f 2a 20 46   rSum;      /* F
7cf0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 73 75  loating point su
7d00: 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53 75 6d 3b  m */.  i64 iSum;
7d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
7d20: 67 65 72 20 73 75 6d 20 2a 2f 20 20 20 0a 20 20  ger sum */   .  
7d30: 69 36 34 20 63 6e 74 3b 20 20 20 20 20 20 20 20  i64 cnt;        
7d40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
7d50: 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a  lements summed *
7d60: 2f 0a 20 20 75 38 20 6f 76 65 72 66 6c 6f 77 3b  /.  u8 overflow;
7d70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7d80: 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f   integer overflo
7d90: 77 20 73 65 65 6e 20 2a 2f 0a 20 20 75 38 20 61  w seen */.  u8 a
7da0: 70 70 72 6f 78 3b 20 20 20 20 20 20 20 20 2f 2a  pprox;        /*
7db0: 20 54 72 75 65 20 69 66 20 6e 6f 6e 2d 69 6e 74   True if non-int
7dc0: 65 67 65 72 20 76 61 6c 75 65 20 77 61 73 20 69  eger value was i
7dd0: 6e 70 75 74 20 74 6f 20 74 68 65 20 73 75 6d 20  nput to the sum 
7de0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  */.};../*.** Rou
7df0: 74 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f  tines used to co
7e00: 6d 70 75 74 65 20 74 68 65 20 73 75 6d 2c 20 61  mpute the sum, a
7e10: 76 65 72 61 67 65 2c 20 61 6e 64 20 74 6f 74 61  verage, and tota
7e20: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 55 4d  l..**.** The SUM
7e30: 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 6c 6c  () function foll
7e40: 6f 77 73 20 74 68 65 20 28 62 72 6f 6b 65 6e 29  ows the (broken)
7e50: 20 53 51 4c 20 73 74 61 6e 64 61 72 64 20 77 68   SQL standard wh
7e60: 69 63 68 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61  ich means.** tha
7e70: 74 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c  t it returns NUL
7e80: 4c 20 69 66 20 69 74 20 73 75 6d 73 20 6f 76 65  L if it sums ove
7e90: 72 20 6e 6f 20 69 6e 70 75 74 73 2e 20 20 54 4f  r no inputs.  TO
7ea0: 54 41 4c 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30  TAL returns.** 0
7eb0: 2e 30 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  .0 in that case.
7ec0: 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 2c 20 54    In addition, T
7ed0: 4f 54 41 4c 20 61 6c 77 61 79 73 20 72 65 74 75  OTAL always retu
7ee0: 72 6e 73 20 61 20 66 6c 6f 61 74 20 77 68 65 72  rns a float wher
7ef0: 65 0a 2a 2a 20 53 55 4d 20 6d 69 67 68 74 20 72  e.** SUM might r
7f00: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
7f10: 20 69 66 20 69 74 20 6e 65 76 65 72 20 65 6e 63   if it never enc
7f20: 6f 75 6e 74 65 72 73 20 61 20 66 6c 6f 61 74 69  ounters a floati
7f30: 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
7f40: 65 2e 20 20 54 4f 54 41 4c 20 6e 65 76 65 72 20  e.  TOTAL never 
7f50: 66 61 69 6c 73 2c 20 62 75 74 20 53 55 4d 20 6d  fails, but SUM m
7f60: 69 67 68 74 20 74 68 72 6f 75 67 68 20 61 6e 20  ight through an 
7f70: 65 78 63 65 70 74 69 6f 6e 20 69 66 0a 2a 2a 20  exception if.** 
7f80: 69 74 20 6f 76 65 72 66 6c 6f 77 73 20 61 6e 20  it overflows an 
7f90: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
7fa0: 69 63 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28  ic void sumStep(
7fb0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7fc0: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
7fd0: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
7fe0: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d  e **argv){.  Sum
7ff0: 43 74 78 20 2a 70 3b 0a 20 20 69 6e 74 20 74 79  Ctx *p;.  int ty
8000: 70 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72  pe;.  assert( ar
8010: 67 63 3d 3d 31 20 29 3b 0a 20 20 70 20 3d 20 73  gc==1 );.  p = s
8020: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
8030: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
8040: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
8050: 20 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f   type = sqlite3_
8060: 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79  value_numeric_ty
8070: 70 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  pe(argv[0]);.  i
8080: 66 28 20 70 20 26 26 20 74 79 70 65 21 3d 53 51  f( p && type!=SQ
8090: 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
80a0: 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 69   p->cnt++;.    i
80b0: 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  f( type==SQLITE_
80c0: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
80d0: 20 69 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33   i64 v = sqlite3
80e0: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
80f0: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  v[0]);.      p->
8100: 72 53 75 6d 20 2b 3d 20 76 3b 0a 20 20 20 20 20  rSum += v;.     
8110: 20 69 66 28 20 28 70 2d 3e 61 70 70 72 6f 78 7c   if( (p->approx|
8120: 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3d 3d 30 20  p->overflow)==0 
8130: 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  ){.        i64 i
8140: 4e 65 77 53 75 6d 20 3d 20 70 2d 3e 69 53 75 6d  NewSum = p->iSum
8150: 20 2b 20 76 3b 0a 20 20 20 20 20 20 20 20 69 6e   + v;.        in
8160: 74 20 73 31 20 3d 20 70 2d 3e 69 53 75 6d 20 3e  t s1 = p->iSum >
8170: 3e 20 28 73 69 7a 65 6f 66 28 69 36 34 29 2a 38  > (sizeof(i64)*8
8180: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  -1);.        int
8190: 20 73 32 20 3d 20 76 20 20 20 20 20 20 20 3e 3e   s2 = v       >>
81a0: 20 28 73 69 7a 65 6f 66 28 69 36 34 29 2a 38 2d   (sizeof(i64)*8-
81b0: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  1);.        int 
81c0: 73 33 20 3d 20 69 4e 65 77 53 75 6d 20 3e 3e 20  s3 = iNewSum >> 
81d0: 28 73 69 7a 65 6f 66 28 69 36 34 29 2a 38 2d 31  (sizeof(i64)*8-1
81e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 76  );.        p->ov
81f0: 65 72 66 6c 6f 77 20 3d 20 28 73 31 26 73 32 26  erflow = (s1&s2&
8200: 7e 73 33 29 20 7c 20 28 7e 73 31 26 7e 73 32 26  ~s3) | (~s1&~s2&
8210: 73 33 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  s3);.        p->
8220: 69 53 75 6d 20 3d 20 69 4e 65 77 53 75 6d 3b 0a  iSum = iNewSum;.
8230: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8240: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 53 75 6d  e{.      p->rSum
8250: 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   += sqlite3_valu
8260: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d  e_double(argv[0]
8270: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 70 72  );.      p->appr
8280: 6f 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ox = 1;.    }.  
8290: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
82a0: 73 75 6d 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  sumFinalize(sqli
82b0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
82c0: 74 65 78 74 29 7b 0a 20 20 53 75 6d 43 74 78 20  text){.  SumCtx 
82d0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
82e0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
82f0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b  ext(context, 0);
8300: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 63  .  if( p && p->c
8310: 6e 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  nt>0 ){.    if( 
8320: 70 2d 3e 6f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  p->overflow ){. 
8330: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8340: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
8350: 74 2c 22 69 6e 74 65 67 65 72 20 6f 76 65 72 66  t,"integer overf
8360: 6c 6f 77 22 2c 2d 31 29 3b 0a 20 20 20 20 7d 65  low",-1);.    }e
8370: 6c 73 65 20 69 66 28 20 70 2d 3e 61 70 70 72 6f  lse if( p->appro
8380: 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
8390: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
83a0: 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 72 53 75  (context, p->rSu
83b0: 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  m);.    }else{. 
83c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
83d0: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
83e0: 74 2c 20 70 2d 3e 69 53 75 6d 29 3b 0a 20 20 20  t, p->iSum);.   
83f0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
8400: 76 6f 69 64 20 61 76 67 46 69 6e 61 6c 69 7a 65  void avgFinalize
8410: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
8420: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75   *context){.  Su
8430: 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  mCtx *p;.  p = s
8440: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
8450: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
8460: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26  , 0);.  if( p &&
8470: 20 70 2d 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20   p->cnt>0 ){.   
8480: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8490: 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20  double(context, 
84a0: 70 2d 3e 72 53 75 6d 2f 28 64 6f 75 62 6c 65 29  p->rSum/(double)
84b0: 70 2d 3e 63 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 73  p->cnt);.  }.}.s
84c0: 74 61 74 69 63 20 76 6f 69 64 20 74 6f 74 61 6c  tatic void total
84d0: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
84e0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
84f0: 74 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b  t){.  SumCtx *p;
8500: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
8510: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
8520: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
8530: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
8540: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 70  ouble(context, p
8550: 20 3f 20 70 2d 3e 72 53 75 6d 20 3a 20 30 2e 30   ? p->rSum : 0.0
8560: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
8570: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
8580: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
8590: 6f 66 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61  of state informa
85a0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20  tion for the.** 
85b0: 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74  count() aggregat
85c0: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74  e function..*/.t
85d0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 6f  ypedef struct Co
85e0: 75 6e 74 43 74 78 20 43 6f 75 6e 74 43 74 78 3b  untCtx CountCtx;
85f0: 0a 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78  .struct CountCtx
8600: 20 7b 0a 20 20 69 36 34 20 6e 3b 0a 7d 3b 0a 0a   {.  i64 n;.};..
8610: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74  /*.** Routines t
8620: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
8630: 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74  count() aggregat
8640: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  e function..*/.s
8650: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74  tatic void count
8660: 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Step(sqlite3_con
8670: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
8680: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
8690: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
86a0: 20 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20    CountCtx *p;. 
86b0: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
86c0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
86d0: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
86e0: 70 29 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63  p));.  if( (argc
86f0: 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55  ==0 || SQLITE_NU
8700: 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL!=sqlite3_valu
8710: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 29  e_type(argv[0]))
8720: 20 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e   && p ){.    p->
8730: 6e 2b 2b 3b 0a 20 20 7d 0a 7d 20 20 20 0a 73 74  n++;.  }.}   .st
8740: 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 46  atic void countF
8750: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
8760: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
8770: 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20 2a 70  ){.  CountCtx *p
8780: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
8790: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
87a0: 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20  t(context, 0);. 
87b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
87c0: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70  int64(context, p
87d0: 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a   ? p->n : 0);.}.
87e0: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
87f0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 69 6e  to implement min
8800: 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61 67 67  () and max() agg
8810: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
8820: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8830: 20 6d 69 6e 6d 61 78 53 74 65 70 28 73 71 6c 69   minmaxStep(sqli
8840: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
8850: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
8860: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8870: 61 72 67 76 29 7b 0a 20 20 4d 65 6d 20 2a 70 41  argv){.  Mem *pA
8880: 72 67 20 20 3d 20 28 4d 65 6d 20 2a 29 61 72 67  rg  = (Mem *)arg
8890: 76 5b 30 5d 3b 0a 20 20 4d 65 6d 20 2a 70 42 65  v[0];.  Mem *pBe
88a0: 73 74 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  st;..  if( sqlit
88b0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
88c0: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
88d0: 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ULL ) return;.  
88e0: 70 42 65 73 74 20 3d 20 28 4d 65 6d 20 2a 29 73  pBest = (Mem *)s
88f0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
8900: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
8910: 2c 20 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29  , sizeof(*pBest)
8920: 29 3b 0a 20 20 69 66 28 20 21 70 42 65 73 74 20  );.  if( !pBest 
8930: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
8940: 20 70 42 65 73 74 2d 3e 66 6c 61 67 73 20 29 7b   pBest->flags ){
8950: 0a 20 20 20 20 69 6e 74 20 6d 61 78 3b 0a 20 20  .    int max;.  
8960: 20 20 69 6e 74 20 63 6d 70 3b 0a 20 20 20 20 43    int cmp;.    C
8970: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
8980: 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f  sqlite3GetFuncCo
8990: 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74 29 3b 0a  llSeq(context);.
89a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 65 70      /* This step
89b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
89c0: 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 6d  d for both the m
89d0: 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 61  in() and max() a
89e0: 67 67 72 65 67 61 74 65 73 2c 0a 20 20 20 20 2a  ggregates,.    *
89f0: 2a 20 74 68 65 20 6f 6e 6c 79 20 64 69 66 66 65  * the only diffe
8a00: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
8a10: 65 20 74 77 6f 20 62 65 69 6e 67 20 74 68 61 74  e two being that
8a20: 20 74 68 65 20 73 65 6e 73 65 20 6f 66 20 74 68   the sense of th
8a30: 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69  e.    ** compari
8a40: 73 6f 6e 20 69 73 20 69 6e 76 65 72 74 65 64 2e  son is inverted.
8a50: 20 46 6f 72 20 74 68 65 20 6d 61 78 28 29 20 61   For the max() a
8a60: 67 67 72 65 67 61 74 65 2c 20 74 68 65 0a 20 20  ggregate, the.  
8a70: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 73 65    ** sqlite3_use
8a80: 72 5f 64 61 74 61 28 29 20 66 75 6e 63 74 69 6f  r_data() functio
8a90: 6e 20 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20  n returns (void 
8aa0: 2a 29 2d 31 2e 20 46 6f 72 20 6d 69 6e 28 29 20  *)-1. For min() 
8ab0: 69 74 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  it.    ** return
8ac0: 73 20 28 76 6f 69 64 20 2a 29 64 62 2c 20 77 68  s (void *)db, wh
8ad0: 65 72 65 20 64 62 20 69 73 20 74 68 65 20 73 71  ere db is the sq
8ae0: 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73 65 20  lite3* database 
8af0: 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20 2a 2a 20  pointer..    ** 
8b00: 54 68 65 72 65 66 6f 72 65 20 74 68 65 20 6e 65  Therefore the ne
8b10: 78 74 20 73 74 61 74 65 6d 65 6e 74 20 73 65 74  xt statement set
8b20: 73 20 76 61 72 69 61 62 6c 65 20 27 6d 61 78 27  s variable 'max'
8b30: 20 74 6f 20 31 20 66 6f 72 20 74 68 65 20 6d 61   to 1 for the ma
8b40: 78 28 29 0a 20 20 20 20 2a 2a 20 61 67 67 72 65  x().    ** aggre
8b50: 67 61 74 65 2c 20 6f 72 20 30 20 66 6f 72 20 6d  gate, or 0 for m
8b60: 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  in()..    */.   
8b70: 20 6d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 75   max = sqlite3_u
8b80: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
8b90: 29 21 3d 30 3b 0a 20 20 20 20 63 6d 70 20 3d 20  )!=0;.    cmp = 
8ba0: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
8bb0: 65 28 70 42 65 73 74 2c 20 70 41 72 67 2c 20 70  e(pBest, pArg, p
8bc0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 28  Coll);.    if( (
8bd0: 6d 61 78 20 26 26 20 63 6d 70 3c 30 29 20 7c 7c  max && cmp<0) ||
8be0: 20 28 21 6d 61 78 20 26 26 20 63 6d 70 3e 30 29   (!max && cmp>0)
8bf0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8c00: 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 70 42 65  3VdbeMemCopy(pBe
8c10: 73 74 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d  st, pArg);.    }
8c20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
8c30: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
8c40: 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20  (pBest, pArg);. 
8c50: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
8c60: 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 28   minMaxFinalize(
8c70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8c80: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c  *context){.  sql
8c90: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 73  ite3_value *pRes
8ca0: 3b 0a 20 20 70 52 65 73 20 3d 20 28 73 71 6c 69  ;.  pRes = (sqli
8cb0: 74 65 33 5f 76 61 6c 75 65 20 2a 29 73 71 6c 69  te3_value *)sqli
8cc0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
8cd0: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 30  ntext(context, 0
8ce0: 29 3b 0a 20 20 69 66 28 20 70 52 65 73 20 29 7b  );.  if( pRes ){
8cf0: 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 66  .    if( pRes->f
8d00: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 73 71  lags ){.      sq
8d10: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
8d20: 75 65 28 63 6f 6e 74 65 78 74 2c 20 70 52 65 73  ue(context, pRes
8d30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
8d40: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
8d50: 73 65 28 70 52 65 73 29 3b 0a 20 20 7d 0a 7d 0a  se(pRes);.  }.}.
8d60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
8d70: 63 74 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64  ction registered
8d80: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
8d90: 65 20 43 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  e C functions as
8da0: 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   SQL.** function
8db0: 73 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  s.  This should 
8dc0: 62 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74  be the only rout
8dd0: 69 6e 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ine in this file
8de0: 20 77 69 74 68 0a 2a 2a 20 65 78 74 65 72 6e 61   with.** externa
8df0: 6c 20 6c 69 6e 6b 61 67 65 2e 0a 2a 2f 0a 76 6f  l linkage..*/.vo
8e00: 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  id sqlite3Regist
8e10: 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f  erBuiltinFunctio
8e20: 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ns(sqlite3 *db){
8e30: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
8e40: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
8e50: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
8e60: 73 69 67 6e 65 64 20 63 68 61 72 20 6e 41 72 67  signed char nArg
8e70: 3b 0a 20 20 20 20 20 75 38 20 61 72 67 54 79 70  ;.     u8 argTyp
8e80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
8e90: 66 66 3a 20 64 62 20 20 20 31 3a 20 30 2c 20 32  ff: db   1: 0, 2
8ea0: 3a 20 31 2c 20 33 3a 20 32 2c 2e 2e 2e 20 20 4e  : 1, 3: 2,...  N
8eb0: 3a 20 20 4e 2d 31 2e 20 2a 2f 0a 20 20 20 20 20  :  N-1. */.     
8ec0: 75 38 20 65 54 65 78 74 52 65 70 3b 20 20 20 20  u8 eTextRep;    
8ed0: 20 20 20 20 20 20 2f 2a 20 31 3a 20 55 54 46 2d        /* 1: UTF-
8ee0: 31 36 2e 20 20 30 3a 20 55 54 46 2d 38 20 2a 2f  16.  0: UTF-8 */
8ef0: 0a 20 20 20 20 20 75 38 20 6e 65 65 64 43 6f 6c  .     u8 needCol
8f00: 6c 53 65 71 3b 0a 20 20 20 20 20 76 6f 69 64 20  lSeq;.     void 
8f10: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
8f20: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
8f30: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 3b  lite3_value **);
8f40: 0a 20 20 7d 20 61 46 75 6e 63 73 5b 5d 20 3d 20  .  } aFuncs[] = 
8f50: 7b 0a 20 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20  {.    { "min",  
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
8f70: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
8f80: 20 20 20 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e      1, minmaxFun
8f90: 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 6e 22  c },.    { "min"
8fa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8fb0: 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   0, 0, SQLITE_UT
8fc0: 46 38 2c 20 20 20 20 31 2c 20 30 20 20 20 20 20  F8,    1, 0     
8fd0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
8fe0: 61 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ax",            
8ff0: 20 20 20 2d 31 2c 20 31 2c 20 53 51 4c 49 54 45     -1, 1, SQLITE
9000: 5f 55 54 46 38 2c 20 20 20 20 31 2c 20 6d 69 6e  _UTF8,    1, min
9010: 6d 61 78 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b  maxFunc },.    {
9020: 20 22 6d 61 78 22 2c 20 20 20 20 20 20 20 20 20   "max",         
9030: 20 20 20 20 20 20 20 30 2c 20 31 2c 20 53 51 4c         0, 1, SQL
9040: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 31 2c 20  ITE_UTF8,    1, 
9050: 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  0          },.  
9060: 20 20 7b 20 22 74 79 70 65 6f 66 22 2c 20 20 20    { "typeof",   
9070: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
9080: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
9090: 30 2c 20 74 79 70 65 6f 66 46 75 6e 63 20 7d 2c  0, typeofFunc },
90a0: 0a 20 20 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c  .    { "length",
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
90c0: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
90d0: 20 20 20 30 2c 20 6c 65 6e 67 74 68 46 75 6e 63     0, lengthFunc
90e0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 75 62 73 74   },.    { "subst
90f0: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
9100: 33 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  3, 0, SQLITE_UTF
9110: 38 2c 20 20 20 20 30 2c 20 73 75 62 73 74 72 46  8,    0, substrF
9120: 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 61 62  unc },.    { "ab
9130: 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  s",             
9140: 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f     1, 0, SQLITE_
9150: 55 54 46 38 2c 20 20 20 20 30 2c 20 61 62 73 46  UTF8,    0, absF
9160: 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  unc    },.    { 
9170: 22 72 6f 75 6e 64 22 2c 20 20 20 20 20 20 20 20  "round",        
9180: 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49        1, 0, SQLI
9190: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 72  TE_UTF8,    0, r
91a0: 6f 75 6e 64 46 75 6e 63 20 20 7d 2c 0a 20 20 20  oundFunc  },.   
91b0: 20 7b 20 22 72 6f 75 6e 64 22 2c 20 20 20 20 20   { "round",     
91c0: 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53           2, 0, S
91d0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
91e0: 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 7d 2c 0a  , roundFunc  },.
91f0: 20 20 20 20 7b 20 22 75 70 70 65 72 22 2c 20 20      { "upper",  
9200: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
9210: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
9220: 20 20 30 2c 20 75 70 70 65 72 46 75 6e 63 20 20    0, upperFunc  
9230: 7d 2c 0a 20 20 20 20 7b 20 22 6c 6f 77 65 72 22  },.    { "lower"
9240: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ,              1
9250: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
9260: 2c 20 20 20 20 30 2c 20 6c 6f 77 65 72 46 75 6e  ,    0, lowerFun
9270: 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 61  c  },.    { "coa
9280: 6c 65 73 63 65 22 2c 20 20 20 20 20 20 20 20 20  lesce",         
9290: 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55   -1, 0, SQLITE_U
92a0: 54 46 38 2c 20 20 20 20 30 2c 20 69 66 6e 75 6c  TF8,    0, ifnul
92b0: 6c 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  lFunc },.    { "
92c0: 63 6f 61 6c 65 73 63 65 22 2c 20 20 20 20 20 20  coalesce",      
92d0: 20 20 20 20 20 30 2c 20 30 2c 20 53 51 4c 49 54       0, 0, SQLIT
92e0: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 30 20  E_UTF8,    0, 0 
92f0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9300: 7b 20 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 20  { "coalesce",   
9310: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51          1, 0, SQ
9320: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
9330: 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20   0          },. 
9340: 20 20 20 7b 20 22 68 65 78 22 2c 20 20 20 20 20     { "hex",     
9350: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
9360: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
9370: 20 30 2c 20 68 65 78 46 75 6e 63 20 20 20 20 7d   0, hexFunc    }
9380: 2c 0a 20 20 20 20 7b 20 22 69 66 6e 75 6c 6c 22  ,.    { "ifnull"
9390: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c  ,             2,
93a0: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
93b0: 20 20 20 20 31 2c 20 69 66 6e 75 6c 6c 46 75 6e      1, ifnullFun
93c0: 63 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6e 64  c },.    { "rand
93d0: 6f 6d 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  om",            
93e0: 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54  -1, 0, SQLITE_UT
93f0: 46 38 2c 20 20 20 20 30 2c 20 72 61 6e 64 6f 6d  F8,    0, random
9400: 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 72  Func },.    { "r
9410: 61 6e 64 6f 6d 62 6c 6f 62 22 2c 20 20 20 20 20  andomblob",     
9420: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
9430: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 72 61 6e  _UTF8,    0, ran
9440: 64 6f 6d 42 6c 6f 62 20 7d 2c 0a 20 20 20 20 7b  domBlob },.    {
9450: 20 22 6e 75 6c 6c 69 66 22 2c 20 20 20 20 20 20   "nullif",      
9460: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c         2, 0, SQL
9470: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 31 2c 20  ITE_UTF8,    1, 
9480: 6e 75 6c 6c 69 66 46 75 6e 63 20 7d 2c 0a 20 20  nullifFunc },.  
9490: 20 20 7b 20 22 73 71 6c 69 74 65 5f 76 65 72 73    { "sqlite_vers
94a0: 69 6f 6e 22 2c 20 20 20 20 20 30 2c 20 30 2c 20  ion",     0, 0, 
94b0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
94c0: 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63 7d 2c  0, versionFunc},
94d0: 0a 20 20 20 20 7b 20 22 71 75 6f 74 65 22 2c 20  .    { "quote", 
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
94f0: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
9500: 20 20 20 30 2c 20 71 75 6f 74 65 46 75 6e 63 20     0, quoteFunc 
9510: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 73 74 5f   },.    { "last_
9520: 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20  insert_rowid",  
9530: 30 2c 20 30 78 66 66 2c 20 53 51 4c 49 54 45 5f  0, 0xff, SQLITE_
9540: 55 54 46 38 2c 20 30 2c 20 6c 61 73 74 5f 69 6e  UTF8, 0, last_in
9550: 73 65 72 74 5f 72 6f 77 69 64 20 7d 2c 0a 20 20  sert_rowid },.  
9560: 20 20 7b 20 22 63 68 61 6e 67 65 73 22 2c 20 20    { "changes",  
9570: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 78 66            0, 0xf
9580: 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  f, SQLITE_UTF8, 
9590: 30 2c 20 63 68 61 6e 67 65 73 20 20 20 20 20 20  0, changes      
95a0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
95b0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c 20 20  otal_changes",  
95c0: 20 20 20 20 30 2c 20 30 78 66 66 2c 20 53 51 4c      0, 0xff, SQL
95d0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 6f 74  ITE_UTF8, 0, tot
95e0: 61 6c 5f 63 68 61 6e 67 65 73 20 20 20 20 20 7d  al_changes     }
95f0: 2c 0a 20 20 20 20 7b 20 22 72 65 70 6c 61 63 65  ,.    { "replace
9600: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 33 2c  ",            3,
9610: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
9620: 20 20 20 20 30 2c 20 72 65 70 6c 61 63 65 46 75      0, replaceFu
9630: 6e 63 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  nc       },.    
9640: 7b 20 22 6c 74 72 69 6d 22 2c 20 20 20 20 20 20  { "ltrim",      
9650: 20 20 20 20 20 20 20 20 31 2c 20 31 2c 20 53 51          1, 1, SQ
9660: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
9670: 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20   trimFunc       
9680: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 74 72     },.    { "ltr
9690: 69 6d 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  im",            
96a0: 20 20 32 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55    2, 1, SQLITE_U
96b0: 54 46 38 2c 20 20 20 20 30 2c 20 74 72 69 6d 46  TF8,    0, trimF
96c0: 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  unc          },.
96d0: 20 20 20 20 7b 20 22 72 74 72 69 6d 22 2c 20 20      { "rtrim",  
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 32              1, 2
96f0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
9700: 20 20 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20    0, trimFunc   
9710: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9720: 22 72 74 72 69 6d 22 2c 20 20 20 20 20 20 20 20  "rtrim",        
9730: 20 20 20 20 20 20 32 2c 20 32 2c 20 53 51 4c 49        2, 2, SQLI
9740: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 74  TE_UTF8,    0, t
9750: 72 69 6d 46 75 6e 63 20 20 20 20 20 20 20 20 20  rimFunc         
9760: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 69 6d 22   },.    { "trim"
9770: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9780: 31 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 3, SQLITE_UTF
9790: 38 2c 20 20 20 20 30 2c 20 74 72 69 6d 46 75 6e  8,    0, trimFun
97a0: 63 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  c          },.  
97b0: 20 20 7b 20 22 74 72 69 6d 22 2c 20 20 20 20 20    { "trim",     
97c0: 20 20 20 20 20 20 20 20 20 20 32 2c 20 33 2c 20            2, 3, 
97d0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
97e0: 30 2c 20 74 72 69 6d 46 75 6e 63 20 20 20 20 20  0, trimFunc     
97f0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 7a       },.    { "z
9800: 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  eroblob",       
9810: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
9820: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 7a 65 72  _UTF8,    0, zer
9830: 6f 62 6c 6f 62 46 75 6e 63 20 20 20 20 20 20 7d  oblobFunc      }
9840: 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
9850: 53 4f 55 4e 44 45 58 0a 20 20 20 20 7b 20 22 73  SOUNDEX.    { "s
9860: 6f 75 6e 64 65 78 22 2c 20 20 20 20 20 20 20 20  oundex",        
9870: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
9880: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 73 6f 75  _UTF8,    0, sou
9890: 6e 64 65 78 46 75 6e 63 7d 2c 0a 23 65 6e 64 69  ndexFunc},.#endi
98a0: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
98b0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
98c0: 53 49 4f 4e 0a 20 20 20 20 7b 20 22 6c 6f 61 64  SION.    { "load
98d0: 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20  _extension",    
98e0: 20 31 2c 20 30 78 66 66 2c 20 53 51 4c 49 54 45   1, 0xff, SQLITE
98f0: 5f 55 54 46 38 2c 20 30 2c 20 6c 6f 61 64 45 78  _UTF8, 0, loadEx
9900: 74 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 6f 61 64  t },.    { "load
9910: 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20  _extension",    
9920: 20 32 2c 20 30 78 66 66 2c 20 53 51 4c 49 54 45   2, 0xff, SQLITE
9930: 5f 55 54 46 38 2c 20 30 2c 20 6c 6f 61 64 45 78  _UTF8, 0, loadEx
9940: 74 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64  t },.#endif.#ifd
9950: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
9960: 20 20 20 7b 20 22 72 61 6e 64 73 74 72 22 2c 20     { "randstr", 
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c                2,
9980: 20 30 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54   0,    SQLITE_UT
9990: 46 38 2c 20 30 2c 20 72 61 6e 64 53 74 72 20 20  F8, 0, randStr  
99a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73 74    },.    { "test
99b0: 5f 64 65 73 74 72 75 63 74 6f 72 22 2c 20 20 20  _destructor",   
99c0: 20 20 20 20 31 2c 20 30 78 66 66 2c 20 53 51 4c      1, 0xff, SQL
99d0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 65 73  ITE_UTF8, 0, tes
99e0: 74 5f 64 65 73 74 72 75 63 74 6f 72 7d 2c 0a 20  t_destructor},. 
99f0: 20 20 20 7b 20 22 74 65 73 74 5f 64 65 73 74 72     { "test_destr
9a00: 75 63 74 6f 72 5f 63 6f 75 6e 74 22 2c 20 30 2c  uctor_count", 0,
9a10: 20 30 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54   0,    SQLITE_UT
9a20: 46 38 2c 20 30 2c 20 74 65 73 74 5f 64 65 73 74  F8, 0, test_dest
9a30: 72 75 63 74 6f 72 5f 63 6f 75 6e 74 7d 2c 0a 20  ructor_count},. 
9a40: 20 20 20 7b 20 22 74 65 73 74 5f 61 75 78 64 61     { "test_auxda
9a50: 74 61 22 2c 20 20 20 20 20 20 20 20 20 2d 31 2c  ta",         -1,
9a60: 20 30 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54   0,    SQLITE_UT
9a70: 46 38 2c 20 30 2c 20 74 65 73 74 5f 61 75 78 64  F8, 0, test_auxd
9a80: 61 74 61 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73  ata},.    { "tes
9a90: 74 5f 65 72 72 6f 72 22 2c 20 20 20 20 20 20 20  t_error",       
9aa0: 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20 53 51       1, 0,    SQ
9ab0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 65  LITE_UTF8, 0, te
9ac0: 73 74 5f 65 72 72 6f 72 7d 2c 0a 23 65 6e 64 69  st_error},.#endi
9ad0: 66 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  f.  };.  static 
9ae0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
9af0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
9b00: 20 20 20 20 73 69 67 6e 65 64 20 63 68 61 72 20      signed char 
9b10: 6e 41 72 67 3b 0a 20 20 20 20 75 38 20 61 72 67  nArg;.    u8 arg
9b20: 54 79 70 65 3b 0a 20 20 20 20 75 38 20 6e 65 65  Type;.    u8 nee
9b30: 64 43 6f 6c 6c 53 65 71 3b 0a 20 20 20 20 76 6f  dCollSeq;.    vo
9b40: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
9b50: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
9b60: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
9b70: 29 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a 78 46  );.    void (*xF
9b80: 69 6e 61 6c 69 7a 65 29 28 73 71 6c 69 74 65 33  inalize)(sqlite3
9b90: 5f 63 6f 6e 74 65 78 74 2a 29 3b 0a 20 20 7d 20  _context*);.  } 
9ba0: 61 41 67 67 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  aAggs[] = {.    
9bb0: 7b 20 22 6d 69 6e 22 2c 20 20 20 20 31 2c 20 30  { "min",    1, 0
9bc0: 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c  , 1, minmaxStep,
9bd0: 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a     minMaxFinaliz
9be0: 65 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 78 22  e },.    { "max"
9bf0: 2c 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 6d 69  ,    1, 1, 1, mi
9c00: 6e 6d 61 78 53 74 65 70 2c 20 20 20 6d 69 6e 4d  nmaxStep,   minM
9c10: 61 78 46 69 6e 61 6c 69 7a 65 20 7d 2c 0a 20 20  axFinalize },.  
9c20: 20 20 7b 20 22 73 75 6d 22 2c 20 20 20 20 31 2c    { "sum",    1,
9c30: 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70 2c 20   0, 0, sumStep, 
9c40: 20 20 20 20 20 73 75 6d 46 69 6e 61 6c 69 7a 65       sumFinalize
9c50: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f      },.    { "to
9c60: 74 61 6c 22 2c 20 20 31 2c 20 30 2c 20 30 2c 20  tal",  1, 0, 0, 
9c70: 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20 74 6f  sumStep,      to
9c80: 74 61 6c 46 69 6e 61 6c 69 7a 65 20 20 20 20 7d  talFinalize    }
9c90: 2c 0a 20 20 20 20 7b 20 22 61 76 67 22 2c 20 20  ,.    { "avg",  
9ca0: 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74    1, 0, 0, sumSt
9cb0: 65 70 2c 20 20 20 20 20 20 61 76 67 46 69 6e 61  ep,      avgFina
9cc0: 6c 69 7a 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b  lize    },.    {
9cd0: 20 22 63 6f 75 6e 74 22 2c 20 20 30 2c 20 30 2c   "count",  0, 0,
9ce0: 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20   0, countStep,  
9cf0: 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20    countFinalize 
9d00: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 75 6e 74   },.    { "count
9d10: 22 2c 20 20 31 2c 20 30 2c 20 30 2c 20 63 6f 75  ",  1, 0, 0, cou
9d20: 6e 74 53 74 65 70 2c 20 20 20 20 63 6f 75 6e 74  ntStep,    count
9d30: 46 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20 20 7d  Finalize  },.  }
9d40: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f  ;.  int i;..  fo
9d50: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
9d60: 61 46 75 6e 63 73 29 2f 73 69 7a 65 6f 66 28 61  aFuncs)/sizeof(a
9d70: 46 75 6e 63 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  Funcs[0]); i++){
9d80: 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 3b  .    void *pArg;
9d90: 0a 20 20 20 20 75 38 20 61 72 67 54 79 70 65 20  .    u8 argType 
9da0: 3d 20 61 46 75 6e 63 73 5b 69 5d 2e 61 72 67 54  = aFuncs[i].argT
9db0: 79 70 65 3b 0a 20 20 20 20 69 66 28 20 61 72 67  ype;.    if( arg
9dc0: 54 79 70 65 3d 3d 30 78 66 66 20 29 7b 0a 20 20  Type==0xff ){.  
9dd0: 20 20 20 20 70 41 72 67 20 3d 20 64 62 3b 0a 20      pArg = db;. 
9de0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9df0: 70 41 72 67 20 3d 20 28 76 6f 69 64 2a 29 28 69  pArg = (void*)(i
9e00: 6e 74 29 61 72 67 54 79 70 65 3b 0a 20 20 20 20  nt)argType;.    
9e10: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  }.    sqlite3Cre
9e20: 61 74 65 46 75 6e 63 28 64 62 2c 20 61 46 75 6e  ateFunc(db, aFun
9e30: 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75  cs[i].zName, aFu
9e40: 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c 0a 20 20 20  ncs[i].nArg,.   
9e50: 20 20 20 20 20 61 46 75 6e 63 73 5b 69 5d 2e 65       aFuncs[i].e
9e60: 54 65 78 74 52 65 70 2c 20 70 41 72 67 2c 20 61  TextRep, pArg, a
9e70: 46 75 6e 63 73 5b 69 5d 2e 78 46 75 6e 63 2c 20  Funcs[i].xFunc, 
9e80: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61  0, 0);.    if( a
9e90: 46 75 6e 63 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c  Funcs[i].needCol
9ea0: 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 46 75  lSeq ){.      Fu
9eb0: 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 73  ncDef *pFunc = s
9ec0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
9ed0: 6f 6e 28 64 62 2c 20 61 46 75 6e 63 73 5b 69 5d  on(db, aFuncs[i]
9ee0: 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
9ef0: 20 20 20 73 74 72 6c 65 6e 28 61 46 75 6e 63 73     strlen(aFuncs
9f00: 5b 69 5d 2e 7a 4e 61 6d 65 29 2c 20 61 46 75 6e  [i].zName), aFun
9f10: 63 73 5b 69 5d 2e 6e 41 72 67 2c 20 61 46 75 6e  cs[i].nArg, aFun
9f20: 63 73 5b 69 5d 2e 65 54 65 78 74 52 65 70 2c 20  cs[i].eTextRep, 
9f30: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  0);.      if( pF
9f40: 75 6e 63 20 26 26 20 61 46 75 6e 63 73 5b 69 5d  unc && aFuncs[i]
9f50: 2e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a  .needCollSeq ){.
9f60: 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 6e          pFunc->n
9f70: 65 65 64 43 6f 6c 6c 53 65 71 20 3d 20 31 3b 0a  eedCollSeq = 1;.
9f80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9f90: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
9fa0: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
9fb0: 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72 46  .  sqlite3AlterF
9fc0: 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 23 65  unctions(db);.#e
9fd0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
9fe0: 49 54 45 5f 4f 4d 49 54 5f 50 41 52 53 45 52 0a  ITE_OMIT_PARSER.
9ff0: 20 20 73 71 6c 69 74 65 33 41 74 74 61 63 68 46    sqlite3AttachF
a000: 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 23 65  unctions(db);.#e
a010: 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ndif.  for(i=0; 
a020: 69 3c 73 69 7a 65 6f 66 28 61 41 67 67 73 29 2f  i<sizeof(aAggs)/
a030: 73 69 7a 65 6f 66 28 61 41 67 67 73 5b 30 5d 29  sizeof(aAggs[0])
a040: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 6f 69 64  ; i++){.    void
a050: 20 2a 70 41 72 67 20 3d 20 28 76 6f 69 64 2a 29   *pArg = (void*)
a060: 28 69 6e 74 29 61 41 67 67 73 5b 69 5d 2e 61 72  (int)aAggs[i].ar
a070: 67 54 79 70 65 3b 0a 20 20 20 20 73 71 6c 69 74  gType;.    sqlit
a080: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
a090: 20 61 41 67 67 73 5b 69 5d 2e 7a 4e 61 6d 65 2c   aAggs[i].zName,
a0a0: 20 61 41 67 67 73 5b 69 5d 2e 6e 41 72 67 2c 20   aAggs[i].nArg, 
a0b0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20  SQLITE_UTF8, .  
a0c0: 20 20 20 20 20 20 70 41 72 67 2c 20 30 2c 20 61        pArg, 0, a
a0d0: 41 67 67 73 5b 69 5d 2e 78 53 74 65 70 2c 20 61  Aggs[i].xStep, a
a0e0: 41 67 67 73 5b 69 5d 2e 78 46 69 6e 61 6c 69 7a  Aggs[i].xFinaliz
a0f0: 65 29 3b 0a 20 20 20 20 69 66 28 20 61 41 67 67  e);.    if( aAgg
a100: 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71  s[i].needCollSeq
a110: 20 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65   ){.      FuncDe
a120: 66 20 2a 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  f *pFunc = sqlit
a130: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 20  e3FindFunction( 
a140: 64 62 2c 20 61 41 67 67 73 5b 69 5d 2e 7a 4e 61  db, aAggs[i].zNa
a150: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 73 74  me,.          st
a160: 72 6c 65 6e 28 61 41 67 67 73 5b 69 5d 2e 7a 4e  rlen(aAggs[i].zN
a170: 61 6d 65 29 2c 20 61 41 67 67 73 5b 69 5d 2e 6e  ame), aAggs[i].n
a180: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
a190: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
a1a0: 70 46 75 6e 63 20 26 26 20 61 41 67 67 73 5b 69  pFunc && aAggs[i
a1b0: 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ].needCollSeq ){
a1c0: 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
a1d0: 6e 65 65 64 43 6f 6c 6c 53 65 71 20 3d 20 31 3b  needCollSeq = 1;
a1e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a1f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69   }.  sqlite3Regi
a200: 73 74 65 72 44 61 74 65 54 69 6d 65 46 75 6e 63  sterDateTimeFunc
a210: 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20 69 66 28  tions(db);.  if(
a220: 20 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46   !sqlite3MallocF
a230: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 69  ailed() ){.    i
a240: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
a250: 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
a260: 6e 28 64 62 2c 20 22 4d 41 54 43 48 22 2c 20 32  n(db, "MATCH", 2
a270: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
a280: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
a290: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
a2a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
a2b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
a2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 61 69        sqlite3Fai
a2d0: 6c 65 64 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ledMalloc();.   
a2e0: 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
a2f0: 4c 49 54 45 5f 53 53 45 0a 20 20 28 76 6f 69 64  LITE_SSE.  (void
a300: 29 73 71 6c 69 74 65 33 53 73 65 46 75 6e 63 74  )sqlite3SseFunct
a310: 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64 69 66  ions(db);.#endif
a320: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
a330: 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49  ASE_SENSITIVE_LI
a340: 4b 45 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69  KE.  sqlite3Regi
a350: 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  sterLikeFunction
a360: 73 28 64 62 2c 20 31 29 3b 0a 23 65 6c 73 65 0a  s(db, 1);.#else.
a370: 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65    sqlite3Registe
a380: 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 64  rLikeFunctions(d
a390: 62 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  b, 0);.#endif.}.
a3a0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 4c  ./*.** Set the L
a3b0: 49 4b 45 4f 50 54 20 66 6c 61 67 20 6f 6e 20 74  IKEOPT flag on t
a3c0: 68 65 20 32 2d 61 72 67 75 6d 65 6e 74 20 66 75  he 2-argument fu
a3d0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
a3e0: 67 69 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  given name..*/.s
a3f0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4c 69  tatic void setLi
a400: 6b 65 4f 70 74 46 6c 61 67 28 73 71 6c 69 74 65  keOptFlag(sqlite
a410: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
a420: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c  r *zName, int fl
a430: 61 67 56 61 6c 29 7b 0a 20 20 46 75 6e 63 44 65  agVal){.  FuncDe
a440: 66 20 2a 70 44 65 66 3b 0a 20 20 70 44 65 66 20  f *pDef;.  pDef 
a450: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
a460: 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ction(db, zName,
a470: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2c 20   strlen(zName), 
a480: 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
a490: 30 29 3b 0a 20 20 69 66 28 20 70 44 65 66 20 29  0);.  if( pDef )
a4a0: 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66 6c 61 67  {.    pDef->flag
a4b0: 73 20 3d 20 66 6c 61 67 56 61 6c 3b 0a 20 20 7d  s = flagVal;.  }
a4c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
a4d0: 65 72 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  er the built-in 
a4e0: 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66 75  LIKE and GLOB fu
a4f0: 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 63 61  nctions.  The ca
a500: 73 65 53 65 6e 73 69 74 69 76 65 0a 2a 2a 20 70  seSensitive.** p
a510: 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
a520: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
a530: 6f 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  ot the LIKE oper
a540: 61 74 6f 72 20 69 73 20 63 61 73 65 0a 2a 2a 20  ator is case.** 
a550: 73 65 6e 73 69 74 69 76 65 2e 20 20 47 4c 4f 42  sensitive.  GLOB
a560: 20 69 73 20 61 6c 77 61 79 73 20 63 61 73 65 20   is always case 
a570: 73 65 6e 73 69 74 69 76 65 2e 0a 2a 2f 0a 76 6f  sensitive..*/.vo
a580: 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  id sqlite3Regist
a590: 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28  erLikeFunctions(
a5a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
a5b0: 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 29 7b   caseSensitive){
a5c0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72  .  struct compar
a5d0: 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  eInfo *pInfo;.  
a5e0: 69 66 28 20 63 61 73 65 53 65 6e 73 69 74 69 76  if( caseSensitiv
a5f0: 65 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 20 3d  e ){.    pInfo =
a600: 20 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72 65   (struct compare
a610: 49 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f 41  Info*)&likeInfoA
a620: 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  lt;.  }else{.   
a630: 20 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63 74   pInfo = (struct
a640: 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 6c   compareInfo*)&l
a650: 69 6b 65 49 6e 66 6f 4e 6f 72 6d 3b 0a 20 20 7d  ikeInfoNorm;.  }
a660: 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  .  sqlite3Create
a670: 46 75 6e 63 28 64 62 2c 20 22 6c 69 6b 65 22 2c  Func(db, "like",
a680: 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
a690: 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63   pInfo, likeFunc
a6a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
a6b0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
a6c0: 20 22 6c 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49   "like", 3, SQLI
a6d0: 54 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20  TE_UTF8, pInfo, 
a6e0: 6c 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b  likeFunc, 0, 0);
a6f0: 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  .  sqlite3Create
a700: 46 75 6e 63 28 64 62 2c 20 22 67 6c 6f 62 22 2c  Func(db, "glob",
a710: 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
a720: 20 0a 20 20 20 20 20 20 28 73 74 72 75 63 74 20   .      (struct 
a730: 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c  compareInfo*)&gl
a740: 6f 62 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63  obInfo, likeFunc
a750: 2c 20 30 2c 30 29 3b 0a 20 20 73 65 74 4c 69 6b  , 0,0);.  setLik
a760: 65 4f 70 74 46 6c 61 67 28 64 62 2c 20 22 67 6c  eOptFlag(db, "gl
a770: 6f 62 22 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  ob", SQLITE_FUNC
a780: 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46  _LIKE | SQLITE_F
a790: 55 4e 43 5f 43 41 53 45 29 3b 0a 20 20 73 65 74  UNC_CASE);.  set
a7a0: 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20  LikeOptFlag(db, 
a7b0: 22 6c 69 6b 65 22 2c 20 0a 20 20 20 20 20 20 63  "like", .      c
a7c0: 61 73 65 53 65 6e 73 69 74 69 76 65 20 3f 20 28  aseSensitive ? (
a7d0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45  SQLITE_FUNC_LIKE
a7e0: 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43   | SQLITE_FUNC_C
a7f0: 41 53 45 29 20 3a 20 53 51 4c 49 54 45 5f 46 55  ASE) : SQLITE_FU
a800: 4e 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a 2f 2a 0a  NC_LIKE);.}../*.
a810: 2a 2a 20 70 45 78 70 72 20 70 6f 69 6e 74 73 20  ** pExpr points 
a820: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
a830: 20 77 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e 74   which implement
a840: 73 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  s a function.  I
a850: 66 0a 2a 2a 20 69 74 20 69 73 20 61 70 70 72 6f  f.** it is appro
a860: 70 72 69 61 74 65 20 74 6f 20 61 70 70 6c 79 20  priate to apply 
a870: 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a  the LIKE optimiz
a880: 61 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 66 75  ation to that fu
a890: 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 73  nction.** then s
a8a0: 65 74 20 61 57 63 5b 30 5d 20 74 68 72 6f 75 67  et aWc[0] throug
a8b0: 68 20 61 57 63 5b 32 5d 20 74 6f 20 74 68 65 20  h aWc[2] to the 
a8c0: 77 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74  wildcard charact
a8d0: 65 72 73 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  ers and.** retur
a8e0: 6e 20 54 52 55 45 2e 20 20 49 66 20 74 68 65 20  n TRUE.  If the 
a8f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  function is not 
a900: 61 20 4c 49 4b 45 2d 73 74 79 6c 65 20 66 75 6e  a LIKE-style fun
a910: 63 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20 72 65  ction then.** re
a920: 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69  turn FALSE..*/.i
a930: 6e 74 20 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  nt sqlite3IsLike
a940: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
a950: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 45 78 70   *db, Expr *pExp
a960: 72 2c 20 69 6e 74 20 2a 70 49 73 4e 6f 63 61 73  r, int *pIsNocas
a970: 65 2c 20 63 68 61 72 20 2a 61 57 63 29 7b 0a 20  e, char *aWc){. 
a980: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a   FuncDef *pDef;.
a990: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
a9a0: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20  =TK_FUNCTION || 
a9b0: 21 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b  !pExpr->pList ){
a9c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a9d0: 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
a9e0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
a9f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
aa00: 0a 20 20 7d 0a 20 20 70 44 65 66 20 3d 20 73 71  .  }.  pDef = sq
aa10: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
aa20: 6e 28 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78  n(db, (char*)pEx
aa30: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
aa40: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 32 2c 0a  pr->token.n, 2,.
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
aa70: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
aa80: 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 28  if( pDef==0 || (
aa90: 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
aaa0: 4c 49 54 45 5f 46 55 4e 43 5f 4c 49 4b 45 29 3d  LITE_FUNC_LIKE)=
aab0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
aac0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
aad0: 65 20 6d 65 6d 63 70 79 28 29 20 73 74 61 74 65  e memcpy() state
aae0: 6d 65 6e 74 20 61 73 73 75 6d 65 73 20 74 68 61  ment assumes tha
aaf0: 74 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63  t the wildcard c
ab00: 68 61 72 61 63 74 65 72 73 20 61 72 65 0a 20 20  haracters are.  
ab10: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ** the first thr
ab20: 65 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ee statements in
ab30: 20 74 68 65 20 63 6f 6d 70 61 72 65 49 6e 66 6f   the compareInfo
ab40: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
ab50: 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 28 29 20  .  ** asserts() 
ab60: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72 69  that follow veri
ab70: 66 79 20 74 68 61 74 20 61 73 73 75 6d 70 74 69  fy that assumpti
ab80: 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  on.  */.  memcpy
ab90: 28 61 57 63 2c 20 70 44 65 66 2d 3e 70 55 73 65  (aWc, pDef->pUse
aba0: 72 44 61 74 61 2c 20 33 29 3b 0a 20 20 61 73 73  rData, 3);.  ass
abb0: 65 72 74 28 20 28 63 68 61 72 2a 29 26 6c 69 6b  ert( (char*)&lik
abc0: 65 49 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68 61  eInfoAlt == (cha
abd0: 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e  r*)&likeInfoAlt.
abe0: 6d 61 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61 73  matchAll );.  as
abf0: 73 65 72 74 28 20 26 28 28 63 68 61 72 2a 29 26  sert( &((char*)&
ac00: 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d 20  likeInfoAlt)[1] 
ac10: 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49  == (char*)&likeI
ac20: 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65 20  nfoAlt.matchOne 
ac30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28 28  );.  assert( &((
ac40: 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41  char*)&likeInfoA
ac50: 6c 74 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72 2a  lt)[2] == (char*
ac60: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61  )&likeInfoAlt.ma
ac70: 74 63 68 53 65 74 20 29 3b 0a 20 20 2a 70 49 73  tchSet );.  *pIs
ac80: 4e 6f 63 61 73 65 20 3d 20 28 70 44 65 66 2d 3e  Nocase = (pDef->
ac90: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
aca0: 55 4e 43 5f 43 41 53 45 29 3d 3d 30 3b 0a 20 20  UNC_CASE)==0;.  
acb0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a              return 1;.}.