/ Hex Artifact Content
Login

Artifact 34085cf518928c7aa61c2d5029e25b0326108887:


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 35 20 32 30 30 35 2f 30 38 2f 32 37  1.105 2005/08/27
02a0: 20 31 33 3a 31 36 3a 33 33 20 64 72 68 20 45 78   13:16:33 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 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
5a90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
5aa0: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
5ab0: 78 74 2c 20 70 20 3f 20 70 2d 3e 73 75 6d 20 3a  xt, p ? p->sum :
5ac0: 20 30 2e 30 29 3b 0a 7d 0a 73 74 61 74 69 63 20   0.0);.}.static 
5ad0: 76 6f 69 64 20 61 76 67 46 69 6e 61 6c 69 7a 65  void avgFinalize
5ae0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5af0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 75   *context){.  Su
5b00: 6d 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73  mCtx *p;.  p = s
5b10: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
5b20: 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
5b30: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
5b40: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 63 6e 74   if( p && p->cnt
5b50: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
5b60: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
5b70: 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 73 75 6d 2f  context, p->sum/
5b80: 28 64 6f 75 62 6c 65 29 70 2d 3e 63 6e 74 29 3b  (double)p->cnt);
5b90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  .  }.}../*.** An
5ba0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
5bb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
5bc0: 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20 63  ture holds the c
5bd0: 6f 6e 74 65 78 74 20 6f 66 20 61 0a 2a 2a 20 76  ontext of a.** v
5be0: 61 72 69 61 6e 63 65 20 6f 72 20 73 74 61 6e 64  ariance or stand
5bf0: 61 72 64 20 64 65 76 69 61 74 69 6f 6e 20 63 6f  ard deviation co
5c00: 6d 70 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  mputation..*/.ty
5c10: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 74 64  pedef struct Std
5c20: 44 65 76 43 74 78 20 53 74 64 44 65 76 43 74 78  DevCtx StdDevCtx
5c30: 3b 0a 73 74 72 75 63 74 20 53 74 64 44 65 76 43  ;.struct StdDevC
5c40: 74 78 20 7b 0a 20 20 64 6f 75 62 6c 65 20 73 75  tx {.  double su
5c50: 6d 3b 20 20 20 20 20 2f 2a 20 53 75 6d 20 6f 66  m;     /* Sum of
5c60: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 64 6f 75 62   terms */.  doub
5c70: 6c 65 20 73 75 6d 32 3b 20 20 20 20 2f 2a 20 53  le sum2;    /* S
5c80: 75 6d 20 6f 66 20 74 68 65 20 73 71 75 61 72 65  um of the square
5c90: 73 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  s of terms */.  
5ca0: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
5cb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
5cc0: 6d 73 20 63 6f 75 6e 74 65 64 20 2a 2f 0a 7d 3b  ms counted */.};
5cd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
5ce0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
5cf0: 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 73  keeps track of s
5d00: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
5d10: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 75 6e   for the.** coun
5d20: 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75  t() aggregate fu
5d30: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  nction..*/.typed
5d40: 65 66 20 73 74 72 75 63 74 20 43 6f 75 6e 74 43  ef struct CountC
5d50: 74 78 20 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72  tx CountCtx;.str
5d60: 75 63 74 20 43 6f 75 6e 74 43 74 78 20 7b 0a 20  uct CountCtx {. 
5d70: 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a   int n;.};../*.*
5d80: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d  * Routines to im
5d90: 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  plement the coun
5da0: 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75  t() aggregate fu
5db0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
5dc0: 63 20 76 6f 69 64 20 63 6f 75 6e 74 53 74 65 70  c void countStep
5dd0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5de0: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
5df0: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
5e00: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 43 6f  ue **argv){.  Co
5e10: 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  untCtx *p;.  p =
5e20: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
5e30: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
5e40: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  xt, sizeof(*p));
5e50: 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20  .  if( (argc==0 
5e60: 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d  || SQLITE_NULL!=
5e70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
5e80: 70 65 28 61 72 67 76 5b 30 5d 29 29 20 26 26 20  pe(argv[0])) && 
5e90: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b  p ){.    p->n++;
5ea0: 0a 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63  .  }.}   .static
5eb0: 20 76 6f 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c   void countFinal
5ec0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
5ed0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
5ee0: 20 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20   CountCtx *p;.  
5ef0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
5f00: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
5f10: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
5f20: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ));.  sqlite3_re
5f30: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
5f40: 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b  , p ? p->n : 0);
5f50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  .}../*.** Routin
5f60: 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  es to implement 
5f70: 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20  min() and max() 
5f80: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
5f90: 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ons..*/.static v
5fa0: 6f 69 64 20 6d 69 6e 6d 61 78 53 74 65 70 28 73  oid minmaxStep(s
5fb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5fc0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
5fd0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
5fe0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 65 6d 20   **argv){.  Mem 
5ff0: 2a 70 41 72 67 20 20 3d 20 28 4d 65 6d 20 2a 29  *pArg  = (Mem *)
6000: 61 72 67 76 5b 30 5d 3b 0a 20 20 4d 65 6d 20 2a  argv[0];.  Mem *
6010: 70 42 65 73 74 3b 0a 0a 20 20 69 66 28 20 73 71  pBest;..  if( sq
6020: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
6030: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
6040: 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b  E_NULL ) return;
6050: 0a 20 20 70 42 65 73 74 20 3d 20 28 4d 65 6d 20  .  pBest = (Mem 
6060: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
6070: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
6080: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 42 65  ext, sizeof(*pBe
6090: 73 74 29 29 3b 0a 20 20 69 66 28 20 21 70 42 65  st));.  if( !pBe
60a0: 73 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  st ) return;..  
60b0: 69 66 28 20 70 42 65 73 74 2d 3e 66 6c 61 67 73  if( pBest->flags
60c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78 3b   ){.    int max;
60d0: 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 0a 20 20  .    int cmp;.  
60e0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
60f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 46 75 6e   = sqlite3GetFun
6100: 63 43 6f 6c 6c 53 65 71 28 63 6f 6e 74 65 78 74  cCollSeq(context
6110: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 73  );.    /* This s
6120: 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  tep function is 
6130: 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
6140: 65 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28  e min() and max(
6150: 29 20 61 67 67 72 65 67 61 74 65 73 2c 0a 20 20  ) aggregates,.  
6160: 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 64 69    ** the only di
6170: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
6180: 20 74 68 65 20 74 77 6f 20 62 65 69 6e 67 20 74   the two being t
6190: 68 61 74 20 74 68 65 20 73 65 6e 73 65 20 6f 66  hat the sense of
61a0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70   the.    ** comp
61b0: 61 72 69 73 6f 6e 20 69 73 20 69 6e 76 65 72 74  arison is invert
61c0: 65 64 2e 20 46 6f 72 20 74 68 65 20 6d 61 78 28  ed. For the max(
61d0: 29 20 61 67 67 72 65 67 61 74 65 2c 20 74 68 65  ) aggregate, the
61e0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
61f0: 75 73 65 72 5f 64 61 74 61 28 29 20 66 75 6e 63  user_data() func
6200: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 28 76 6f  tion returns (vo
6210: 69 64 20 2a 29 2d 31 2e 20 46 6f 72 20 6d 69 6e  id *)-1. For min
6220: 28 29 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 74  () it.    ** ret
6230: 75 72 6e 73 20 28 76 6f 69 64 20 2a 29 64 62 2c  urns (void *)db,
6240: 20 77 68 65 72 65 20 64 62 20 69 73 20 74 68 65   where db is the
6250: 20 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61   sqlite3* databa
6260: 73 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20  se pointer..    
6270: 2a 2a 20 54 68 65 72 65 66 6f 72 65 20 74 68 65  ** Therefore the
6280: 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
6290: 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 27 6d  sets variable 'm
62a0: 61 78 27 20 74 6f 20 31 20 66 6f 72 20 74 68 65  ax' to 1 for the
62b0: 20 6d 61 78 28 29 0a 20 20 20 20 2a 2a 20 61 67   max().    ** ag
62c0: 67 72 65 67 61 74 65 2c 20 6f 72 20 30 20 66 6f  gregate, or 0 fo
62d0: 72 20 6d 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a  r min()..    */.
62e0: 20 20 20 20 6d 61 78 20 3d 20 28 28 73 71 6c 69      max = ((sqli
62f0: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
6300: 6e 74 65 78 74 29 3d 3d 28 76 6f 69 64 20 2a 29  ntext)==(void *)
6310: 2d 31 29 3f 31 3a 30 29 3b 0a 20 20 20 20 63 6d  -1)?1:0);.    cm
6320: 70 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  p = sqlite3MemCo
6330: 6d 70 61 72 65 28 70 42 65 73 74 2c 20 70 41 72  mpare(pBest, pAr
6340: 67 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  g, pColl);.    i
6350: 66 28 20 28 6d 61 78 20 26 26 20 63 6d 70 3c 30  f( (max && cmp<0
6360: 29 20 7c 7c 20 28 21 6d 61 78 20 26 26 20 63 6d  ) || (!max && cm
6370: 70 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  p>0) ){.      sq
6380: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
6390: 28 70 42 65 73 74 2c 20 70 41 72 67 29 3b 0a 20  (pBest, pArg);. 
63a0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
63b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
63c0: 43 6f 70 79 28 70 42 65 73 74 2c 20 70 41 72 67  Copy(pBest, pArg
63d0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
63e0: 76 6f 69 64 20 6d 69 6e 4d 61 78 46 69 6e 61 6c  void minMaxFinal
63f0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
6400: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
6410: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6420: 70 52 65 73 3b 0a 20 20 70 52 65 73 20 3d 20 28  pRes;.  pRes = (
6430: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 29  sqlite3_value *)
6440: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
6450: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
6460: 74 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b  t, sizeof(Mem));
6470: 0a 20 20 69 66 28 20 70 52 65 73 2d 3e 66 6c 61  .  if( pRes->fla
6480: 67 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  gs ){.    sqlite
6490: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
64a0: 6f 6e 74 65 78 74 2c 20 70 52 65 73 29 3b 0a 20  ontext, pRes);. 
64b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
64c0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 65 73 29  MemRelease(pRes)
64d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
64e0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74   function regist
64f0: 65 72 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 20  ered all of the 
6500: 61 62 6f 76 65 20 43 20 66 75 6e 63 74 69 6f 6e  above C function
6510: 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63  s as SQL.** func
6520: 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 68 6f  tions.  This sho
6530: 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20  uld be the only 
6540: 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73 20  routine in this 
6550: 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65 78 74  file with.** ext
6560: 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e 0a 2a  ernal linkage..*
6570: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
6580: 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e  gisterBuiltinFun
6590: 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a  ctions(sqlite3 *
65a0: 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  db){.  static co
65b0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
65c0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
65d0: 20 20 20 20 73 69 67 6e 65 64 20 63 68 61 72 20      signed char 
65e0: 6e 41 72 67 3b 0a 20 20 20 20 20 75 38 20 61 72  nArg;.     u8 ar
65f0: 67 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  gType;          
6600: 20 2f 2a 20 30 3a 20 6e 6f 6e 65 2e 20 20 31 3a   /* 0: none.  1:
6610: 20 64 62 20 20 32 3a 20 28 2d 31 29 20 2a 2f 0a   db  2: (-1) */.
6620: 20 20 20 20 20 75 38 20 65 54 65 78 74 52 65 70       u8 eTextRep
6630: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a  ;          /* 1:
6640: 20 55 54 46 2d 31 36 2e 20 20 30 3a 20 55 54 46   UTF-16.  0: UTF
6650: 2d 38 20 2a 2f 0a 20 20 20 20 20 75 38 20 6e 65  -8 */.     u8 ne
6660: 65 64 43 6f 6c 6c 53 65 71 3b 0a 20 20 20 20 20  edCollSeq;.     
6670: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
6680: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
6690: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
66a0: 20 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e 63 73   **);.  } aFuncs
66b0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6d 69  [] = {.    { "mi
66c0: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
66d0: 20 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f    -1, 0, SQLITE_
66e0: 55 54 46 38 2c 20 20 20 20 31 2c 20 6d 69 6e 6d  UTF8,    1, minm
66f0: 61 78 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  axFunc },.    { 
6700: 22 6d 69 6e 22 2c 20 20 20 20 20 20 20 20 20 20  "min",          
6710: 20 20 20 20 20 20 30 2c 20 30 2c 20 53 51 4c 49        0, 0, SQLI
6720: 54 45 5f 55 54 46 38 2c 20 20 20 20 31 2c 20 30  TE_UTF8,    1, 0
6730: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6740: 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 20 20 20   { "max",       
6750: 20 20 20 20 20 20 20 20 2d 31 2c 20 32 2c 20 53          -1, 2, S
6760: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 31  QLITE_UTF8,    1
6770: 2c 20 6d 69 6e 6d 61 78 46 75 6e 63 20 7d 2c 0a  , minmaxFunc },.
6780: 20 20 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20      { "max",    
6790: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 32              0, 2
67a0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
67b0: 20 20 31 2c 20 30 20 20 20 20 20 20 20 20 20 20    1, 0          
67c0: 7d 2c 0a 20 20 20 20 7b 20 22 74 79 70 65 6f 66  },.    { "typeof
67d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ",             1
67e0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
67f0: 2c 20 20 20 20 30 2c 20 74 79 70 65 6f 66 46 75  ,    0, typeofFu
6800: 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 6e  nc },.    { "len
6810: 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  gth",           
6820: 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    1, 0, SQLITE_U
6830: 54 46 38 2c 20 20 20 20 30 2c 20 6c 65 6e 67 74  TF8,    0, lengt
6840: 68 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  hFunc },.    { "
6850: 73 75 62 73 74 72 22 2c 20 20 20 20 20 20 20 20  substr",        
6860: 20 20 20 20 20 33 2c 20 30 2c 20 53 51 4c 49 54       3, 0, SQLIT
6870: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 73 75  E_UTF8,    0, su
6880: 62 73 74 72 46 75 6e 63 20 7d 2c 0a 23 69 66 6e  bstrFunc },.#ifn
6890: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
68a0: 55 54 46 31 36 0a 20 20 20 20 7b 20 22 73 75 62  UTF16.    { "sub
68b0: 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  str",           
68c0: 20 20 33 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    3, 0, SQLITE_U
68d0: 54 46 31 36 4c 45 2c 20 30 2c 20 73 71 6c 69 74  TF16LE, 0, sqlit
68e0: 65 33 75 74 66 31 36 53 75 62 73 74 72 20 7d 2c  e3utf16Substr },
68f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 20 22 61  .#endif.    { "a
6900: 62 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  bs",            
6910: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
6920: 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 61 62 73  _UTF8,    0, abs
6930: 46 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b  Func    },.    {
6940: 20 22 72 6f 75 6e 64 22 2c 20 20 20 20 20 20 20   "round",       
6950: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51 4c         1, 0, SQL
6960: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20  ITE_UTF8,    0, 
6970: 72 6f 75 6e 64 46 75 6e 63 20 20 7d 2c 0a 20 20  roundFunc  },.  
6980: 20 20 7b 20 22 72 6f 75 6e 64 22 2c 20 20 20 20    { "round",    
6990: 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20            2, 0, 
69a0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
69b0: 30 2c 20 72 6f 75 6e 64 46 75 6e 63 20 20 7d 2c  0, roundFunc  },
69c0: 0a 20 20 20 20 7b 20 22 75 70 70 65 72 22 2c 20  .    { "upper", 
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
69e0: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
69f0: 20 20 20 30 2c 20 75 70 70 65 72 46 75 6e 63 20     0, upperFunc 
6a00: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 6f 77 65 72   },.    { "lower
6a10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6a20: 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  1, 0, SQLITE_UTF
6a30: 38 2c 20 20 20 20 30 2c 20 6c 6f 77 65 72 46 75  8,    0, lowerFu
6a40: 6e 63 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f  nc  },.    { "co
6a50: 61 6c 65 73 63 65 22 2c 20 20 20 20 20 20 20 20  alesce",        
6a60: 20 20 2d 31 2c 20 30 2c 20 53 51 4c 49 54 45 5f    -1, 0, SQLITE_
6a70: 55 54 46 38 2c 20 20 20 20 30 2c 20 69 66 6e 75  UTF8,    0, ifnu
6a80: 6c 6c 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  llFunc },.    { 
6a90: 22 63 6f 61 6c 65 73 63 65 22 2c 20 20 20 20 20  "coalesce",     
6aa0: 20 20 20 20 20 20 30 2c 20 30 2c 20 53 51 4c 49        0, 0, SQLI
6ab0: 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 30  TE_UTF8,    0, 0
6ac0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6ad0: 20 7b 20 22 63 6f 61 6c 65 73 63 65 22 2c 20 20   { "coalesce",  
6ae0: 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53           1, 0, S
6af0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30  QLITE_UTF8,    0
6b00: 2c 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  , 0          },.
6b10: 20 20 20 20 7b 20 22 69 66 6e 75 6c 6c 22 2c 20      { "ifnull", 
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30              2, 0
6b30: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20  , SQLITE_UTF8,  
6b40: 20 20 31 2c 20 69 66 6e 75 6c 6c 46 75 6e 63 20    1, ifnullFunc 
6b50: 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6e 64 6f 6d  },.    { "random
6b60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d 31  ",            -1
6b70: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
6b80: 2c 20 20 20 20 30 2c 20 72 61 6e 64 6f 6d 46 75  ,    0, randomFu
6b90: 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 75 6c  nc },.    { "nul
6ba0: 6c 69 66 22 2c 20 20 20 20 20 20 20 20 20 20 20  lif",           
6bb0: 20 20 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55    2, 0, SQLITE_U
6bc0: 54 46 38 2c 20 20 20 20 31 2c 20 6e 75 6c 6c 69  TF8,    1, nulli
6bd0: 66 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22  fFunc },.    { "
6be0: 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 22 2c  sqlite_version",
6bf0: 20 20 20 20 20 30 2c 20 30 2c 20 53 51 4c 49 54       0, 0, SQLIT
6c00: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 76 65  E_UTF8,    0, ve
6c10: 72 73 69 6f 6e 46 75 6e 63 7d 2c 0a 20 20 20 20  rsionFunc},.    
6c20: 7b 20 22 71 75 6f 74 65 22 2c 20 20 20 20 20 20  { "quote",      
6c30: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 53 51          1, 0, SQ
6c40: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
6c50: 20 71 75 6f 74 65 46 75 6e 63 20 20 7d 2c 0a 20   quoteFunc  },. 
6c60: 20 20 20 7b 20 22 6c 61 73 74 5f 69 6e 73 65 72     { "last_inser
6c70: 74 5f 72 6f 77 69 64 22 2c 20 20 30 2c 20 31 2c  t_rowid",  0, 1,
6c80: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
6c90: 20 30 2c 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f   0, last_insert_
6ca0: 72 6f 77 69 64 20 7d 2c 0a 20 20 20 20 7b 20 22  rowid },.    { "
6cb0: 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20  changes",       
6cc0: 20 20 20 20 20 30 2c 20 31 2c 20 53 51 4c 49 54       0, 1, SQLIT
6cd0: 45 5f 55 54 46 38 2c 20 20 20 20 30 2c 20 63 68  E_UTF8,    0, ch
6ce0: 61 6e 67 65 73 20 20 20 20 7d 2c 0a 20 20 20 20  anges    },.    
6cf0: 7b 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  { "total_changes
6d00: 22 2c 20 20 20 20 20 20 30 2c 20 31 2c 20 53 51  ",      0, 1, SQ
6d10: 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 30 2c  LITE_UTF8,    0,
6d20: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 20 7d   total_changes }
6d30: 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
6d40: 53 4f 55 4e 44 45 58 0a 20 20 20 20 7b 20 22 73  SOUNDEX.    { "s
6d50: 6f 75 6e 64 65 78 22 2c 20 20 20 20 20 20 20 20  oundex",        
6d60: 20 20 20 20 31 2c 20 30 2c 20 53 51 4c 49 54 45      1, 0, SQLITE
6d70: 5f 55 54 46 38 2c 20 30 2c 20 73 6f 75 6e 64 65  _UTF8, 0, sounde
6d80: 78 46 75 6e 63 7d 2c 0a 23 65 6e 64 69 66 0a 23  xFunc},.#endif.#
6d90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
6da0: 54 0a 20 20 20 20 7b 20 22 72 61 6e 64 73 74 72  T.    { "randstr
6db0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6dc0: 20 32 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54   2, 0, SQLITE_UT
6dd0: 46 38 2c 20 30 2c 20 72 61 6e 64 53 74 72 20 20  F8, 0, randStr  
6de0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73 74    },.    { "test
6df0: 5f 64 65 73 74 72 75 63 74 6f 72 22 2c 20 20 20  _destructor",   
6e00: 20 20 20 20 31 2c 20 31 2c 20 53 51 4c 49 54 45      1, 1, SQLITE
6e10: 5f 55 54 46 38 2c 20 30 2c 20 74 65 73 74 5f 64  _UTF8, 0, test_d
6e20: 65 73 74 72 75 63 74 6f 72 7d 2c 0a 20 20 20 20  estructor},.    
6e30: 7b 20 22 74 65 73 74 5f 64 65 73 74 72 75 63 74  { "test_destruct
6e40: 6f 72 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c  or_count", 0, 0,
6e50: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
6e60: 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72   test_destructor
6e70: 5f 63 6f 75 6e 74 7d 2c 0a 20 20 20 20 7b 20 22  _count},.    { "
6e80: 74 65 73 74 5f 61 75 78 64 61 74 61 22 2c 20 20  test_auxdata",  
6e90: 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 53 51         -1, 0, SQ
6ea0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 65  LITE_UTF8, 0, te
6eb0: 73 74 5f 61 75 78 64 61 74 61 7d 2c 0a 20 20 20  st_auxdata},.   
6ec0: 20 7b 20 22 74 65 73 74 5f 65 72 72 6f 72 22 2c   { "test_error",
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
6ee0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
6ef0: 2c 20 74 65 73 74 5f 65 72 72 6f 72 7d 2c 0a 23  , test_error},.#
6f00: 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 73 74 61  endif.  };.  sta
6f10: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
6f20: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61   {.    char *zNa
6f30: 6d 65 3b 0a 20 20 20 20 73 69 67 6e 65 64 20 63  me;.    signed c
6f40: 68 61 72 20 6e 41 72 67 3b 0a 20 20 20 20 75 38  har nArg;.    u8
6f50: 20 61 72 67 54 79 70 65 3b 0a 20 20 20 20 75 38   argType;.    u8
6f60: 20 6e 65 65 64 43 6f 6c 6c 53 65 71 3b 0a 20 20   needCollSeq;.  
6f70: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
6f80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
6f90: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
6fa0: 75 65 2a 2a 29 3b 0a 20 20 20 20 76 6f 69 64 20  ue**);.    void 
6fb0: 28 2a 78 46 69 6e 61 6c 69 7a 65 29 28 73 71 6c  (*xFinalize)(sql
6fc0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 3b 0a  ite3_context*);.
6fd0: 20 20 7d 20 61 41 67 67 73 5b 5d 20 3d 20 7b 0a    } aAggs[] = {.
6fe0: 20 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20      { "min",    
6ff0: 31 2c 20 30 2c 20 31 2c 20 6d 69 6e 6d 61 78 53  1, 0, 1, minmaxS
7000: 74 65 70 2c 20 20 20 6d 69 6e 4d 61 78 46 69 6e  tep,   minMaxFin
7010: 61 6c 69 7a 65 20 7d 2c 0a 20 20 20 20 7b 20 22  alize },.    { "
7020: 6d 61 78 22 2c 20 20 20 20 31 2c 20 32 2c 20 31  max",    1, 2, 1
7030: 2c 20 6d 69 6e 6d 61 78 53 74 65 70 2c 20 20 20  , minmaxStep,   
7040: 6d 69 6e 4d 61 78 46 69 6e 61 6c 69 7a 65 20 7d  minMaxFinalize }
7050: 2c 0a 20 20 20 20 7b 20 22 73 75 6d 22 2c 20 20  ,.    { "sum",  
7060: 20 20 31 2c 20 30 2c 20 30 2c 20 73 75 6d 53 74    1, 0, 0, sumSt
7070: 65 70 2c 20 20 20 20 20 20 73 75 6d 46 69 6e 61  ep,      sumFina
7080: 6c 69 7a 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b  lize    },.    {
7090: 20 22 61 76 67 22 2c 20 20 20 20 31 2c 20 30 2c   "avg",    1, 0,
70a0: 20 30 2c 20 73 75 6d 53 74 65 70 2c 20 20 20 20   0, sumStep,    
70b0: 20 20 61 76 67 46 69 6e 61 6c 69 7a 65 20 20 20    avgFinalize   
70c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 75 6e 74   },.    { "count
70d0: 22 2c 20 20 30 2c 20 30 2c 20 30 2c 20 63 6f 75  ",  0, 0, 0, cou
70e0: 6e 74 53 74 65 70 2c 20 20 20 20 63 6f 75 6e 74  ntStep,    count
70f0: 46 69 6e 61 6c 69 7a 65 20 20 7d 2c 0a 20 20 20  Finalize  },.   
7100: 20 7b 20 22 63 6f 75 6e 74 22 2c 20 20 31 2c 20   { "count",  1, 
7110: 30 2c 20 30 2c 20 63 6f 75 6e 74 53 74 65 70 2c  0, 0, countStep,
7120: 20 20 20 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a      countFinaliz
7130: 65 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  e  },.  };.  int
7140: 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   i;..  for(i=0; 
7150: 69 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 29  i<sizeof(aFuncs)
7160: 2f 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 5b 30  /sizeof(aFuncs[0
7170: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 6f  ]); i++){.    vo
7180: 69 64 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20  id *pArg = 0;.  
7190: 20 20 73 77 69 74 63 68 28 20 61 46 75 6e 63 73    switch( aFuncs
71a0: 5b 69 5d 2e 61 72 67 54 79 70 65 20 29 7b 0a 20  [i].argType ){. 
71b0: 20 20 20 20 20 63 61 73 65 20 31 3a 20 70 41 72       case 1: pAr
71c0: 67 20 3d 20 64 62 3b 20 62 72 65 61 6b 3b 0a 20  g = db; break;. 
71d0: 20 20 20 20 20 63 61 73 65 20 32 3a 20 70 41 72       case 2: pAr
71e0: 67 20 3d 20 28 76 6f 69 64 20 2a 29 28 2d 31 29  g = (void *)(-1)
71f0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ; break;.    }. 
7200: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
7210: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  e_function(db, a
7220: 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  Funcs[i].zName, 
7230: 61 46 75 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c 0a  aFuncs[i].nArg,.
7240: 20 20 20 20 20 20 20 20 61 46 75 6e 63 73 5b 69          aFuncs[i
7250: 5d 2e 65 54 65 78 74 52 65 70 2c 20 70 41 72 67  ].eTextRep, pArg
7260: 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 78 46 75 6e  , aFuncs[i].xFun
7270: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  c, 0, 0);.    if
7280: 28 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 65 65 64  ( aFuncs[i].need
7290: 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20  CollSeq ){.     
72a0: 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20   FuncDef *pFunc 
72b0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
72c0: 63 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 73  ction(db, aFuncs
72d0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [i].zName, .    
72e0: 20 20 20 20 20 20 73 74 72 6c 65 6e 28 61 46 75        strlen(aFu
72f0: 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 29 2c 20 61  ncs[i].zName), a
7300: 46 75 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c 20 61  Funcs[i].nArg, a
7310: 46 75 6e 63 73 5b 69 5d 2e 65 54 65 78 74 52 65  Funcs[i].eTextRe
7320: 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  p, 0);.      if(
7330: 20 70 46 75 6e 63 20 26 26 20 61 46 75 6e 63 73   pFunc && aFuncs
7340: 5b 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  [i].needCollSeq 
7350: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  ){.        pFunc
7360: 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 3d 20  ->needCollSeq = 
7370: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
7380: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
7390: 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
73a0: 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 41 6c 74  BLE.  sqlite3Alt
73b0: 65 72 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  erFunctions(db);
73c0: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
73d0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 41 67 67  0; i<sizeof(aAgg
73e0: 73 29 2f 73 69 7a 65 6f 66 28 61 41 67 67 73 5b  s)/sizeof(aAggs[
73f0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76  0]); i++){.    v
7400: 6f 69 64 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20  oid *pArg = 0;. 
7410: 20 20 20 73 77 69 74 63 68 28 20 61 41 67 67 73     switch( aAggs
7420: 5b 69 5d 2e 61 72 67 54 79 70 65 20 29 7b 0a 20  [i].argType ){. 
7430: 20 20 20 20 20 63 61 73 65 20 31 3a 20 70 41 72       case 1: pAr
7440: 67 20 3d 20 64 62 3b 20 62 72 65 61 6b 3b 0a 20  g = db; break;. 
7450: 20 20 20 20 20 63 61 73 65 20 32 3a 20 70 41 72       case 2: pAr
7460: 67 20 3d 20 28 76 6f 69 64 20 2a 29 28 2d 31 29  g = (void *)(-1)
7470: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ; break;.    }. 
7480: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
7490: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  e_function(db, a
74a0: 41 67 67 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61  Aggs[i].zName, a
74b0: 41 67 67 73 5b 69 5d 2e 6e 41 72 67 2c 20 53 51  Aggs[i].nArg, SQ
74c0: 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
74d0: 20 20 20 20 70 41 72 67 2c 20 30 2c 20 61 41 67      pArg, 0, aAg
74e0: 67 73 5b 69 5d 2e 78 53 74 65 70 2c 20 61 41 67  gs[i].xStep, aAg
74f0: 67 73 5b 69 5d 2e 78 46 69 6e 61 6c 69 7a 65 29  gs[i].xFinalize)
7500: 3b 0a 20 20 20 20 69 66 28 20 61 41 67 67 73 5b  ;.    if( aAggs[
7510: 69 5d 2e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  i].needCollSeq )
7520: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
7530: 2a 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  *pFunc = sqlite3
7540: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 20 64 62  FindFunction( db
7550: 2c 20 61 41 67 67 73 5b 69 5d 2e 7a 4e 61 6d 65  , aAggs[i].zName
7560: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c  ,.          strl
7570: 65 6e 28 61 41 67 67 73 5b 69 5d 2e 7a 4e 61 6d  en(aAggs[i].zNam
7580: 65 29 2c 20 61 41 67 67 73 5b 69 5d 2e 6e 41 72  e), aAggs[i].nAr
7590: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
75a0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  0);.      if( pF
75b0: 75 6e 63 20 26 26 20 61 41 67 67 73 5b 69 5d 2e  unc && aAggs[i].
75c0: 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  needCollSeq ){. 
75d0: 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 6e 65         pFunc->ne
75e0: 65 64 43 6f 6c 6c 53 65 71 20 3d 20 31 3b 0a 20  edCollSeq = 1;. 
75f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7600: 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  .  sqlite3Regist
7610: 65 72 44 61 74 65 54 69 6d 65 46 75 6e 63 74 69  erDateTimeFuncti
7620: 6f 6e 73 28 64 62 29 3b 0a 23 69 66 64 65 66 20  ons(db);.#ifdef 
7630: 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 73 71 6c  SQLITE_SSE.  sql
7640: 69 74 65 33 53 73 65 46 75 6e 63 74 69 6f 6e 73  ite3SseFunctions
7650: 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  (db);.#endif.#if
7660: 64 65 66 20 53 51 4c 49 54 45 5f 43 41 53 45 5f  def SQLITE_CASE_
7670: 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 0a 20  SENSITIVE_LIKE. 
7680: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
7690: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 64 62  LikeFunctions(db
76a0: 2c 20 31 29 3b 0a 23 65 6c 73 65 0a 20 20 73 71  , 1);.#else.  sq
76b0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b  lite3RegisterLik
76c0: 65 46 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 30  eFunctions(db, 0
76d0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
76e0: 2a 2a 20 53 65 74 20 74 68 65 20 4c 49 4b 45 4f  ** Set the LIKEO
76f0: 50 54 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 32  PT flag on the 2
7700: 2d 61 72 67 75 6d 65 6e 74 20 66 75 6e 63 74 69  -argument functi
7710: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
7720: 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  n name..*/.stati
7730: 63 20 76 6f 69 64 20 73 65 74 4c 69 6b 65 4f 70  c void setLikeOp
7740: 74 46 6c 61 67 28 73 71 6c 69 74 65 33 20 2a 64  tFlag(sqlite3 *d
7750: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
7760: 4e 61 6d 65 29 7b 0a 20 20 46 75 6e 63 44 65 66  Name){.  FuncDef
7770: 20 2a 70 44 65 66 3b 0a 20 20 70 44 65 66 20 3d   *pDef;.  pDef =
7780: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
7790: 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
77a0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2c 20 32  strlen(zName), 2
77b0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
77c0: 29 3b 0a 20 20 69 66 28 20 70 44 65 66 20 29 7b  );.  if( pDef ){
77d0: 0a 20 20 20 20 70 44 65 66 2d 3e 66 6c 61 67 73  .    pDef->flags
77e0: 20 3d 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c   = SQLITE_FUNC_L
77f0: 49 4b 45 4f 50 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f  IKEOPT;.  }.}../
7800: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
7810: 65 20 62 75 69 6c 74 2d 69 6e 20 4c 49 4b 45 20  e built-in LIKE 
7820: 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f  and GLOB functio
7830: 6e 73 2e 20 20 54 68 65 20 63 61 73 65 53 65 6e  ns.  The caseSen
7840: 73 69 74 69 76 65 0a 2a 2a 20 70 61 72 61 6d 65  sitive.** parame
7850: 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
7860: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
7870: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
7880: 69 73 20 63 61 73 65 0a 2a 2a 20 73 65 6e 73 69  is case.** sensi
7890: 74 69 76 65 2e 20 20 47 4c 4f 42 20 69 73 20 61  tive.  GLOB is a
78a0: 6c 77 61 79 73 20 63 61 73 65 20 73 65 6e 73 69  lways case sensi
78b0: 74 69 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tive..*/.void sq
78c0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b  lite3RegisterLik
78d0: 65 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74  eFunctions(sqlit
78e0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 63 61 73 65  e3 *db, int case
78f0: 53 65 6e 73 69 74 69 76 65 29 7b 0a 20 20 73 74  Sensitive){.  st
7900: 72 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f  ruct compareInfo
7910: 20 2a 70 49 6e 66 6f 3b 0a 20 20 69 66 28 20 63   *pInfo;.  if( c
7920: 61 73 65 53 65 6e 73 69 74 69 76 65 20 29 7b 0a  aseSensitive ){.
7930: 20 20 20 20 70 49 6e 66 6f 20 3d 20 28 73 74 72      pInfo = (str
7940: 75 63 74 20 63 6f 6d 70 61 72 65 49 6e 66 6f 2a  uct compareInfo*
7950: 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 3b 0a 20  )&likeInfoAlt;. 
7960: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
7970: 6f 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6d 70  o = (struct comp
7980: 61 72 65 49 6e 66 6f 2a 29 26 6c 69 6b 65 49 6e  areInfo*)&likeIn
7990: 66 6f 4e 6f 72 6d 3b 0a 20 20 7d 0a 20 20 73 71  foNorm;.  }.  sq
79a0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
79b0: 63 74 69 6f 6e 28 64 62 2c 20 22 6c 69 6b 65 22  ction(db, "like"
79c0: 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
79d0: 2c 20 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e  , pInfo, likeFun
79e0: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  c, 0, 0);.  sqli
79f0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
7a00: 69 6f 6e 28 64 62 2c 20 22 6c 69 6b 65 22 2c 20  ion(db, "like", 
7a10: 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  3, SQLITE_UTF8, 
7a20: 70 49 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c  pInfo, likeFunc,
7a30: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
7a40: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7a50: 6e 28 64 62 2c 20 22 67 6c 6f 62 22 2c 20 32 2c  n(db, "glob", 2,
7a60: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
7a70: 20 20 20 20 20 28 73 74 72 75 63 74 20 63 6f 6d       (struct com
7a80: 70 61 72 65 49 6e 66 6f 2a 29 26 67 6c 6f 62 49  pareInfo*)&globI
7a90: 6e 66 6f 2c 20 6c 69 6b 65 46 75 6e 63 2c 20 30  nfo, likeFunc, 0
7aa0: 2c 30 29 3b 0a 20 20 73 65 74 4c 69 6b 65 4f 70  ,0);.  setLikeOp
7ab0: 74 46 6c 61 67 28 64 62 2c 20 22 67 6c 6f 62 22  tFlag(db, "glob"
7ac0: 29 3b 0a 20 20 69 66 28 20 63 61 73 65 53 65 6e  );.  if( caseSen
7ad0: 73 69 74 69 76 65 20 29 7b 0a 20 20 20 20 73 65  sitive ){.    se
7ae0: 74 4c 69 6b 65 4f 70 74 46 6c 61 67 28 64 62 2c  tLikeOptFlag(db,
7af0: 20 22 6c 69 6b 65 22 29 3b 0a 20 20 7d 0a 7d 0a   "like");.  }.}.
7b00: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 70 6f 69  ./*.** pExpr poi
7b10: 6e 74 73 20 74 6f 20 61 6e 20 65 78 70 72 65 73  nts to an expres
7b20: 73 69 6f 6e 20 77 68 69 63 68 20 69 6d 70 6c 65  sion which imple
7b30: 6d 65 6e 74 73 20 61 20 66 75 6e 63 74 69 6f 6e  ments a function
7b40: 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69 73 20 61  .  If.** it is a
7b50: 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 61 70  ppropriate to ap
7b60: 70 6c 79 20 74 68 65 20 4c 49 4b 45 20 6f 70 74  ply the LIKE opt
7b70: 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68 61  imization to tha
7b80: 74 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68  t function.** th
7b90: 65 6e 20 73 65 74 20 61 57 63 5b 30 5d 20 74 68  en set aWc[0] th
7ba0: 72 6f 75 67 68 20 61 57 63 5b 32 5d 20 74 6f 20  rough aWc[2] to 
7bb0: 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68 61  the wildcard cha
7bc0: 72 61 63 74 65 72 73 20 61 6e 64 0a 2a 2a 20 72  racters and.** r
7bd0: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
7be0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
7bf0: 6e 6f 74 20 61 20 4c 49 4b 45 2d 73 74 79 6c 65  not a LIKE-style
7c00: 20 66 75 6e 63 74 69 6f 6e 20 74 68 65 6e 0a 2a   function then.*
7c10: 2a 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  * return FALSE..
7c20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
7c30: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 73 71 6c  LikeFunction(sql
7c40: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
7c50: 70 45 78 70 72 2c 20 63 68 61 72 20 2a 61 57 63  pExpr, char *aWc
7c60: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 44  ){.  FuncDef *pD
7c70: 65 66 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  ef;.  if( pExpr-
7c80: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
7c90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7ca0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
7cb0: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  r->pList->nExpr!
7cc0: 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =2 ){.    return
7cd0: 20 30 3b 0a 20 20 7d 0a 20 20 70 44 65 66 20 3d   0;.  }.  pDef =
7ce0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
7cf0: 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2d 3e  tion(db, pExpr->
7d00: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
7d10: 74 6f 6b 65 6e 2e 6e 2c 20 32 2c 0a 20 20 20 20  token.n, 2,.    
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
7d40: 55 54 46 38 2c 20 30 29 3b 0a 20 20 69 66 28 20  UTF8, 0);.  if( 
7d50: 70 44 65 66 3d 3d 30 20 7c 7c 20 28 70 44 65 66  pDef==0 || (pDef
7d60: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
7d70: 5f 46 55 4e 43 5f 4c 49 4b 45 4f 50 54 29 3d 3d  _FUNC_LIKEOPT)==
7d80: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7d90: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
7da0: 20 6d 65 6d 63 70 79 28 29 20 73 74 61 74 65 6d   memcpy() statem
7db0: 65 6e 74 20 61 73 73 75 6d 65 73 20 74 68 61 74  ent assumes that
7dc0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 68   the wildcard ch
7dd0: 61 72 61 63 74 65 72 73 20 61 72 65 0a 20 20 2a  aracters are.  *
7de0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  * the first thre
7df0: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  e statements in 
7e00: 74 68 65 20 63 6f 6d 70 61 72 65 49 6e 66 6f 20  the compareInfo 
7e10: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 0a  structure.  The.
7e20: 20 20 2a 2a 20 61 73 73 65 72 74 73 28 29 20 74    ** asserts() t
7e30: 68 61 74 20 66 6f 6c 6c 6f 77 20 76 65 72 69 66  hat follow verif
7e40: 79 20 74 68 61 74 20 61 73 73 75 6d 70 74 69 6f  y that assumptio
7e50: 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  n.  */.  memcpy(
7e60: 61 57 63 2c 20 70 44 65 66 2d 3e 70 55 73 65 72  aWc, pDef->pUser
7e70: 44 61 74 61 2c 20 33 29 3b 0a 20 20 61 73 73 65  Data, 3);.  asse
7e80: 72 74 28 20 28 63 68 61 72 2a 29 26 6c 69 6b 65  rt( (char*)&like
7e90: 49 6e 66 6f 41 6c 74 20 3d 3d 20 28 63 68 61 72  InfoAlt == (char
7ea0: 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d  *)&likeInfoAlt.m
7eb0: 61 74 63 68 41 6c 6c 20 29 3b 0a 20 20 61 73 73  atchAll );.  ass
7ec0: 65 72 74 28 20 26 28 28 63 68 61 72 2a 29 26 6c  ert( &((char*)&l
7ed0: 69 6b 65 49 6e 66 6f 41 6c 74 29 5b 31 5d 20 3d  ikeInfoAlt)[1] =
7ee0: 3d 20 28 63 68 61 72 2a 29 26 6c 69 6b 65 49 6e  = (char*)&likeIn
7ef0: 66 6f 41 6c 74 2e 6d 61 74 63 68 4f 6e 65 20 29  foAlt.matchOne )
7f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 26 28 28 63  ;.  assert( &((c
7f10: 68 61 72 2a 29 26 6c 69 6b 65 49 6e 66 6f 41 6c  har*)&likeInfoAl
7f20: 74 29 5b 32 5d 20 3d 3d 20 28 63 68 61 72 2a 29  t)[2] == (char*)
7f30: 26 6c 69 6b 65 49 6e 66 6f 41 6c 74 2e 6d 61 74  &likeInfoAlt.mat
7f40: 63 68 53 65 74 20 29 3b 0a 0a 20 20 72 65 74 75  chSet );..  retu
7f50: 72 6e 20 31 3b 0a 7d 0a                          rn 1;.}.