/ Hex Artifact Content
Login

Artifact 0d9c25956152adefee8881c6fadc8354793764d0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 4d 61 72 63 68  /*.** 2008 March
0010: 20 31 39 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75   19.**.** The au
0020: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
0030: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
0040: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
0050: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20  n place of.** a 
0060: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
0070: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
0080: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79  :.**.**    May y
0090: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
00a0: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d  ot evil..**    M
00b0: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67  ay you find forg
00c0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72  iveness for your
00d0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65  self and forgive
00e0: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d   others..**    M
00f0: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
0100: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
0110: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
0120: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  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 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 74  **.** Code for t
0180: 65 73 74 69 6e 67 20 61 6c 6c 20 73 6f 72 74 73  esting all sorts
0190: 20 6f 66 20 53 51 4c 69 74 65 20 69 6e 74 65 72   of SQLite inter
01a0: 66 61 63 65 73 2e 20 20 54 68 69 73 20 63 6f 64  faces.  This cod
01b0: 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
01c0: 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  new SQL function
01d0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  s used by the te
01e0: 73 74 20 73 63 72 69 70 74 73 2e 0a 2a 2f 0a 23  st scripts..*/.#
01f0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0200: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63  .h".#include "tc
0210: 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73  l.h".#include <s
0220: 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64  tdlib.h>.#includ
0230: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e  e <string.h>.#in
0240: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
0250: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  ..#include "sqli
0260: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
0270: 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 0a  e "vdbeInt.h"...
0280: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
0290: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
02a0: 61 63 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ace using sqlite
02b0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 74  3_malloc(). If t
02c0: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
02d0: 20 66 61 69 6c 73 2c 20 63 61 6c 6c 20 73 71 6c   fails, call sql
02e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
02f0: 72 5f 6e 6f 6d 65 6d 28 29 20 74 6f 20 6e 6f 74  r_nomem() to not
0300: 69 66 79 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ify.** the datab
0310: 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
0320: 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 66 61 69  malloc() has fai
0330: 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
0340: 6f 69 64 20 2a 74 65 73 74 43 6f 6e 74 65 78 74  oid *testContext
0350: 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f 63  Malloc(sqlite3_c
0360: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
0370: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 63   int nByte){.  c
0380: 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
0390: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
03a0: 20 20 69 66 28 20 21 7a 20 26 26 20 6e 42 79 74    if( !z && nByt
03b0: 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e>0 ){.    sqlit
03c0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
03d0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
03e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
03f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
0400: 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73  nction generates
0410: 20 61 20 73 74 72 69 6e 67 20 6f 66 20 72 61 6e   a string of ran
0420: 64 6f 6d 20 63 68 61 72 61 63 74 65 72 73 2e 20  dom characters. 
0430: 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 67 65 6e   Used for.** gen
0440: 65 72 61 74 69 6e 67 20 74 65 73 74 20 64 61 74  erating test dat
0450: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
0460: 64 20 72 61 6e 64 53 74 72 28 73 71 6c 69 74 65  d randStr(sqlite
0470: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
0480: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
0490: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
04a0: 67 76 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  gv){.  static co
04b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
04c0: 72 20 7a 53 72 63 5b 5d 20 3d 20 0a 20 20 20 20  r zSrc[] = .    
04d0: 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
04e0: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
04f0: 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
0500: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
0510: 20 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39       "0123456789
0520: 22 0a 20 20 20 20 20 22 2e 2d 21 2c 3a 2a 5e 2b  ".     ".-!,:*^+
0530: 3d 5f 7c 3f 2f 3c 3e 20 22 3b 0a 20 20 69 6e 74  =_|?/<> ";.  int
0540: 20 69 4d 69 6e 2c 20 69 4d 61 78 2c 20 6e 2c 20   iMin, iMax, n, 
0550: 72 2c 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  r, i;.  unsigned
0560: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
0570: 3b 0a 0a 20 20 2f 2a 20 49 74 20 75 73 65 64 20  ;..  /* It used 
0580: 74 6f 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  to be possible t
0590: 6f 20 63 61 6c 6c 20 72 61 6e 64 73 74 72 28 29  o call randstr()
05a0: 20 77 69 74 68 20 61 6e 79 20 6e 75 6d 62 65 72   with any number
05b0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2c 0a 20   of arguments,. 
05c0: 20 2a 2a 20 62 75 74 20 6e 6f 77 20 69 74 20 69   ** but now it i
05d0: 73 20 72 65 67 69 73 74 65 72 65 64 20 77 69 74  s registered wit
05e0: 68 20 53 51 4c 69 74 65 20 61 73 20 72 65 71 75  h SQLite as requ
05f0: 69 72 69 6e 67 20 65 78 61 63 74 6c 79 20 32 2e  iring exactly 2.
0600: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 61  .  */.  assert(a
0610: 72 67 63 3d 3d 32 29 3b 0a 0a 20 20 69 4d 69 6e  rgc==2);..  iMin
0620: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
0630: 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  _int(argv[0]);. 
0640: 20 69 66 28 20 69 4d 69 6e 3c 30 20 29 20 69 4d   if( iMin<0 ) iM
0650: 69 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 4d  in = 0;.  if( iM
0660: 69 6e 3e 3d 73 69 7a 65 6f 66 28 7a 42 75 66 29  in>=sizeof(zBuf)
0670: 20 29 20 69 4d 69 6e 20 3d 20 73 69 7a 65 6f 66   ) iMin = sizeof
0680: 28 7a 42 75 66 29 2d 31 3b 0a 20 20 69 4d 61 78  (zBuf)-1;.  iMax
0690: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
06a0: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  _int(argv[1]);. 
06b0: 20 69 66 28 20 69 4d 61 78 3c 69 4d 69 6e 20 29   if( iMax<iMin )
06c0: 20 69 4d 61 78 20 3d 20 69 4d 69 6e 3b 0a 20 20   iMax = iMin;.  
06d0: 69 66 28 20 69 4d 61 78 3e 3d 73 69 7a 65 6f 66  if( iMax>=sizeof
06e0: 28 7a 42 75 66 29 20 29 20 69 4d 61 78 20 3d 20  (zBuf) ) iMax = 
06f0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 3b 0a  sizeof(zBuf)-1;.
0700: 20 20 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 69 66    n = iMin;.  if
0710: 28 20 69 4d 61 78 3e 69 4d 69 6e 20 29 7b 0a 20  ( iMax>iMin ){. 
0720: 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
0730: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c  mness(sizeof(r),
0740: 20 26 72 29 3b 0a 20 20 20 20 72 20 26 3d 20 30   &r);.    r &= 0
0750: 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 6e  x7fffffff;.    n
0760: 20 2b 3d 20 72 25 28 69 4d 61 78 20 2b 20 31 20   += r%(iMax + 1 
0770: 2d 20 69 4d 69 6e 29 3b 0a 20 20 7d 0a 20 20 61  - iMin);.  }.  a
0780: 73 73 65 72 74 28 20 6e 3c 73 69 7a 65 6f 66 28  ssert( n<sizeof(
0790: 7a 42 75 66 29 20 29 3b 0a 20 20 73 71 6c 69 74  zBuf) );.  sqlit
07a0: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 6e 2c  e3_randomness(n,
07b0: 20 7a 42 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d   zBuf);.  for(i=
07c0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
07d0: 20 20 7a 42 75 66 5b 69 5d 20 3d 20 7a 53 72 63    zBuf[i] = zSrc
07e0: 5b 7a 42 75 66 5b 69 5d 25 28 73 69 7a 65 6f 66  [zBuf[i]%(sizeof
07f0: 28 7a 53 72 63 29 2d 31 29 5d 3b 0a 20 20 7d 0a  (zSrc)-1)];.  }.
0800: 20 20 7a 42 75 66 5b 6e 5d 20 3d 20 30 3b 0a 20    zBuf[n] = 0;. 
0810: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0820: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
0830: 68 61 72 2a 29 7a 42 75 66 2c 20 6e 2c 20 53 51  har*)zBuf, n, SQ
0840: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
0850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
0860: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 53 51 4c 20  llowing two SQL 
0870: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73  functions are us
0880: 65 64 20 74 6f 20 74 65 73 74 20 72 65 74 75 72  ed to test retur
0890: 6e 69 6e 67 20 61 20 74 65 78 74 0a 2a 2a 20 72  ning a text.** r
08a0: 65 73 75 6c 74 20 77 69 74 68 20 61 20 64 65 73  esult with a des
08b0: 74 72 75 63 74 6f 72 2e 20 46 75 6e 63 74 69 6f  tructor. Functio
08c0: 6e 20 27 74 65 73 74 5f 64 65 73 74 72 75 63 74  n 'test_destruct
08d0: 6f 72 27 20 74 61 6b 65 73 20 6f 6e 65 20 61 72  or' takes one ar
08e0: 67 75 6d 65 6e 74 0a 2a 2a 20 61 6e 64 20 72 65  gument.** and re
08f0: 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 61  turns the same a
0900: 72 67 75 6d 65 6e 74 20 69 6e 74 65 72 70 72 65  rgument interpre
0910: 74 65 64 20 61 73 20 54 45 58 54 2e 20 41 20 64  ted as TEXT. A d
0920: 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20  estructor is.** 
0930: 70 61 73 73 65 64 20 77 69 74 68 20 74 68 65 20  passed with the 
0940: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
0950: 65 78 74 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  ext() call..**.*
0960: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 27  * SQL function '
0970: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  test_destructor_
0980: 63 6f 75 6e 74 27 20 72 65 74 75 72 6e 73 20 74  count' returns t
0990: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
09a0: 73 74 61 6e 64 69 6e 67 20 0a 2a 2a 20 61 6c 6c  standing .** all
09b0: 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
09c0: 20 27 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f   'test_destructo
09d0: 72 27 3b 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  r';.**.** WARNIN
09e0: 47 3a 20 4e 6f 74 20 74 68 72 65 61 64 73 61 66  G: Not threadsaf
09f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
0a00: 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72   test_destructor
0a10: 5f 63 6f 75 6e 74 5f 76 61 72 20 3d 20 30 3b 0a  _count_var = 0;.
0a20: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
0a30: 72 75 63 74 6f 72 28 76 6f 69 64 20 2a 70 29 7b  ructor(void *p){
0a40: 0a 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20  .  char *zVal = 
0a50: 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 61 73 73  (char *)p;.  ass
0a60: 65 72 74 28 7a 56 61 6c 29 3b 0a 20 20 7a 56 61  ert(zVal);.  zVa
0a70: 6c 2d 2d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  l--;.  sqlite3_f
0a80: 72 65 65 28 7a 56 61 6c 29 3b 0a 20 20 74 65 73  ree(zVal);.  tes
0a90: 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75  t_destructor_cou
0aa0: 6e 74 5f 76 61 72 2d 2d 3b 0a 7d 0a 73 74 61 74  nt_var--;.}.stat
0ab0: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 64 65 73  ic void test_des
0ac0: 74 72 75 63 74 6f 72 28 0a 20 20 73 71 6c 69 74  tructor(.  sqlit
0ad0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
0ae0: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
0af0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0b00: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20  *argv.){.  char 
0b10: 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74 20 6c 65 6e  *zVal;.  int len
0b20: 3b 0a 20 20 0a 20 20 74 65 73 74 5f 64 65 73 74  ;.  .  test_dest
0b30: 72 75 63 74 6f 72 5f 63 6f 75 6e 74 5f 76 61 72  ructor_count_var
0b40: 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41  ++;.  assert( nA
0b50: 72 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73  rg==1 );.  if( s
0b60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
0b70: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
0b80: 54 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e  TE_NULL ) return
0b90: 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65  ;.  len = sqlite
0ba0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
0bb0: 67 76 5b 30 5d 29 3b 20 0a 20 20 7a 56 61 6c 20  gv[0]); .  zVal 
0bc0: 3d 20 74 65 73 74 43 6f 6e 74 65 78 74 4d 61 6c  = testContextMal
0bd0: 6c 6f 63 28 70 43 74 78 2c 20 6c 65 6e 2b 33 29  loc(pCtx, len+3)
0be0: 3b 0a 20 20 69 66 28 20 21 7a 56 61 6c 20 29 7b  ;.  if( !zVal ){
0bf0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
0c00: 0a 20 20 7a 56 61 6c 5b 6c 65 6e 2b 31 5d 20 3d  .  zVal[len+1] =
0c10: 20 30 3b 0a 20 20 7a 56 61 6c 5b 6c 65 6e 2b 32   0;.  zVal[len+2
0c20: 5d 20 3d 20 30 3b 0a 20 20 7a 56 61 6c 2b 2b 3b  ] = 0;.  zVal++;
0c30: 0a 20 20 6d 65 6d 63 70 79 28 7a 56 61 6c 2c 20  .  memcpy(zVal, 
0c40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
0c50: 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 6c 65 6e  xt(argv[0]), len
0c60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
0c70: 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a  ult_text(pCtx, z
0c80: 56 61 6c 2c 20 2d 31 2c 20 64 65 73 74 72 75 63  Val, -1, destruc
0c90: 74 6f 72 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20  tor);.}.#ifndef 
0ca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
0cb0: 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  6.static void te
0cc0: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 31 36 28  st_destructor16(
0cd0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
0ce0: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
0cf0: 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
0d00: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
0d10: 0a 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20  .  char *zVal;. 
0d20: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 0a 20 20 74   int len;.  .  t
0d30: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  est_destructor_c
0d40: 6f 75 6e 74 5f 76 61 72 2b 2b 3b 0a 20 20 61 73  ount_var++;.  as
0d50: 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
0d60: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
0d70: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
0d80: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
0d90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6c 65 6e 20  ) return;.  len 
0da0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
0db0: 62 79 74 65 73 31 36 28 61 72 67 76 5b 30 5d 29  bytes16(argv[0])
0dc0: 3b 20 0a 20 20 7a 56 61 6c 20 3d 20 74 65 73 74  ; .  zVal = test
0dd0: 43 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 70 43  ContextMalloc(pC
0de0: 74 78 2c 20 6c 65 6e 2b 33 29 3b 0a 20 20 69 66  tx, len+3);.  if
0df0: 28 20 21 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72  ( !zVal ){.    r
0e00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 56 61  eturn;.  }.  zVa
0e10: 6c 5b 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20  l[len+1] = 0;.  
0e20: 7a 56 61 6c 5b 6c 65 6e 2b 32 5d 20 3d 20 30 3b  zVal[len+2] = 0;
0e30: 0a 20 20 7a 56 61 6c 2b 2b 3b 0a 20 20 6d 65 6d  .  zVal++;.  mem
0e40: 63 70 79 28 7a 56 61 6c 2c 20 73 71 6c 69 74 65  cpy(zVal, sqlite
0e50: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61  3_value_text16(a
0e60: 72 67 76 5b 30 5d 29 2c 20 6c 65 6e 29 3b 0a 20  rgv[0]), len);. 
0e70: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0e80: 74 65 78 74 31 36 28 70 43 74 78 2c 20 7a 56 61  text16(pCtx, zVa
0e90: 6c 2c 20 2d 31 2c 20 64 65 73 74 72 75 63 74 6f  l, -1, destructo
0ea0: 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61  r);.}.#endif.sta
0eb0: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 64 65  tic void test_de
0ec0: 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28 0a  structor_count(.
0ed0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
0ee0: 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
0ef0: 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
0f00: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
0f10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0f20: 5f 69 6e 74 28 70 43 74 78 2c 20 74 65 73 74 5f  _int(pCtx, test_
0f30: 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74  destructor_count
0f40: 5f 76 61 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _var);.}../*.** 
0f50: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 67  The following ag
0f60: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
0f70: 2c 20 74 65 73 74 5f 61 67 67 5f 65 72 72 6d 73  , test_agg_errms
0f80: 67 31 36 28 29 2c 20 74 61 6b 65 73 20 7a 65 72  g16(), takes zer
0f90: 6f 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  o .** arguments.
0fa0: 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20   It returns the 
0fb0: 74 65 78 74 20 76 61 6c 75 65 20 72 65 74 75 72  text value retur
0fc0: 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  ned by the sqlit
0fd0: 65 33 5f 65 72 72 6d 73 67 31 36 28 29 0a 2a 2a  e3_errmsg16().**
0fe0: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
0ff0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1000: 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45  _OMIT_BUILTIN_TE
1010: 53 54 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  ST.void sqlite3B
1020: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
1030: 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 73 71 6c  (void);.void sql
1040: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
1050: 6c 6f 63 28 76 6f 69 64 29 3b 0a 23 65 6c 73 65  loc(void);.#else
1060: 0a 20 20 23 64 65 66 69 6e 65 20 73 71 6c 69 74  .  #define sqlit
1070: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
1080: 6c 6f 63 28 29 0a 20 20 23 64 65 66 69 6e 65 20  loc().  #define 
1090: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
10a0: 4d 61 6c 6c 6f 63 28 29 0a 23 65 6e 64 69 66 0a  Malloc().#endif.
10b0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
10c0: 5f 61 67 67 5f 65 72 72 6d 73 67 31 36 5f 73 74  _agg_errmsg16_st
10d0: 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
10e0: 78 74 20 2a 61 2c 20 69 6e 74 20 62 2c 73 71 6c  xt *a, int b,sql
10f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 63 29 7b  ite3_value **c){
1100: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
1110: 65 73 74 5f 61 67 67 5f 65 72 72 6d 73 67 31 36  est_agg_errmsg16
1120: 5f 66 69 6e 61 6c 28 73 71 6c 69 74 65 33 5f 63  _final(sqlite3_c
1130: 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 23 69  ontext *ctx){.#i
1140: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1150: 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73 74 20  T_UTF16.  const 
1160: 76 6f 69 64 20 2a 7a 3b 0a 20 20 73 71 6c 69 74  void *z;.  sqlit
1170: 65 33 20 2a 20 64 62 20 3d 20 73 71 6c 69 74 65  e3 * db = sqlite
1180: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
1190: 64 6c 65 28 63 74 78 29 3b 0a 20 20 73 71 6c 69  dle(ctx);.  sqli
11a0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
11b0: 6e 74 65 78 74 28 63 74 78 2c 20 32 30 34 38 29  ntext(ctx, 2048)
11c0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
11d0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11e0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 65 72    z = sqlite3_er
11f0: 72 6d 73 67 31 36 28 64 62 29 3b 0a 20 20 73 71  rmsg16(db);.  sq
1200: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
1210: 6c 6c 6f 63 28 29 3b 0a 20 20 73 71 6c 69 74 65  lloc();.  sqlite
1220: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 28  3_result_text16(
1230: 63 74 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  ctx, z, -1, SQLI
1240: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23  TE_TRANSIENT);.#
1250: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
1260: 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 65 73 74  outines for test
1270: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
1280: 67 65 74 5f 61 75 78 64 61 74 61 28 29 20 61 6e  get_auxdata() an
1290: 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75  d sqlite3_set_au
12a0: 78 64 61 74 61 28 29 0a 2a 2a 20 69 6e 74 65 72  xdata().** inter
12b0: 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  face..**.** The 
12c0: 74 65 73 74 5f 61 75 78 64 61 74 61 28 29 20 53  test_auxdata() S
12d0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  QL function atte
12e0: 6d 70 74 73 20 74 6f 20 72 65 67 69 73 74 65 72  mpts to register
12f0: 20 65 61 63 68 20 6f 66 20 69 74 73 20 61 72 67   each of its arg
1300: 75 6d 65 6e 74 73 0a 2a 2a 20 61 73 20 61 75 78  uments.** as aux
1310: 69 6c 69 61 72 79 20 64 61 74 61 2e 20 20 49 66  iliary data.  If
1320: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 70 72   there are no pr
1330: 69 6f 72 20 72 65 67 69 73 74 72 61 74 69 6f 6e  ior registration
1340: 73 20 6f 66 20 61 75 78 20 64 61 74 61 20 66 6f  s of aux data fo
1350: 72 0a 2a 2a 20 74 68 61 74 20 61 72 67 75 6d 65  r.** that argume
1360: 6e 74 20 28 6d 65 61 6e 69 6e 67 20 74 68 65 20  nt (meaning the 
1370: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
1380: 61 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 74 68  a constant or th
1390: 69 73 20 69 73 20 69 74 73 20 66 69 72 73 74 0a  is is its first.
13a0: 2a 2a 20 63 61 6c 6c 29 20 74 68 65 6e 20 74 68  ** call) then th
13b0: 65 20 72 65 73 75 6c 74 20 66 6f 72 20 74 68 61  e result for tha
13c0: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 30 2e  t argument is 0.
13d0: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20    If there is a 
13e0: 70 72 69 6f 72 0a 2a 2a 20 72 65 67 69 73 74 72  prior.** registr
13f0: 61 74 69 6f 6e 2c 20 74 68 65 20 72 65 73 75 6c  ation, the resul
1400: 74 20 66 6f 72 20 74 68 61 74 20 61 72 67 75 6d  t for that argum
1410: 65 6e 74 20 69 73 20 31 2e 20 20 54 68 65 20 6f  ent is 1.  The o
1420: 76 65 72 61 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a  verall result.**
1430: 20 69 73 20 74 68 65 20 69 6e 64 69 76 69 64 75   is the individu
1440: 61 6c 20 61 72 67 75 6d 65 6e 74 20 72 65 73 75  al argument resu
1450: 6c 74 73 20 73 65 70 61 72 61 74 65 64 20 62 79  lts separated by
1460: 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
1470: 69 63 20 76 6f 69 64 20 66 72 65 65 5f 74 65 73  ic void free_tes
1480: 74 5f 61 75 78 64 61 74 61 28 76 6f 69 64 20 2a  t_auxdata(void *
1490: 70 29 20 7b 73 71 6c 69 74 65 33 5f 66 72 65 65  p) {sqlite3_free
14a0: 28 70 29 3b 7d 0a 73 74 61 74 69 63 20 76 6f 69  (p);}.static voi
14b0: 64 20 74 65 73 74 5f 61 75 78 64 61 74 61 28 0a  d test_auxdata(.
14c0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
14d0: 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
14e0: 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
14f0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
1500: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
1510: 2a 7a 52 65 74 20 3d 20 74 65 73 74 43 6f 6e 74  *zRet = testCont
1520: 65 78 74 4d 61 6c 6c 6f 63 28 70 43 74 78 2c 20  extMalloc(pCtx, 
1530: 6e 41 72 67 2a 32 29 3b 0a 20 20 69 66 28 20 21  nArg*2);.  if( !
1540: 7a 52 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  zRet ) return;. 
1550: 20 6d 65 6d 73 65 74 28 7a 52 65 74 2c 20 30 2c   memset(zRet, 0,
1560: 20 6e 41 72 67 2a 32 29 3b 0a 20 20 66 6f 72 28   nArg*2);.  for(
1570: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
1580: 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  ){.    char cons
1590: 74 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  t *z = (char*)sq
15a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
15b0: 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69  (argv[i]);.    i
15c0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 69 6e  f( z ){.      in
15d0: 74 20 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20  t n;.      char 
15e0: 2a 7a 41 75 78 20 3d 20 73 71 6c 69 74 65 33 5f  *zAux = sqlite3_
15f0: 67 65 74 5f 61 75 78 64 61 74 61 28 70 43 74 78  get_auxdata(pCtx
1600: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
1610: 7a 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20 20  zAux ){.        
1620: 7a 52 65 74 5b 69 2a 32 5d 20 3d 20 27 31 27 3b  zRet[i*2] = '1';
1630: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1640: 20 73 74 72 63 6d 70 28 7a 41 75 78 2c 7a 29 3d   strcmp(zAux,z)=
1650: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  =0 );.      }els
1660: 65 20 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  e {.        zRet
1670: 5b 69 2a 32 5d 20 3d 20 27 30 27 3b 0a 20 20 20  [i*2] = '0';.   
1680: 20 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 28     }.      n = (
1690: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29 20 2b 20  int)strlen(z) + 
16a0: 31 3b 0a 20 20 20 20 20 20 7a 41 75 78 20 3d 20  1;.      zAux = 
16b0: 74 65 73 74 43 6f 6e 74 65 78 74 4d 61 6c 6c 6f  testContextMallo
16c0: 63 28 70 43 74 78 2c 20 6e 29 3b 0a 20 20 20 20  c(pCtx, n);.    
16d0: 20 20 69 66 28 20 7a 41 75 78 20 29 7b 0a 20 20    if( zAux ){.  
16e0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 75        memcpy(zAu
16f0: 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  x, z, n);.      
1700: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
1710: 78 64 61 74 61 28 70 43 74 78 2c 20 69 2c 20 7a  xdata(pCtx, i, z
1720: 41 75 78 2c 20 66 72 65 65 5f 74 65 73 74 5f 61  Aux, free_test_a
1730: 75 78 64 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  uxdata);.      }
1740: 0a 20 20 20 20 20 20 7a 52 65 74 5b 69 2a 32 2b  .      zRet[i*2+
1750: 31 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a  1] = ' ';.    }.
1760: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65    }.  sqlite3_re
1770: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
1780: 7a 52 65 74 2c 20 32 2a 6e 41 72 67 2d 31 2c 20  zRet, 2*nArg-1, 
1790: 66 72 65 65 5f 74 65 73 74 5f 61 75 78 64 61 74  free_test_auxdat
17a0: 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 66  a);.}../*.** A f
17b0: 75 6e 63 74 69 6f 6e 20 74 6f 20 74 65 73 74 20  unction to test 
17c0: 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 20  error reporting 
17d0: 66 72 6f 6d 20 75 73 65 72 20 66 75 6e 63 74 69  from user functi
17e0: 6f 6e 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ons. This functi
17f0: 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  on.** returns a 
1800: 63 6f 70 79 20 6f 66 20 69 74 73 20 66 69 72 73  copy of its firs
1810: 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20 74 68  t argument as th
1820: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
1830: 20 20 49 66 20 74 68 65 0a 2a 2a 20 73 65 63 6f    If the.** seco
1840: 6e 64 20 61 72 67 75 6d 65 6e 74 20 65 78 69 73  nd argument exis
1850: 74 73 2c 20 69 74 20 62 65 63 6f 6d 65 73 20 74  ts, it becomes t
1860: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  he error code..*
1870: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
1880: 73 74 5f 65 72 72 6f 72 28 0a 20 20 73 71 6c 69  st_error(.  sqli
1890: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
18a0: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
18b0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
18c0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
18d0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
18e0: 28 70 43 74 78 2c 20 28 63 68 61 72 2a 29 73 71  (pCtx, (char*)sq
18f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1900: 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 3b 0a  (argv[0]), -1);.
1910: 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
1920: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
1930: 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70  ult_error_code(p
1940: 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
1950: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29  ue_int(argv[1]))
1960: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1970: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1980: 20 74 68 65 20 63 6f 75 6e 74 65 72 28 58 29 20   the counter(X) 
1990: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 58 20  function.  If X 
19a0: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a  is an integer.**
19b0: 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
19c0: 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61  the first invoca
19d0: 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e  tion will return
19e0: 20 58 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20   X.  The second 
19f0: 58 2b 31 2e 0a 2a 2a 20 61 6e 64 20 73 6f 20 66  X+1..** and so f
1a00: 6f 72 74 68 2e 20 20 43 61 6e 20 62 65 20 75 73  orth.  Can be us
1a10: 65 64 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  ed (for example)
1a20: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 73 65   to provide a se
1a30: 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 0a 2a 2a  quence number.**
1a40: 20 69 6e 20 61 20 72 65 73 75 6c 74 20 73 65 74   in a result set
1a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a60: 20 63 6f 75 6e 74 65 72 46 75 6e 63 28 0a 20 20   counterFunc(.  
1a70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1a80: 2a 70 43 74 78 2c 20 20 20 2f 2a 20 46 75 6e 63  *pCtx,   /* Func
1a90: 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  tion context */.
1aa0: 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
1ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1ac0: 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mber of function
1ad0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1ae0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1af0: 61 72 67 76 20 20 20 20 20 2f 2a 20 56 61 6c 75  argv     /* Valu
1b00: 65 73 20 66 6f 72 20 61 6c 6c 20 66 75 6e 63 74  es for all funct
1b10: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1b20: 0a 29 7b 0a 20 20 69 6e 74 20 2a 70 43 6f 75 6e  .){.  int *pCoun
1b30: 74 65 72 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  ter = (int*)sqli
1b40: 74 65 33 5f 67 65 74 5f 61 75 78 64 61 74 61 28  te3_get_auxdata(
1b50: 70 43 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20  pCtx, 0);.  if( 
1b60: 70 43 6f 75 6e 74 65 72 3d 3d 30 20 29 7b 0a 20  pCounter==0 ){. 
1b70: 20 20 20 70 43 6f 75 6e 74 65 72 20 3d 20 73 71     pCounter = sq
1b80: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
1b90: 7a 65 6f 66 28 2a 70 43 6f 75 6e 74 65 72 29 20  zeof(*pCounter) 
1ba0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 75 6e  );.    if( pCoun
1bb0: 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ter==0 ){.      
1bc0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
1bd0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
1be0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
1bf0: 20 20 20 20 7d 0a 20 20 20 20 2a 70 43 6f 75 6e      }.    *pCoun
1c00: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ter = sqlite3_va
1c10: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29  lue_int(argv[0])
1c20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65  ;.    sqlite3_se
1c30: 74 5f 61 75 78 64 61 74 61 28 70 43 74 78 2c 20  t_auxdata(pCtx, 
1c40: 30 2c 20 70 43 6f 75 6e 74 65 72 2c 20 73 71 6c  0, pCounter, sql
1c50: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 65  ite3_free);.  }e
1c60: 6c 73 65 7b 0a 20 20 20 20 2b 2b 2a 70 43 6f 75  lse{.    ++*pCou
1c70: 6e 74 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nter;.  }.  sqli
1c80: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70  te3_result_int(p
1c90: 43 74 78 2c 20 2a 70 43 6f 75 6e 74 65 72 29 3b  Ctx, *pCounter);
1ca0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1cb0: 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 74  function takes t
1cc0: 77 6f 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49  wo arguments.  I
1cd0: 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 55 54  t performance UT
1ce0: 46 2d 38 2f 31 36 20 74 79 70 65 0a 2a 2a 20 63  F-8/16 type.** c
1cf0: 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e 20 74 68  onversions on th
1d00: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1d10: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 61 20   then returns a 
1d20: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
1d30: 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
1d40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1d50: 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 63  ion is used in c
1d60: 61 73 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ases such as the
1d70: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
1d80: 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 65  *      SELECT te
1d90: 73 74 5f 69 73 6f 6c 61 74 69 6f 6e 28 78 2c 78  st_isolation(x,x
1da0: 29 20 46 52 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a  ) FROM t1;.**.**
1db0: 20 57 65 20 77 61 6e 74 20 74 6f 20 76 65 72 69   We want to veri
1dc0: 66 79 20 74 68 61 74 20 74 68 65 20 74 79 70 65  fy that the type
1dd0: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 74 68 61   conversions tha
1de0: 74 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 0a 2a  t occur on the.*
1df0: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
1e00: 20 64 6f 20 6e 6f 74 20 69 6e 76 61 6c 69 64 61   do not invalida
1e10: 74 65 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  te the second ar
1e20: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
1e30: 63 20 76 6f 69 64 20 74 65 73 74 5f 69 73 6f 6c  c void test_isol
1e40: 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
1e50: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
1e60: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
1e70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1e80: 72 67 76 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  rgv.){.#ifndef S
1e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1ea0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1eb0: 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29  _text16(argv[0])
1ec0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
1ed0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
1ee0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1ef0: 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29  _text16(argv[0])
1f00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
1f10: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
1f20: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1f30: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70  3_result_value(p
1f40: 43 74 78 2c 20 61 72 67 76 5b 31 5d 29 3b 0a 7d  Ctx, argv[1]);.}
1f50: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61  ../*.** Invoke a
1f60: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
1f70: 72 65 63 75 72 73 69 76 65 6c 79 2e 20 20 54 68  recursively.  Th
1f80: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c  e function resul
1f90: 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  t is the .** fir
1fa0: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
1fb0: 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 74 68   first row of th
1fc0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
1fd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
1fe0: 74 5f 65 76 61 6c 28 0a 20 20 73 71 6c 69 74 65  t_eval(.  sqlite
1ff0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2000: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
2010: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2020: 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
2030: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
2040: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
2050: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
2060: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
2070: 6c 65 28 70 43 74 78 29 3b 0a 20 20 63 6f 6e 73  le(pCtx);.  cons
2080: 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 0a 20  t char *zSql;.. 
2090: 20 7a 53 71 6c 20 3d 20 28 63 68 61 72 2a 29 73   zSql = (char*)s
20a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
20b0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 72 63  t(argv[0]);.  rc
20c0: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
20d0: 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
20e0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
20f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2100: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
2110: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2120: 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  mt);.    if( rc=
2130: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
2140: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2150: 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20  ult_value(pCtx, 
2160: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
2170: 61 6c 75 65 28 70 53 74 6d 74 2c 20 30 29 29 3b  alue(pStmt, 0));
2180: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2190: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
21a0: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 69  (pStmt);.  }.  i
21b0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 68 61  f( rc ){.    cha
21c0: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 61 73 73  r *zErr;.    ass
21d0: 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
21e0: 0a 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69  .    zErr = sqli
21f0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 73 71 6c  te3_mprintf("sql
2200: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2210: 29 20 65 72 72 6f 72 3a 20 25 73 22 2c 73 71 6c  ) error: %s",sql
2220: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
2230: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
2240: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
2250: 7a 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74 65  zErr, -1, sqlite
2260: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  3_free);.    sql
2270: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2280: 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29  r_code(pCtx, rc)
2290: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
22a0: 63 6f 6e 76 65 72 74 20 6f 6e 65 20 63 68 61 72  convert one char
22b0: 61 63 74 65 72 20 66 72 6f 6d 20 68 65 78 20 74  acter from hex t
22c0: 6f 20 62 69 6e 61 72 79 0a 2a 2f 0a 73 74 61 74  o binary.*/.stat
22d0: 69 63 20 69 6e 74 20 74 65 73 74 48 65 78 43 68  ic int testHexCh
22e0: 61 72 28 63 68 61 72 20 63 29 7b 0a 20 20 69 66  ar(char c){.  if
22f0: 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27  ( c>='0' && c<='
2300: 39 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  9' ){.    return
2310: 20 63 20 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73   c - '0';.  }els
2320: 65 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26 20  e if( c>='a' && 
2330: 63 3c 3d 27 66 27 20 29 7b 0a 20 20 20 20 72 65  c<='f' ){.    re
2340: 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b 20 31  turn c - 'a' + 1
2350: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63  0;.  }else if( c
2360: 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27 20  >='A' && c<='F' 
2370: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 20  ){.    return c 
2380: 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 7d 0a  - 'A' + 10;.  }.
2390: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
23a0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 68 65 78  *.** Convert hex
23b0: 20 74 6f 20 62 69 6e 61 72 79 2e 0a 2a 2f 0a 73   to binary..*/.s
23c0: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 48  tatic void testH
23d0: 65 78 54 6f 42 69 6e 28 63 6f 6e 73 74 20 63 68  exToBin(const ch
23e0: 61 72 20 2a 7a 49 6e 2c 20 63 68 61 72 20 2a 7a  ar *zIn, char *z
23f0: 4f 75 74 29 7b 0a 20 20 77 68 69 6c 65 28 20 7a  Out){.  while( z
2400: 49 6e 5b 30 5d 20 26 26 20 7a 49 6e 5b 31 5d 20  In[0] && zIn[1] 
2410: 29 7b 0a 20 20 20 20 2a 28 7a 4f 75 74 2b 2b 29  ){.    *(zOut++)
2420: 20 3d 20 28 74 65 73 74 48 65 78 43 68 61 72 28   = (testHexChar(
2430: 7a 49 6e 5b 30 5d 29 3c 3c 34 29 20 2b 20 74 65  zIn[0])<<4) + te
2440: 73 74 48 65 78 43 68 61 72 28 7a 49 6e 5b 31 5d  stHexChar(zIn[1]
2450: 29 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d 20 32 3b  );.    zIn += 2;
2460: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20  .  }.}../*.**   
2470: 20 20 20 68 65 78 5f 74 6f 5f 75 74 66 31 36 62     hex_to_utf16b
2480: 65 28 48 45 58 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e  e(HEX).**.** Con
2490: 76 65 72 74 20 74 68 65 20 69 6e 70 75 74 20 73  vert the input s
24a0: 74 72 69 6e 67 20 66 72 6f 6d 20 48 45 58 20 69  tring from HEX i
24b0: 6e 74 6f 20 62 69 6e 61 72 79 2e 20 20 54 68 65  nto binary.  The
24c0: 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20  n return the.** 
24d0: 72 65 73 75 6c 74 20 75 73 69 6e 67 20 73 71 6c  result using sql
24e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
24f0: 31 36 6c 65 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64  16le()..*/.#ifnd
2500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
2510: 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64  TF16.static void
2520: 20 74 65 73 74 48 65 78 54 6f 55 74 66 31 36 62   testHexToUtf16b
2530: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  e(.  sqlite3_con
2540: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
2550: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
2560: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
2570: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  ){.  int n;.  co
2580: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b 0a 20  nst char *zIn;. 
2590: 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 61   char *zOut;.  a
25a0: 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29  ssert( nArg==1 )
25b0: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  n = sqlite3_
25c0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
25d0: 5b 30 5d 29 3b 0a 20 20 7a 49 6e 20 3d 20 28 63  [0]);.  zIn = (c
25e0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
25f0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
2600: 67 76 5b 30 5d 29 3b 0a 20 20 7a 4f 75 74 20 3d  gv[0]);.  zOut =
2610: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2620: 20 6e 2f 32 20 29 3b 0a 20 20 69 66 28 20 7a 4f   n/2 );.  if( zO
2630: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ut==0 ){.    sql
2640: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2650: 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b 0a 20  r_nomem(pCtx);. 
2660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74   }else{.    test
2670: 48 65 78 54 6f 42 69 6e 28 7a 49 6e 2c 20 7a 4f  HexToBin(zIn, zO
2680: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
2690: 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65  _result_text16be
26a0: 28 70 43 74 78 2c 20 7a 4f 75 74 2c 20 6e 2f 32  (pCtx, zOut, n/2
26b0: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
26c0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
26d0: 2a 0a 2a 2a 20 20 20 20 20 20 68 65 78 5f 74 6f  *.**      hex_to
26e0: 5f 75 74 66 38 28 48 45 58 29 0a 2a 2a 0a 2a 2a  _utf8(HEX).**.**
26f0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 69 6e 70   Convert the inp
2700: 75 74 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 48  ut string from H
2710: 45 58 20 69 6e 74 6f 20 62 69 6e 61 72 79 2e 20  EX into binary. 
2720: 20 54 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   Then return the
2730: 0a 2a 2a 20 72 65 73 75 6c 74 20 75 73 69 6e 67  .** result using
2740: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2750: 74 65 78 74 31 36 6c 65 28 29 2e 0a 2a 2f 0a 73  text16le()..*/.s
2760: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 48  tatic void testH
2770: 65 78 54 6f 55 74 66 38 28 0a 20 20 73 71 6c 69  exToUtf8(.  sqli
2780: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2790: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
27a0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
27b0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
27c0: 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n;.  const char 
27d0: 2a 7a 49 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 4f  *zIn;.  char *zO
27e0: 75 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41  ut;.  assert( nA
27f0: 72 67 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 73  rg==1 );.  n = s
2800: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
2810: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  es(argv[0]);.  z
2820: 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  In = (const char
2830: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
2840: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
2850: 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   zOut = sqlite3_
2860: 6d 61 6c 6c 6f 63 28 20 6e 2f 32 20 29 3b 0a 20  malloc( n/2 );. 
2870: 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a   if( zOut==0 ){.
2880: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2890: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70  lt_error_nomem(p
28a0: 43 74 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Ctx);.  }else{. 
28b0: 20 20 20 74 65 73 74 48 65 78 54 6f 42 69 6e 28     testHexToBin(
28c0: 7a 49 6e 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  zIn, zOut);.    
28d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
28e0: 65 78 74 28 70 43 74 78 2c 20 7a 4f 75 74 2c 20  ext(pCtx, zOut, 
28f0: 6e 2f 32 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  n/2, sqlite3_fre
2900: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
2910: 20 20 20 20 20 20 68 65 78 5f 74 6f 5f 75 74 66        hex_to_utf
2920: 31 36 6c 65 28 48 45 58 29 0a 2a 2a 0a 2a 2a 20  16le(HEX).**.** 
2930: 43 6f 6e 76 65 72 74 20 74 68 65 20 69 6e 70 75  Convert the inpu
2940: 74 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 48 45  t string from HE
2950: 58 20 69 6e 74 6f 20 62 69 6e 61 72 79 2e 20 20  X into binary.  
2960: 54 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  Then return the.
2970: 2a 2a 20 72 65 73 75 6c 74 20 75 73 69 6e 67 20  ** result using 
2980: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
2990: 65 78 74 31 36 6c 65 28 29 2e 0a 2a 2f 0a 23 69  ext16le()..*/.#i
29a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29b0: 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20 76  T_UTF16.static v
29c0: 6f 69 64 20 74 65 73 74 48 65 78 54 6f 55 74 66  oid testHexToUtf
29d0: 31 36 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  16le(.  sqlite3_
29e0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
29f0: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2a00: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
2a10: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  gv.){.  int n;. 
2a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
2a30: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  ;.  char *zOut;.
2a40: 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
2a50: 31 20 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  1 );.  n = sqlit
2a60: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
2a70: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 49 6e 20 3d  rgv[0]);.  zIn =
2a80: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
2a90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
2aa0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 4f 75  (argv[0]);.  zOu
2ab0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
2ac0: 6f 63 28 20 6e 2f 32 20 29 3b 0a 20 20 69 66 28  oc( n/2 );.  if(
2ad0: 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   zOut==0 ){.    
2ae0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2af0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2b00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
2b10: 65 73 74 48 65 78 54 6f 42 69 6e 28 7a 49 6e 2c  estHexToBin(zIn,
2b20: 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69   zOut);.    sqli
2b30: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31  te3_result_text1
2b40: 36 6c 65 28 70 43 74 78 2c 20 7a 4f 75 74 2c 20  6le(pCtx, zOut, 
2b50: 6e 2f 32 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  n/2, sqlite3_fre
2b60: 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  e);.  }.}.#endif
2b70: 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63  ../*.** SQL func
2b80: 74 69 6f 6e 3a 20 20 20 72 65 61 6c 32 68 65 78  tion:   real2hex
2b90: 28 58 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  (X).**.** If arg
2ba0: 75 6d 65 6e 74 20 58 20 69 73 20 61 20 72 65 61  ument X is a rea
2bb0: 6c 20 6e 75 6d 62 65 72 2c 20 74 68 65 6e 20 63  l number, then c
2bc0: 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61  onvert it into a
2bd0: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
2be0: 0a 2a 2a 20 74 68 65 20 62 69 67 2d 65 6e 64 69  .** the big-endi
2bf0: 61 6e 20 68 65 78 61 64 65 63 69 6d 61 6c 20 72  an hexadecimal r
2c00: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2c10: 20 74 68 65 20 69 65 65 65 37 35 34 20 65 6e 63   the ieee754 enc
2c20: 6f 64 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 61 74  oding of.** that
2c30: 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 58 20 69   number.  If X i
2c40: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 6e 75 6d  s not a real num
2c50: 62 65 72 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ber, return NULL
2c60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2c70: 20 72 65 61 6c 32 68 65 78 28 0a 20 20 73 71 6c   real2hex(.  sql
2c80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
2c90: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
2ca0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
2cb0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 75  ue **argv.){.  u
2cc0: 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 71 6c 69 74  nion {.    sqlit
2cd0: 65 33 5f 75 69 6e 74 36 34 20 69 3b 0a 20 20 20  e3_uint64 i;.   
2ce0: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 75   double r;.    u
2cf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 78 5b 38  nsigned char x[8
2d00: 5d 3b 0a 20 20 7d 20 76 3b 0a 20 20 63 68 61 72  ];.  } v;.  char
2d10: 20 7a 4f 75 74 5b 32 30 5d 3b 0a 20 20 69 6e 74   zOut[20];.  int
2d20: 20 69 3b 0a 20 20 69 6e 74 20 62 69 67 45 6e 64   i;.  int bigEnd
2d30: 69 61 6e 3b 0a 20 20 76 2e 69 20 3d 20 31 3b 0a  ian;.  v.i = 1;.
2d40: 20 20 62 69 67 45 6e 64 69 61 6e 20 3d 20 76 2e    bigEndian = v.
2d50: 78 5b 30 5d 3d 3d 30 3b 0a 20 20 76 2e 72 20 3d  x[0]==0;.  v.r =
2d60: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
2d70: 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a  ouble(argv[0]);.
2d80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 38 3b 20    for(i=0; i<8; 
2d90: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 62 69  i++){.    if( bi
2da0: 67 45 6e 64 69 61 6e 20 29 7b 0a 20 20 20 20 20  gEndian ){.     
2db0: 20 7a 4f 75 74 5b 69 2a 32 5d 20 20 20 3d 20 22   zOut[i*2]   = "
2dc0: 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
2dd0: 22 5b 76 2e 78 5b 69 5d 3e 3e 34 5d 3b 0a 20 20  "[v.x[i]>>4];.  
2de0: 20 20 20 20 7a 4f 75 74 5b 69 2a 32 2b 31 5d 20      zOut[i*2+1] 
2df0: 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63  = "0123456789abc
2e00: 64 65 66 22 5b 76 2e 78 5b 69 5d 26 30 78 66 5d  def"[v.x[i]&0xf]
2e10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e20: 20 20 20 7a 4f 75 74 5b 31 34 2d 69 2a 32 5d 20     zOut[14-i*2] 
2e30: 20 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61    = "0123456789a
2e40: 62 63 64 65 66 22 5b 76 2e 78 5b 69 5d 3e 3e 34  bcdef"[v.x[i]>>4
2e50: 5d 3b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 31 34  ];.      zOut[14
2e60: 2d 69 2a 32 2b 31 5d 20 3d 20 22 30 31 32 33 34  -i*2+1] = "01234
2e70: 35 36 37 38 39 61 62 63 64 65 66 22 5b 76 2e 78  56789abcdef"[v.x
2e80: 5b 69 5d 26 30 78 66 5d 3b 0a 20 20 20 20 7d 0a  [i]&0xf];.    }.
2e90: 20 20 7d 0a 20 20 7a 4f 75 74 5b 31 36 5d 20 3d    }.  zOut[16] =
2ea0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
2eb0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
2ec0: 74 2c 20 7a 4f 75 74 2c 20 2d 31 2c 20 53 51 4c  t, zOut, -1, SQL
2ed0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
2ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 74 65 73  }../*.**     tes
2ef0: 74 5f 65 78 74 72 61 63 74 28 72 65 63 6f 72 64  t_extract(record
2f00: 2c 20 66 69 65 6c 64 29 0a 2a 2a 0a 2a 2a 20 54  , field).**.** T
2f10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  his function imp
2f20: 6c 65 6d 65 6e 74 73 20 61 6e 20 53 51 4c 20 75  lements an SQL u
2f30: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 74 68 61  ser-function tha
2f40: 74 20 61 63 63 65 70 74 73 20 61 20 62 6c 6f 62  t accepts a blob
2f50: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  .** containing a
2f60: 20 66 6f 72 6d 61 74 74 65 64 20 64 61 74 61 62   formatted datab
2f70: 61 73 65 20 72 65 63 6f 72 64 20 61 73 20 74 68  ase record as th
2f80: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
2f90: 2e 20 54 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  . The.** second 
2fa0: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
2fb0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 65  index of the fie
2fc0: 6c 64 20 77 69 74 68 69 6e 20 74 68 61 74 20 72  ld within that r
2fd0: 65 63 6f 72 64 20 74 6f 0a 2a 2a 20 65 78 74 72  ecord to.** extr
2fe0: 61 63 74 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  act and return..
2ff0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
3000: 65 73 74 5f 65 78 74 72 61 63 74 28 0a 20 20 73  est_extract(.  s
3010: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3020: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
3030: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
3040: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
3050: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
3060: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
3070: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
3080: 29 3b 0a 20 20 75 38 20 2a 70 52 65 63 3b 0a 20  );.  u8 *pRec;. 
3090: 20 75 38 20 2a 70 45 6e 64 48 64 72 3b 20 20 20   u8 *pEndHdr;   
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 2f 2a 20 50 6f 69 6e 74 73 20 74 6f 20 6f 6e   /* Points to on
30c0: 65 20 62 79 74 65 20 70 61 73 74 20 72 65 63 6f  e byte past reco
30d0: 72 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  rd header */.  u
30e0: 38 20 2a 70 48 64 72 3b 20 20 20 20 20 20 20 20  8 *pHdr;        
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3100: 2a 20 43 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  * Current point 
3110: 69 6e 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  in record header
3120: 20 2a 2f 0a 20 20 75 38 20 2a 70 42 6f 64 79 3b   */.  u8 *pBody;
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3140: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
3150: 20 70 6f 69 6e 74 20 69 6e 20 72 65 63 6f 72 64   point in record
3160: 20 64 61 74 61 20 2a 2f 0a 20 20 75 36 34 20 6e   data */.  u64 n
3170: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
3180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
3190: 74 65 73 20 69 6e 20 72 65 63 6f 72 64 20 68 65  tes in record he
31a0: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 49  ader */.  int iI
31b0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
31c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
31d0: 75 69 72 65 64 20 66 69 65 6c 64 20 2a 2f 0a 20  uired field */. 
31e0: 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
31f0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
3200: 20 2f 2a 20 43 75 72 72 65 6e 74 20 66 69 65 6c   /* Current fiel
3210: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
3220: 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20 70 52 65  argc==2 );.  pRe
3230: 63 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  c = (u8*)sqlite3
3240: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
3250: 5b 30 5d 29 3b 0a 20 20 69 49 64 78 20 3d 20 73  [0]);.  iIdx = s
3260: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
3270: 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 70 48  (argv[1]);..  pH
3280: 64 72 20 3d 20 70 52 65 63 20 2b 20 73 71 6c 69  dr = pRec + sqli
3290: 74 65 33 47 65 74 56 61 72 69 6e 74 28 70 52 65  te3GetVarint(pRe
32a0: 63 2c 20 26 6e 48 64 72 29 3b 0a 20 20 70 42 6f  c, &nHdr);.  pBo
32b0: 64 79 20 3d 20 70 45 6e 64 48 64 72 20 3d 20 26  dy = pEndHdr = &
32c0: 70 52 65 63 5b 6e 48 64 72 5d 3b 0a 0a 20 20 66  pRec[nHdr];..  f
32d0: 6f 72 28 69 43 75 72 72 65 6e 74 3d 30 3b 20 70  or(iCurrent=0; p
32e0: 48 64 72 3c 70 45 6e 64 48 64 72 20 26 26 20 69  Hdr<pEndHdr && i
32f0: 43 75 72 72 65 6e 74 3c 3d 69 49 64 78 3b 20 69  Current<=iIdx; i
3300: 43 75 72 72 65 6e 74 2b 2b 29 7b 0a 20 20 20 20  Current++){.    
3310: 75 36 34 20 69 53 65 72 69 61 6c 54 79 70 65 3b  u64 iSerialType;
3320: 0a 20 20 20 20 4d 65 6d 20 6d 65 6d 3b 0a 0a 20  .    Mem mem;.. 
3330: 20 20 20 6d 65 6d 73 65 74 28 26 6d 65 6d 2c 20     memset(&mem, 
3340: 30 2c 20 73 69 7a 65 6f 66 28 6d 65 6d 29 29 3b  0, sizeof(mem));
3350: 0a 20 20 20 20 6d 65 6d 2e 64 62 20 3d 20 64 62  .    mem.db = db
3360: 3b 0a 20 20 20 20 6d 65 6d 2e 65 6e 63 20 3d 20  ;.    mem.enc = 
3370: 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 48 64  ENC(db);.    pHd
3380: 72 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  r += sqlite3GetV
3390: 61 72 69 6e 74 28 70 48 64 72 2c 20 26 69 53 65  arint(pHdr, &iSe
33a0: 72 69 61 6c 54 79 70 65 29 3b 0a 20 20 20 20 70  rialType);.    p
33b0: 42 6f 64 79 20 2b 3d 20 73 71 6c 69 74 65 33 56  Body += sqlite3V
33c0: 64 62 65 53 65 72 69 61 6c 47 65 74 28 70 42 6f  dbeSerialGet(pBo
33d0: 64 79 2c 20 28 75 33 32 29 69 53 65 72 69 61 6c  dy, (u32)iSerial
33e0: 54 79 70 65 2c 20 26 6d 65 6d 29 3b 0a 0a 20 20  Type, &mem);..  
33f0: 20 20 69 66 28 20 69 43 75 72 72 65 6e 74 3d 3d    if( iCurrent==
3400: 69 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71  iIdx ){.      sq
3410: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
3420: 75 65 28 63 6f 6e 74 65 78 74 2c 20 26 6d 65 6d  ue(context, &mem
3430: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
3440: 28 20 6d 65 6d 2e 73 7a 4d 61 6c 6c 6f 63 20 29  ( mem.szMalloc )
3450: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3460: 62 2c 20 6d 65 6d 2e 7a 4d 61 6c 6c 6f 63 29 3b  b, mem.zMalloc);
3470: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20  .  }.}../*.**   
3480: 20 20 20 74 65 73 74 5f 64 65 63 6f 64 65 28 72     test_decode(r
3490: 65 63 6f 72 64 29 0a 2a 2a 0a 2a 2a 20 54 68 69  ecord).**.** Thi
34a0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  s function imple
34b0: 6d 65 6e 74 73 20 61 6e 20 53 51 4c 20 75 73 65  ments an SQL use
34c0: 72 2d 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  r-function that 
34d0: 61 63 63 65 70 74 73 20 61 20 62 6c 6f 62 0a 2a  accepts a blob.*
34e0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 66  * containing a f
34f0: 6f 72 6d 61 74 74 65 64 20 64 61 74 61 62 61 73  ormatted databas
3500: 65 20 72 65 63 6f 72 64 20 61 73 20 69 74 73 20  e record as its 
3510: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 49  only argument. I
3520: 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 74  t returns.** a t
3530: 63 6c 20 6c 69 73 74 20 28 74 79 70 65 20 53 51  cl list (type SQ
3540: 4c 49 54 45 5f 54 45 58 54 29 20 63 6f 6e 74 61  LITE_TEXT) conta
3550: 69 6e 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68  ining each of th
3560: 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 0a  e values stored.
3570: 2a 2a 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ** in the record
3580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3590: 20 74 65 73 74 5f 64 65 63 6f 64 65 28 0a 20 20   test_decode(.  
35a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
35b0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
35c0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
35d0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
35e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
35f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
3600: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
3610: 74 29 3b 0a 20 20 75 38 20 2a 70 52 65 63 3b 0a  t);.  u8 *pRec;.
3620: 20 20 75 38 20 2a 70 45 6e 64 48 64 72 3b 20 20    u8 *pEndHdr;  
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 2f 2a 20 50 6f 69 6e 74 73 20 74 6f 20 6f    /* Points to o
3650: 6e 65 20 62 79 74 65 20 70 61 73 74 20 72 65 63  ne byte past rec
3660: 6f 72 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ord header */.  
3670: 75 38 20 2a 70 48 64 72 3b 20 20 20 20 20 20 20  u8 *pHdr;       
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3690: 2f 2a 20 43 75 72 72 65 6e 74 20 70 6f 69 6e 74  /* Current point
36a0: 20 69 6e 20 72 65 63 6f 72 64 20 68 65 61 64 65   in record heade
36b0: 72 20 2a 2f 0a 20 20 75 38 20 2a 70 42 6f 64 79  r */.  u8 *pBody
36c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
36e0: 74 20 70 6f 69 6e 74 20 69 6e 20 72 65 63 6f 72  t point in recor
36f0: 64 20 64 61 74 61 20 2a 2f 0a 20 20 75 36 34 20  d data */.  u64 
3700: 6e 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  nHdr;           
3710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3720: 79 74 65 73 20 69 6e 20 72 65 63 6f 72 64 20 68  ytes in record h
3730: 65 61 64 65 72 20 2a 2f 0a 20 20 54 63 6c 5f 4f  eader */.  Tcl_O
3740: 62 6a 20 2a 70 52 65 74 3b 20 20 20 20 20 20 20  bj *pRet;       
3750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
3760: 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
3770: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f   pRet = Tcl_NewO
3780: 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  bj();.  Tcl_Incr
3790: 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
37a0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
37b0: 3d 31 20 29 3b 0a 20 20 70 52 65 63 20 3d 20 28  =1 );.  pRec = (
37c0: 75 38 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  u8*)sqlite3_valu
37d0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
37e0: 0a 0a 20 20 70 48 64 72 20 3d 20 70 52 65 63 20  ..  pHdr = pRec 
37f0: 2b 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  + sqlite3GetVari
3800: 6e 74 28 70 52 65 63 2c 20 26 6e 48 64 72 29 3b  nt(pRec, &nHdr);
3810: 0a 20 20 70 42 6f 64 79 20 3d 20 70 45 6e 64 48  .  pBody = pEndH
3820: 64 72 20 3d 20 26 70 52 65 63 5b 6e 48 64 72 5d  dr = &pRec[nHdr]
3830: 3b 0a 20 20 77 68 69 6c 65 28 20 70 48 64 72 3c  ;.  while( pHdr<
3840: 70 45 6e 64 48 64 72 20 29 7b 0a 20 20 20 20 54  pEndHdr ){.    T
3850: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20 3d 20 30  cl_Obj *pVal = 0
3860: 3b 0a 20 20 20 20 75 36 34 20 69 53 65 72 69 61  ;.    u64 iSeria
3870: 6c 54 79 70 65 3b 0a 20 20 20 20 4d 65 6d 20 6d  lType;.    Mem m
3880: 65 6d 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28  em;..    memset(
3890: 26 6d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &mem, 0, sizeof(
38a0: 6d 65 6d 29 29 3b 0a 20 20 20 20 6d 65 6d 2e 64  mem));.    mem.d
38b0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 6d 65 6d 2e  b = db;.    mem.
38c0: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
38d0: 20 20 20 70 48 64 72 20 2b 3d 20 73 71 6c 69 74     pHdr += sqlit
38e0: 65 33 47 65 74 56 61 72 69 6e 74 28 70 48 64 72  e3GetVarint(pHdr
38f0: 2c 20 26 69 53 65 72 69 61 6c 54 79 70 65 29 3b  , &iSerialType);
3900: 0a 20 20 20 20 70 42 6f 64 79 20 2b 3d 20 73 71  .    pBody += sq
3910: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
3920: 65 74 28 70 42 6f 64 79 2c 20 28 75 33 32 29 69  et(pBody, (u32)i
3930: 53 65 72 69 61 6c 54 79 70 65 2c 20 26 6d 65 6d  SerialType, &mem
3940: 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20  );..    switch( 
3950: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
3960: 70 65 28 26 6d 65 6d 29 20 29 7b 0a 20 20 20 20  pe(&mem) ){.    
3970: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
3980: 58 54 3a 0a 20 20 20 20 20 20 20 20 70 56 61 6c  XT:.        pVal
3990: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
39a0: 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  Obj((const char*
39b0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
39c0: 65 78 74 28 26 6d 65 6d 29 2c 20 2d 31 29 3b 0a  ext(&mem), -1);.
39d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
39e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
39f0: 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
3a00: 20 20 63 68 61 72 20 68 65 78 64 69 67 69 74 5b    char hexdigit[
3a10: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
3a20: 27 30 27 2c 20 27 31 27 2c 20 27 32 27 2c 20 27  '0', '1', '2', '
3a30: 33 27 2c 20 27 34 27 2c 20 27 35 27 2c 20 27 36  3', '4', '5', '6
3a40: 27 2c 20 27 37 27 2c 0a 20 20 20 20 20 20 20 20  ', '7',.        
3a50: 20 20 27 38 27 2c 20 27 39 27 2c 20 27 61 27 2c    '8', '9', 'a',
3a60: 20 27 62 27 2c 20 27 63 27 2c 20 27 64 27 2c 20   'b', 'c', 'd', 
3a70: 27 65 27 2c 20 27 66 27 0a 20 20 20 20 20 20 20  'e', 'f'.       
3a80: 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   };.        int 
3a90: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
3aa0: 65 5f 62 79 74 65 73 28 26 6d 65 6d 29 3b 0a 20  e_bytes(&mem);. 
3ab0: 20 20 20 20 20 20 20 75 38 20 2a 7a 20 3d 20 28         u8 *z = (
3ac0: 75 38 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  u8*)sqlite3_valu
3ad0: 65 5f 62 6c 6f 62 28 26 6d 65 6d 29 3b 0a 20 20  e_blob(&mem);.  
3ae0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
3af0: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
3b00: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 78 27  NewStringObj("x'
3b10: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ", -1);.        
3b20: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
3b30: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68  +){.          ch
3b40: 61 72 20 68 65 78 5b 33 5d 3b 0a 20 20 20 20 20  ar hex[3];.     
3b50: 20 20 20 20 20 68 65 78 5b 30 5d 20 3d 20 68 65       hex[0] = he
3b60: 78 64 69 67 69 74 5b 28 28 7a 5b 69 5d 20 3e 3e  xdigit[((z[i] >>
3b70: 20 34 29 20 26 20 30 78 30 46 29 5d 3b 0a 20 20   4) & 0x0F)];.  
3b80: 20 20 20 20 20 20 20 20 68 65 78 5b 31 5d 20 3d          hex[1] =
3b90: 20 68 65 78 64 69 67 69 74 5b 28 7a 5b 69 5d 20   hexdigit[(z[i] 
3ba0: 26 20 30 78 30 46 29 5d 3b 0a 20 20 20 20 20 20  & 0x0F)];.      
3bb0: 20 20 20 20 68 65 78 5b 32 5d 20 3d 20 27 5c 30      hex[2] = '\0
3bc0: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ';.          Tcl
3bd0: 5f 41 70 70 65 6e 64 53 74 72 69 6e 67 73 54 6f  _AppendStringsTo
3be0: 4f 62 6a 28 70 56 61 6c 2c 20 68 65 78 2c 20 30  Obj(pVal, hex, 0
3bf0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
3c00: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 53       Tcl_AppendS
3c10: 74 72 69 6e 67 73 54 6f 4f 62 6a 28 70 56 61 6c  tringsToObj(pVal
3c20: 2c 20 22 27 22 2c 20 30 29 3b 0a 20 20 20 20 20  , "'", 0);.     
3c30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3c40: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  }..      case SQ
3c50: 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  LITE_FLOAT:.    
3c60: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
3c70: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 73 71 6c 69  ewDoubleObj(sqli
3c80: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
3c90: 28 26 6d 65 6d 29 29 3b 0a 20 20 20 20 20 20 20  (&mem));.       
3ca0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
3cb0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
3cc0: 45 52 3a 0a 20 20 20 20 20 20 20 20 70 56 61 6c  ER:.        pVal
3cd0: 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e   = Tcl_NewWideIn
3ce0: 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c  tObj(sqlite3_val
3cf0: 75 65 5f 69 6e 74 36 34 28 26 6d 65 6d 29 29 3b  ue_int64(&mem));
3d00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3d10: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
3d20: 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 20  TE_NULL:.       
3d30: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
3d40: 74 72 69 6e 67 4f 62 6a 28 22 4e 55 4c 4c 22 2c  tringObj("NULL",
3d50: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72   -1);.        br
3d60: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61  eak;..      defa
3d70: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73  ult:.        ass
3d80: 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a  ert( 0 );.    }.
3d90: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3da0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
3db0: 20 70 52 65 74 2c 20 70 56 61 6c 29 3b 0a 0a 20   pRet, pVal);.. 
3dc0: 20 20 20 69 66 28 20 6d 65 6d 2e 73 7a 4d 61 6c     if( mem.szMal
3dd0: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  loc ){.      sql
3de0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 6d  ite3DbFree(db, m
3df0: 65 6d 2e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  em.zMalloc);.   
3e00: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
3e10: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
3e20: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
3e30: 72 69 6e 67 28 70 52 65 74 29 2c 20 2d 31 2c 20  ring(pRet), -1, 
3e40: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
3e50: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
3e60: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 7d 0a 0a  Count(pRet);.}..
3e70: 2f 2a 0a 2a 2a 20 20 20 20 20 20 20 74 65 73 74  /*.**       test
3e80: 5f 7a 65 72 6f 62 6c 6f 62 28 4e 29 0a 2a 2a 0a  _zeroblob(N).**.
3e90: 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
3ea0: 61 74 69 6f 6e 20 6f 66 20 73 63 61 6c 61 72 20  ation of scalar 
3eb0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 22 74 65  SQL function "te
3ec0: 73 74 5f 7a 65 72 6f 62 6c 6f 62 28 29 22 2e 20  st_zeroblob()". 
3ed0: 54 68 69 73 20 69 73 0a 2a 2a 20 73 69 6d 69 6c  This is.** simil
3ee0: 61 72 20 74 6f 20 74 68 65 20 62 75 69 6c 74 2d  ar to the built-
3ef0: 69 6e 20 7a 65 72 6f 62 6c 6f 62 28 29 20 66 75  in zeroblob() fu
3f00: 6e 63 74 69 6f 6e 2c 20 65 78 63 65 70 74 20 74  nction, except t
3f10: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a  hat it does not.
3f20: 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ** check that th
3f30: 65 20 69 6e 74 65 67 65 72 20 70 61 72 61 6d 65  e integer parame
3f40: 74 65 72 20 69 73 20 77 69 74 68 69 6e 20 72 61  ter is within ra
3f50: 6e 67 65 20 62 65 66 6f 72 65 20 70 61 73 73 69  nge before passi
3f60: 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
3f70: 74 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72 6f 62  te3_result_zerob
3f80: 6c 6f 62 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lob()..*/.static
3f90: 20 76 6f 69 64 20 74 65 73 74 5f 7a 65 72 6f 62   void test_zerob
3fa0: 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  lob(.  sqlite3_c
3fb0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
3fc0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
3fd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3fe0: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 5a 65  rgv.){.  int nZe
3ff0: 72 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ro = sqlite3_val
4000: 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b  ue_int(argv[0]);
4010: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
4020: 74 5f 7a 65 72 6f 62 6c 6f 62 28 63 6f 6e 74 65  t_zeroblob(conte
4030: 78 74 2c 20 6e 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f  xt, nZero);.}../
4040: 2a 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 67  *         test_g
4050: 65 74 73 75 62 74 79 70 65 28 56 29 0a 2a 2a 0a  etsubtype(V).**.
4060: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 75  ** Return the su
4070: 62 74 79 70 65 20 66 6f 72 20 76 61 6c 75 65 20  btype for value 
4080: 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  V..*/.static voi
4090: 64 20 74 65 73 74 5f 67 65 74 73 75 62 74 79 70  d test_getsubtyp
40a0: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  e(.  sqlite3_con
40b0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
40c0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
40d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
40e0: 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  v.){.  sqlite3_r
40f0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
4100: 74 2c 20 28 69 6e 74 29 73 71 6c 69 74 65 33 5f  t, (int)sqlite3_
4110: 76 61 6c 75 65 5f 73 75 62 74 79 70 65 28 61 72  value_subtype(ar
4120: 67 76 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a 20 20  gv[0]));.}../*  
4130: 20 20 20 20 20 20 20 74 65 73 74 5f 73 65 74 73         test_sets
4140: 75 62 74 79 70 65 28 56 2c 20 54 29 0a 2a 2a 0a  ubtype(V, T).**.
4150: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
4160: 6c 75 65 20 56 20 77 69 74 68 20 69 74 73 20 73  lue V with its s
4170: 75 62 74 79 70 65 20 63 68 61 6e 67 65 64 20 74  ubtype changed t
4180: 6f 20 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  o T.*/.static vo
4190: 69 64 20 74 65 73 74 5f 73 65 74 73 75 62 74 79  id test_setsubty
41a0: 70 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  pe(.  sqlite3_co
41b0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
41c0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
41d0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
41e0: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  gv.){.  sqlite3_
41f0: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e  result_value(con
4200: 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  text, argv[0]);.
4210: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4220: 5f 73 75 62 74 79 70 65 28 63 6f 6e 74 65 78 74  _subtype(context
4230: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
4240: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
4250: 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a 7d 0a 0a  t(argv[1]));.}..
4260: 73 74 61 74 69 63 20 69 6e 74 20 72 65 67 69 73  static int regis
4270: 74 65 72 54 65 73 74 46 75 6e 63 74 69 6f 6e 73  terTestFunctions
4280: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4290: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
42a0: 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
42b0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 73 69   *zName;.     si
42c0: 67 6e 65 64 20 63 68 61 72 20 6e 41 72 67 3b 0a  gned char nArg;.
42d0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
42e0: 74 20 65 54 65 78 74 52 65 70 3b 20 2f 2a 20 31  t eTextRep; /* 1
42f0: 3a 20 55 54 46 2d 31 36 2e 20 20 30 3a 20 55 54  : UTF-16.  0: UT
4300: 46 2d 38 20 2a 2f 0a 20 20 20 20 20 76 6f 69 64  F-8 */.     void
4310: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
4320: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
4330: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
4340: 3b 0a 20 20 7d 20 61 46 75 6e 63 73 5b 5d 20 3d  ;.  } aFuncs[] =
4350: 20 7b 0a 20 20 20 20 7b 20 22 72 61 6e 64 73 74   {.    { "randst
4360: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
4370: 20 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38    2, SQLITE_UTF8
4380: 2c 20 72 61 6e 64 53 74 72 20 20 20 20 7d 2c 0a  , randStr    },.
4390: 20 20 20 20 7b 20 22 74 65 73 74 5f 64 65 73 74      { "test_dest
43a0: 72 75 63 74 6f 72 22 2c 20 20 20 20 20 20 20 31  ructor",       1
43b0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 74  , SQLITE_UTF8, t
43c0: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 7d 2c  est_destructor},
43d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
43e0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 7b  OMIT_UTF16.    {
43f0: 20 22 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f   "test_destructo
4400: 72 31 36 22 2c 20 20 20 20 20 31 2c 20 53 51 4c  r16",     1, SQL
4410: 49 54 45 5f 55 54 46 38 2c 20 74 65 73 74 5f 64  ITE_UTF8, test_d
4420: 65 73 74 72 75 63 74 6f 72 31 36 7d 2c 0a 20 20  estructor16},.  
4430: 20 20 7b 20 22 68 65 78 5f 74 6f 5f 75 74 66 31    { "hex_to_utf1
4440: 36 62 65 22 2c 20 20 20 20 20 20 20 20 31 2c 20  6be",        1, 
4450: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 74 65 73  SQLITE_UTF8, tes
4460: 74 48 65 78 54 6f 55 74 66 31 36 62 65 7d 2c 0a  tHexToUtf16be},.
4470: 20 20 20 20 7b 20 22 68 65 78 5f 74 6f 5f 75 74      { "hex_to_ut
4480: 66 31 36 6c 65 22 2c 20 20 20 20 20 20 20 20 31  f16le",        1
4490: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 74  , SQLITE_UTF8, t
44a0: 65 73 74 48 65 78 54 6f 55 74 66 31 36 6c 65 7d  estHexToUtf16le}
44b0: 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 20 22  ,.#endif.    { "
44c0: 68 65 78 5f 74 6f 5f 75 74 66 38 22 2c 20 20 20  hex_to_utf8",   
44d0: 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54          1, SQLIT
44e0: 45 5f 55 54 46 38 2c 20 74 65 73 74 48 65 78 54  E_UTF8, testHexT
44f0: 6f 55 74 66 38 7d 2c 0a 20 20 20 20 7b 20 22 74  oUtf8},.    { "t
4500: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  est_destructor_c
4510: 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45  ount", 0, SQLITE
4520: 5f 55 54 46 38 2c 20 74 65 73 74 5f 64 65 73 74  _UTF8, test_dest
4530: 72 75 63 74 6f 72 5f 63 6f 75 6e 74 7d 2c 0a 20  ructor_count},. 
4540: 20 20 20 7b 20 22 74 65 73 74 5f 61 75 78 64 61     { "test_auxda
4550: 74 61 22 2c 20 20 20 20 20 20 20 20 20 2d 31 2c  ta",         -1,
4560: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 74 65   SQLITE_UTF8, te
4570: 73 74 5f 61 75 78 64 61 74 61 7d 2c 0a 20 20 20  st_auxdata},.   
4580: 20 7b 20 22 74 65 73 74 5f 65 72 72 6f 72 22 2c   { "test_error",
4590: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 53              1, S
45a0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 74 65 73 74  QLITE_UTF8, test
45b0: 5f 65 72 72 6f 72 7d 2c 0a 20 20 20 20 7b 20 22  _error},.    { "
45c0: 74 65 73 74 5f 65 72 72 6f 72 22 2c 20 20 20 20  test_error",    
45d0: 20 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54          2, SQLIT
45e0: 45 5f 55 54 46 38 2c 20 74 65 73 74 5f 65 72 72  E_UTF8, test_err
45f0: 6f 72 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73 74  or},.    { "test
4600: 5f 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20  _eval",         
4610: 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54      1, SQLITE_UT
4620: 46 38 2c 20 74 65 73 74 5f 65 76 61 6c 7d 2c 0a  F8, test_eval},.
4630: 20 20 20 20 7b 20 22 74 65 73 74 5f 69 73 6f 6c      { "test_isol
4640: 61 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 32  ation",        2
4650: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 74  , SQLITE_UTF8, t
4660: 65 73 74 5f 69 73 6f 6c 61 74 69 6f 6e 7d 2c 0a  est_isolation},.
4670: 20 20 20 20 7b 20 22 74 65 73 74 5f 63 6f 75 6e      { "test_coun
4680: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 31  ter",          1
4690: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63  , SQLITE_UTF8, c
46a0: 6f 75 6e 74 65 72 46 75 6e 63 7d 2c 0a 20 20 20  ounterFunc},.   
46b0: 20 7b 20 22 72 65 61 6c 32 68 65 78 22 2c 20 20   { "real2hex",  
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 53              1, S
46d0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 72 65 61 6c  QLITE_UTF8, real
46e0: 32 68 65 78 7d 2c 0a 20 20 20 20 7b 20 22 74 65  2hex},.    { "te
46f0: 73 74 5f 64 65 63 6f 64 65 22 2c 20 20 20 20 20  st_decode",     
4700: 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f        1, SQLITE_
4710: 55 54 46 38 2c 20 74 65 73 74 5f 64 65 63 6f 64  UTF8, test_decod
4720: 65 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73 74 5f  e},.    { "test_
4730: 65 78 74 72 61 63 74 22 2c 20 20 20 20 20 20 20  extract",       
4740: 20 20 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46     2, SQLITE_UTF
4750: 38 2c 20 74 65 73 74 5f 65 78 74 72 61 63 74 7d  8, test_extract}
4760: 2c 0a 20 20 20 20 7b 20 22 74 65 73 74 5f 7a 65  ,.    { "test_ze
4770: 72 6f 62 6c 6f 62 22 2c 20 20 31 2c 20 53 51 4c  roblob",  1, SQL
4780: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
4790: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 74  DETERMINISTIC, t
47a0: 65 73 74 5f 7a 65 72 6f 62 6c 6f 62 7d 2c 0a 20  est_zeroblob},. 
47b0: 20 20 20 7b 20 22 74 65 73 74 5f 67 65 74 73 75     { "test_getsu
47c0: 62 74 79 70 65 22 2c 20 20 20 20 20 20 20 31 2c  btype",       1,
47d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 74 65   SQLITE_UTF8, te
47e0: 73 74 5f 67 65 74 73 75 62 74 79 70 65 7d 2c 0a  st_getsubtype},.
47f0: 20 20 20 20 7b 20 22 74 65 73 74 5f 73 65 74 73      { "test_sets
4800: 75 62 74 79 70 65 22 2c 20 20 20 20 20 20 20 32  ubtype",       2
4810: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 74  , SQLITE_UTF8, t
4820: 65 73 74 5f 73 65 74 73 75 62 74 79 70 65 7d 2c  est_setsubtype},
4830: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  .  };.  int i;..
4840: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4850: 65 6f 66 28 61 46 75 6e 63 73 29 2f 73 69 7a 65  eof(aFuncs)/size
4860: 6f 66 28 61 46 75 6e 63 73 5b 30 5d 29 3b 20 69  of(aFuncs[0]); i
4870: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
4880: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
4890: 28 64 62 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 7a  (db, aFuncs[i].z
48a0: 4e 61 6d 65 2c 20 61 46 75 6e 63 73 5b 69 5d 2e  Name, aFuncs[i].
48b0: 6e 41 72 67 2c 0a 20 20 20 20 20 20 20 20 61 46  nArg,.        aF
48c0: 75 6e 63 73 5b 69 5d 2e 65 54 65 78 74 52 65 70  uncs[i].eTextRep
48d0: 2c 20 30 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 78  , 0, aFuncs[i].x
48e0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
48f0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ..  sqlite3_crea
4900: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
4910: 22 74 65 73 74 5f 61 67 67 5f 65 72 72 6d 73 67  "test_agg_errmsg
4920: 31 36 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 41  16", 0, SQLITE_A
4930: 4e 59 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20  NY, 0, 0, .     
4940: 20 74 65 73 74 5f 61 67 67 5f 65 72 72 6d 73 67   test_agg_errmsg
4950: 31 36 5f 73 74 65 70 2c 20 74 65 73 74 5f 61 67  16_step, test_ag
4960: 67 5f 65 72 72 6d 73 67 31 36 5f 66 69 6e 61 6c  g_errmsg16_final
4970: 29 3b 0a 20 20 20 20 20 20 0a 20 20 72 65 74 75  );.      .  retu
4980: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
4990: 0a 2f 2a 0a 2a 2a 20 54 43 4c 43 4d 44 3a 20 20  ./*.** TCLCMD:  
49a0: 61 75 74 6f 69 6e 73 74 61 6c 6c 5f 74 65 73 74  autoinstall_test
49b0: 5f 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a  _functions.**.**
49c0: 20 49 6e 76 6f 6b 65 20 74 68 69 73 20 54 43 4c   Invoke this TCL
49d0: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 75 73 65 20   command to use 
49e0: 73 71 6c 69 74 65 33 5f 61 75 74 6f 5f 65 78 74  sqlite3_auto_ext
49f0: 65 6e 73 69 6f 6e 28 29 20 74 6f 20 63 61 75 73  ension() to caus
4a00: 65 0a 2a 2a 20 74 68 65 20 73 74 61 6e 64 61 72  e.** the standar
4a10: 64 20 73 65 74 20 6f 66 20 74 65 73 74 20 66 75  d set of test fu
4a20: 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 6c 6f  nctions to be lo
4a30: 61 64 65 64 20 69 6e 74 6f 20 65 61 63 68 20 6e  aded into each n
4a40: 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  ew.** database c
4a50: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
4a60: 61 74 69 63 20 69 6e 74 20 61 75 74 6f 69 6e 73  atic int autoins
4a70: 74 61 6c 6c 5f 74 65 73 74 5f 66 75 6e 63 73 28  tall_test_funcs(
4a80: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
4a90: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
4aa0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
4ab0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
4ac0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
4ad0: 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
4ae0: 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c  Md5_Register(sql
4af0: 69 74 65 33 2a 29 3b 0a 20 20 69 6e 74 20 72 63  ite3*);.  int rc
4b00: 20 3d 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 5f   = sqlite3_auto_
4b10: 65 78 74 65 6e 73 69 6f 6e 28 28 76 6f 69 64 2a  extension((void*
4b20: 29 72 65 67 69 73 74 65 72 54 65 73 74 46 75 6e  )registerTestFun
4b30: 63 74 69 6f 6e 73 29 3b 0a 20 20 69 66 28 20 72  ctions);.  if( r
4b40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4b50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4b60: 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28  _auto_extension(
4b70: 28 76 6f 69 64 2a 29 4d 64 35 5f 52 65 67 69 73  (void*)Md5_Regis
4b80: 74 65 72 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  ter);.  }.  Tcl_
4b90: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
4ba0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
4bb0: 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
4bc0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4bd0: 2a 2a 20 41 20 62 6f 67 75 73 20 73 74 65 70 20  ** A bogus step 
4be0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 66 69 6e  function and fin
4bf0: 61 6c 69 7a 65 72 20 66 75 6e 63 74 69 6f 6e 2e  alizer function.
4c00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4c10: 74 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f  tStep(sqlite3_co
4c20: 6e 74 65 78 74 20 2a 61 2c 20 69 6e 74 20 62 2c  ntext *a, int b,
4c30: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4c40: 2a 63 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69  *c){}.static voi
4c50: 64 20 74 46 69 6e 61 6c 28 73 71 6c 69 74 65 33  d tFinal(sqlite3
4c60: 5f 63 6f 6e 74 65 78 74 20 2a 61 29 7b 7d 0a 0a  _context *a){}..
4c70: 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
4c80: 61 62 75 73 65 5f 63 72 65 61 74 65 5f 66 75 6e  abuse_create_fun
4c90: 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65  ction.**.** Make
4ca0: 20 76 61 72 69 6f 75 73 20 63 61 6c 6c 73 20 74   various calls t
4cb0: 6f 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  o sqlite3_create
4cc0: 5f 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 64  _function that d
4cd0: 6f 20 6e 6f 74 20 68 61 76 65 20 76 61 6c 69 64  o not have valid
4ce0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 2e 20  .** parameters. 
4cf0: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
4d00: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
4d10: 20 69 73 20 64 65 74 65 63 74 65 64 20 61 6e 64   is detected and
4d20: 20 72 65 70 6f 72 74 65 64 2e 0a 2a 2f 0a 73 74   reported..*/.st
4d30: 61 74 69 63 20 69 6e 74 20 61 62 75 73 65 5f 63  atic int abuse_c
4d40: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
4d50: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
4d60: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
4d70: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
4d80: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
4d90: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
4da0: 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 67  {.  extern int g
4db0: 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f  etDbPointer(Tcl_
4dc0: 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74 20 63  Interp*, const c
4dd0: 68 61 72 2a 2c 20 73 71 6c 69 74 65 33 2a 2a 29  har*, sqlite3**)
4de0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
4df0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
4e00: 20 6d 78 41 72 67 3b 0a 0a 20 20 69 66 28 20 67   mxArg;..  if( g
4e10: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
4e20: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
4e30: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
4e40: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4e50: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
4e60: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
4e70: 74 69 6f 6e 28 64 62 2c 20 22 74 78 22 2c 20 31  tion(db, "tx", 1
4e80: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
4e90: 2c 20 74 53 74 65 70 2c 74 53 74 65 70 2c 74 46  , tStep,tStep,tF
4ea0: 69 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  inal);.  if( rc!
4eb0: 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 29  =SQLITE_MISUSE )
4ec0: 20 67 6f 74 6f 20 61 62 75 73 65 5f 65 72 72 3b   goto abuse_err;
4ed0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
4ee0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
4ef0: 28 64 62 2c 20 22 74 78 22 2c 20 31 2c 20 53 51  (db, "tx", 1, SQ
4f00: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 53  LITE_UTF8, 0, tS
4f10: 74 65 70 2c 20 74 53 74 65 70 2c 20 30 29 3b 0a  tep, tStep, 0);.
4f20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4f30: 5f 4d 49 53 55 53 45 20 29 20 67 6f 74 6f 20 61  _MISUSE ) goto a
4f40: 62 75 73 65 5f 65 72 72 3b 0a 0a 20 20 72 63 20  buse_err;..  rc 
4f50: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
4f60: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
4f70: 78 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  x", 1, SQLITE_UT
4f80: 46 38 2c 20 30 2c 20 74 53 74 65 70 2c 20 30 2c  F8, 0, tStep, 0,
4f90: 20 74 46 69 6e 61 6c 29 3b 0a 20 20 69 66 28 20   tFinal);.  if( 
4fa0: 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53  rc!=SQLITE_MISUS
4fb0: 45 29 20 67 6f 74 6f 20 61 62 75 73 65 5f 65 72  E) goto abuse_er
4fc0: 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r;..  rc = sqlit
4fd0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
4fe0: 6f 6e 28 64 62 2c 20 22 74 78 22 2c 20 31 2c 20  on(db, "tx", 1, 
4ff0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
5000: 30 2c 20 30 2c 20 74 46 69 6e 61 6c 29 3b 0a 20  0, 0, tFinal);. 
5010: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5020: 4d 49 53 55 53 45 20 29 20 67 6f 74 6f 20 61 62  MISUSE ) goto ab
5030: 75 73 65 5f 65 72 72 3b 0a 0a 20 20 72 63 20 3d  use_err;..  rc =
5040: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
5050: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 78  function(db, "tx
5060: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
5070: 38 2c 20 30 2c 20 30 2c 20 74 53 74 65 70 2c 20  8, 0, 0, tStep, 
5080: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
5090: 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 20 67 6f  LITE_MISUSE ) go
50a0: 74 6f 20 61 62 75 73 65 5f 65 72 72 3b 0a 0a 20  to abuse_err;.. 
50b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
50c0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
50d0: 2c 20 22 74 78 22 2c 20 2d 32 2c 20 53 51 4c 49  , "tx", -2, SQLI
50e0: 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 53 74 65  TE_UTF8, 0, tSte
50f0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  p, 0, 0);.  if( 
5100: 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53  rc!=SQLITE_MISUS
5110: 45 20 29 20 67 6f 74 6f 20 61 62 75 73 65 5f 65  E ) goto abuse_e
5120: 72 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rr;..  rc = sqli
5130: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
5140: 69 6f 6e 28 64 62 2c 20 22 74 78 22 2c 20 31 32  ion(db, "tx", 12
5150: 38 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  8, SQLITE_UTF8, 
5160: 30 2c 20 74 53 74 65 70 2c 20 30 2c 20 30 29 3b  0, tStep, 0, 0);
5170: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5180: 45 5f 4d 49 53 55 53 45 20 29 20 67 6f 74 6f 20  E_MISUSE ) goto 
5190: 61 62 75 73 65 5f 65 72 72 3b 0a 0a 20 20 72 63  abuse_err;..  rc
51a0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
51b0: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
51c0: 66 75 6e 63 78 78 22 0a 20 20 20 20 20 20 20 22  funcxx".       "
51d0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
51e0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
51f0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
5200: 38 39 22 0a 20 20 20 20 20 20 20 22 5f 31 32 33  89".       "_123
5210: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
5220: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
5230: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 22 0a  6789_123456789".
5240: 20 20 20 20 20 20 20 22 5f 31 32 33 34 35 36 37         "_1234567
5250: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
5260: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
5270: 5f 31 32 33 34 35 36 37 38 39 22 0a 20 20 20 20  _123456789".    
5280: 20 20 20 22 5f 31 32 33 34 35 36 37 38 39 5f 31     "_123456789_1
5290: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
52a0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
52b0: 34 35 36 37 38 39 22 0a 20 20 20 20 20 20 20 22  456789".       "
52c0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
52d0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
52e0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
52f0: 38 39 22 2c 0a 20 20 20 20 20 20 20 31 2c 20 53  89",.       1, S
5300: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74  QLITE_UTF8, 0, t
5310: 53 74 65 70 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Step, 0, 0);.  i
5320: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49  f( rc!=SQLITE_MI
5330: 53 55 53 45 20 29 20 67 6f 74 6f 20 61 62 75 73  SUSE ) goto abus
5340: 65 5f 65 72 72 3b 0a 0a 20 20 2f 2a 20 54 68 69  e_err;..  /* Thi
5350: 73 20 6c 61 73 74 20 66 75 6e 63 74 69 6f 6e 20  s last function 
5360: 72 65 67 69 73 74 72 61 74 69 6f 6e 20 73 68 6f  registration sho
5370: 75 6c 64 20 61 63 74 75 61 6c 6c 79 20 77 6f 72  uld actually wor
5380: 6b 2e 20 20 47 65 6e 65 72 61 74 65 0a 20 20 2a  k.  Generate.  *
5390: 2a 20 61 20 6e 6f 2d 6f 70 20 66 75 6e 63 74 69  * a no-op functi
53a0: 6f 6e 20 28 74 68 61 74 20 61 6c 77 61 79 73 20  on (that always 
53b0: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 29 20 61 6e  returns NULL) an
53c0: 64 20 77 68 69 63 68 20 68 61 73 20 74 68 65 0a  d which has the.
53d0: 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 2d 6c 65 6e    ** maximum-len
53e0: 67 74 68 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  gth function nam
53f0: 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  e and the maximu
5400: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 72 61  m number of para
5410: 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 73  meters..  */.  s
5420: 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c  qlite3_limit(db,
5430: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55   SQLITE_LIMIT_FU
5440: 4e 43 54 49 4f 4e 5f 41 52 47 2c 20 31 30 30 30  NCTION_ARG, 1000
5450: 30 29 3b 0a 20 20 6d 78 41 72 67 20 3d 20 73 71  0);.  mxArg = sq
5460: 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20  lite3_limit(db, 
5470: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
5480: 43 54 49 4f 4e 5f 41 52 47 2c 20 2d 31 29 3b 0a  CTION_ARG, -1);.
5490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
54a0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
54b0: 62 2c 20 22 6e 75 6c 6c 78 22 0a 20 20 20 20 20  b, "nullx".     
54c0: 20 20 22 5f 31 32 33 34 35 36 37 38 39 5f 31 32    "_123456789_12
54d0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
54e0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
54f0: 35 36 37 38 39 22 0a 20 20 20 20 20 20 20 22 5f  56789".       "_
5500: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
5510: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
5520: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
5530: 39 22 0a 20 20 20 20 20 20 20 22 5f 31 32 33 34  9".       "_1234
5540: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
5550: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
5560: 37 38 39 5f 31 32 33 34 35 36 37 38 39 22 0a 20  789_123456789". 
5570: 20 20 20 20 20 20 22 5f 31 32 33 34 35 36 37 38        "_12345678
5580: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
5590: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
55a0: 31 32 33 34 35 36 37 38 39 22 0a 20 20 20 20 20  123456789".     
55b0: 20 20 22 5f 31 32 33 34 35 36 37 38 39 5f 31 32    "_123456789_12
55c0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
55d0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
55e0: 35 36 37 38 39 22 2c 0a 20 20 20 20 20 20 20 6d  56789",.       m
55f0: 78 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  xArg, SQLITE_UTF
5600: 38 2c 20 30 2c 20 74 53 74 65 70 2c 20 30 2c 20  8, 0, tStep, 0, 
5610: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
5620: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
5630: 62 75 73 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  buse_err;.      
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 20 20 20 20 20 20 20 20 20 20 0a 20 20 72 65 74            .  ret
5660: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 61 62 75  urn TCL_OK;..abu
5670: 73 65 5f 65 72 72 3a 0a 20 20 54 63 6c 5f 41 70  se_err:.  Tcl_Ap
5680: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5690: 70 2c 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61  p, "sqlite3_crea
56a0: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 61 62 75 73  te_function abus
56b0: 65 64 20 74 65 73 74 20 66 61 69 6c 65 64 22 2c  ed test failed",
56c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
56d0: 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
56e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
56f0: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OR;.}../*.** Reg
5700: 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77  ister commands w
5710: 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65  ith the TCL inte
5720: 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  rpreter..*/.int 
5730: 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f  Sqlitetest_func_
5740: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
5750: 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73 74 61 74  *interp){.  stat
5760: 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
5770: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
5780: 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f     Tcl_ObjCmdPro
5790: 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 4f  c *xProc;.  } aO
57a0: 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  bjCmd[] = {.    
57b0: 20 7b 20 22 61 75 74 6f 69 6e 73 74 61 6c 6c 5f   { "autoinstall_
57c0: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 73 22 2c  test_functions",
57d0: 20 20 20 20 61 75 74 6f 69 6e 73 74 61 6c 6c 5f      autoinstall_
57e0: 74 65 73 74 5f 66 75 6e 63 73 20 7d 2c 0a 20 20  test_funcs },.  
57f0: 20 20 20 7b 20 22 61 62 75 73 65 5f 63 72 65 61     { "abuse_crea
5800: 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20  te_function",   
5810: 20 20 20 20 20 20 61 62 75 73 65 5f 63 72 65 61        abuse_crea
5820: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a  te_function  },.
5830: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
5840: 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f 52  extern int Md5_R
5850: 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33 2a  egister(sqlite3*
5860: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
5870: 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29  <sizeof(aObjCmd)
5880: 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b  /sizeof(aObjCmd[
5890: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  0]); i++){.    T
58a0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
58b0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a  and(interp, aObj
58c0: 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 4f  Cmd[i].zName, aO
58d0: 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20  bjCmd[i].xProc, 
58e0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  0, 0);.  }.  sql
58f0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
5900: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 61 75 74  );.  sqlite3_aut
5910: 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 28 76 6f 69  o_extension((voi
5920: 64 2a 29 72 65 67 69 73 74 65 72 54 65 73 74 46  d*)registerTestF
5930: 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 73 71 6c  unctions);.  sql
5940: 69 74 65 33 5f 61 75 74 6f 5f 65 78 74 65 6e 73  ite3_auto_extens
5950: 69 6f 6e 28 28 76 6f 69 64 2a 29 4d 64 35 5f 52  ion((void*)Md5_R
5960: 65 67 69 73 74 65 72 29 3b 0a 20 20 72 65 74 75  egister);.  retu
5970: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a           rn TCL_OK;.}.