/ Hex Artifact Content
Login

Artifact 713cf33a0ab8685d44ed31a9c753983a7ff9fd6e:


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 30 37 20 32 30 30 35 2f 30 39 2f 30 36  1.107 2005/09/06
02a0: 20 32 30 3a 33 36 3a 34 39 20 64 72 68 20 45 78   20:36:49 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 23 69 6e 63 6c 75 64 65 20 3c 6d 61 74 68 2e  .#include <math.
02f0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0300: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0310: 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c  <assert.h>.#incl
0320: 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a  ude "vdbeInt.h".
0330: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
0340: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0350: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
0360: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
0370: 77 69 74 68 20 61 20 66 75 6e 63 74 69 6f 6e 2e  with a function.
0380: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
0390: 65 71 20 2a 73 71 6c 69 74 65 33 47 65 74 46 75  eq *sqlite3GetFu
03a0: 6e 63 43 6f 6c 6c 53 65 71 28 73 71 6c 69 74 65  ncCollSeq(sqlite
03b0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
03c0: 78 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 6f  xt){.  return co
03d0: 6e 74 65 78 74 2d 3e 70 43 6f 6c 6c 3b 0a 7d 0a  ntext->pColl;.}.
03e0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
03f0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 6f 6e  ation of the non
0400: 2d 61 67 67 72 65 67 61 74 65 20 6d 69 6e 28 29  -aggregate min()
0410: 20 61 6e 64 20 6d 61 78 28 29 20 66 75 6e 63 74   and max() funct
0420: 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ions.*/.static v
0430: 6f 69 64 20 6d 69 6e 6d 61 78 46 75 6e 63 28 0a  oid minmaxFunc(.
0440: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
0450: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
0460: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
0470: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
0480: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
0490: 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 30 20 66   mask;    /* 0 f
04a0: 6f 72 20 6d 69 6e 28 29 20 6f 72 20 30 78 66 66  or min() or 0xff
04b0: 66 66 66 66 66 66 20 66 6f 72 20 6d 61 78 28 29  ffffff for max()
04c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 65 73 74 3b   */.  int iBest;
04d0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
04e0: 6c 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  l;..  if( argc==
04f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 61  0 ) return;.  ma
0500: 73 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  sk = sqlite3_use
0510: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3d  r_data(context)=
0520: 3d 30 20 3f 20 30 20 3a 20 2d 31 3b 0a 20 20 70  =0 ? 0 : -1;.  p
0530: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
0540: 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e  tFuncCollSeq(con
0550: 74 65 78 74 29 3b 0a 20 20 61 73 73 65 72 74 28  text);.  assert(
0560: 20 70 43 6f 6c 6c 20 29 3b 0a 20 20 61 73 73 65   pColl );.  asse
0570: 72 74 28 20 6d 61 73 6b 3d 3d 2d 31 20 7c 7c 20  rt( mask==-1 || 
0580: 6d 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 69 42 65  mask==0 );.  iBe
0590: 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  st = 0;.  if( sq
05a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
05b0: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
05c0: 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b  E_NULL ) return;
05d0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72  .  for(i=1; i<ar
05e0: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  gc; i++){.    if
05f0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
0600: 74 79 70 65 28 61 72 67 76 5b 69 5d 29 3d 3d 53  type(argv[i])==S
0610: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74  QLITE_NULL ) ret
0620: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 28 73 71  urn;.    if( (sq
0630: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
0640: 61 72 67 76 5b 69 42 65 73 74 5d 2c 20 61 72 67  argv[iBest], arg
0650: 76 5b 69 5d 2c 20 70 43 6f 6c 6c 29 5e 6d 61 73  v[i], pColl)^mas
0660: 6b 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  k)>=0 ){.      i
0670: 42 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 7d 0a  Best = i;.    }.
0680: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65    }.  sqlite3_re
0690: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
06a0: 78 74 2c 20 61 72 67 76 5b 69 42 65 73 74 5d 29  xt, argv[iBest])
06b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
06c0: 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68  n the type of th
06d0: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
06e0: 74 61 74 69 63 20 76 6f 69 64 20 74 79 70 65 6f  tatic void typeo
06f0: 66 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  fFunc(.  sqlite3
0700: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
0710: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
0720: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0730: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
0740: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
0750: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
0760: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
0770: 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  0]) ){.    case 
0780: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 20 20 20  SQLITE_NULL:    
0790: 7a 20 3d 20 22 6e 75 6c 6c 22 3b 20 20 20 20 62  z = "null";    b
07a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
07b0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7a  QLITE_INTEGER: z
07c0: 20 3d 20 22 69 6e 74 65 67 65 72 22 3b 20 62 72   = "integer"; br
07d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
07e0: 4c 49 54 45 5f 54 45 58 54 3a 20 20 20 20 7a 20  LITE_TEXT:    z 
07f0: 3d 20 22 74 65 78 74 22 3b 20 20 20 20 62 72 65  = "text";    bre
0800: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0810: 49 54 45 5f 46 4c 4f 41 54 3a 20 20 20 7a 20 3d  ITE_FLOAT:   z =
0820: 20 22 72 65 61 6c 22 3b 20 20 20 20 62 72 65 61   "real";    brea
0830: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0840: 54 45 5f 42 4c 4f 42 3a 20 20 20 20 7a 20 3d 20  TE_BLOB:    z = 
0850: 22 62 6c 6f 62 22 3b 20 20 20 20 62 72 65 61 6b  "blob";    break
0860: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
0870: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
0880: 65 78 74 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  ext, z, -1, SQLI
0890: 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 0a  TE_STATIC);.}...
08a0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
08b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 65 6e 67  tion of the leng
08c0: 74 68 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2f  th() function.*/
08d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 6e  .static void len
08e0: 67 74 68 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  gthFunc(.  sqlit
08f0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
0900: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
0910: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
0920: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
0930: 20 6c 65 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28   len;..  assert(
0940: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 73 77   argc==1 );.  sw
0950: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
0960: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
0970: 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  ) ){.    case SQ
0980: 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 63  LITE_BLOB:.    c
0990: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
09a0: 45 52 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ER:.    case SQL
09b0: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
09c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
09d0: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
09e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
09f0: 65 73 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20  es(argv[0]));.  
0a00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0a10: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0a20: 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 63  _TEXT: {.      c
0a30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
0a40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
0a50: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
0a60: 20 20 66 6f 72 28 6c 65 6e 3d 30 3b 20 2a 7a 3b    for(len=0; *z;
0a70: 20 7a 2b 2b 29 7b 20 69 66 28 20 28 30 78 63 30   z++){ if( (0xc0
0a80: 26 2a 7a 29 21 3d 30 78 38 30 20 29 20 6c 65 6e  &*z)!=0x80 ) len
0a90: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  ++; }.      sqli
0aa0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
0ab0: 6f 6e 74 65 78 74 2c 20 6c 65 6e 29 3b 0a 20 20  ontext, len);.  
0ac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0ad0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
0ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
0af0: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
0b00: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
0b10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
0b20: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
0b30: 6f 6e 20 6f 66 20 74 68 65 20 61 62 73 28 29 20  on of the abs() 
0b40: 66 75 6e 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  function.*/.stat
0b50: 69 63 20 76 6f 69 64 20 61 62 73 46 75 6e 63 28  ic void absFunc(
0b60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
0b70: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
0b80: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
0b90: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 61 73 73  e **argv){.  ass
0ba0: 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a  ert( argc==1 );.
0bb0: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
0bc0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
0bd0: 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73  v[0]) ){.    cas
0be0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
0bf0: 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 69 56  : {.      i64 iV
0c00: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
0c10: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d  ue_int64(argv[0]
0c20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 56 61  );.      if( iVa
0c30: 6c 3c 30 20 29 20 69 56 61 6c 20 3d 20 69 56 61  l<0 ) iVal = iVa
0c40: 6c 20 2a 20 2d 31 3b 0a 20 20 20 20 20 20 73 71  l * -1;.      sq
0c50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
0c60: 36 34 28 63 6f 6e 74 65 78 74 2c 20 69 56 61 6c  64(context, iVal
0c70: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
0c80: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
0c90: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
0ca0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
0cb0: 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29  lt_null(context)
0cc0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0cd0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
0ce0: 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65  : {.      double
0cf0: 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   rVal = sqlite3_
0d00: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
0d10: 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[0]);.      if(
0d20: 20 72 56 61 6c 3c 30 20 29 20 72 56 61 6c 20 3d   rVal<0 ) rVal =
0d30: 20 72 56 61 6c 20 2a 20 2d 31 2e 30 3b 0a 20 20   rVal * -1.0;.  
0d40: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
0d50: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
0d60: 74 2c 20 72 56 61 6c 29 3b 0a 20 20 20 20 20 20  t, rVal);.      
0d70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
0d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
0d90: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0da0: 73 75 62 73 74 72 28 29 20 66 75 6e 63 74 69 6f  substr() functio
0db0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
0dc0: 20 73 75 62 73 74 72 46 75 6e 63 28 0a 20 20 73   substrFunc(.  s
0dd0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
0de0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
0df0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
0e00: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
0e10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
0e20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
0e30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
0e40: 20 70 31 2c 20 70 32 2c 20 6c 65 6e 3b 0a 0a 20   p1, p2, len;.. 
0e50: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33   assert( argc==3
0e60: 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65   );.  z = sqlite
0e70: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
0e80: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  v[0]);.  if( z==
0e90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 31  0 ) return;.  p1
0ea0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
0eb0: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  _int(argv[1]);. 
0ec0: 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   p2 = sqlite3_va
0ed0: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29  lue_int(argv[2])
0ee0: 3b 0a 20 20 66 6f 72 28 6c 65 6e 3d 30 2c 20 7a  ;.  for(len=0, z
0ef0: 32 3d 7a 3b 20 2a 7a 32 3b 20 7a 32 2b 2b 29 7b  2=z; *z2; z2++){
0f00: 20 69 66 28 20 28 30 78 63 30 26 2a 7a 32 29 21   if( (0xc0&*z2)!
0f10: 3d 30 78 38 30 20 29 20 6c 65 6e 2b 2b 3b 20 7d  =0x80 ) len++; }
0f20: 0a 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20  .  if( p1<0 ){. 
0f30: 20 20 20 70 31 20 2b 3d 20 6c 65 6e 3b 0a 20 20     p1 += len;.  
0f40: 20 20 69 66 28 20 70 31 3c 30 20 29 7b 0a 20 20    if( p1<0 ){.  
0f50: 20 20 20 20 70 32 20 2b 3d 20 70 31 3b 0a 20 20      p2 += p1;.  
0f60: 20 20 20 20 70 31 20 3d 20 30 3b 0a 20 20 20 20      p1 = 0;.    
0f70: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 31  }.  }else if( p1
0f80: 3e 30 20 29 7b 0a 20 20 20 20 70 31 2d 2d 3b 0a  >0 ){.    p1--;.
0f90: 20 20 7d 0a 20 20 69 66 28 20 70 31 2b 70 32 3e    }.  if( p1+p2>
0fa0: 6c 65 6e 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  len ){.    p2 = 
0fb0: 6c 65 6e 2d 70 31 3b 0a 20 20 7d 0a 20 20 66 6f  len-p1;.  }.  fo
0fc0: 72 28 69 3d 30 3b 20 69 3c 70 31 20 26 26 20 7a  r(i=0; i<p1 && z
0fd0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
0fe0: 66 28 20 28 7a 5b 69 5d 26 30 78 63 30 29 3d 3d  f( (z[i]&0xc0)==
0ff0: 30 78 38 30 20 29 20 70 31 2b 2b 3b 0a 20 20 7d  0x80 ) p1++;.  }
1000: 0a 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 20 26  .  while( z[i] &
1010: 26 20 28 7a 5b 69 5d 26 30 78 63 30 29 3d 3d 30  & (z[i]&0xc0)==0
1020: 78 38 30 20 29 7b 20 69 2b 2b 3b 20 70 31 2b 2b  x80 ){ i++; p1++
1030: 3b 20 7d 0a 20 20 66 6f 72 28 3b 20 69 3c 70 31  ; }.  for(; i<p1
1040: 2b 70 32 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b  +p2 && z[i]; i++
1050: 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 5b 69 5d  ){.    if( (z[i]
1060: 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 70  &0xc0)==0x80 ) p
1070: 32 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  2++;.  }.  while
1080: 28 20 7a 5b 69 5d 20 26 26 20 28 7a 5b 69 5d 26  ( z[i] && (z[i]&
1090: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 20 69  0xc0)==0x80 ){ i
10a0: 2b 2b 3b 20 70 32 2b 2b 3b 20 7d 0a 20 20 69 66  ++; p2++; }.  if
10b0: 28 20 70 32 3c 30 20 29 20 70 32 20 3d 20 30 3b  ( p2<0 ) p2 = 0;
10c0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
10d0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
10e0: 26 7a 5b 70 31 5d 2c 20 70 32 2c 20 53 51 4c 49  &z[p1], p2, SQLI
10f0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d  TE_TRANSIENT);.}
1100: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1110: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f  tation of the ro
1120: 75 6e 64 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a  und() function.*
1130: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f  /.static void ro
1140: 75 6e 64 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  undFunc(sqlite3_
1150: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1160: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
1170: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
1180: 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
1190: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68    double r;.  ch
11a0: 61 72 20 7a 42 75 66 5b 35 30 30 5d 3b 20 20 2f  ar zBuf[500];  /
11b0: 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  * larger than th
11c0: 65 20 25 66 20 72 65 70 72 65 73 65 6e 74 61 74  e %f representat
11d0: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ion of the large
11e0: 73 74 20 64 6f 75 62 6c 65 20 2a 2f 0a 20 20 61  st double */.  a
11f0: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 7c  ssert( argc==1 |
1200: 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69  | argc==2 );.  i
1210: 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20  f( argc==2 ){.  
1220: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
1230: 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L==sqlite3_value
1240: 5f 74 79 70 65 28 61 72 67 76 5b 31 5d 29 20 29  _type(argv[1]) )
1250: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20 3d   return;.    n =
1260: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
1270: 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  nt(argv[1]);.   
1280: 20 69 66 28 20 6e 3e 33 30 20 29 20 6e 20 3d 20   if( n>30 ) n = 
1290: 33 30 3b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20  30;.    if( n<0 
12a0: 29 20 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ) n = 0;.  }.  i
12b0: 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d  f( SQLITE_NULL==
12c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
12d0: 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20 72 65  pe(argv[0]) ) re
12e0: 74 75 72 6e 3b 0a 20 20 72 20 3d 20 73 71 6c 69  turn;.  r = sqli
12f0: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
1300: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c  (argv[0]);.  sql
1310: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1320: 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c  zeof(zBuf),zBuf,
1330: 22 25 2e 2a 66 22 2c 6e 2c 72 29 3b 0a 20 20 73  "%.*f",n,r);.  s
1340: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
1350: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66  xt(context, zBuf
1360: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
1370: 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  NSIENT);.}../*.*
1380: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1390: 20 6f 66 20 74 68 65 20 75 70 70 65 72 28 29 20   of the upper() 
13a0: 61 6e 64 20 6c 6f 77 65 72 28 29 20 53 51 4c 20  and lower() SQL 
13b0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  functions..*/.st
13c0: 61 74 69 63 20 76 6f 69 64 20 75 70 70 65 72 46  atic void upperF
13d0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
13e0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
13f0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
1400: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
1410: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1420: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  z;.  int i;.  if
1430: 28 20 61 72 67 63 3c 31 20 7c 7c 20 53 51 4c 49  ( argc<1 || SQLI
1440: 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33  TE_NULL==sqlite3
1450: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
1460: 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  [0]) ) return;. 
1470: 20 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f   z = sqliteMallo
1480: 63 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  c(sqlite3_value_
1490: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 2b 31  bytes(argv[0])+1
14a0: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
14b0: 72 65 74 75 72 6e 3b 0a 20 20 73 74 72 63 70 79  return;.  strcpy
14c0: 28 7a 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  (z, sqlite3_valu
14d0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29  e_text(argv[0]))
14e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69  ;.  for(i=0; z[i
14f0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; i++){.    z[i
1500: 5d 20 3d 20 74 6f 75 70 70 65 72 28 7a 5b 69 5d  ] = toupper(z[i]
1510: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1520: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
1530: 74 65 78 74 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  text, z, -1, SQL
1540: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
1550: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
1560: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1570: 6f 77 65 72 46 75 6e 63 28 73 71 6c 69 74 65 33  owerFunc(sqlite3
1580: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1590: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
15a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
15b0: 76 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  v){.  unsigned c
15c0: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b  har *z;.  int i;
15d0: 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 7c 7c  .  if( argc<1 ||
15e0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71   SQLITE_NULL==sq
15f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
1600: 28 61 72 67 76 5b 30 5d 29 20 29 20 72 65 74 75  (argv[0]) ) retu
1610: 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
1620: 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f 76  Malloc(sqlite3_v
1630: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
1640: 30 5d 29 2b 31 29 3b 0a 20 20 69 66 28 20 7a 3d  0])+1);.  if( z=
1650: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
1660: 74 72 63 70 79 28 7a 2c 20 73 71 6c 69 74 65 33  trcpy(z, sqlite3
1670: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1680: 5b 30 5d 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30  [0]));.  for(i=0
1690: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
16a0: 20 20 7a 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72    z[i] = tolower
16b0: 28 7a 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71  (z[i]);.  }.  sq
16c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
16d0: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 2d 31  t(context, z, -1
16e0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
16f0: 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  NT);.  sqliteFre
1700: 65 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e(z);.}../*.** I
1710: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1720: 20 74 68 65 20 49 46 4e 55 4c 4c 28 29 2c 20 4e   the IFNULL(), N
1730: 56 4c 28 29 2c 20 61 6e 64 20 43 4f 41 4c 45 53  VL(), and COALES
1740: 43 45 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  CE() functions. 
1750: 20 0a 2a 2a 20 41 6c 6c 20 74 68 72 65 65 20 64   .** All three d
1760: 6f 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  o the same thing
1770: 2e 20 20 54 68 65 79 20 72 65 74 75 72 6e 20 74  .  They return t
1780: 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c  he first non-NUL
1790: 4c 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  L.** argument..*
17a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 66  /.static void if
17b0: 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69  nullFunc(.  sqli
17c0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
17d0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
17e0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
17f0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
1800: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1810: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
1820: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
1830: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
1840: 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20 29  _type(argv[i]) )
1850: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1860: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
1870: 74 65 78 74 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  text, argv[i]);.
1880: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1890: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
18a0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
18b0: 66 20 72 61 6e 64 6f 6d 28 29 2e 20 20 52 65 74  f random().  Ret
18c0: 75 72 6e 20 61 20 72 61 6e 64 6f 6d 20 69 6e 74  urn a random int
18d0: 65 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  eger.  .*/.stati
18e0: 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 46 75 6e  c void randomFun
18f0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
1900: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
1910: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
1920: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
1930: 76 0a 29 7b 0a 20 20 69 6e 74 20 72 3b 0a 20 20  v.){.  int r;.  
1940: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
1950: 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29  s(sizeof(r), &r)
1960: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
1970: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
1980: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  r);.}../*.** Imp
1990: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
19a0: 68 65 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  he last_insert_r
19b0: 6f 77 69 64 28 29 20 53 51 4c 20 66 75 6e 63 74  owid() SQL funct
19c0: 69 6f 6e 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ion.  The return
19d0: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65  .** value is the
19e0: 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 71 6c   same as the sql
19f0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
1a00: 5f 72 6f 77 69 64 28 29 20 41 50 49 20 66 75 6e  _rowid() API fun
1a10: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1a20: 20 76 6f 69 64 20 6c 61 73 74 5f 69 6e 73 65 72   void last_inser
1a30: 74 5f 72 6f 77 69 64 28 0a 20 20 73 71 6c 69 74  t_rowid(.  sqlit
1a40: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1a50: 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 2c  ext, .  int arg,
1a60: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
1a70: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71  e **argv.){.  sq
1a80: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
1a90: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
1aa0: 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65  ntext);.  sqlite
1ab0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
1ac0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
1ad0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
1ae0: 64 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  d(db));.}../*.**
1af0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
1b00: 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 28 29  of the changes()
1b10: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
1b20: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1b30: 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   is the.** same 
1b40: 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  as the sqlite3_c
1b50: 68 61 6e 67 65 73 28 29 20 41 50 49 20 66 75 6e  hanges() API fun
1b60: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1b70: 20 76 6f 69 64 20 63 68 61 6e 67 65 73 28 0a 20   void changes(. 
1b80: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1b90: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
1ba0: 20 61 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f   arg,.  sqlite3_
1bb0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
1bc0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1bd0: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
1be0: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71  a(context);.  sq
1bf0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
1c00: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
1c10: 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a  3_changes(db));.
1c20: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
1c30: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ntation of the t
1c40: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 53  otal_changes() S
1c50: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  QL function.  Th
1c60: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1c70: 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73  s.** the same as
1c80: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 6f 74   the sqlite3_tot
1c90: 61 6c 5f 63 68 61 6e 67 65 73 28 29 20 41 50 49  al_changes() API
1ca0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
1cb0: 61 74 69 63 20 76 6f 69 64 20 74 6f 74 61 6c 5f  atic void total_
1cc0: 63 68 61 6e 67 65 73 28 0a 20 20 73 71 6c 69 74  changes(.  sqlit
1cd0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1ce0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 2c 0a  ext,.  int arg,.
1cf0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1d00: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1d10: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
1d20: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
1d30: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ext);.  sqlite3_
1d40: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
1d50: 78 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  xt, sqlite3_tota
1d60: 6c 5f 63 68 61 6e 67 65 73 28 64 62 29 29 3b 0a  l_changes(db));.
1d70: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63  }../*.** A struc
1d80: 74 75 72 65 20 64 65 66 69 6e 69 6e 67 20 68 6f  ture defining ho
1d90: 77 20 74 6f 20 64 6f 20 47 4c 4f 42 2d 73 74 79  w to do GLOB-sty
1da0: 6c 65 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  le comparisons..
1db0: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6d 70 61 72  */.struct compar
1dc0: 65 49 6e 66 6f 20 7b 0a 20 20 75 38 20 6d 61 74  eInfo {.  u8 mat
1dd0: 63 68 41 6c 6c 3b 0a 20 20 75 38 20 6d 61 74 63  chAll;.  u8 matc
1de0: 68 4f 6e 65 3b 0a 20 20 75 38 20 6d 61 74 63 68  hOne;.  u8 match
1df0: 53 65 74 3b 0a 20 20 75 38 20 6e 6f 43 61 73 65  Set;.  u8 noCase
1e00: 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 63 6f 6e  ;.};..static con
1e10: 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72  st struct compar
1e20: 65 49 6e 66 6f 20 67 6c 6f 62 49 6e 66 6f 20 3d  eInfo globInfo =
1e30: 20 7b 20 27 2a 27 2c 20 27 3f 27 2c 20 27 5b 27   { '*', '?', '['
1e40: 2c 20 30 20 7d 3b 0a 2f 2a 20 54 68 65 20 63 6f  , 0 };./* The co
1e50: 72 72 65 63 74 20 53 51 4c 2d 39 32 20 62 65 68  rrect SQL-92 beh
1e60: 61 76 69 6f 72 20 69 73 20 66 6f 72 20 74 68 65  avior is for the
1e70: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 74   LIKE operator t
1e80: 6f 20 69 67 6e 6f 72 65 0a 2a 2a 20 63 61 73 65  o ignore.** case
1e90: 2e 20 20 54 68 75 73 20 20 27 61 27 20 4c 49 4b  .  Thus  'a' LIK
1ea0: 45 20 27 41 27 20 77 6f 75 6c 64 20 62 65 20 74  E 'A' would be t
1eb0: 72 75 65 2e 20 2a 2f 0a 73 74 61 74 69 63 20 63  rue. */.static c
1ec0: 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70  onst struct comp
1ed0: 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e 66 6f  areInfo likeInfo
1ee0: 4e 6f 72 6d 20 3d 20 7b 20 27 25 27 2c 20 27 5f  Norm = { '%', '_
1ef0: 27 2c 20 20 20 30 2c 20 31 20 7d 3b 0a 2f 2a 20  ',   0, 1 };./* 
1f00: 49 66 20 53 51 4c 49 54 45 5f 43 41 53 45 5f 53  If SQLITE_CASE_S
1f10: 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 20 69 73  ENSITIVE_LIKE is
1f20: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
1f30: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
1f40: 0a 2a 2a 20 69 73 20 63 61 73 65 20 73 65 6e 73  .** is case sens
1f50: 69 74 69 76 65 20 63 61 75 73 69 6e 67 20 27 61  itive causing 'a
1f60: 27 20 4c 49 4b 45 20 27 41 27 20 74 6f 20 62 65  ' LIKE 'A' to be
1f70: 20 66 61 6c 73 65 20 2a 2f 0a 73 74 61 74 69 63   false */.static
1f80: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f   const struct co
1f90: 6d 70 61 72 65 49 6e 66 6f 20 6c 69 6b 65 49 6e  mpareInfo likeIn
1fa0: 66 6f 41 6c 74 20 3d 20 7b 20 27 25 27 2c 20 27  foAlt = { '%', '
1fb0: 5f 27 2c 20 20 20 30 2c 20 30 20 7d 3b 0a 0a 2f  _',   0, 0 };../
1fc0: 2a 0a 2a 2a 20 58 20 69 73 20 61 20 70 6f 69 6e  *.** X is a poin
1fd0: 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  ter to the first
1fe0: 20 62 79 74 65 20 6f 66 20 61 20 55 54 46 2d 38   byte of a UTF-8
1ff0: 20 63 68 61 72 61 63 74 65 72 2e 20 20 49 6e 63   character.  Inc
2000: 72 65 6d 65 6e 74 0a 2a 2a 20 58 20 73 6f 20 74  rement.** X so t
2010: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
2020: 20 74 68 65 20 6e 65 78 74 20 63 68 61 72 61 63   the next charac
2030: 74 65 72 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ter.  This only 
2040: 77 6f 72 6b 73 20 72 69 67 68 74 0a 2a 2a 20 69  works right.** i
2050: 66 20 58 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  f X points to a 
2060: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 55 54 46 2d  well-formed UTF-
2070: 38 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 23 64 65  8 string..*/.#de
2080: 66 69 6e 65 20 73 71 6c 69 74 65 4e 65 78 74 43  fine sqliteNextC
2090: 68 61 72 28 58 29 20 20 77 68 69 6c 65 28 20 28  har(X)  while( (
20a0: 30 78 63 30 26 2a 2b 2b 28 58 29 29 3d 3d 30 78  0xc0&*++(X))==0x
20b0: 38 30 20 29 7b 7d 0a 23 64 65 66 69 6e 65 20 73  80 ){}.#define s
20c0: 71 6c 69 74 65 43 68 61 72 56 61 6c 28 58 29 20  qliteCharVal(X) 
20d0: 20 20 73 71 6c 69 74 65 33 52 65 61 64 55 74 66    sqlite3ReadUtf
20e0: 38 28 58 29 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  8(X).../*.** Com
20f0: 70 61 72 65 20 74 77 6f 20 55 54 46 2d 38 20 73  pare two UTF-8 s
2100: 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75 61 6c  trings for equal
2110: 69 74 79 20 77 68 65 72 65 20 74 68 65 20 66 69  ity where the fi
2120: 72 73 74 20 73 74 72 69 6e 67 20 63 61 6e 0a 2a  rst string can.*
2130: 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65  * potentially be
2140: 20 61 20 22 67 6c 6f 62 22 20 65 78 70 72 65 73   a "glob" expres
2150: 73 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74 72  sion.  Return tr
2160: 75 65 20 28 31 29 20 69 66 20 74 68 65 79 0a 2a  ue (1) if they.*
2170: 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
2180: 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69 66 20  nd false (0) if 
2190: 74 68 65 79 20 61 72 65 20 64 69 66 66 65 72 65  they are differe
21a0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69  nt..**.** Globbi
21b0: 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ng rules:.**.** 
21c0: 20 20 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d       '*'       M
21d0: 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65  atches any seque
21e0: 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  nce of zero or m
21f0: 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a  ore characters..
2200: 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20  **.**      '?'  
2210: 20 20 20 20 20 4d 61 74 63 68 65 73 20 65 78 61       Matches exa
2220: 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74  ctly one charact
2230: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e  er..**.**     [.
2240: 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73  ..]      Matches
2250: 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 66   one character f
2260: 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64  rom the enclosed
2270: 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20   list of.**     
2280: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 61             chara
2290: 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  cters..**.**    
22a0: 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63   [^...]     Matc
22b0: 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65  hes one characte
22c0: 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63  r not in the enc
22d0: 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  losed list..**.*
22e0: 2a 20 57 69 74 68 20 74 68 65 20 5b 2e 2e 2e 5d  * With the [...]
22f0: 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61 74 63   and [^...] matc
2300: 68 69 6e 67 2c 20 61 20 27 5d 27 20 63 68 61 72  hing, a ']' char
2310: 61 63 74 65 72 20 63 61 6e 20 62 65 20 69 6e 63  acter can be inc
2320: 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  luded.** in the 
2330: 6c 69 73 74 20 62 79 20 6d 61 6b 69 6e 67 20 69  list by making i
2340: 74 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  t the first char
2350: 61 63 74 65 72 20 61 66 74 65 72 20 27 5b 27 20  acter after '[' 
2360: 6f 72 20 27 5e 27 2e 20 20 41 0a 2a 2a 20 72 61  or '^'.  A.** ra
2370: 6e 67 65 20 6f 66 20 63 68 61 72 61 63 74 65 72  nge of character
2380: 73 20 63 61 6e 20 62 65 20 73 70 65 63 69 66 69  s can be specifi
2390: 65 64 20 75 73 69 6e 67 20 27 2d 27 2e 20 20 45  ed using '-'.  E
23a0: 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61 2d 7a  xample:.** "[a-z
23b0: 5d 22 20 6d 61 74 63 68 65 73 20 61 6e 79 20 73  ]" matches any s
23c0: 69 6e 67 6c 65 20 6c 6f 77 65 72 2d 63 61 73 65  ingle lower-case
23d0: 20 6c 65 74 74 65 72 2e 20 20 54 6f 20 6d 61 74   letter.  To mat
23e0: 63 68 20 61 20 27 2d 27 2c 20 6d 61 6b 65 0a 2a  ch a '-', make.*
23f0: 2a 20 69 74 20 74 68 65 20 6c 61 73 74 20 63 68  * it the last ch
2400: 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 6c  aracter in the l
2410: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ist..**.** This 
2420: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 75 61 6c  routine is usual
2430: 6c 79 20 71 75 69 63 6b 2c 20 62 75 74 20 63 61  ly quick, but ca
2440: 6e 20 62 65 20 4e 2a 2a 32 20 69 6e 20 74 68 65  n be N**2 in the
2450: 20 77 6f 72 73 74 20 63 61 73 65 2e 0a 2a 2a 0a   worst case..**.
2460: 2a 2a 20 48 69 6e 74 73 3a 20 74 6f 20 6d 61 74  ** Hints: to mat
2470: 63 68 20 27 2a 27 20 6f 72 20 27 3f 27 2c 20 70  ch '*' or '?', p
2480: 75 74 20 74 68 65 6d 20 69 6e 20 22 5b 5d 22 2e  ut them in "[]".
2490: 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
24a0: 2a 2a 20 20 20 20 20 20 20 20 20 61 62 63 5b 2a  **         abc[*
24b0: 5d 78 79 7a 20 20 20 20 20 20 20 20 4d 61 74 63  ]xyz        Matc
24c0: 68 65 73 20 22 61 62 63 2a 78 79 7a 22 20 6f 6e  hes "abc*xyz" on
24d0: 6c 79 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ly.*/.static int
24e0: 20 70 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28   patternCompare(
24f0: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50 61  .  const u8 *zPa
2500: 74 74 65 72 6e 2c 20 20 20 20 20 20 20 20 20 20  ttern,          
2510: 20 20 20 20 2f 2a 20 54 68 65 20 67 6c 6f 62 20      /* The glob 
2520: 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63 6f 6e  pattern */.  con
2530: 73 74 20 75 38 20 2a 7a 53 74 72 69 6e 67 2c 20  st u8 *zString, 
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2550: 20 54 68 65 20 73 74 72 69 6e 67 20 74 6f 20 63   The string to c
2560: 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74  ompare against t
2570: 68 65 20 67 6c 6f 62 20 2a 2f 0a 20 20 63 6f 6e  he glob */.  con
2580: 73 74 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72  st struct compar
2590: 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 2c 20 2f 2a  eInfo *pInfo, /*
25a0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
25b0: 75 74 20 68 6f 77 20 74 6f 20 64 6f 20 74 68 65  ut how to do the
25c0: 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f   compare */.  co
25d0: 6e 73 74 20 69 6e 74 20 65 73 63 20 20 20 20 20  nst int esc     
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25f0: 2a 20 54 68 65 20 65 73 63 61 70 65 20 63 68 61  * The escape cha
2600: 72 61 63 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 72  racter */.){.  r
2610: 65 67 69 73 74 65 72 20 69 6e 74 20 63 3b 0a 20  egister int c;. 
2620: 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69   int invert;.  i
2630: 6e 74 20 73 65 65 6e 3b 0a 20 20 69 6e 74 20 63  nt seen;.  int c
2640: 32 3b 0a 20 20 75 38 20 6d 61 74 63 68 4f 6e 65  2;.  u8 matchOne
2650: 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68 4f   = pInfo->matchO
2660: 6e 65 3b 0a 20 20 75 38 20 6d 61 74 63 68 41 6c  ne;.  u8 matchAl
2670: 6c 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63 68  l = pInfo->match
2680: 41 6c 6c 3b 0a 20 20 75 38 20 6d 61 74 63 68 53  All;.  u8 matchS
2690: 65 74 20 3d 20 70 49 6e 66 6f 2d 3e 6d 61 74 63  et = pInfo->matc
26a0: 68 53 65 74 3b 0a 20 20 75 38 20 6e 6f 43 61 73  hSet;.  u8 noCas
26b0: 65 20 3d 20 70 49 6e 66 6f 2d 3e 6e 6f 43 61 73  e = pInfo->noCas
26c0: 65 3b 20 0a 20 20 69 6e 74 20 70 72 65 76 45 73  e; .  int prevEs
26d0: 63 61 70 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  cape = 0;     /*
26e0: 20 54 72 75 65 20 69 66 20 74 68 65 20 70 72 65   True if the pre
26f0: 76 69 6f 75 73 20 63 68 61 72 61 63 74 65 72 20  vious character 
2700: 77 61 73 20 27 65 73 63 61 70 65 27 20 2a 2f 0a  was 'escape' */.
2710: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a  .  while( (c = *
2720: 7a 50 61 74 74 65 72 6e 29 21 3d 30 20 29 7b 0a  zPattern)!=0 ){.
2730: 20 20 20 20 69 66 28 20 21 70 72 65 76 45 73 63      if( !prevEsc
2740: 61 70 65 20 26 26 20 63 3d 3d 6d 61 74 63 68 41  ape && c==matchA
2750: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  ll ){.      whil
2760: 65 28 20 28 63 3d 7a 50 61 74 74 65 72 6e 5b 31  e( (c=zPattern[1
2770: 5d 29 20 3d 3d 20 6d 61 74 63 68 41 6c 6c 20 7c  ]) == matchAll |
2780: 7c 20 63 20 3d 3d 20 6d 61 74 63 68 4f 6e 65 20  | c == matchOne 
2790: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
27a0: 3d 3d 6d 61 74 63 68 4f 6e 65 20 29 7b 0a 20 20  ==matchOne ){.  
27b0: 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74          if( *zSt
27c0: 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  ring==0 ) return
27d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   0;.          sq
27e0: 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74  liteNextChar(zSt
27f0: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  ring);.        }
2800: 0a 20 20 20 20 20 20 20 20 7a 50 61 74 74 65 72  .        zPatter
2810: 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
2820: 20 20 20 69 66 28 20 63 20 26 26 20 65 73 63 20     if( c && esc 
2830: 26 26 20 73 71 6c 69 74 65 33 52 65 61 64 55 74  && sqlite3ReadUt
2840: 66 38 28 26 7a 50 61 74 74 65 72 6e 5b 31 5d 29  f8(&zPattern[1])
2850: 3d 3d 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20  ==esc ){.       
2860: 20 75 38 20 63 6f 6e 73 74 20 2a 7a 54 65 6d 70   u8 const *zTemp
2870: 20 3d 20 26 7a 50 61 74 74 65 72 6e 5b 31 5d 3b   = &zPattern[1];
2880: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4e  .        sqliteN
2890: 65 78 74 43 68 61 72 28 7a 54 65 6d 70 29 3b 0a  extChar(zTemp);.
28a0: 20 20 20 20 20 20 20 20 63 20 3d 20 2a 7a 54 65          c = *zTe
28b0: 6d 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  mp;.      }.    
28c0: 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74    if( c==0 ) ret
28d0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 69 66 28  urn 1;.      if(
28e0: 20 63 3d 3d 6d 61 74 63 68 53 65 74 20 29 7b 0a   c==matchSet ){.
28f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2900: 65 73 63 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54  esc==0 );   /* T
2910: 68 69 73 20 69 73 20 47 4c 4f 42 2c 20 6e 6f 74  his is GLOB, not
2920: 20 4c 49 4b 45 20 2a 2f 0a 20 20 20 20 20 20 20   LIKE */.       
2930: 20 77 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67   while( *zString
2940: 20 26 26 20 70 61 74 74 65 72 6e 43 6f 6d 70 61   && patternCompa
2950: 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31 5d 2c  re(&zPattern[1],
2960: 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c 65 73  zString,pInfo,es
2970: 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  c)==0 ){.       
2980: 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61     sqliteNextCha
2990: 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20  r(zString);.    
29a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
29b0: 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 21 3d 30  turn *zString!=0
29c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29d0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
29e0: 32 20 3d 20 2a 7a 53 74 72 69 6e 67 29 21 3d 30  2 = *zString)!=0
29f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2a00: 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20  ( noCase ){.    
2a10: 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c          c2 = sql
2a20: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
2a30: 5b 63 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [c2];.          
2a40: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70    c = sqlite3Upp
2a50: 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20  erToLower[c];.  
2a60: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
2a70: 20 63 32 20 21 3d 20 30 20 26 26 20 63 32 20 21   c2 != 0 && c2 !
2a80: 3d 20 63 20 29 7b 20 63 32 20 3d 20 73 71 6c 69  = c ){ c2 = sqli
2a90: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
2aa0: 2a 2b 2b 7a 53 74 72 69 6e 67 5d 3b 20 7d 0a 20  *++zString]; }. 
2ab0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
2ad0: 65 28 20 63 32 20 21 3d 20 30 20 26 26 20 63 32  e( c2 != 0 && c2
2ae0: 20 21 3d 20 63 20 29 7b 20 63 32 20 3d 20 2a 2b   != c ){ c2 = *+
2af0: 2b 7a 53 74 72 69 6e 67 3b 20 7d 0a 20 20 20 20  +zString; }.    
2b00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b10: 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65    if( c2==0 ) re
2b20: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
2b30: 20 20 69 66 28 20 70 61 74 74 65 72 6e 43 6f 6d    if( patternCom
2b40: 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31  pare(&zPattern[1
2b50: 5d 2c 7a 53 74 72 69 6e 67 2c 70 49 6e 66 6f 2c  ],zString,pInfo,
2b60: 65 73 63 29 20 29 20 72 65 74 75 72 6e 20 31 3b  esc) ) return 1;
2b70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2b80: 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69 6e  eNextChar(zStrin
2b90: 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
2ba0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2bc0: 65 20 69 66 28 20 21 70 72 65 76 45 73 63 61 70  e if( !prevEscap
2bd0: 65 20 26 26 20 63 3d 3d 6d 61 74 63 68 4f 6e 65  e && c==matchOne
2be0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 7a   ){.      if( *z
2bf0: 53 74 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75  String==0 ) retu
2c00: 72 6e 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69  rn 0;.      sqli
2c10: 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69  teNextChar(zStri
2c20: 6e 67 29 3b 0a 20 20 20 20 20 20 7a 50 61 74 74  ng);.      zPatt
2c30: 65 72 6e 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ern++;.    }else
2c40: 20 69 66 28 20 63 3d 3d 6d 61 74 63 68 53 65 74   if( c==matchSet
2c50: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 72   ){.      int pr
2c60: 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
2c70: 20 61 73 73 65 72 74 28 20 65 73 63 3d 3d 30 20   assert( esc==0 
2c80: 29 3b 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e  );    /* This on
2c90: 6c 79 20 6f 63 63 75 72 73 20 66 6f 72 20 47 4c  ly occurs for GL
2ca0: 4f 42 2c 20 6e 6f 74 20 4c 49 4b 45 20 2a 2f 0a  OB, not LIKE */.
2cb0: 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a        seen = 0;.
2cc0: 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30        invert = 0
2cd0: 3b 0a 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69  ;.      c = sqli
2ce0: 74 65 43 68 61 72 56 61 6c 28 7a 53 74 72 69 6e  teCharVal(zStrin
2cf0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  g);.      if( c=
2d00: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2d10: 20 20 20 20 20 63 32 20 3d 20 2a 2b 2b 7a 50 61       c2 = *++zPa
2d20: 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 69 66 28  ttern;.      if(
2d30: 20 63 32 3d 3d 27 5e 27 20 29 7b 20 69 6e 76 65   c2=='^' ){ inve
2d40: 72 74 20 3d 20 31 3b 20 63 32 20 3d 20 2a 2b 2b  rt = 1; c2 = *++
2d50: 7a 50 61 74 74 65 72 6e 3b 20 7d 0a 20 20 20 20  zPattern; }.    
2d60: 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b    if( c2==']' ){
2d70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
2d80: 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a  ']' ) seen = 1;.
2d90: 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 2b 2b          c2 = *++
2da0: 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20  zPattern;.      
2db0: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  }.      while( (
2dc0: 63 32 20 3d 20 73 71 6c 69 74 65 43 68 61 72 56  c2 = sqliteCharV
2dd0: 61 6c 28 7a 50 61 74 74 65 72 6e 29 29 21 3d 30  al(zPattern))!=0
2de0: 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20   && c2!=']' ){. 
2df0: 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27         if( c2=='
2e00: 2d 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 31  -' && zPattern[1
2e10: 5d 21 3d 27 5d 27 20 26 26 20 7a 50 61 74 74 65  ]!=']' && zPatte
2e20: 72 6e 5b 31 5d 21 3d 30 20 26 26 20 70 72 69 6f  rn[1]!=0 && prio
2e30: 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  r_c>0 ){.       
2e40: 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20     zPattern++;. 
2e50: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
2e60: 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 50 61 74  liteCharVal(zPat
2e70: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tern);.         
2e80: 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20   if( c>=prior_c 
2e90: 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20  && c<=c2 ) seen 
2ea0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
2eb0: 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20  rior_c = 0;.    
2ec0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
2ed0: 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =c2 ){.         
2ee0: 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
2ef0: 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63       prior_c = c
2f00: 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  2;.        }else
2f10: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f  {.          prio
2f20: 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20  r_c = c2;.      
2f30: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
2f40: 74 65 4e 65 78 74 43 68 61 72 28 7a 50 61 74 74  teNextChar(zPatt
2f50: 65 72 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ern);.      }.  
2f60: 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c      if( c2==0 ||
2f70: 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72 74 29   (seen ^ invert)
2f80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2f90: 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74        sqliteNext
2fa0: 43 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20  Char(zString);. 
2fb0: 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b       zPattern++;
2fc0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
2fd0: 73 63 20 26 26 20 21 70 72 65 76 45 73 63 61 70  sc && !prevEscap
2fe0: 65 20 26 26 20 73 71 6c 69 74 65 33 52 65 61 64  e && sqlite3Read
2ff0: 55 74 66 38 28 7a 50 61 74 74 65 72 6e 29 3d 3d  Utf8(zPattern)==
3000: 65 73 63 29 7b 0a 20 20 20 20 20 20 70 72 65 76  esc){.      prev
3010: 45 73 63 61 70 65 20 3d 20 31 3b 0a 20 20 20 20  Escape = 1;.    
3020: 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72    sqliteNextChar
3030: 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  (zPattern);.    
3040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
3050: 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20   noCase ){.     
3060: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 55 70     if( sqlite3Up
3070: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 20 21 3d  perToLower[c] !=
3080: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
3090: 6f 77 65 72 5b 2a 7a 53 74 72 69 6e 67 5d 20 29  ower[*zString] )
30a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
30b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30c0: 69 66 28 20 63 20 21 3d 20 2a 7a 53 74 72 69 6e  if( c != *zStrin
30d0: 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  g ) return 0;.  
30e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 61 74      }.      zPat
30f0: 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 7a 53  tern++;.      zS
3100: 74 72 69 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 70  tring++;.      p
3110: 72 65 76 45 73 63 61 70 65 20 3d 20 30 3b 0a 20  revEscape = 0;. 
3120: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3130: 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 3b 0a 7d  n *zString==0;.}
3140: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
3150: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
3160: 73 20 74 68 61 74 20 74 68 65 20 4c 49 4b 45 20  s that the LIKE 
3170: 6f 70 65 72 61 74 6f 72 20 28 6f 72 20 47 4c 4f  operator (or GLO
3180: 42 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6a 75  B which is.** ju
3190: 73 74 20 61 20 76 61 72 69 61 74 69 6f 6e 20 6f  st a variation o
31a0: 66 20 4c 49 4b 45 29 20 67 65 74 73 20 63 61 6c  f LIKE) gets cal
31b0: 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 75 73  led.  This is us
31c0: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
31d0: 2a 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  * only..*/.#ifde
31e0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
31f0: 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63  t sqlite3_like_c
3200: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
3210: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  .../*.** Impleme
3220: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
3230: 69 6b 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ike() SQL functi
3240: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
3250: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  on implements.**
3260: 20 74 68 65 20 62 75 69 6c 64 2d 69 6e 20 4c 49   the build-in LI
3270: 4b 45 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68  KE operator.  Th
3280: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
3290: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
32a0: 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 74 74 65   is the.** patte
32b0: 72 6e 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  rn and the secon
32c0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
32d0: 65 20 73 74 72 69 6e 67 2e 20 20 53 6f 2c 20 74  e string.  So, t
32e0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
32f0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41  s:.**.**       A
3300: 20 4c 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69 73   LIKE B.**.** is
3310: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
3320: 6c 69 6b 65 28 42 2c 41 29 2e 0a 2a 2a 0a 2a 2a  like(B,A)..**.**
3330: 20 54 68 69 73 20 73 61 6d 65 20 66 75 6e 63 74   This same funct
3340: 69 6f 6e 20 28 77 69 74 68 20 61 20 64 69 66 66  ion (with a diff
3350: 65 72 65 6e 74 20 63 6f 6d 70 61 72 65 49 6e 66  erent compareInf
3360: 6f 20 73 74 72 75 63 74 75 72 65 29 20 63 6f 6d  o structure) com
3370: 70 75 74 65 73 0a 2a 2a 20 74 68 65 20 47 4c 4f  putes.** the GLO
3380: 42 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73  B operator..*/.s
3390: 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6b 65 46  tatic void likeF
33a0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
33b0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
33c0: 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20   .  int argc, . 
33d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
33e0: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
33f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3400: 7a 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  zA = sqlite3_val
3410: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
3420: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
3430: 65 64 20 63 68 61 72 20 2a 7a 42 20 3d 20 73 71  ed char *zB = sq
3440: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
3450: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 6e 74  (argv[1]);.  int
3460: 20 65 73 63 61 70 65 20 3d 20 30 3b 0a 20 20 69   escape = 0;.  i
3470: 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20  f( argc==3 ){.  
3480: 20 20 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20    /* The escape 
3490: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
34a0: 20 6d 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66   must consist of
34b0: 20 61 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20   a single UTF-8 
34c0: 63 68 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a  character..    *
34d0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
34e0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
34f0: 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75    */.    const u
3500: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45  nsigned char *zE
3510: 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  sc = sqlite3_val
3520: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29  ue_text(argv[2])
3530: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
3540: 33 75 74 66 38 43 68 61 72 4c 65 6e 28 7a 45 73  3utf8CharLen(zEs
3550: 63 2c 20 2d 31 29 21 3d 31 20 29 7b 0a 20 20 20  c, -1)!=1 ){.   
3560: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3570: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
3580: 20 0a 20 20 20 20 20 20 20 20 20 20 22 45 53 43   .          "ESC
3590: 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  APE expression m
35a0: 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ust be a single 
35b0: 63 68 61 72 61 63 74 65 72 22 2c 20 2d 31 29 3b  character", -1);
35c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
35d0: 20 20 20 7d 0a 20 20 20 20 65 73 63 61 70 65 20     }.    escape 
35e0: 3d 20 73 71 6c 69 74 65 33 52 65 61 64 55 74 66  = sqlite3ReadUtf
35f0: 38 28 7a 45 73 63 29 3b 0a 20 20 7d 0a 20 20 69  8(zEsc);.  }.  i
3600: 66 28 20 7a 41 20 26 26 20 7a 42 20 29 7b 0a 20  f( zA && zB ){. 
3610: 20 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61 72     struct compar
3620: 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 73  eInfo *pInfo = s
3630: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
3640: 28 63 6f 6e 74 65 78 74 29 3b 0a 23 69 66 64 65  (context);.#ifde
3650: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
3660: 20 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63    sqlite3_like_c
3670: 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
3680: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3690: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
36a0: 61 74 74 65 72 6e 43 6f 6d 70 61 72 65 28 7a 41  atternCompare(zA
36b0: 2c 20 7a 42 2c 20 70 49 6e 66 6f 2c 20 65 73 63  , zB, pInfo, esc
36c0: 61 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ape));.  }.}../*
36d0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
36e0: 6f 6e 20 6f 66 20 74 68 65 20 4e 55 4c 4c 49 46  on of the NULLIF
36f0: 28 78 2c 79 29 20 66 75 6e 63 74 69 6f 6e 2e 20  (x,y) function. 
3700: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
3710: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
3720: 6d 65 6e 74 20 69 66 20 74 68 65 20 61 72 67 75  ment if the argu
3730: 6d 65 6e 74 73 20 61 72 65 20 64 69 66 66 65 72  ments are differ
3740: 65 6e 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ent.  The result
3750: 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a   is NULL if the.
3760: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ** arguments are
3770: 20 65 71 75 61 6c 20 74 6f 20 65 61 63 68 20 6f   equal to each o
3780: 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
3790: 76 6f 69 64 20 6e 75 6c 6c 69 66 46 75 6e 63 28  void nullifFunc(
37a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
37b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
37c0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
37d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
37e0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
37f0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
3800: 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74  FuncCollSeq(cont
3810: 65 78 74 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ext);.  if( sqli
3820: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 61 72  te3MemCompare(ar
3830: 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 2c 20  gv[0], argv[1], 
3840: 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20  pColl)!=0 ){.   
3850: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3860: 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61  value(context, a
3870: 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a  rgv[0]);.  }.}..
3880: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
3890: 74 69 6f 6e 20 6f 66 20 74 68 65 20 56 45 52 53  tion of the VERS
38a0: 49 4f 4e 28 2a 29 20 66 75 6e 63 74 69 6f 6e 2e  ION(*) function.
38b0: 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20    The result is 
38c0: 74 68 65 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f  the version.** o
38d0: 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  f the SQLite lib
38e0: 72 61 72 79 20 74 68 61 74 20 69 73 20 72 75 6e  rary that is run
38f0: 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
3900: 76 6f 69 64 20 76 65 72 73 69 6f 6e 46 75 6e 63  void versionFunc
3910: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
3920: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
3930: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
3940: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
3950: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  .){.  sqlite3_re
3960: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
3970: 74 2c 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  t, sqlite3_versi
3980: 6f 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  on, -1, SQLITE_S
3990: 54 41 54 49 43 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TATIC);.}.../*.*
39a0: 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 2d  * EXPERIMENTAL -
39b0: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20   This is not an 
39c0: 6f 66 66 69 63 69 61 6c 20 66 75 6e 63 74 69 6f  official functio
39d0: 6e 2e 20 20 54 68 65 20 69 6e 74 65 72 66 61 63  n.  The interfac
39e0: 65 20 6d 61 79 0a 2a 2a 20 63 68 61 6e 67 65 2e  e may.** change.
39f0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
3a00: 6d 61 79 20 64 69 73 61 70 70 65 61 72 2e 20 20  may disappear.  
3a10: 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 63 6f 64  Do not write cod
3a20: 65 20 74 68 61 74 20 64 65 70 65 6e 64 73 0a 2a  e that depends.*
3a30: 2a 20 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69  * on this functi
3a40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  on..**.** Implem
3a50: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
3a60: 51 55 4f 54 45 28 29 20 66 75 6e 63 74 69 6f 6e  QUOTE() function
3a70: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
3a80: 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a   takes a single.
3a90: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66  ** argument.  If
3aa0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
3ab0: 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 20 72 65   numeric, the re
3ac0: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
3ad0: 65 20 73 61 6d 65 20 61 73 0a 2a 2a 20 74 68 65  e same as.** the
3ae0: 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 20 74   argument.  If t
3af0: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  he argument is N
3b00: 55 4c 4c 2c 20 74 68 65 20 72 65 74 75 72 6e 20  ULL, the return 
3b10: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 74 72  value is the str
3b20: 69 6e 67 0a 2a 2a 20 22 4e 55 4c 4c 22 2e 20 20  ing.** "NULL".  
3b30: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
3b40: 72 67 75 6d 65 6e 74 20 69 73 20 65 6e 63 6c 6f  rgument is enclo
3b50: 73 65 64 20 69 6e 20 73 69 6e 67 6c 65 20 71 75  sed in single qu
3b60: 6f 74 65 73 20 77 69 74 68 0a 2a 2a 20 73 69 6e  otes with.** sin
3b70: 67 6c 65 2d 71 75 6f 74 65 20 65 73 63 61 70 65  gle-quote escape
3b80: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
3b90: 64 20 71 75 6f 74 65 46 75 6e 63 28 73 71 6c 69  d quoteFunc(sqli
3ba0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
3bb0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
3bc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3bd0: 61 72 67 76 29 7b 0a 20 20 69 66 28 20 61 72 67  argv){.  if( arg
3be0: 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  c<1 ) return;.  
3bf0: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
3c00: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
3c10: 30 5d 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  0]) ){.    case 
3c20: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
3c30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3c40: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
3c50: 2c 20 22 4e 55 4c 4c 22 2c 20 34 2c 20 53 51 4c  , "NULL", 4, SQL
3c60: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
3c70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3c80: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3c90: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
3ca0: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
3cb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
3cc0: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
3cd0: 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  text, argv[0]);.
3ce0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3cf0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3d00: 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
3d10: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
3d20: 61 72 20 68 65 78 64 69 67 69 74 73 5b 5d 20 3d  ar hexdigits[] =
3d30: 20 7b 20 0a 20 20 20 20 20 20 20 20 27 30 27 2c   { .        '0',
3d40: 20 27 31 27 2c 20 27 32 27 2c 20 27 33 27 2c 20   '1', '2', '3', 
3d50: 27 34 27 2c 20 27 35 27 2c 20 27 36 27 2c 20 27  '4', '5', '6', '
3d60: 37 27 2c 0a 20 20 20 20 20 20 20 20 27 38 27 2c  7',.        '8',
3d70: 20 27 39 27 2c 20 27 41 27 2c 20 27 42 27 2c 20   '9', 'A', 'B', 
3d80: 27 43 27 2c 20 27 44 27 2c 20 27 45 27 2c 20 27  'C', 'D', 'E', '
3d90: 46 27 20 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  F' .      };.   
3da0: 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d     char *zText =
3db0: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   0;.      int nB
3dc0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
3dd0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
3de0: 5d 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63  ]);.      char c
3df0: 6f 6e 73 74 20 2a 7a 42 6c 6f 62 20 3d 20 73 71  onst *zBlob = sq
3e00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
3e10: 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 20 20  (argv[0]);..    
3e20: 20 20 7a 54 65 78 74 20 3d 20 28 63 68 61 72 20    zText = (char 
3e30: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 28  *)sqliteMalloc((
3e40: 32 2a 6e 42 6c 6f 62 29 2b 34 29 3b 20 0a 20 20  2*nBlob)+4); .  
3e50: 20 20 20 20 69 66 28 20 21 7a 54 65 78 74 20 29      if( !zText )
3e60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3e70: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
3e80: 6f 6e 74 65 78 74 2c 20 22 6f 75 74 20 6f 66 20  ontext, "out of 
3e90: 6d 65 6d 6f 72 79 22 2c 20 2d 31 29 3b 0a 20 20  memory", -1);.  
3ea0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3eb0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
3ec0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c    for(i=0; i<nBl
3ed0: 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ob; i++){.      
3ee0: 20 20 20 20 7a 54 65 78 74 5b 28 69 2a 32 29 2b      zText[(i*2)+
3ef0: 32 5d 20 3d 20 68 65 78 64 69 67 69 74 73 5b 28  2] = hexdigits[(
3f00: 7a 42 6c 6f 62 5b 69 5d 3e 3e 34 29 26 30 78 30  zBlob[i]>>4)&0x0
3f10: 46 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  F];.          zT
3f20: 65 78 74 5b 28 69 2a 32 29 2b 33 5d 20 3d 20 68  ext[(i*2)+3] = h
3f30: 65 78 64 69 67 69 74 73 5b 28 7a 42 6c 6f 62 5b  exdigits[(zBlob[
3f40: 69 5d 29 26 30 78 30 46 5d 3b 0a 20 20 20 20 20  i])&0x0F];.     
3f50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 54 65     }.        zTe
3f60: 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b 32 5d 20  xt[(nBlob*2)+2] 
3f70: 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  = '\'';.        
3f80: 7a 54 65 78 74 5b 28 6e 42 6c 6f 62 2a 32 29 2b  zText[(nBlob*2)+
3f90: 33 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  3] = '\0';.     
3fa0: 20 20 20 7a 54 65 78 74 5b 30 5d 20 3d 20 27 58     zText[0] = 'X
3fb0: 27 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 78 74  ';.        zText
3fc0: 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  [1] = '\'';.    
3fd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3fe0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
3ff0: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51 4c 49   zText, -1, SQLI
4000: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
4010: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
4020: 65 28 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20  e(zText);.      
4030: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4040: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
4050: 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20  LITE_TEXT: {.   
4060: 20 20 20 69 6e 74 20 69 2c 6a 2c 6e 3b 0a 20 20     int i,j,n;.  
4070: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4080: 7a 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 76  zArg = sqlite3_v
4090: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
40a0: 5d 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ]);.      char *
40b0: 7a 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  z;..      for(i=
40c0: 6e 3d 30 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b  n=0; zArg[i]; i+
40d0: 2b 29 7b 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d  +){ if( zArg[i]=
40e0: 3d 27 5c 27 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20  ='\'' ) n++; }. 
40f0: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 4d       z = sqliteM
4100: 61 6c 6c 6f 63 28 20 69 2b 6e 2b 33 20 29 3b 0a  alloc( i+n+3 );.
4110: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
4120: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7a   return;.      z
4130: 5b 30 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  [0] = '\'';.    
4140: 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 31 3b 20    for(i=0, j=1; 
4150: 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zArg[i]; i++){. 
4160: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
4170: 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
4180: 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c   if( zArg[i]=='\
4190: 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  '' ){.          
41a0: 7a 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  z[j++] = '\'';. 
41b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
41c0: 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20  .      z[j++] = 
41d0: 27 5c 27 27 3b 0a 20 20 20 20 20 20 7a 5b 6a 5d  '\'';.      z[j]
41e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
41f0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
4200: 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 6a 2c 20 53  context, z, j, S
4210: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
4220: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
4230: 65 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ee(z);.    }.  }
4240: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4250: 45 5f 53 4f 55 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  E_SOUNDEX./*.** 
4260: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 6f 75 6e  Compute the soun
4270: 64 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  dex encoding of 
4280: 61 20 77 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  a word..*/.stati
4290: 63 20 76 6f 69 64 20 73 6f 75 6e 64 65 78 46 75  c void soundexFu
42a0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
42b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
42c0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
42d0: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
42e0: 63 68 61 72 20 7a 52 65 73 75 6c 74 5b 38 5d 3b  char zResult[8];
42f0: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 49 6e  .  const u8 *zIn
4300: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
4310: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
4320: 69 67 6e 65 64 20 63 68 61 72 20 69 43 6f 64 65  igned char iCode
4330: 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20 30 2c  [] = {.    0, 0,
4340: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4350: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
4360: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 30  , 0, 0, 0,.    0
4370: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
4380: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4390: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
43a0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
43b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
43c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
43d0: 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,.    0, 0, 0, 
43e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
43f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
4400: 20 30 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c   0, 0,.    0, 0,
4410: 20 31 2c 20 32 2c 20 33 2c 20 30 2c 20 31 2c 20   1, 2, 3, 0, 1, 
4420: 32 2c 20 30 2c 20 30 2c 20 32 2c 20 32 2c 20 34  2, 0, 0, 2, 2, 4
4430: 2c 20 35 2c 20 35 2c 20 30 2c 0a 20 20 20 20 31  , 5, 5, 0,.    1
4440: 2c 20 32 2c 20 36 2c 20 32 2c 20 33 2c 20 30 2c  , 2, 6, 2, 3, 0,
4450: 20 31 2c 20 30 2c 20 32 2c 20 30 2c 20 32 2c 20   1, 0, 2, 0, 2, 
4460: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
4470: 20 20 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 33     0, 0, 1, 2, 3
4480: 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 30 2c  , 0, 1, 2, 0, 0,
4490: 20 32 2c 20 32 2c 20 34 2c 20 35 2c 20 35 2c 20   2, 2, 4, 5, 5, 
44a0: 30 2c 0a 20 20 20 20 31 2c 20 32 2c 20 36 2c 20  0,.    1, 2, 6, 
44b0: 32 2c 20 33 2c 20 30 2c 20 31 2c 20 30 2c 20 32  2, 3, 0, 1, 0, 2
44c0: 2c 20 30 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 2, 0, 0, 0,
44d0: 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20 61 73   0, 0,.  };.  as
44e0: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
44f0: 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a 29 73 71  .  zIn = (u8*)sq
4500: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
4510: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72  (argv[0]);.  for
4520: 28 69 3d 30 3b 20 7a 49 6e 5b 69 5d 20 26 26 20  (i=0; zIn[i] && 
4530: 21 69 73 61 6c 70 68 61 28 7a 49 6e 5b 69 5d 29  !isalpha(zIn[i])
4540: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a  ; i++){}.  if( z
4550: 49 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 7a 52 65  In[i] ){.    zRe
4560: 73 75 6c 74 5b 30 5d 20 3d 20 74 6f 75 70 70 65  sult[0] = touppe
4570: 72 28 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 66  r(zIn[i]);.    f
4580: 6f 72 28 6a 3d 31 3b 20 6a 3c 34 20 26 26 20 7a  or(j=1; j<4 && z
4590: 49 6e 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  In[i]; i++){.   
45a0: 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 69 43     int code = iC
45b0: 6f 64 65 5b 7a 49 6e 5b 69 5d 26 30 78 37 66 5d  ode[zIn[i]&0x7f]
45c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 64 65  ;.      if( code
45d0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  >0 ){.        zR
45e0: 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 63 6f 64  esult[j++] = cod
45f0: 65 20 2b 20 27 30 27 3b 0a 20 20 20 20 20 20 7d  e + '0';.      }
4600: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
4610: 28 20 6a 3c 34 20 29 7b 0a 20 20 20 20 20 20 7a  ( j<4 ){.      z
4620: 52 65 73 75 6c 74 5b 6a 2b 2b 5d 20 3d 20 27 30  Result[j++] = '0
4630: 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65  ';.    }.    zRe
4640: 73 75 6c 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  sult[j] = 0;.   
4650: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4660: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52  text(context, zR
4670: 65 73 75 6c 74 2c 20 34 2c 20 53 51 4c 49 54 45  esult, 4, SQLITE
4680: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
4690: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
46a0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
46b0: 6e 74 65 78 74 2c 20 22 3f 30 30 30 22 2c 20 34  ntext, "?000", 4
46c0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
46d0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
46e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
46f0: 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ST./*.** This fu
4700: 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73  nction generates
4710: 20 61 20 73 74 72 69 6e 67 20 6f 66 20 72 61 6e   a string of ran
4720: 64 6f 6d 20 63 68 61 72 61 63 74 65 72 73 2e 20  dom characters. 
4730: 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 67 65 6e   Used for.** gen
4740: 65 72 61 74 69 6e 67 20 74 65 73 74 20 64 61 74  erating test dat
4750: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
4760: 64 20 72 61 6e 64 53 74 72 28 73 71 6c 69 74 65  d randStr(sqlite
4770: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
4780: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
4790: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
47a0: 67 76 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  gv){.  static co
47b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
47c0: 72 20 7a 53 72 63 5b 5d 20 3d 20 0a 20 20 20 20  r zSrc[] = .    
47d0: 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
47e0: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
47f0: 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
4800: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
4810: 20 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39       "0123456789
4820: 22 0a 20 20 20 20 20 22 2e 2d 21 2c 3a 2a 5e 2b  ".     ".-!,:*^+
4830: 3d 5f 7c 3f 2f 3c 3e 20 22 3b 0a 20 20 69 6e 74  =_|?/<> ";.  int
4840: 20 69 4d 69 6e 2c 20 69 4d 61 78 2c 20 6e 2c 20   iMin, iMax, n, 
4850: 72 2c 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  r, i;.  unsigned
4860: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
4870: 3b 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 31 20  ;.  if( argc>=1 
4880: 29 7b 0a 20 20 20 20 69 4d 69 6e 20 3d 20 73 71  ){.    iMin = sq
4890: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
48a0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
48b0: 28 20 69 4d 69 6e 3c 30 20 29 20 69 4d 69 6e 20  ( iMin<0 ) iMin 
48c0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 4d 69  = 0;.    if( iMi
48d0: 6e 3e 3d 73 69 7a 65 6f 66 28 7a 42 75 66 29 20  n>=sizeof(zBuf) 
48e0: 29 20 69 4d 69 6e 20 3d 20 73 69 7a 65 6f 66 28  ) iMin = sizeof(
48f0: 7a 42 75 66 29 2d 31 3b 0a 20 20 7d 65 6c 73 65  zBuf)-1;.  }else
4900: 7b 0a 20 20 20 20 69 4d 69 6e 20 3d 20 31 3b 0a  {.    iMin = 1;.
4910: 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 3d    }.  if( argc>=
4920: 32 20 29 7b 0a 20 20 20 20 69 4d 61 78 20 3d 20  2 ){.    iMax = 
4930: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
4940: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  t(argv[1]);.    
4950: 69 66 28 20 69 4d 61 78 3c 69 4d 69 6e 20 29 20  if( iMax<iMin ) 
4960: 69 4d 61 78 20 3d 20 69 4d 69 6e 3b 0a 20 20 20  iMax = iMin;.   
4970: 20 69 66 28 20 69 4d 61 78 3e 3d 73 69 7a 65 6f   if( iMax>=sizeo
4980: 66 28 7a 42 75 66 29 20 29 20 69 4d 61 78 20 3d  f(zBuf) ) iMax =
4990: 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 3b   sizeof(zBuf)-1;
49a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4d  .  }else{.    iM
49b0: 61 78 20 3d 20 35 30 3b 0a 20 20 7d 0a 20 20 6e  ax = 50;.  }.  n
49c0: 20 3d 20 69 4d 69 6e 3b 0a 20 20 69 66 28 20 69   = iMin;.  if( i
49d0: 4d 61 78 3e 69 4d 69 6e 20 29 7b 0a 20 20 20 20  Max>iMin ){.    
49e0: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
49f0: 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29  s(sizeof(r), &r)
4a00: 3b 0a 20 20 20 20 72 20 26 3d 20 30 78 37 66 66  ;.    r &= 0x7ff
4a10: 66 66 66 66 66 3b 0a 20 20 20 20 6e 20 2b 3d 20  fffff;.    n += 
4a20: 72 25 28 69 4d 61 78 20 2b 20 31 20 2d 20 69 4d  r%(iMax + 1 - iM
4a30: 69 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  in);.  }.  asser
4a40: 74 28 20 6e 3c 73 69 7a 65 6f 66 28 7a 42 75 66  t( n<sizeof(zBuf
4a50: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 61  ) );.  sqlite3Ra
4a60: 6e 64 6f 6d 6e 65 73 73 28 6e 2c 20 7a 42 75 66  ndomness(n, zBuf
4a70: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4a80: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 42 75  n; i++){.    zBu
4a90: 66 5b 69 5d 20 3d 20 7a 53 72 63 5b 7a 42 75 66  f[i] = zSrc[zBuf
4aa0: 5b 69 5d 25 28 73 69 7a 65 6f 66 28 7a 53 72 63  [i]%(sizeof(zSrc
4ab0: 29 2d 31 29 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75  )-1)];.  }.  zBu
4ac0: 66 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  f[n] = 0;.  sqli
4ad0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
4ae0: 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 6e  context, zBuf, n
4af0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
4b00: 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  NT);.}.#endif /*
4b10: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.
4b20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4b30: 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  EST./*.** The fo
4b40: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 53 51 4c 20  llowing two SQL 
4b50: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73  functions are us
4b60: 65 64 20 74 6f 20 74 65 73 74 20 72 65 74 75 72  ed to test retur
4b70: 6e 69 6e 67 20 61 20 74 65 78 74 0a 2a 2a 20 72  ning a text.** r
4b80: 65 73 75 6c 74 20 77 69 74 68 20 61 20 64 65 73  esult with a des
4b90: 74 72 75 63 74 6f 72 2e 20 46 75 6e 63 74 69 6f  tructor. Functio
4ba0: 6e 20 27 74 65 73 74 5f 64 65 73 74 72 75 63 74  n 'test_destruct
4bb0: 6f 72 27 20 74 61 6b 65 73 20 6f 6e 65 20 61 72  or' takes one ar
4bc0: 67 75 6d 65 6e 74 0a 2a 2a 20 61 6e 64 20 72 65  gument.** and re
4bd0: 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 61  turns the same a
4be0: 72 67 75 6d 65 6e 74 20 69 6e 74 65 72 70 72 65  rgument interpre
4bf0: 74 65 64 20 61 73 20 54 45 58 54 2e 20 41 20 64  ted as TEXT. A d
4c00: 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20  estructor is.** 
4c10: 70 61 73 73 65 64 20 77 69 74 68 20 74 68 65 20  passed with the 
4c20: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4c30: 65 78 74 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  ext() call..**.*
4c40: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 27  * SQL function '
4c50: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  test_destructor_
4c60: 63 6f 75 6e 74 27 20 72 65 74 75 72 6e 73 20 74  count' returns t
4c70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
4c80: 73 74 61 6e 64 69 6e 67 20 0a 2a 2a 20 61 6c 6c  standing .** all
4c90: 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
4ca0: 20 27 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f   'test_destructo
4cb0: 72 27 3b 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  r';.**.** WARNIN
4cc0: 47 3a 20 4e 6f 74 20 74 68 72 65 61 64 73 61 66  G: Not threadsaf
4cd0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4ce0: 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72   test_destructor
4cf0: 5f 63 6f 75 6e 74 5f 76 61 72 20 3d 20 30 3b 0a  _count_var = 0;.
4d00: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
4d10: 72 75 63 74 6f 72 28 76 6f 69 64 20 2a 70 29 7b  ructor(void *p){
4d20: 0a 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20  .  char *zVal = 
4d30: 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 61 73 73  (char *)p;.  ass
4d40: 65 72 74 28 7a 56 61 6c 29 3b 0a 20 20 7a 56 61  ert(zVal);.  zVa
4d50: 6c 2d 2d 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  l--;.  sqliteFre
4d60: 65 28 7a 56 61 6c 29 3b 0a 20 20 74 65 73 74 5f  e(zVal);.  test_
4d70: 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74  destructor_count
4d80: 5f 76 61 72 2d 2d 3b 0a 7d 0a 73 74 61 74 69 63  _var--;.}.static
4d90: 20 76 6f 69 64 20 74 65 73 74 5f 64 65 73 74 72   void test_destr
4da0: 75 63 74 6f 72 28 0a 20 20 73 71 6c 69 74 65 33  uctor(.  sqlite3
4db0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
4dc0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
4dd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4de0: 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  rgv.){.  char *z
4df0: 56 61 6c 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  Val;.  int len;.
4e00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4e10: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
4e20: 61 28 70 43 74 78 29 3b 0a 20 0a 20 20 74 65 73  a(pCtx);. .  tes
4e30: 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75  t_destructor_cou
4e40: 6e 74 5f 76 61 72 2b 2b 3b 0a 20 20 61 73 73 65  nt_var++;.  asse
4e50: 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
4e60: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
4e70: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
4e80: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
4e90: 72 65 74 75 72 6e 3b 0a 20 20 6c 65 6e 20 3d 20  return;.  len = 
4ea0: 73 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65  sqlite3ValueByte
4eb0: 73 28 61 72 67 76 5b 30 5d 2c 20 64 62 2d 3e 65  s(argv[0], db->e
4ec0: 6e 63 29 3b 20 0a 20 20 7a 56 61 6c 20 3d 20 73  nc); .  zVal = s
4ed0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b  qliteMalloc(len+
4ee0: 33 29 3b 0a 20 20 7a 56 61 6c 5b 6c 65 6e 5d 20  3);.  zVal[len] 
4ef0: 3d 20 30 3b 0a 20 20 7a 56 61 6c 5b 6c 65 6e 2d  = 0;.  zVal[len-
4f00: 31 5d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  1] = 0;.  assert
4f10: 28 20 7a 56 61 6c 20 29 3b 0a 20 20 7a 56 61 6c  ( zVal );.  zVal
4f20: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 56 61  ++;.  memcpy(zVa
4f30: 6c 2c 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54  l, sqlite3ValueT
4f40: 65 78 74 28 61 72 67 76 5b 30 5d 2c 20 64 62 2d  ext(argv[0], db-
4f50: 3e 65 6e 63 29 2c 20 6c 65 6e 29 3b 0a 20 20 69  >enc), len);.  i
4f60: 66 28 20 64 62 2d 3e 65 6e 63 3d 3d 53 51 4c 49  f( db->enc==SQLI
4f70: 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 73  TE_UTF8 ){.    s
4f80: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
4f90: 78 74 28 70 43 74 78 2c 20 7a 56 61 6c 2c 20 2d  xt(pCtx, zVal, -
4fa0: 31 2c 20 64 65 73 74 72 75 63 74 6f 72 29 3b 0a  1, destructor);.
4fb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4fc0: 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73  MIT_UTF16.  }els
4fd0: 65 20 69 66 28 20 64 62 2d 3e 65 6e 63 3d 3d 53  e if( db->enc==S
4fe0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 29 7b  QLITE_UTF16LE ){
4ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
5000: 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 70 43 74  ult_text16le(pCt
5010: 78 2c 20 7a 56 61 6c 2c 20 2d 31 2c 20 64 65 73  x, zVal, -1, des
5020: 74 72 75 63 74 6f 72 29 3b 0a 20 20 7d 65 6c 73  tructor);.  }els
5030: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
5040: 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70  esult_text16be(p
5050: 43 74 78 2c 20 7a 56 61 6c 2c 20 2d 31 2c 20 64  Ctx, zVal, -1, d
5060: 65 73 74 72 75 63 74 6f 72 29 3b 0a 23 65 6e 64  estructor);.#end
5070: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
5080: 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 7d 0a 7d  T_UTF16 */.  }.}
5090: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
50a0: 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75  t_destructor_cou
50b0: 6e 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nt(.  sqlite3_co
50c0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
50d0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
50e0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
50f0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  .){.  sqlite3_re
5100: 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 74  sult_int(pCtx, t
5110: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  est_destructor_c
5120: 6f 75 6e 74 5f 76 61 72 29 3b 0a 7d 0a 23 65 6e  ount_var);.}.#en
5130: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45  dif /* SQLITE_TE
5140: 53 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  ST */..#ifdef SQ
5150: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
5160: 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 65 73  Routines for tes
5170: 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  ting the sqlite3
5180: 5f 67 65 74 5f 61 75 78 64 61 74 61 28 29 20 61  _get_auxdata() a
5190: 6e 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61  nd sqlite3_set_a
51a0: 75 78 64 61 74 61 28 29 0a 2a 2a 20 69 6e 74 65  uxdata().** inte
51b0: 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rface..**.** The
51c0: 20 74 65 73 74 5f 61 75 78 64 61 74 61 28 29 20   test_auxdata() 
51d0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  SQL function att
51e0: 65 6d 70 74 73 20 74 6f 20 72 65 67 69 73 74 65  empts to registe
51f0: 72 20 65 61 63 68 20 6f 66 20 69 74 73 20 61 72  r each of its ar
5200: 67 75 6d 65 6e 74 73 0a 2a 2a 20 61 73 20 61 75  guments.** as au
5210: 78 69 6c 69 61 72 79 20 64 61 74 61 2e 20 20 49  xiliary data.  I
5220: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 70  f there are no p
5230: 72 69 6f 72 20 72 65 67 69 73 74 72 61 74 69 6f  rior registratio
5240: 6e 73 20 6f 66 20 61 75 78 20 64 61 74 61 20 66  ns of aux data f
5250: 6f 72 0a 2a 2a 20 74 68 61 74 20 61 72 67 75 6d  or.** that argum
5260: 65 6e 74 20 28 6d 65 61 6e 69 6e 67 20 74 68 65  ent (meaning the
5270: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
5280: 20 61 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 74   a constant or t
5290: 68 69 73 20 69 73 20 69 74 73 20 66 69 72 73 74  his is its first
52a0: 0a 2a 2a 20 63 61 6c 6c 29 20 74 68 65 6e 20 74  .** call) then t
52b0: 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 74 68  he result for th
52c0: 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 30  at argument is 0
52d0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
52e0: 20 70 72 69 6f 72 0a 2a 2a 20 72 65 67 69 73 74   prior.** regist
52f0: 72 61 74 69 6f 6e 2c 20 74 68 65 20 72 65 73 75  ration, the resu
5300: 6c 74 20 66 6f 72 20 74 68 61 74 20 61 72 67 75  lt for that argu
5310: 6d 65 6e 74 20 69 73 20 31 2e 20 20 54 68 65 20  ment is 1.  The 
5320: 6f 76 65 72 61 6c 6c 20 72 65 73 75 6c 74 0a 2a  overall result.*
5330: 2a 20 69 73 20 74 68 65 20 69 6e 64 69 76 69 64  * is the individ
5340: 75 61 6c 20 61 72 67 75 6d 65 6e 74 20 72 65 73  ual argument res
5350: 75 6c 74 73 20 73 65 70 61 72 61 74 65 64 20 62  ults separated b
5360: 79 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  y spaces..*/.sta
5370: 74 69 63 20 76 6f 69 64 20 66 72 65 65 5f 74 65  tic void free_te
5380: 73 74 5f 61 75 78 64 61 74 61 28 76 6f 69 64 20  st_auxdata(void 
5390: 2a 70 29 20 7b 73 71 6c 69 74 65 46 72 65 65 28  *p) {sqliteFree(
53a0: 70 29 3b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  p);}.static void
53b0: 20 74 65 73 74 5f 61 75 78 64 61 74 61 28 0a 20   test_auxdata(. 
53c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
53d0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
53e0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
53f0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
5400: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
5410: 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  zRet = sqliteMal
5420: 6c 6f 63 28 6e 41 72 67 2a 32 29 3b 0a 20 20 69  loc(nArg*2);.  i
5430: 66 28 20 21 7a 52 65 74 20 29 20 72 65 74 75 72  f( !zRet ) retur
5440: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
5450: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
5460: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 20 3d 20  char const *z = 
5470: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
5480: 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  xt(argv[i]);.   
5490: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
54a0: 63 68 61 72 20 2a 7a 41 75 78 20 3d 20 73 71 6c  char *zAux = sql
54b0: 69 74 65 33 5f 67 65 74 5f 61 75 78 64 61 74 61  ite3_get_auxdata
54c0: 28 70 43 74 78 2c 20 69 29 3b 0a 20 20 20 20 20  (pCtx, i);.     
54d0: 20 69 66 28 20 7a 41 75 78 20 29 7b 0a 20 20 20   if( zAux ){.   
54e0: 20 20 20 20 20 7a 52 65 74 5b 69 2a 32 5d 20 3d       zRet[i*2] =
54f0: 20 27 31 27 3b 0a 20 20 20 20 20 20 20 20 69 66   '1';.        if
5500: 28 20 73 74 72 63 6d 70 28 7a 41 75 78 2c 20 7a  ( strcmp(zAux, z
5510: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
5520: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5530: 72 6f 72 28 70 43 74 78 2c 20 22 41 75 78 69 6c  ror(pCtx, "Auxil
5540: 61 72 79 20 64 61 74 61 20 63 6f 72 72 75 70 74  ary data corrupt
5550: 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20  ion", -1);.     
5560: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
5570: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
5580: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  se{.        zRet
5590: 5b 69 2a 32 5d 20 3d 20 27 30 27 3b 0a 20 20 20  [i*2] = '0';.   
55a0: 20 20 20 20 20 7a 41 75 78 20 3d 20 73 71 6c 69       zAux = sqli
55b0: 74 65 53 74 72 44 75 70 28 7a 29 3b 0a 20 20 20  teStrDup(z);.   
55c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
55d0: 5f 61 75 78 64 61 74 61 28 70 43 74 78 2c 20 69  _auxdata(pCtx, i
55e0: 2c 20 7a 41 75 78 2c 20 66 72 65 65 5f 74 65 73  , zAux, free_tes
55f0: 74 5f 61 75 78 64 61 74 61 29 3b 0a 20 20 20 20  t_auxdata);.    
5600: 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 74 5b 69    }.      zRet[i
5610: 2a 32 2b 31 5d 20 3d 20 27 20 27 3b 0a 20 20 20  *2+1] = ' ';.   
5620: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
5630: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
5640: 78 2c 20 7a 52 65 74 2c 20 32 2a 6e 41 72 67 2d  x, zRet, 2*nArg-
5650: 31 2c 20 66 72 65 65 5f 74 65 73 74 5f 61 75 78  1, free_test_aux
5660: 64 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  data);.}.#endif 
5670: 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
5680: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
5690: 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 41 20 66 75  _TEST./*.** A fu
56a0: 6e 63 74 69 6f 6e 20 74 6f 20 74 65 73 74 20 65  nction to test e
56b0: 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 20 66  rror reporting f
56c0: 72 6f 6d 20 75 73 65 72 20 66 75 6e 63 74 69 6f  rom user functio
56d0: 6e 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ns. This functio
56e0: 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 63  n.** returns a c
56f0: 6f 70 79 20 6f 66 20 69 74 27 73 20 66 69 72 73  opy of it's firs
5700: 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20 61 6e  t argument as an
5710: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
5720: 63 20 76 6f 69 64 20 74 65 73 74 5f 65 72 72 6f  c void test_erro
5730: 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  r(.  sqlite3_con
5740: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
5750: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
5760: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5770: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ){.  sqlite3_res
5780: 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
5790: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
57a0: 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 30 29 3b  xt(argv[0]), 0);
57b0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
57c0: 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a  ITE_TEST */../*.
57d0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
57e0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
57f0: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
5800: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61  the context of a
5810: 0a 2a 2a 20 73 75 6d 28 29 20 6f 72 20 61 76 67  .** sum() or avg
5820: 28 29 20 61 67 67 72 65 67 61 74 65 20 63 6f 6d  () aggregate com
5830: 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  putation..*/.typ
5840: 65 64 65 66 20 73 74 72 75 63 74 20 53 75 6d 43  edef struct SumC
5850: 74 78 20 53 75 6d 43 74 78 3b 0a 73 74 72 75 63  tx SumCtx;.struc
5860: 74 20 53 75 6d 43 74 78 20 7b 0a 20 20 64 6f 75  t SumCtx {.  dou
5870: 62 6c 65 20 73 75 6d 3b 20 20 20 20 20 2f 2a 20  ble sum;     /* 
5880: 53 75 6d 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a  Sum of terms */.
5890: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
58a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
58b0: 6c 65 6d 65 6e 74 73 20 73 75 6d 6d 65 64 20 2a  lements summed *
58c0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  /.};../*.** Rout
58d0: 69 6e 65 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ines used to com
58e0: 70 75 74 65 20 74 68 65 20 73 75 6d 20 6f 72 20  pute the sum or 
58f0: 61 76 65 72 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  average..*/.stat
5900: 69 63 20 76 6f 69 64 20 73 75 6d 53 74 65 70 28  ic void sumStep(
5910: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5920: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
5930: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
5940: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 53 75 6d  e **argv){.  Sum
5950: 43 74 78 20 2a 70 3b 0a 20 20 69 66 28 20 61 72  Ctx *p;.  if( ar
5960: 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  gc<1 ) return;. 
5970: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
5980: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
5990: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
59a0: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  p));.  if( p && 
59b0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
59c0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
59d0: 61 72 67 76 5b 30 5d 29 20 29 7b 0a 20 20 20 20  argv[0]) ){.    
59e0: 70 2d 3e 73 75 6d 20 2b 3d 20 73 71 6c 69 74 65  p->sum += sqlite
59f0: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
5a00: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 70 2d 3e  rgv[0]);.    p->
5a10: 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61  cnt++;.  }.}.sta
5a20: 74 69 63 20 76 6f 69 64 20 73 75 6d 46 69 6e 61  tic void sumFina
5a30: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
5a40: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
5a50: 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a 20 20 70    SumCtx *p;.  p
5a60: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
5a70: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
5a80: 74 65 78 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  text, 0);.  sqli
5a90: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
5aa0: 65 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70  e(context, p ? p
5ab0: 2d 3e 73 75 6d 20 3a 20 30 2e 30 29 3b 0a 7d 0a  ->sum : 0.0);.}.
5ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 76 67 46  static void avgF
5ad0: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
5ae0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
5af0: 29 7b 0a 20 20 53 75 6d 43 74 78 20 2a 70 3b 0a  ){.  SumCtx *p;.
5b00: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
5b10: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
5b20: 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69  context, 0);.  i
5b30: 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74 3e 30  f( p && p->cnt>0
5b40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5b50: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
5b60: 6e 74 65 78 74 2c 20 70 2d 3e 73 75 6d 2f 28 64  ntext, p->sum/(d
5b70: 6f 75 62 6c 65 29 70 2d 3e 63 6e 74 29 3b 0a 20  ouble)p->cnt);. 
5b80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69   }.}../*.** An i
5b90: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
5ba0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
5bb0: 72 65 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6e  re holds the con
5bc0: 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20 76 61 72  text of a.** var
5bd0: 69 61 6e 63 65 20 6f 72 20 73 74 61 6e 64 61 72  iance or standar
5be0: 64 20 64 65 76 69 61 74 69 6f 6e 20 63 6f 6d 70  d deviation comp
5bf0: 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  utation..*/.type
5c00: 64 65 66 20 73 74 72 75 63 74 20 53 74 64 44 65  def struct StdDe
5c10: 76 43 74 78 20 53 74 64 44 65 76 43 74 78 3b 0a  vCtx StdDevCtx;.
5c20: 73 74 72 75 63 74 20 53 74 64 44 65 76 43 74 78  struct StdDevCtx
5c30: 20 7b 0a 20 20 64 6f 75 62 6c 65 20 73 75 6d 3b   {.  double sum;
5c40: 20 20 20 20 20 2f 2a 20 53 75 6d 20 6f 66 20 74       /* Sum of t
5c50: 65 72 6d 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  erms */.  double
5c60: 20 73 75 6d 32 3b 20 20 20 20 2f 2a 20 53 75 6d   sum2;    /* Sum
5c70: 20 6f 66 20 74 68 65 20 73 71 75 61 72 65 73 20   of the squares 
5c80: 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  of terms */.  in
5c90: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  t cnt;        /*
5ca0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
5cb0: 20 63 6f 75 6e 74 65 64 20 2a 2f 0a 7d 3b 0a 0a   counted */.};..
5cc0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
5cd0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
5ce0: 65 70 73 20 74 72 61 63 6b 20 6f 66 20 73 74 61  eps track of sta
5cf0: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  te information f
5d00: 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75 6e 74 28  or the.** count(
5d10: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
5d20: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
5d30: 20 73 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78   struct CountCtx
5d40: 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63   CountCtx;.struc
5d50: 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69  t CountCtx {.  i
5d60: 6e 74 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  nt n;.};../*.** 
5d70: 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c  Routines to impl
5d80: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 28  ement the count(
5d90: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
5da0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5db0: 76 6f 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73  void countStep(s
5dc0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5dd0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
5de0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
5df0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e   **argv){.  Coun
5e00: 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  tCtx *p;.  p = s
5e10: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
5e20: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
5e30: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
5e40: 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c   if( (argc==0 ||
5e50: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
5e60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
5e70: 28 61 72 67 76 5b 30 5d 29 29 20 26 26 20 70 20  (argv[0])) && p 
5e80: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
5e90: 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76   }.}   .static v
5ea0: 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a  oid countFinaliz
5eb0: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
5ec0: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 43  t *context){.  C
5ed0: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
5ee0: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
5ef0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
5f00: 65 78 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ext, 0);.  sqlit
5f10: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
5f20: 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20  ntext, p ? p->n 
5f30: 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  : 0);.}../*.** R
5f40: 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65  outines to imple
5f50: 6d 65 6e 74 20 6d 69 6e 28 29 20 61 6e 64 20 6d  ment min() and m
5f60: 61 78 28 29 20 61 67 67 72 65 67 61 74 65 20 66  ax() aggregate f
5f70: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  unctions..*/.sta
5f80: 74 69 63 20 76 6f 69 64 20 6d 69 6e 6d 61 78 53  tic void minmaxS
5f90: 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  tep(sqlite3_cont
5fa0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
5fb0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
5fc0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
5fd0: 20 4d 65 6d 20 2a 70 41 72 67 20 20 3d 20 28 4d   Mem *pArg  = (M
5fe0: 65 6d 20 2a 29 61 72 67 76 5b 30 5d 3b 0a 20 20  em *)argv[0];.  
5ff0: 4d 65 6d 20 2a 70 42 65 73 74 3b 0a 0a 20 20 69  Mem *pBest;..  i
6000: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
6010: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
6020: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 65  SQLITE_NULL ) re
6030: 74 75 72 6e 3b 0a 20 20 70 42 65 73 74 20 3d 20  turn;.  pBest = 
6040: 28 4d 65 6d 20 2a 29 73 71 6c 69 74 65 33 5f 61  (Mem *)sqlite3_a
6050: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
6060: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
6070: 28 2a 70 42 65 73 74 29 29 3b 0a 20 20 69 66 28  (*pBest));.  if(
6080: 20 21 70 42 65 73 74 20 29 20 72 65 74 75 72 6e   !pBest ) return
6090: 3b 0a 0a 20 20 69 66 28 20 70 42 65 73 74 2d 3e  ;..  if( pBest->
60a0: 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 6e 74  flags ){.    int
60b0: 20 6d 61 78 3b 0a 20 20 20 20 69 6e 74 20 63 6d   max;.    int cm
60c0: 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  p;.    CollSeq *
60d0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
60e0: 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 63 6f  etFuncCollSeq(co
60f0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 2f 2a 20 54  ntext);.    /* T
6100: 68 69 73 20 73 74 65 70 20 66 75 6e 63 74 69 6f  his step functio
6110: 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 62 6f  n is used for bo
6120: 74 68 20 74 68 65 20 6d 69 6e 28 29 20 61 6e 64  th the min() and
6130: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
6140: 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e  s,.    ** the on
6150: 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  ly difference be
6160: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62 65  tween the two be
6170: 69 6e 67 20 74 68 61 74 20 74 68 65 20 73 65 6e  ing that the sen
6180: 73 65 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  se of the.    **
6190: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 69   comparison is i
61a0: 6e 76 65 72 74 65 64 2e 20 46 6f 72 20 74 68 65  nverted. For the
61b0: 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
61c0: 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  , the.    ** sql
61d0: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 29  ite3_user_data()
61e0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
61f0: 73 20 28 76 6f 69 64 20 2a 29 2d 31 2e 20 46 6f  s (void *)-1. Fo
6200: 72 20 6d 69 6e 28 29 20 69 74 0a 20 20 20 20 2a  r min() it.    *
6210: 2a 20 72 65 74 75 72 6e 73 20 28 76 6f 69 64 20  * returns (void 
6220: 2a 29 64 62 2c 20 77 68 65 72 65 20 64 62 20 69  *)db, where db i
6230: 73 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 64  s the sqlite3* d
6240: 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 2e  atabase pointer.
6250: 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 66 6f 72  .    ** Therefor
6260: 65 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65  e the next state
6270: 6d 65 6e 74 20 73 65 74 73 20 76 61 72 69 61 62  ment sets variab
6280: 6c 65 20 27 6d 61 78 27 20 74 6f 20 31 20 66 6f  le 'max' to 1 fo
6290: 72 20 74 68 65 20 6d 61 78 28 29 0a 20 20 20 20  r the max().    
62a0: 2a 2a 20 61 67 67 72 65 67 61 74 65 2c 20 6f 72  ** aggregate, or
62b0: 20 30 20 66 6f 72 20 6d 69 6e 28 29 2e 0a 20 20   0 for min()..  
62c0: 20 20 2a 2f 0a 20 20 20 20 6d 61 78 20 3d 20 28    */.    max = (
62d0: 28 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  (sqlite3_user_da
62e0: 74 61 28 63 6f 6e 74 65 78 74 29 3d 3d 28 76 6f  ta(context)==(vo
62f0: 69 64 20 2a 29 2d 31 29 3f 31 3a 30 29 3b 0a 20  id *)-1)?1:0);. 
6300: 20 20 20 63 6d 70 20 3d 20 73 71 6c 69 74 65 33     cmp = sqlite3
6310: 4d 65 6d 43 6f 6d 70 61 72 65 28 70 42 65 73 74  MemCompare(pBest
6320: 2c 20 70 41 72 67 2c 20 70 43 6f 6c 6c 29 3b 0a  , pArg, pColl);.
6330: 20 20 20 20 69 66 28 20 28 6d 61 78 20 26 26 20      if( (max && 
6340: 63 6d 70 3c 30 29 20 7c 7c 20 28 21 6d 61 78 20  cmp<0) || (!max 
6350: 26 26 20 63 6d 70 3e 30 29 20 29 7b 0a 20 20 20  && cmp>0) ){.   
6360: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
6370: 6d 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41 72  mCopy(pBest, pAr
6380: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  g);.    }.  }els
6390: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
63a0: 62 65 4d 65 6d 43 6f 70 79 28 70 42 65 73 74 2c  beMemCopy(pBest,
63b0: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 73 74   pArg);.  }.}.st
63c0: 61 74 69 63 20 76 6f 69 64 20 6d 69 6e 4d 61 78  atic void minMax
63d0: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
63e0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
63f0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  t){.  sqlite3_va
6400: 6c 75 65 20 2a 70 52 65 73 3b 0a 20 20 70 52 65  lue *pRes;.  pRe
6410: 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 61 6c  s = (sqlite3_val
6420: 75 65 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  ue *)sqlite3_agg
6430: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
6440: 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 69 66  ontext, 0);.  if
6450: 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 69 66  ( pRes ){.    if
6460: 28 20 70 52 65 73 2d 3e 66 6c 61 67 73 20 29 7b  ( pRes->flags ){
6470: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
6480: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74  esult_value(cont
6490: 65 78 74 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  ext, pRes);.    
64a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
64b0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 65 73  eMemRelease(pRes
64c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
64d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
64e0: 65 67 69 73 74 65 72 65 64 20 61 6c 6c 20 6f 66  egistered all of
64f0: 20 74 68 65 20 61 62 6f 76 65 20 43 20 66 75 6e   the above C fun
6500: 63 74 69 6f 6e 73 20 61 73 20 53 51 4c 0a 2a 2a  ctions as SQL.**
6510: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69   functions.  Thi
6520: 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  s should be the 
6530: 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 20 69 6e 20  only routine in 
6540: 74 68 69 73 20 66 69 6c 65 20 77 69 74 68 0a 2a  this file with.*
6550: 2a 20 65 78 74 65 72 6e 61 6c 20 6c 69 6e 6b 61  * external linka
6560: 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ge..*/.void sqli
6570: 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74  te3RegisterBuilt
6580: 69 6e 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69  inFunctions(sqli
6590: 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74  te3 *db){.  stat
65a0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
65b0: 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
65c0: 6d 65 3b 0a 20 20 20 20 20 73 69 67 6e 65 64 20  me;.     signed 
65d0: 63 68 61 72 20 6e 41 72 67 3b 0a 20 20 20 20 20  char nArg;.     
65e0: 75 38 20 61 72 67 54 79 70 65 3b 20 20 20 20 20  u8 argType;     
65f0: 20 20 20 20 20 20 2f 2a 20 30 3a 20 6e 6f 6e 65        /* 0: none
6600: 2e 20 20 31 3a 20 64 62 20 20 32 3a 20 28 2d 31  .  1: db  2: (-1
6610: 29 20 2a 2f 0a 20 20 20 20 20 75 38 20 65 54 65  ) */.     u8 eTe
6620: 78 74 52 65 70 3b 20 20 20 20 20 20 20 20 20 20  xtRep;          
6630: 2f 2a 20 31 3a 20 55 54 46 2d 31 36 2e 20 20 30  /* 1: UTF-16.  0
6640: 3a 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20  : UTF-8 */.     
6650: 75 38 20 6e 65 65 64 43 6f 6c 6c 53 65 71 3b 0a  u8 needCollSeq;.
6660: 20 20 20 20 20 76 6f 69 64 20 28 2a 78 46 75 6e       void (*xFun
6670: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
6680: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
6690: 76 61 6c 75 65 20 2a 2a 29 3b 0a 20 20 7d 20 61  value **);.  } a
66a0: 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Funcs[] = {.    
66b0: 7b 20 22 6d 69 6e 22 2c 20 20 20 20 20 20 20 20  { "min",        
66c0: 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 53 51         -1, 0, SQ
66d0: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 31 2c  LITE_UTF8,    1,
66e0: 20 6d 69 6e 6d 61 78 46 75 6e 63 20 7d 2c 0a 20   minmaxFunc },. 
66f0: 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 20     { "min",     
6700: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
6710: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
6720: 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20 7d   1, 0          }
6730: 2c 0a 20 20 20 20 7b 20 22 6d 61 78 22 2c 20 20  ,.    { "max",  
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
6750: 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
6760: 20 20 20 20 31 2c 20 6d 69 6e 6d 61 78 46 75 6e      1, minmaxFun
6770: 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 78 22  c },.    { "max"
6780: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6790: 20 30 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54   0, 2, SQLITE_UT
67a0: 46 38 2c 20 20 20 20 31 2c 20 30 20 20 20 20 20  F8,    1, 0     
67b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
67c0: 79 70 65 6f 66 22 2c 20 20 20 20 20 20 20 20 20  ypeof",         
67d0: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
67e0: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 74 79 70  _UTF8,    0, typ
67f0: 65 6f 66 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b  eofFunc },.    {
6800: 20 22 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20   "length",      
6810: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c         1, 0, SQL
6820: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
6830: 6c 65 6e 67 74 68 46 75 6e 63 20 7d 2c 0a 20 20  lengthFunc },.  
6840: 20 20 7b 20 22 73 75 62 73 74 72 22 2c 20 20 20    { "substr",   
6850: 20 20 20 20 20 20 20 20 20 20 33 2c 20 30 2c 20            3, 0, 
6860: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
6870: 30 2c 20 73 75 62 73 74 72 46 75 6e 63 20 7d 2c  0, substrFunc },
6880: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6890: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 7b  OMIT_UTF16.    {
68a0: 20 22 73 75 62 73 74 72 22 2c 20 20 20 20 20 20   "substr",      
68b0: 20 20 20 20 20 20 20 33 2c 20 30 2c 20 53 51 4c         3, 0, SQL
68c0: 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20  ITE_UTF16LE, 0, 
68d0: 73 71 6c 69 74 65 33 75 74 66 31 36 53 75 62 73  sqlite3utf16Subs
68e0: 74 72 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20  tr },.#endif.   
68f0: 20 7b 20 22 61 62 73 22 2c 20 20 20 20 20 20 20   { "abs",       
6900: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
6910: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
6920: 2c 20 61 62 73 46 75 6e 63 20 20 20 20 7d 2c 0a  , absFunc    },.
6930: 20 20 20 20 7b 20 22 72 6f 75 6e 64 22 2c 20 20      { "round",  
6940: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
6950: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
6960: 20 20 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20    0, roundFunc  
6970: 7d 2c 0a 20 20 20 20 7b 20 22 72 6f 75 6e 64 22  },.    { "round"
6980: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  ,              2
6990: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
69a0: 2c 20 20 20 20 30 2c 20 72 6f 75 6e 64 46 75 6e  ,    0, roundFun
69b0: 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70 70  c  },.    { "upp
69c0: 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  er",            
69d0: 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    1, 0, SQLITE_U
69e0: 54 46 38 2c 20 20 20 20 30 2c 20 75 70 70 65 72  TF8,    0, upper
69f0: 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22  Func  },.    { "
6a00: 6c 6f 77 65 72 22 2c 20 20 20 20 20 20 20 20 20  lower",         
6a10: 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54       1, 0, SQLIT
6a20: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 6c 6f  E_UTF8,    0, lo
6a30: 77 65 72 46 75 6e 63 20 20 7d 2c 0a 20 20 20 20  werFunc  },.    
6a40: 7b 20 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 20  { "coalesce",   
6a50: 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 53 51         -1, 0, SQ
6a60: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
6a70: 20 69 66 6e 75 6c 6c 46 75 6e 63 20 7d 2c 0a 20   ifnullFunc },. 
6a80: 20 20 20 7b 20 22 63 6f 61 6c 65 73 63 65 22 2c     { "coalesce",
6a90: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
6aa0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
6ab0: 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 7d   0, 0          }
6ac0: 2c 0a 20 20 20 20 7b 20 22 63 6f 61 6c 65 73 63  ,.    { "coalesc
6ad0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c  e",           1,
6ae0: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
6af0: 20 20 20 20 30 2c 20 30 20 20 20 20 20 20 20 20      0, 0        
6b00: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 66 6e 75    },.    { "ifnu
6b10: 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ll",            
6b20: 20 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   2, 0, SQLITE_UT
6b30: 46 38 2c 20 20 20 20 31 2c 20 69 66 6e 75 6c 6c  F8,    1, ifnull
6b40: 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 72  Func },.    { "r
6b50: 61 6e 64 6f 6d 22 2c 20 20 20 20 20 20 20 20 20  andom",         
6b60: 20 20 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45     -1, 0, SQLITE
6b70: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 72 61 6e  _UTF8,    0, ran
6b80: 64 6f 6d 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b  domFunc },.    {
6b90: 20 22 6e 75 6c 6c 69 66 22 2c 20 20 20 20 20 20   "nullif",      
6ba0: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c         2, 0, SQL
6bb0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 31 2c 20  ITE_UTF8,    1, 
6bc0: 6e 75 6c 6c 69 66 46 75 6e 63 20 7d 2c 0a 20 20  nullifFunc },.  
6bd0: 20 20 7b 20 22 73 71 6c 69 74 65 5f 76 65 72 73    { "sqlite_vers
6be0: 69 6f 6e 22 2c 20 20 20 20 20 30 2c 20 30 2c 20  ion",     0, 0, 
6bf0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
6c00: 30 2c 20 76 65 72 73 69 6f 6e 46 75 6e 63 7d 2c  0, versionFunc},
6c10: 0a 20 20 20 20 7b 20 22 71 75 6f 74 65 22 2c 20  .    { "quote", 
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
6c30: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
6c40: 20 20 20 30 2c 20 71 75 6f 74 65 46 75 6e 63 20     0, quoteFunc 
6c50: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 73 74 5f   },.    { "last_
6c60: 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20  insert_rowid",  
6c70: 30 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  0, 1, SQLITE_UTF
6c80: 38 2c 20 20 20 20 30 2c 20 6c 61 73 74 5f 69 6e  8,    0, last_in
6c90: 73 65 72 74 5f 72 6f 77 69 64 20 7d 2c 0a 20 20  sert_rowid },.  
6ca0: 20 20 7b 20 22 63 68 61 6e 67 65 73 22 2c 20 20    { "changes",  
6cb0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c 20            0, 1, 
6cc0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
6cd0: 30 2c 20 63 68 61 6e 67 65 73 20 20 20 20 7d 2c  0, changes    },
6ce0: 0a 20 20 20 20 7b 20 22 74 6f 74 61 6c 5f 63 68  .    { "total_ch
6cf0: 61 6e 67 65 73 22 2c 20 20 20 20 20 20 30 2c 20  anges",      0, 
6d00: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
6d10: 20 20 20 30 2c 20 74 6f 74 61 6c 5f 63 68 61 6e     0, total_chan
6d20: 67 65 73 20 7d 2c 0a 23 69 66 64 65 66 20 53 51  ges },.#ifdef SQ
6d30: 4c 49 54 45 5f 53 4f 55 4e 44 45 58 0a 20 20 20  LITE_SOUNDEX.   
6d40: 20 7b 20 22 73 6f 75 6e 64 65 78 22 2c 20 20 20   { "soundex",   
6d50: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
6d60: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 73  QLITE_UTF8, 0, s
6d70: 6f 75 6e 64 65 78 46 75 6e 63 7d 2c 0a 23 65 6e  oundexFunc},.#en
6d80: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
6d90: 45 5f 54 45 53 54 0a 20 20 20 20 7b 20 22 72 61  E_TEST.    { "ra
6da0: 6e 64 73 74 72 22 2c 20 20 20 20 20 20 20 20 20  ndstr",         
6db0: 20 20 20 20 20 20 32 2c 20 30 2c 20 53 51 4c 49        2, 0, SQLI
6dc0: 54 45 5f 55 54 46 38 2c 20 30 2c 20 72 61 6e 64  TE_UTF8, 0, rand
6dd0: 53 74 72 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Str    },.    { 
6de0: 22 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72  "test_destructor
6df0: 22 2c 20 20 20 20 20 20 20 31 2c 20 31 2c 20 53  ",       1, 1, S
6e00: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74  QLITE_UTF8, 0, t
6e10: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 7d 2c  est_destructor},
6e20: 0a 20 20 20 20 7b 20 22 74 65 73 74 5f 64 65 73  .    { "test_des
6e30: 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 22 2c 20  tructor_count", 
6e40: 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  0, 0, SQLITE_UTF
6e50: 38 2c 20 30 2c 20 74 65 73 74 5f 64 65 73 74 72  8, 0, test_destr
6e60: 75 63 74 6f 72 5f 63 6f 75 6e 74 7d 2c 0a 20 20  uctor_count},.  
6e70: 20 20 7b 20 22 74 65 73 74 5f 61 75 78 64 61 74    { "test_auxdat
6e80: 61 22 2c 20 20 20 20 20 20 20 20 20 2d 31 2c 20  a",         -1, 
6e90: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
6ea0: 30 2c 20 74 65 73 74 5f 61 75 78 64 61 74 61 7d  0, test_auxdata}
6eb0: 2c 0a 20 20 20 20 7b 20 22 74 65 73 74 5f 65 72  ,.    { "test_er
6ec0: 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ror",           
6ed0: 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   1, 0, SQLITE_UT
6ee0: 46 38 2c 20 30 2c 20 74 65 73 74 5f 65 72 72 6f  F8, 0, test_erro
6ef0: 72 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a  r},.#endif.  };.
6f00: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
6f10: 74 72 75 63 74 20 7b 0a 20 20 20 20 63 68 61 72  truct {.    char
6f20: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 69 67   *zName;.    sig
6f30: 6e 65 64 20 63 68 61 72 20 6e 41 72 67 3b 0a 20  ned char nArg;. 
6f40: 20 20 20 75 38 20 61 72 67 54 79 70 65 3b 0a 20     u8 argType;. 
6f50: 20 20 20 75 38 20 6e 65 65 64 43 6f 6c 6c 53 65     u8 needCollSe
6f60: 71 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a 78 53  q;.    void (*xS
6f70: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
6f80: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
6f90: 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 20 20  3_value**);.    
6fa0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 69 7a 65  void (*xFinalize
6fb0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
6fc0: 74 2a 29 3b 0a 20 20 7d 20 61 41 67 67 73 5b 5d  t*);.  } aAggs[]
6fd0: 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6d 69 6e 22   = {.    { "min"
6fe0: 2c 20 20 20 20 31 2c 20 30 2c 20 31 2c 20 6d 69  ,    1, 0, 1, mi
6ff0: 6e 6d 61 78 53 74 65 70 2c 20 20 20 6d 69 6e 4d  nmaxStep,   minM
7000: 61 78 46 69 6e 61 6c 69 7a 65 20 7d 2c 0a 20 20  axFinalize },.  
7010: 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 31 2c    { "max",    1,
7020: 20 32 2c 20 31 2c 20 6d 69 6e 6d 61 78 53 74 65   2, 1, minmaxSte
7030: 70 2c 20 20 20 6d 69 6e 4d 61 78 46 69 6e 61 6c  p,   minMaxFinal
7040: 69 7a 65 20 7d 2c 0a 20 20 20 20 7b 20 22 73 75  ize },.    { "su
7050: 6d 22 2c 20 20 20 20 31 2c 20 30 2c 20 30 2c 20  m",    1, 0, 0, 
7060: 73 75 6d 53 74 65 70 2c 20 20 20 20 20 20 73 75  sumStep,      su
7070: 6d 46 69 6e 61 6c 69 7a 65 20 20 20 20 7d 2c 0a  mFinalize    },.
7080: 20 20 20 20 7b 20 22 61 76 67 22 2c 20 20 20 20      { "avg",    
7090: 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74 65 70  1, 0, 0, sumStep
70a0: 2c 20 20 20 20 20 20 61 76 67 46 69 6e 61 6c 69  ,      avgFinali
70b0: 7a 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  ze    },.    { "
70c0: 63 6f 75 6e 74 22 2c 20 20 30 2c 20 30 2c 20 30  count",  0, 0, 0
70d0: 2c 20 63 6f 75 6e 74 53 74 65 70 2c 20 20 20 20  , countStep,    
70e0: 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 20 20 7d  countFinalize  }
70f0: 2c 0a 20 20 20 20 7b 20 22 63 6f 75 6e 74 22 2c  ,.    { "count",
7100: 20 20 31 2c 20 30 2c 20 30 2c 20 63 6f 75 6e 74    1, 0, 0, count
7110: 53 74 65 70 2c 20 20 20 20 63 6f 75 6e 74 46 69  Step,    countFi
7120: 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20 20 7d 3b 0a  nalize  },.  };.
7130: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28    int i;..  for(
7140: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 46  i=0; i<sizeof(aF
7150: 75 6e 63 73 29 2f 73 69 7a 65 6f 66 28 61 46 75  uncs)/sizeof(aFu
7160: 6e 63 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  ncs[0]); i++){. 
7170: 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20     void *pArg = 
7180: 30 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 61  0;.    switch( a
7190: 46 75 6e 63 73 5b 69 5d 2e 61 72 67 54 79 70 65  Funcs[i].argType
71a0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 31   ){.      case 1
71b0: 3a 20 70 41 72 67 20 3d 20 64 62 3b 20 62 72 65  : pArg = db; bre
71c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 32  ak;.      case 2
71d0: 3a 20 70 41 72 67 20 3d 20 28 76 6f 69 64 20 2a  : pArg = (void *
71e0: 29 28 2d 31 29 3b 20 62 72 65 61 6b 3b 0a 20 20  )(-1); break;.  
71f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
7200: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
7210: 64 62 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e  db, aFuncs[i].zN
7220: 61 6d 65 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 6e  ame, aFuncs[i].n
7230: 41 72 67 2c 0a 20 20 20 20 20 20 20 20 61 46 75  Arg,.        aFu
7240: 6e 63 73 5b 69 5d 2e 65 54 65 78 74 52 65 70 2c  ncs[i].eTextRep,
7250: 20 70 41 72 67 2c 20 61 46 75 6e 63 73 5b 69 5d   pArg, aFuncs[i]
7260: 2e 78 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  .xFunc, 0, 0);. 
7270: 20 20 20 69 66 28 20 61 46 75 6e 63 73 5b 69 5d     if( aFuncs[i]
7280: 2e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a  .needCollSeq ){.
7290: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
72a0: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
72b0: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  ndFunction(db, a
72c0: 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  Funcs[i].zName, 
72d0: 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65  .          strle
72e0: 6e 28 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d  n(aFuncs[i].zNam
72f0: 65 29 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 41  e), aFuncs[i].nA
7300: 72 67 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 65 54  rg, aFuncs[i].eT
7310: 65 78 74 52 65 70 2c 20 30 29 3b 0a 20 20 20 20  extRep, 0);.    
7320: 20 20 69 66 28 20 70 46 75 6e 63 20 26 26 20 61    if( pFunc && a
7330: 46 75 6e 63 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c  Funcs[i].needCol
7340: 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  lSeq ){.        
7350: 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53  pFunc->needCollS
7360: 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  eq = 1;.      }.
7370: 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 6e 64 65      }.  }.#ifnde
7380: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
7390: 54 45 52 54 41 42 4c 45 0a 20 20 73 71 6c 69 74  TERTABLE.  sqlit
73a0: 65 33 41 6c 74 65 72 46 75 6e 63 74 69 6f 6e 73  e3AlterFunctions
73b0: 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66  (db);.#endif.  f
73c0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
73d0: 28 61 41 67 67 73 29 2f 73 69 7a 65 6f 66 28 61  (aAggs)/sizeof(a
73e0: 41 67 67 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  Aggs[0]); i++){.
73f0: 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d      void *pArg =
7400: 20 30 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   0;.    switch( 
7410: 61 41 67 67 73 5b 69 5d 2e 61 72 67 54 79 70 65  aAggs[i].argType
7420: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 31   ){.      case 1
7430: 3a 20 70 41 72 67 20 3d 20 64 62 3b 20 62 72 65  : pArg = db; bre
7440: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 32  ak;.      case 2
7450: 3a 20 70 41 72 67 20 3d 20 28 76 6f 69 64 20 2a  : pArg = (void *
7460: 29 28 2d 31 29 3b 20 62 72 65 61 6b 3b 0a 20 20  )(-1); break;.  
7470: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
7480: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
7490: 64 62 2c 20 61 41 67 67 73 5b 69 5d 2e 7a 4e 61  db, aAggs[i].zNa
74a0: 6d 65 2c 20 61 41 67 67 73 5b 69 5d 2e 6e 41 72  me, aAggs[i].nAr
74b0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
74c0: 0a 20 20 20 20 20 20 20 20 70 41 72 67 2c 20 30  .        pArg, 0
74d0: 2c 20 61 41 67 67 73 5b 69 5d 2e 78 53 74 65 70  , aAggs[i].xStep
74e0: 2c 20 61 41 67 67 73 5b 69 5d 2e 78 46 69 6e 61  , aAggs[i].xFina
74f0: 6c 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 61  lize);.    if( a
7500: 41 67 67 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c  Aggs[i].needColl
7510: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 46 75 6e  Seq ){.      Fun
7520: 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 73 71  cDef *pFunc = sq
7530: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
7540: 6e 28 20 64 62 2c 20 61 41 67 67 73 5b 69 5d 2e  n( db, aAggs[i].
7550: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
7560: 20 73 74 72 6c 65 6e 28 61 41 67 67 73 5b 69 5d   strlen(aAggs[i]
7570: 2e 7a 4e 61 6d 65 29 2c 20 61 41 67 67 73 5b 69  .zName), aAggs[i
7580: 5d 2e 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  ].nArg, SQLITE_U
7590: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  TF8, 0);.      i
75a0: 66 28 20 70 46 75 6e 63 20 26 26 20 61 41 67 67  f( pFunc && aAgg
75b0: 73 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71  s[i].needCollSeq
75c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 75 6e   ){.        pFun
75d0: 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 3d  c->needCollSeq =
75e0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
75f0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
7600: 65 67 69 73 74 65 72 44 61 74 65 54 69 6d 65 46  egisterDateTimeF
7610: 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 23 69  unctions(db);.#i
7620: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a  fdef SQLITE_SSE.
7630: 20 20 73 71 6c 69 74 65 33 53 73 65 46 75 6e 63    sqlite3SseFunc
7640: 74 69 6f 6e 73 28 64 62 29 3b 0a 23 65 6e 64 69  tions(db);.#endi
7650: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
7660: 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c  CASE_SENSITIVE_L
7670: 49 4b 45 0a 20 20 73 71 6c 69 74 65 33 52 65 67  IKE.  sqlite3Reg
7680: 69 73 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f  isterLikeFunctio
7690: 6e 73 28 64 62 2c 20 31 29 3b 0a 23 65 6c 73 65  ns(db, 1);.#else
76a0: 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  .  sqlite3Regist
76b0: 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28  erLikeFunctions(
76c0: 64 62 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 7d  db, 0);.#endif.}
76d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
76e0: 4c 49 4b 45 4f 50 54 20 66 6c 61 67 20 6f 6e 20  LIKEOPT flag on 
76f0: 74 68 65 20 32 2d 61 72 67 75 6d 65 6e 74 20 66  the 2-argument f
7700: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
7710: 20 67 69 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a   given name..*/.
7720: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4c  static void setL
7730: 69 6b 65 4f 70 74 46 6c 61 67 28 73 71 6c 69 74  ikeOptFlag(sqlit
7740: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
7750: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66  ar *zName, int f
7760: 6c 61 67 56 61 6c 29 7b 0a 20 20 46 75 6e 63 44  lagVal){.  FuncD
7770: 65 66 20 2a 70 44 65 66 3b 0a 20 20 70 44 65 66  ef *pDef;.  pDef
7780: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
7790: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  nction(db, zName
77a0: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2c  , strlen(zName),
77b0: 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
77c0: 20 30 29 3b 0a 20 20 69 66 28 20 70 44 65 66 20   0);.  if( pDef 
77d0: 29 7b 0a 20 20 20 20 70 44 65 66 2d 3e 66 6c 61  ){.    pDef->fla
77e0: 67 73 20 3d 20 66 6c 61 67 56 61 6c 3b 0a 20 20  gs = flagVal;.  
77f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  }.}../*.** Regis
7800: 74 65 72 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  ter the built-in
7810: 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66   LIKE and GLOB f
7820: 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 63  unctions.  The c
7830: 61 73 65 53 65 6e 73 69 74 69 76 65 0a 2a 2a 20  aseSensitive.** 
7840: 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
7850: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
7860: 6e 6f 74 20 74 68 65 20 4c 49 4b 45 20 6f 70 65  not the LIKE ope
7870: 72 61 74 6f 72 20 69 73 20 63 61 73 65 0a 2a 2a  rator is case.**
7880: 20 73 65 6e 73 69 74 69 76 65 2e 20 20 47 4c 4f   sensitive.  GLO
7890: 42 20 69 73 20 61 6c 77 61 79 73 20 63 61 73 65  B is always case
78a0: 20 73 65 6e 73 69 74 69 76 65 2e 0a 2a 2f 0a 76   sensitive..*/.v
78b0: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73  oid sqlite3Regis
78c0: 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73  terLikeFunctions
78d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
78e0: 74 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 29  t caseSensitive)
78f0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6d 70 61  {.  struct compa
7900: 72 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  reInfo *pInfo;. 
7910: 20 69 66 28 20 63 61 73 65 53 65 6e 73 69 74 69   if( caseSensiti
7920: 76 65 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 20  ve ){.    pInfo 
7930: 3d 20 28 73 74 72 75 63 74 20 63 6f 6d 70 61 72  = (struct compar
7940: 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e 66 6f  eInfo*)&likeInfo
7950: 41 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Alt;.  }else{.  
7960: 20 20 70 49 6e 66 6f 20 3d 20 28 73 74 72 75 63    pInfo = (struc
7970: 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29 26  t compareInfo*)&
7980: 6c 69 6b 65 49 6e 66 6f 4e 6f 72 6d 3b 0a 20 20  likeInfoNorm;.  
7990: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  }.  sqlite3_crea
79a0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
79b0: 22 6c 69 6b 65 22 2c 20 32 2c 20 53 51 4c 49 54  "like", 2, SQLIT
79c0: 45 5f 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c  E_UTF8, pInfo, l
79d0: 69 6b 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ikeFunc, 0, 0);.
79e0: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
79f0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c  _function(db, "l
7a00: 69 6b 65 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f  ike", 3, SQLITE_
7a10: 55 54 46 38 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b  UTF8, pInfo, lik
7a20: 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  eFunc, 0, 0);.  
7a30: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7a40: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 67 6c 6f  unction(db, "glo
7a50: 62 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  b", 2, SQLITE_UT
7a60: 46 38 2c 20 0a 20 20 20 20 20 20 28 73 74 72 75  F8, .      (stru
7a70: 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a 29  ct compareInfo*)
7a80: 26 67 6c 6f 62 49 6e 66 6f 2c 20 6c 69 6b 65 46  &globInfo, likeF
7a90: 75 6e 63 2c 20 30 2c 30 29 3b 0a 20 20 73 65 74  unc, 0,0);.  set
7aa0: 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c 20  LikeOptFlag(db, 
7ab0: 22 67 6c 6f 62 22 2c 20 53 51 4c 49 54 45 5f 46  "glob", SQLITE_F
7ac0: 55 4e 43 5f 4c 49 4b 45 20 7c 20 53 51 4c 49 54  UNC_LIKE | SQLIT
7ad0: 45 5f 46 55 4e 43 5f 43 41 53 45 29 3b 0a 20 20  E_FUNC_CASE);.  
7ae0: 73 65 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64  setLikeOptFlag(d
7af0: 62 2c 20 22 6c 69 6b 65 22 2c 20 0a 20 20 20 20  b, "like", .    
7b00: 20 20 63 61 73 65 53 65 6e 73 69 74 69 76 65 20    caseSensitive 
7b10: 3f 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  ? (SQLITE_FUNC_L
7b20: 49 4b 45 20 7c 20 53 51 4c 49 54 45 5f 46 55 4e  IKE | SQLITE_FUN
7b30: 43 5f 43 41 53 45 29 20 3a 20 53 51 4c 49 54 45  C_CASE) : SQLITE
7b40: 5f 46 55 4e 43 5f 4c 49 4b 45 29 3b 0a 7d 0a 0a  _FUNC_LIKE);.}..
7b50: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f 69 6e  /*.** pExpr poin
7b60: 74 73 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  ts to an express
7b70: 69 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c 65 6d  ion which implem
7b80: 65 6e 74 73 20 61 20 66 75 6e 63 74 69 6f 6e 2e  ents a function.
7b90: 20 20 49 66 0a 2a 2a 20 69 74 20 69 73 20 61 70    If.** it is ap
7ba0: 70 72 6f 70 72 69 61 74 65 20 74 6f 20 61 70 70  propriate to app
7bb0: 6c 79 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69  ly the LIKE opti
7bc0: 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68 61 74  mization to that
7bd0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 65   function.** the
7be0: 6e 20 73 65 74 20 61 57 63 5b 30 5d 20 74 68 72  n set aWc[0] thr
7bf0: 6f 75 67 68 20 61 57 63 5b 32 5d 20 74 6f 20 74  ough aWc[2] to t
7c00: 68 65 20 77 69 6c 64 63 61 72 64 20 63 68 61 72  he wildcard char
7c10: 61 63 74 65 72 73 20 61 6e 64 0a 2a 2a 20 72 65  acters and.** re
7c20: 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 74  turn TRUE.  If t
7c30: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  he function is n
7c40: 6f 74 20 61 20 4c 49 4b 45 2d 73 74 79 6c 65 20  ot a LIKE-style 
7c50: 66 75 6e 63 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a  function then.**
7c60: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a   return FALSE..*
7c70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 4c  /.int sqlite3IsL
7c80: 69 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69  ikeFunction(sqli
7c90: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
7ca0: 45 78 70 72 2c 20 69 6e 74 20 2a 70 49 73 4e 6f  Expr, int *pIsNo
7cb0: 63 61 73 65 2c 20 63 68 61 72 20 2a 61 57 63 29  case, char *aWc)
7cc0: 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65  {.  FuncDef *pDe
7cd0: 66 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  f;.  if( pExpr->
7ce0: 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op!=TK_FUNCTION 
7cf0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7d00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72  .  }.  if( pExpr
7d10: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
7d20: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
7d30: 30 3b 0a 20 20 7d 0a 20 20 70 44 65 66 20 3d 20  0;.  }.  pDef = 
7d40: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
7d50: 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2d 3e 74  ion(db, pExpr->t
7d60: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
7d70: 6f 6b 65 6e 2e 6e 2c 20 32 2c 0a 20 20 20 20 20  oken.n, 2,.     
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55          SQLITE_U
7da0: 54 46 38 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  TF8, 0);.  if( p
7db0: 44 65 66 3d 3d 30 20 7c 7c 20 28 70 44 65 66 2d  Def==0 || (pDef-
7dc0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
7dd0: 46 55 4e 43 5f 4c 49 4b 45 29 3d 3d 30 20 29 7b  FUNC_LIKE)==0 ){
7de0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7df0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 65 6d   }..  /* The mem
7e00: 63 70 79 28 29 20 73 74 61 74 65 6d 65 6e 74 20  cpy() statement 
7e10: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
7e20: 20 77 69 6c 64 63 61 72 64 20 63 68 61 72 61 63   wildcard charac
7e30: 74 65 72 73 20 61 72 65 0a 20 20 2a 2a 20 74 68  ters are.  ** th
7e40: 65 20 66 69 72 73 74 20 74 68 72 65 65 20 73 74  e first three st
7e50: 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
7e60: 63 6f 6d 70 61 72 65 49 6e 66 6f 20 73 74 72 75  compareInfo stru
7e70: 63 74 75 72 65 2e 20 20 54 68 65 0a 20 20 2a 2a  cture.  The.  **
7e80: 20 61 73 73 65 72 74 73 28 29 20 74 68 61 74 20   asserts() that 
7e90: 66 6f 6c 6c 6f 77 20 76 65 72 69 66 79 20 74 68  follow verify th
7ea0: 61 74 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  at assumption.  
7eb0: 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 61 57 63 2c  */.  memcpy(aWc,
7ec0: 20 70 44 65 66 2d 3e 70 55 73 65 72 44 61 74 61   pDef->pUserData
7ed0: 2c 20 33 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 3);.  assert( 
7ee0: 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f  (char*)&likeInfo
7ef0: 41 6c 74 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c  Alt == (char*)&l
7f00: 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68  ikeInfoAlt.match
7f10: 41 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  All );.  assert(
7f20: 20 26 28 28 63 68 61 72 2a 29 26 6c 69 6b 65 49   &((char*)&likeI
7f30: 6e 66 6f 41 6c 74 29 5b 31 5d 20 3d 3d 20 28 63  nfoAlt)[1] == (c
7f40: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
7f50: 74 2e 6d 61 74 63 68 4f 6e 65 20 29 3b 0a 20 20  t.matchOne );.  
7f60: 61 73 73 65 72 74 28 20 26 28 28 63 68 61 72 2a  assert( &((char*
7f70: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 32  )&likeInfoAlt)[2
7f80: 5d 20 3d 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b  ] == (char*)&lik
7f90: 65 49 6e 66 6f 41 6c 74 2e 6d 61 74 63 68 53 65  eInfoAlt.matchSe
7fa0: 74 20 29 3b 0a 20 20 2a 70 49 73 4e 6f 63 61 73  t );.  *pIsNocas
7fb0: 65 20 3d 20 28 70 44 65 66 2d 3e 66 6c 61 67 73  e = (pDef->flags
7fc0: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43   & SQLITE_FUNC_C
7fd0: 41 53 45 29 3d 3d 30 3b 0a 20 20 72 65 74 75 72  ASE)==0;.  retur
7fe0: 6e 20 31 3b 0a 7d 0a                             n 1;.}.