/ Hex Artifact Content
Login

Artifact f8235719dff4bf9ffee04c55a190af8782ce9ab5:


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 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
2ef0: 20 74 65 73 74 5f 65 78 74 72 61 63 74 28 72 65   test_extract(re
2f00: 63 6f 72 64 2c 20 66 69 65 6c 64 29 0a 2a 2a 0a  cord, field).**.
2f10: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2f20: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 53   implements an S
2f30: 51 4c 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e  QL user-function
2f40: 20 74 68 61 74 20 61 63 63 65 70 74 73 20 61 20   that accepts a 
2f50: 62 6c 6f 62 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  blob.** containi
2f60: 6e 67 20 61 20 66 6f 72 6d 61 74 74 65 64 20 64  ng a formatted d
2f70: 61 74 61 62 61 73 65 20 72 65 63 6f 72 64 20 61  atabase record a
2f80: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
2f90: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 73 65 63  ment. The.** sec
2fa0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
2fb0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
2fc0: 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68   field within th
2fd0: 61 74 20 72 65 63 6f 72 64 20 74 6f 0a 2a 2a 20  at record to.** 
2fe0: 65 78 74 72 61 63 74 20 61 6e 64 20 72 65 74 75  extract and retu
2ff0: 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rn..*/.static vo
3000: 69 64 20 74 65 73 74 5f 65 78 74 72 61 63 74 28  id test_extract(
3010: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
3020: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
3030: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
3040: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
3050: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
3060: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
3070: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
3080: 74 65 78 74 29 3b 0a 20 20 75 38 20 2a 70 52 65  text);.  u8 *pRe
3090: 63 3b 0a 20 20 75 38 20 2a 70 45 6e 64 48 64 72  c;.  u8 *pEndHdr
30a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30b0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 73 20 74       /* Points t
30c0: 6f 20 6f 6e 65 20 62 79 74 65 20 70 61 73 74 20  o one byte past 
30d0: 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 2a 2f  record header */
30e0: 0a 20 20 75 38 20 2a 70 48 64 72 3b 20 20 20 20  .  u8 *pHdr;    
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 6f     /* Current po
3110: 69 6e 74 20 69 6e 20 72 65 63 6f 72 64 20 68 65  int in record he
3120: 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 42  ader */.  u8 *pB
3130: 6f 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ody;            
3140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
3150: 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 72 65  rent point in re
3160: 63 6f 72 64 20 64 61 74 61 20 2a 2f 0a 20 20 75  cord data */.  u
3170: 36 34 20 6e 48 64 72 3b 20 20 20 20 20 20 20 20  64 nHdr;        
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3190: 2a 20 42 79 74 65 73 20 69 6e 20 72 65 63 6f 72  * Bytes in recor
31a0: 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  d header */.  in
31b0: 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20  t iIdx;         
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d0: 20 52 65 71 75 69 72 65 64 20 66 69 65 6c 64 20   Required field 
31e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e  */.  int iCurren
31f0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
3200: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
3210: 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 61 73 73 65  field */..  asse
3220: 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20  rt( argc==2 );. 
3230: 20 70 52 65 63 20 3d 20 28 75 38 2a 29 73 71 6c   pRec = (u8*)sql
3240: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
3250: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 49 64 78  argv[0]);.  iIdx
3260: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
3270: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a  _int(argv[1]);..
3280: 20 20 70 48 64 72 20 3d 20 70 52 65 63 20 2b 20    pHdr = pRec + 
3290: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
32a0: 28 70 52 65 63 2c 20 26 6e 48 64 72 29 3b 0a 20  (pRec, &nHdr);. 
32b0: 20 70 42 6f 64 79 20 3d 20 70 45 6e 64 48 64 72   pBody = pEndHdr
32c0: 20 3d 20 26 70 52 65 63 5b 6e 48 64 72 5d 3b 0a   = &pRec[nHdr];.
32d0: 0a 20 20 66 6f 72 28 69 43 75 72 72 65 6e 74 3d  .  for(iCurrent=
32e0: 30 3b 20 70 48 64 72 3c 70 45 6e 64 48 64 72 20  0; pHdr<pEndHdr 
32f0: 26 26 20 69 43 75 72 72 65 6e 74 3c 3d 69 49 64  && iCurrent<=iId
3300: 78 3b 20 69 43 75 72 72 65 6e 74 2b 2b 29 7b 0a  x; iCurrent++){.
3310: 20 20 20 20 75 36 34 20 69 53 65 72 69 61 6c 54      u64 iSerialT
3320: 79 70 65 3b 0a 20 20 20 20 4d 65 6d 20 6d 65 6d  ype;.    Mem mem
3330: 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6d  ;..    memset(&m
3340: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 65  em, 0, sizeof(me
3350: 6d 29 29 3b 0a 20 20 20 20 6d 65 6d 2e 64 62 20  m));.    mem.db 
3360: 3d 20 64 62 3b 0a 20 20 20 20 6d 65 6d 2e 65 6e  = db;.    mem.en
3370: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
3380: 20 70 48 64 72 20 2b 3d 20 73 71 6c 69 74 65 33   pHdr += sqlite3
3390: 47 65 74 56 61 72 69 6e 74 28 70 48 64 72 2c 20  GetVarint(pHdr, 
33a0: 26 69 53 65 72 69 61 6c 54 79 70 65 29 3b 0a 20  &iSerialType);. 
33b0: 20 20 20 70 42 6f 64 79 20 2b 3d 20 73 71 6c 69     pBody += sqli
33c0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
33d0: 28 70 42 6f 64 79 2c 20 28 75 33 32 29 69 53 65  (pBody, (u32)iSe
33e0: 72 69 61 6c 54 79 70 65 2c 20 26 6d 65 6d 29 3b  rialType, &mem);
33f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3400: 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 26 6d 65  MemStoreType(&me
3410: 6d 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 43 75  m);..    if( iCu
3420: 72 72 65 6e 74 3d 3d 69 49 64 78 20 29 7b 0a 20  rrent==iIdx ){. 
3430: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3440: 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78  ult_value(contex
3450: 74 2c 20 26 6d 65 6d 29 3b 0a 20 20 20 20 7d 0a  t, &mem);.    }.
3460: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3470: 65 65 28 64 62 2c 20 6d 65 6d 2e 7a 4d 61 6c 6c  ee(db, mem.zMall
3480: 6f 63 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  oc);.  }.}../*.*
3490: 2a 20 74 63 6c 63 6d 64 3a 20 74 65 73 74 5f 64  * tclcmd: test_d
34a0: 65 63 6f 64 65 28 72 65 63 6f 72 64 29 0a 2a 2a  ecode(record).**
34b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
34c0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20  n implements an 
34d0: 53 51 4c 20 75 73 65 72 2d 66 75 6e 63 74 69 6f  SQL user-functio
34e0: 6e 20 74 68 61 74 20 61 63 63 65 70 74 73 20 61  n that accepts a
34f0: 20 62 6c 6f 62 0a 2a 2a 20 63 6f 6e 74 61 69 6e   blob.** contain
3500: 69 6e 67 20 61 20 66 6f 72 6d 61 74 74 65 64 20  ing a formatted 
3510: 64 61 74 61 62 61 73 65 20 72 65 63 6f 72 64 20  database record 
3520: 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72 67 75  as its only argu
3530: 6d 65 6e 74 2e 20 49 74 20 72 65 74 75 72 6e 73  ment. It returns
3540: 0a 2a 2a 20 61 20 74 63 6c 20 6c 69 73 74 20 28  .** a tcl list (
3550: 74 79 70 65 20 53 51 4c 49 54 45 5f 54 45 58 54  type SQLITE_TEXT
3560: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 65 61 63  ) containing eac
3570: 68 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  h of the values 
3580: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
3590: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74   record..*/.stat
35a0: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 64 65 63  ic void test_dec
35b0: 6f 64 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ode(.  sqlite3_c
35c0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
35d0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
35e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
35f0: 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
3600: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
3610: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
3620: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 75 38 20  (context);.  u8 
3630: 2a 70 52 65 63 3b 0a 20 20 75 38 20 2a 70 45 6e  *pRec;.  u8 *pEn
3640: 64 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  dHdr;           
3650: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
3660: 74 73 20 74 6f 20 6f 6e 65 20 62 79 74 65 20 70  ts to one byte p
3670: 61 73 74 20 72 65 63 6f 72 64 20 68 65 61 64 65  ast record heade
3680: 72 20 2a 2f 0a 20 20 75 38 20 2a 70 48 64 72 3b  r */.  u8 *pHdr;
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
36b0: 74 20 70 6f 69 6e 74 20 69 6e 20 72 65 63 6f 72  t point in recor
36c0: 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  d header */.  u8
36d0: 20 2a 70 42 6f 64 79 3b 20 20 20 20 20 20 20 20   *pBody;        
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36f0: 20 43 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69   Current point i
3700: 6e 20 72 65 63 6f 72 64 20 64 61 74 61 20 2a 2f  n record data */
3710: 0a 20 20 75 36 34 20 6e 48 64 72 3b 20 20 20 20  .  u64 nHdr;    
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 72     /* Bytes in r
3740: 65 63 6f 72 64 20 68 65 61 64 65 72 20 2a 2f 0a  ecord header */.
3750: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3770: 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
3780: 65 20 2a 2f 0a 0a 20 20 70 52 65 74 20 3d 20 54  e */..  pRet = T
3790: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54  cl_NewObj();.  T
37a0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
37b0: 70 52 65 74 29 3b 0a 0a 20 20 61 73 73 65 72 74  pRet);..  assert
37c0: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 70  ( argc==1 );.  p
37d0: 52 65 63 20 3d 20 28 75 38 2a 29 73 71 6c 69 74  Rec = (u8*)sqlit
37e0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
37f0: 67 76 5b 30 5d 29 3b 0a 0a 20 20 70 48 64 72 20  gv[0]);..  pHdr 
3800: 3d 20 70 52 65 63 20 2b 20 73 71 6c 69 74 65 33  = pRec + sqlite3
3810: 47 65 74 56 61 72 69 6e 74 28 70 52 65 63 2c 20  GetVarint(pRec, 
3820: 26 6e 48 64 72 29 3b 0a 20 20 70 42 6f 64 79 20  &nHdr);.  pBody 
3830: 3d 20 70 45 6e 64 48 64 72 20 3d 20 26 70 52 65  = pEndHdr = &pRe
3840: 63 5b 6e 48 64 72 5d 3b 0a 20 20 77 68 69 6c 65  c[nHdr];.  while
3850: 28 20 70 48 64 72 3c 70 45 6e 64 48 64 72 20 29  ( pHdr<pEndHdr )
3860: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
3870: 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 75 36 34  Val = 0;.    u64
3880: 20 69 53 65 72 69 61 6c 54 79 70 65 3b 0a 20 20   iSerialType;.  
3890: 20 20 4d 65 6d 20 6d 65 6d 3b 0a 0a 20 20 20 20    Mem mem;..    
38a0: 6d 65 6d 73 65 74 28 26 6d 65 6d 2c 20 30 2c 20  memset(&mem, 0, 
38b0: 73 69 7a 65 6f 66 28 6d 65 6d 29 29 3b 0a 20 20  sizeof(mem));.  
38c0: 20 20 6d 65 6d 2e 64 62 20 3d 20 64 62 3b 0a 20    mem.db = db;. 
38d0: 20 20 20 6d 65 6d 2e 65 6e 63 20 3d 20 45 4e 43     mem.enc = ENC
38e0: 28 64 62 29 3b 0a 20 20 20 20 70 48 64 72 20 2b  (db);.    pHdr +
38f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
3900: 6e 74 28 70 48 64 72 2c 20 26 69 53 65 72 69 61  nt(pHdr, &iSeria
3910: 6c 54 79 70 65 29 3b 0a 20 20 20 20 70 42 6f 64  lType);.    pBod
3920: 79 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  y += sqlite3Vdbe
3930: 53 65 72 69 61 6c 47 65 74 28 70 42 6f 64 79 2c  SerialGet(pBody,
3940: 20 28 75 33 32 29 69 53 65 72 69 61 6c 54 79 70   (u32)iSerialTyp
3950: 65 2c 20 26 6d 65 6d 29 3b 0a 0a 20 20 20 20 73  e, &mem);..    s
3960: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f  qlite3VdbeMemSto
3970: 72 65 54 79 70 65 28 26 6d 65 6d 29 3b 0a 20 20  reType(&mem);.  
3980: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
3990: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 26 6d 65  3_value_type(&me
39a0: 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  m) ){.      case
39b0: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20   SQLITE_TEXT:.  
39c0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
39d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
39e0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
39f0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 26 6d  e3_value_text(&m
3a00: 65 6d 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  em), -1);.      
3a10: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
3a20: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
3a30: 3a 20 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  : {.        char
3a40: 20 68 65 78 64 69 67 69 74 5b 5d 20 3d 20 7b 0a   hexdigit[] = {.
3a50: 20 20 20 20 20 20 20 20 20 20 27 30 27 2c 20 27            '0', '
3a60: 31 27 2c 20 27 32 27 2c 20 27 33 27 2c 20 27 34  1', '2', '3', '4
3a70: 27 2c 20 27 35 27 2c 20 27 36 27 2c 20 27 37 27  ', '5', '6', '7'
3a80: 2c 0a 20 20 20 20 20 20 20 20 20 20 27 38 27 2c  ,.          '8',
3a90: 20 27 39 27 2c 20 27 61 27 2c 20 27 62 27 2c 20   '9', 'a', 'b', 
3aa0: 27 63 27 2c 20 27 64 27 2c 20 27 65 27 2c 20 27  'c', 'd', 'e', '
3ab0: 66 27 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20  f'.        };.  
3ac0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
3ad0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
3ae0: 73 28 26 6d 65 6d 29 3b 0a 20 20 20 20 20 20 20  s(&mem);.       
3af0: 20 75 38 20 2a 7a 20 3d 20 28 75 38 2a 29 73 71   u8 *z = (u8*)sq
3b00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
3b10: 28 26 6d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  (&mem);.        
3b20: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 70  int i;.        p
3b30: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Val = Tcl_NewStr
3b40: 69 6e 67 4f 62 6a 28 22 78 27 22 2c 20 2d 31 29  ingObj("x'", -1)
3b50: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
3b60: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
3b70: 20 20 20 20 20 20 20 20 63 68 61 72 20 68 65 78          char hex
3b80: 5b 33 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 68  [3];.          h
3b90: 65 78 5b 30 5d 20 3d 20 68 65 78 64 69 67 69 74  ex[0] = hexdigit
3ba0: 5b 28 28 7a 5b 69 5d 20 3e 3e 20 34 29 20 26 20  [((z[i] >> 4) & 
3bb0: 30 78 30 46 29 5d 3b 0a 20 20 20 20 20 20 20 20  0x0F)];.        
3bc0: 20 20 68 65 78 5b 31 5d 20 3d 20 68 65 78 64 69    hex[1] = hexdi
3bd0: 67 69 74 5b 28 7a 5b 69 5d 20 26 20 30 78 30 46  git[(z[i] & 0x0F
3be0: 29 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 68 65  )];.          he
3bf0: 78 5b 32 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  x[2] = '\0';.   
3c00: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
3c10: 64 53 74 72 69 6e 67 73 54 6f 4f 62 6a 28 70 56  dStringsToObj(pV
3c20: 61 6c 2c 20 68 65 78 2c 20 30 29 3b 0a 20 20 20  al, hex, 0);.   
3c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
3c40: 63 6c 5f 41 70 70 65 6e 64 53 74 72 69 6e 67 73  cl_AppendStrings
3c50: 54 6f 4f 62 6a 28 70 56 61 6c 2c 20 22 27 22 2c  ToObj(pVal, "'",
3c60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
3c70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
3c80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
3c90: 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20 20 70 56  LOAT:.        pV
3ca0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62  al = Tcl_NewDoub
3cb0: 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  leObj(sqlite3_va
3cc0: 6c 75 65 5f 64 6f 75 62 6c 65 28 26 6d 65 6d 29  lue_double(&mem)
3cd0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
3ce0: 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  ;..      case SQ
3cf0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20  LITE_INTEGER:.  
3d00: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
3d10: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 73  _NewWideIntObj(s
3d20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
3d30: 36 34 28 26 6d 65 6d 29 29 3b 0a 20 20 20 20 20  64(&mem));.     
3d40: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
3d50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
3d60: 4c 3a 0a 20 20 20 20 20 20 20 20 70 56 61 6c 20  L:.        pVal 
3d70: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
3d80: 62 6a 28 22 4e 55 4c 4c 22 2c 20 2d 31 29 3b 0a  bj("NULL", -1);.
3d90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
3da0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
3db0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30         assert( 0
3dc0: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54   );.    }..    T
3dd0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3de0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
3df0: 20 70 56 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28   pVal);..    if(
3e00: 20 6d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a   mem.zMalloc ){.
3e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3e20: 72 65 65 28 64 62 2c 20 6d 65 6d 2e 7a 4d 61 6c  ree(db, mem.zMal
3e30: 6c 6f 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  loc);.    }.  }.
3e40: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
3e50: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
3e60: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 52  Tcl_GetString(pR
3e70: 65 74 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  et), -1, SQLITE_
3e80: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 54 63  TRANSIENT);.  Tc
3e90: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
3ea0: 52 65 74 29 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  Ret);.}...static
3eb0: 20 69 6e 74 20 72 65 67 69 73 74 65 72 54 65 73   int registerTes
3ec0: 74 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74  tFunctions(sqlit
3ed0: 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69  e3 *db){.  stati
3ee0: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
3ef0: 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  .     char *zNam
3f00: 65 3b 0a 20 20 20 20 20 73 69 67 6e 65 64 20 63  e;.     signed c
3f10: 68 61 72 20 6e 41 72 67 3b 0a 20 20 20 20 20 75  har nArg;.     u
3f20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 54 65  nsigned char eTe
3f30: 78 74 52 65 70 3b 20 2f 2a 20 31 3a 20 55 54 46  xtRep; /* 1: UTF
3f40: 2d 31 36 2e 20 20 30 3a 20 55 54 46 2d 38 20 2a  -16.  0: UTF-8 *
3f50: 2f 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78 46  /.     void (*xF
3f60: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
3f70: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
3f80: 33 5f 76 61 6c 75 65 20 2a 2a 29 3b 0a 20 20 7d  3_value **);.  }
3f90: 20 61 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20   aFuncs[] = {.  
3fa0: 20 20 7b 20 22 72 61 6e 64 73 74 72 22 2c 20 20    { "randstr",  
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2c 20               2, 
3fc0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 72 61 6e  SQLITE_UTF8, ran
3fd0: 64 53 74 72 20 20 20 20 7d 2c 0a 20 20 20 20 7b  dStr    },.    {
3fe0: 20 22 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f   "test_destructo
3ff0: 72 22 2c 20 20 20 20 20 20 20 31 2c 20 53 51 4c  r",       1, SQL
4000: 49 54 45 5f 55 54 46 38 2c 20 74 65 73 74 5f 64  ITE_UTF8, test_d
4010: 65 73 74 72 75 63 74 6f 72 7d 2c 0a 23 69 66 6e  estructor},.#ifn
4020: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4030: 55 54 46 31 36 0a 20 20 20 20 7b 20 22 74 65 73  UTF16.    { "tes
4040: 74 5f 64 65 73 74 72 75 63 74 6f 72 31 36 22 2c  t_destructor16",
4050: 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55       1, SQLITE_U
4060: 54 46 38 2c 20 74 65 73 74 5f 64 65 73 74 72 75  TF8, test_destru
4070: 63 74 6f 72 31 36 7d 2c 0a 20 20 20 20 7b 20 22  ctor16},.    { "
4080: 68 65 78 5f 74 6f 5f 75 74 66 31 36 62 65 22 2c  hex_to_utf16be",
4090: 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54          1, SQLIT
40a0: 45 5f 55 54 46 38 2c 20 74 65 73 74 48 65 78 54  E_UTF8, testHexT
40b0: 6f 55 74 66 31 36 62 65 7d 2c 0a 20 20 20 20 7b  oUtf16be},.    {
40c0: 20 22 68 65 78 5f 74 6f 5f 75 74 66 31 36 6c 65   "hex_to_utf16le
40d0: 22 2c 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c  ",        1, SQL
40e0: 49 54 45 5f 55 54 46 38 2c 20 74 65 73 74 48 65  ITE_UTF8, testHe
40f0: 78 54 6f 55 74 66 31 36 6c 65 7d 2c 0a 23 65 6e  xToUtf16le},.#en
4100: 64 69 66 0a 20 20 20 20 7b 20 22 68 65 78 5f 74  dif.    { "hex_t
4110: 6f 5f 75 74 66 38 22 2c 20 20 20 20 20 20 20 20  o_utf8",        
4120: 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46     1, SQLITE_UTF
4130: 38 2c 20 74 65 73 74 48 65 78 54 6f 55 74 66 38  8, testHexToUtf8
4140: 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73 74 5f 64  },.    { "test_d
4150: 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 22  estructor_count"
4160: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
4170: 2c 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f  , test_destructo
4180: 72 5f 63 6f 75 6e 74 7d 2c 0a 20 20 20 20 7b 20  r_count},.    { 
4190: 22 74 65 73 74 5f 61 75 78 64 61 74 61 22 2c 20  "test_auxdata", 
41a0: 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49          -1, SQLI
41b0: 54 45 5f 55 54 46 38 2c 20 74 65 73 74 5f 61 75  TE_UTF8, test_au
41c0: 78 64 61 74 61 7d 2c 0a 20 20 20 20 7b 20 22 74  xdata},.    { "t
41d0: 65 73 74 5f 65 72 72 6f 72 22 2c 20 20 20 20 20  est_error",     
41e0: 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45         1, SQLITE
41f0: 5f 55 54 46 38 2c 20 74 65 73 74 5f 65 72 72 6f  _UTF8, test_erro
4200: 72 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73 74 5f  r},.    { "test_
4210: 65 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20  error",         
4220: 20 20 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46     2, SQLITE_UTF
4230: 38 2c 20 74 65 73 74 5f 65 72 72 6f 72 7d 2c 0a  8, test_error},.
4240: 20 20 20 20 7b 20 22 74 65 73 74 5f 65 76 61 6c      { "test_eval
4250: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 31  ",             1
4260: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 74  , SQLITE_UTF8, t
4270: 65 73 74 5f 65 76 61 6c 7d 2c 0a 20 20 20 20 7b  est_eval},.    {
4280: 20 22 74 65 73 74 5f 69 73 6f 6c 61 74 69 6f 6e   "test_isolation
4290: 22 2c 20 20 20 20 20 20 20 20 32 2c 20 53 51 4c  ",        2, SQL
42a0: 49 54 45 5f 55 54 46 38 2c 20 74 65 73 74 5f 69  ITE_UTF8, test_i
42b0: 73 6f 6c 61 74 69 6f 6e 7d 2c 0a 20 20 20 20 7b  solation},.    {
42c0: 20 22 74 65 73 74 5f 63 6f 75 6e 74 65 72 22 2c   "test_counter",
42d0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c            1, SQL
42e0: 49 54 45 5f 55 54 46 38 2c 20 63 6f 75 6e 74 65  ITE_UTF8, counte
42f0: 72 46 75 6e 63 7d 2c 0a 20 20 20 20 7b 20 22 72  rFunc},.    { "r
4300: 65 61 6c 32 68 65 78 22 2c 20 20 20 20 20 20 20  eal2hex",       
4310: 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45         1, SQLITE
4320: 5f 55 54 46 38 2c 20 72 65 61 6c 32 68 65 78 7d  _UTF8, real2hex}
4330: 2c 0a 20 20 20 20 7b 20 22 74 65 73 74 5f 64 65  ,.    { "test_de
4340: 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20  code",          
4350: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
4360: 20 74 65 73 74 5f 64 65 63 6f 64 65 7d 2c 0a 20   test_decode},. 
4370: 20 20 20 7b 20 22 74 65 73 74 5f 65 78 74 72 61     { "test_extra
4380: 63 74 22 2c 20 20 20 20 20 20 20 20 20 20 32 2c  ct",          2,
4390: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 74 65   SQLITE_UTF8, te
43a0: 73 74 5f 65 78 74 72 61 63 74 7d 2c 0a 20 20 7d  st_extract},.  }
43b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f  ;.  int i;..  fo
43c0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
43d0: 61 46 75 6e 63 73 29 2f 73 69 7a 65 6f 66 28 61  aFuncs)/sizeof(a
43e0: 46 75 6e 63 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  Funcs[0]); i++){
43f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
4400: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
4410: 20 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65   aFuncs[i].zName
4420: 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 41 72 67  , aFuncs[i].nArg
4430: 2c 0a 20 20 20 20 20 20 20 20 61 46 75 6e 63 73  ,.        aFuncs
4440: 5b 69 5d 2e 65 54 65 78 74 52 65 70 2c 20 30 2c  [i].eTextRep, 0,
4450: 20 61 46 75 6e 63 73 5b 69 5d 2e 78 46 75 6e 63   aFuncs[i].xFunc
4460: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
4470: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
4480: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
4490: 74 5f 61 67 67 5f 65 72 72 6d 73 67 31 36 22 2c  t_agg_errmsg16",
44a0: 20 30 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20   0, SQLITE_ANY, 
44b0: 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73  0, 0, .      tes
44c0: 74 5f 61 67 67 5f 65 72 72 6d 73 67 31 36 5f 73  t_agg_errmsg16_s
44d0: 74 65 70 2c 20 74 65 73 74 5f 61 67 67 5f 65 72  tep, test_agg_er
44e0: 72 6d 73 67 31 36 5f 66 69 6e 61 6c 29 3b 0a 20  rmsg16_final);. 
44f0: 20 20 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53       .  return S
4500: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
4510: 2a 2a 20 54 43 4c 43 4d 44 3a 20 20 61 75 74 6f  ** TCLCMD:  auto
4520: 69 6e 73 74 61 6c 6c 5f 74 65 73 74 5f 66 75 6e  install_test_fun
4530: 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 49 6e 76  ctions.**.** Inv
4540: 6f 6b 65 20 74 68 69 73 20 54 43 4c 20 63 6f 6d  oke this TCL com
4550: 6d 61 6e 64 20 74 6f 20 75 73 65 20 73 71 6c 69  mand to use sqli
4560: 74 65 33 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69  te3_auto_extensi
4570: 6f 6e 28 29 20 74 6f 20 63 61 75 73 65 0a 2a 2a  on() to cause.**
4580: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 73 65   the standard se
4590: 74 20 6f 66 20 74 65 73 74 20 66 75 6e 63 74 69  t of test functi
45a0: 6f 6e 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64  ons to be loaded
45b0: 20 69 6e 74 6f 20 65 61 63 68 20 6e 65 77 0a 2a   into each new.*
45c0: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
45d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
45e0: 20 69 6e 74 20 61 75 74 6f 69 6e 73 74 61 6c 6c   int autoinstall
45f0: 5f 74 65 73 74 5f 66 75 6e 63 73 28 0a 20 20 76  _test_funcs(.  v
4600: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
4610: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
4620: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
4630: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
4640: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
4650: 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f   extern int Md5_
4660: 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33  Register(sqlite3
4670: 2a 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  *);.  int rc = s
4680: 71 6c 69 74 65 33 5f 61 75 74 6f 5f 65 78 74 65  qlite3_auto_exte
4690: 6e 73 69 6f 6e 28 28 76 6f 69 64 2a 29 72 65 67  nsion((void*)reg
46a0: 69 73 74 65 72 54 65 73 74 46 75 6e 63 74 69 6f  isterTestFunctio
46b0: 6e 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ns);.  if( rc==S
46c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
46d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 61 75 74  rc = sqlite3_aut
46e0: 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 28 76 6f 69  o_extension((voi
46f0: 64 2a 29 4d 64 35 5f 52 65 67 69 73 74 65 72 29  d*)Md5_Register)
4700: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
4710: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
4720: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
4730: 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  c));.  return TC
4740: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  L_OK;.}../*.** A
4750: 20 62 6f 67 75 73 20 73 74 65 70 20 66 75 6e 63   bogus step func
4760: 74 69 6f 6e 20 61 6e 64 20 66 69 6e 61 6c 69 7a  tion and finaliz
4770: 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  er function..*/.
4780: 73 74 61 74 69 63 20 76 6f 69 64 20 74 53 74 65  static void tSte
4790: 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  p(sqlite3_contex
47a0: 74 20 2a 61 2c 20 69 6e 74 20 62 2c 20 73 71 6c  t *a, int b, sql
47b0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 63 29 7b  ite3_value **c){
47c0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 46  }.static void tF
47d0: 69 6e 61 6c 28 73 71 6c 69 74 65 33 5f 63 6f 6e  inal(sqlite3_con
47e0: 74 65 78 74 20 2a 61 29 7b 7d 0a 0a 0a 2f 2a 0a  text *a){}.../*.
47f0: 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 61 62 75 73  ** tclcmd:  abus
4800: 65 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  e_create_functio
4810: 6e 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 76 61 72  n.**.** Make var
4820: 69 6f 75 73 20 63 61 6c 6c 73 20 74 6f 20 73 71  ious calls to sq
4830: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
4840: 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 20 6e 6f  ction that do no
4850: 74 20 68 61 76 65 20 76 61 6c 69 64 0a 2a 2a 20  t have valid.** 
4860: 70 61 72 61 6d 65 74 65 72 73 2e 20 20 56 65 72  parameters.  Ver
4870: 69 66 79 20 74 68 61 74 20 74 68 65 20 65 72 72  ify that the err
4880: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  or condition is 
4890: 64 65 74 65 63 74 65 64 20 61 6e 64 20 72 65 70  detected and rep
48a0: 6f 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  orted..*/.static
48b0: 20 69 6e 74 20 61 62 75 73 65 5f 63 72 65 61 74   int abuse_creat
48c0: 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f  e_function(.  vo
48d0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
48e0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
48f0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
4900: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
4910: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
4920: 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 44 62  extern int getDb
4930: 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65  Pointer(Tcl_Inte
4940: 72 70 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  rp*, const char*
4950: 2c 20 73 71 6c 69 74 65 33 2a 2a 29 3b 0a 20 20  , sqlite3**);.  
4960: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
4970: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 78 41  nt rc;.  int mxA
4980: 72 67 3b 0a 0a 20 20 69 66 28 20 67 65 74 44 62  rg;..  if( getDb
4990: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
49a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
49b0: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
49c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
49d0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
49e0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
49f0: 28 64 62 2c 20 22 74 78 22 2c 20 31 2c 20 53 51  (db, "tx", 1, SQ
4a00: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 53  LITE_UTF8, 0, tS
4a10: 74 65 70 2c 74 53 74 65 70 2c 74 46 69 6e 61 6c  tep,tStep,tFinal
4a20: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
4a30: 49 54 45 5f 4d 49 53 55 53 45 20 29 20 67 6f 74  ITE_MISUSE ) got
4a40: 6f 20 61 62 75 73 65 5f 65 72 72 3b 0a 0a 20 20  o abuse_err;..  
4a50: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
4a60: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
4a70: 20 22 74 78 22 2c 20 31 2c 20 53 51 4c 49 54 45   "tx", 1, SQLITE
4a80: 5f 55 54 46 38 2c 20 30 2c 20 74 53 74 65 70 2c  _UTF8, 0, tStep,
4a90: 20 74 53 74 65 70 2c 20 30 29 3b 0a 20 20 69 66   tStep, 0);.  if
4aa0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53  ( rc!=SQLITE_MIS
4ab0: 55 53 45 20 29 20 67 6f 74 6f 20 61 62 75 73 65  USE ) goto abuse
4ac0: 5f 65 72 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71  _err;..  rc = sq
4ad0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
4ae0: 63 74 69 6f 6e 28 64 62 2c 20 22 74 78 22 2c 20  ction(db, "tx", 
4af0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
4b00: 30 2c 20 74 53 74 65 70 2c 20 30 2c 20 74 46 69  0, tStep, 0, tFi
4b10: 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
4b20: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 29 20 67  SQLITE_MISUSE) g
4b30: 6f 74 6f 20 61 62 75 73 65 5f 65 72 72 3b 0a 0a  oto abuse_err;..
4b40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
4b50: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
4b60: 62 2c 20 22 74 78 22 2c 20 31 2c 20 53 51 4c 49  b, "tx", 1, SQLI
4b70: 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 30  TE_UTF8, 0, 0, 0
4b80: 2c 20 74 46 69 6e 61 6c 29 3b 0a 20 20 69 66 28  , tFinal);.  if(
4b90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55   rc!=SQLITE_MISU
4ba0: 53 45 20 29 20 67 6f 74 6f 20 61 62 75 73 65 5f  SE ) goto abuse_
4bb0: 65 72 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  err;..  rc = sql
4bc0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
4bd0: 74 69 6f 6e 28 64 62 2c 20 22 74 78 22 2c 20 31  tion(db, "tx", 1
4be0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
4bf0: 2c 20 30 2c 20 74 53 74 65 70 2c 20 30 29 3b 0a  , 0, tStep, 0);.
4c00: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4c10: 5f 4d 49 53 55 53 45 20 29 20 67 6f 74 6f 20 61  _MISUSE ) goto a
4c20: 62 75 73 65 5f 65 72 72 3b 0a 0a 20 20 72 63 20  buse_err;..  rc 
4c30: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
4c40: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
4c50: 78 22 2c 20 2d 32 2c 20 53 51 4c 49 54 45 5f 55  x", -2, SQLITE_U
4c60: 54 46 38 2c 20 30 2c 20 74 53 74 65 70 2c 20 30  TF8, 0, tStep, 0
4c70: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
4c80: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 20  SQLITE_MISUSE ) 
4c90: 67 6f 74 6f 20 61 62 75 73 65 5f 65 72 72 3b 0a  goto abuse_err;.
4ca0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
4cb0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
4cc0: 64 62 2c 20 22 74 78 22 2c 20 31 32 38 2c 20 53  db, "tx", 128, S
4cd0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74  QLITE_UTF8, 0, t
4ce0: 53 74 65 70 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Step, 0, 0);.  i
4cf0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49  f( rc!=SQLITE_MI
4d00: 53 55 53 45 20 29 20 67 6f 74 6f 20 61 62 75 73  SUSE ) goto abus
4d10: 65 5f 65 72 72 3b 0a 0a 20 20 72 63 20 3d 20 73  e_err;..  rc = s
4d20: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
4d30: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66 75 6e 63  nction(db, "func
4d40: 78 78 22 0a 20 20 20 20 20 20 20 22 5f 31 32 33  xx".       "_123
4d50: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
4d60: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
4d70: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 22 0a  6789_123456789".
4d80: 20 20 20 20 20 20 20 22 5f 31 32 33 34 35 36 37         "_1234567
4d90: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
4da0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
4db0: 5f 31 32 33 34 35 36 37 38 39 22 0a 20 20 20 20  _123456789".    
4dc0: 20 20 20 22 5f 31 32 33 34 35 36 37 38 39 5f 31     "_123456789_1
4dd0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
4de0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
4df0: 34 35 36 37 38 39 22 0a 20 20 20 20 20 20 20 22  456789".       "
4e00: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
4e10: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
4e20: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
4e30: 38 39 22 0a 20 20 20 20 20 20 20 22 5f 31 32 33  89".       "_123
4e40: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
4e50: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
4e60: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 22 2c  6789_123456789",
4e70: 0a 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54  .       1, SQLIT
4e80: 45 5f 55 54 46 38 2c 20 30 2c 20 74 53 74 65 70  E_UTF8, 0, tStep
4e90: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
4ea0: 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  c!=SQLITE_MISUSE
4eb0: 20 29 20 67 6f 74 6f 20 61 62 75 73 65 5f 65 72   ) goto abuse_er
4ec0: 72 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 61  r;..  /* This la
4ed0: 73 74 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69  st function regi
4ee0: 73 74 72 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  stration should 
4ef0: 61 63 74 75 61 6c 6c 79 20 77 6f 72 6b 2e 20 20  actually work.  
4f00: 47 65 6e 65 72 61 74 65 0a 20 20 2a 2a 20 61 20  Generate.  ** a 
4f10: 6e 6f 2d 6f 70 20 66 75 6e 63 74 69 6f 6e 20 28  no-op function (
4f20: 74 68 61 74 20 61 6c 77 61 79 73 20 72 65 74 75  that always retu
4f30: 72 6e 73 20 4e 55 4c 4c 29 20 61 6e 64 20 77 68  rns NULL) and wh
4f40: 69 63 68 20 68 61 73 20 74 68 65 0a 20 20 2a 2a  ich has the.  **
4f50: 20 6d 61 78 69 6d 75 6d 2d 6c 65 6e 67 74 68 20   maximum-length 
4f60: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 61 6e  function name an
4f70: 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  d the maximum nu
4f80: 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65  mber of paramete
4f90: 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  rs..  */.  sqlit
4fa0: 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c  e3_limit(db, SQL
4fb0: 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
4fc0: 4f 4e 5f 41 52 47 2c 20 31 30 30 30 30 29 3b 0a  ON_ARG, 10000);.
4fd0: 20 20 6d 78 41 72 67 20 3d 20 73 71 6c 69 74 65    mxArg = sqlite
4fe0: 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49  3_limit(db, SQLI
4ff0: 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
5000: 4e 5f 41 52 47 2c 20 2d 31 29 3b 0a 20 20 72 63  N_ARG, -1);.  rc
5010: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
5020: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
5030: 6e 75 6c 6c 78 22 0a 20 20 20 20 20 20 20 22 5f  nullx".       "_
5040: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
5050: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
5060: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
5070: 39 22 0a 20 20 20 20 20 20 20 22 5f 31 32 33 34  9".       "_1234
5080: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
5090: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
50a0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 22 0a 20  789_123456789". 
50b0: 20 20 20 20 20 20 22 5f 31 32 33 34 35 36 37 38        "_12345678
50c0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
50d0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
50e0: 31 32 33 34 35 36 37 38 39 22 0a 20 20 20 20 20  123456789".     
50f0: 20 20 22 5f 31 32 33 34 35 36 37 38 39 5f 31 32    "_123456789_12
5100: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
5110: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
5120: 35 36 37 38 39 22 0a 20 20 20 20 20 20 20 22 5f  56789".       "_
5130: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
5140: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
5150: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
5160: 39 22 2c 0a 20 20 20 20 20 20 20 6d 78 41 72 67  9",.       mxArg
5170: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
5180: 2c 20 74 53 74 65 70 2c 20 30 2c 20 30 29 3b 0a  , tStep, 0, 0);.
5190: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
51a0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 75 73 65  _OK ) goto abuse
51b0: 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20  _err;.          
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 0a 20 20 72 65 74 75 72 6e 20        .  return 
51e0: 54 43 4c 5f 4f 4b 3b 0a 0a 61 62 75 73 65 5f 65  TCL_OK;..abuse_e
51f0: 72 72 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  rr:.  Tcl_Append
5200: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
5210: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
5220: 75 6e 63 74 69 6f 6e 20 61 62 75 73 65 64 20 74  unction abused t
5230: 65 73 74 20 66 61 69 6c 65 64 22 2c 20 0a 20 20  est failed", .  
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65   (char*)0);.  re
5260: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5270: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
5280: 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20  r commands with 
5290: 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  the TCL interpre
52a0: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69  ter..*/.int Sqli
52b0: 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74  tetest_func_Init
52c0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
52d0: 65 72 70 29 7b 0a 20 20 73 74 61 74 69 63 20 73  erp){.  static s
52e0: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
52f0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54  r *zName;.     T
5300: 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78  cl_ObjCmdProc *x
5310: 50 72 6f 63 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d  Proc;.  } aObjCm
5320: 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22  d[] = {.     { "
5330: 61 75 74 6f 69 6e 73 74 61 6c 6c 5f 74 65 73 74  autoinstall_test
5340: 5f 66 75 6e 63 74 69 6f 6e 73 22 2c 20 20 20 20  _functions",    
5350: 61 75 74 6f 69 6e 73 74 61 6c 6c 5f 74 65 73 74  autoinstall_test
5360: 5f 66 75 6e 63 73 20 7d 2c 0a 20 20 20 20 20 7b  _funcs },.     {
5370: 20 22 61 62 75 73 65 5f 63 72 65 61 74 65 5f 66   "abuse_create_f
5380: 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  unction",       
5390: 20 20 61 62 75 73 65 5f 63 72 65 61 74 65 5f 66    abuse_create_f
53a0: 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 7d 3b  unction  },.  };
53b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 65 78 74 65  .  int i;.  exte
53c0: 72 6e 20 69 6e 74 20 4d 64 35 5f 52 65 67 69 73  rn int Md5_Regis
53d0: 74 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 0a  ter(sqlite3*);..
53e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
53f0: 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a  eof(aObjCmd)/siz
5400: 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b  eof(aObjCmd[0]);
5410: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43   i++){.    Tcl_C
5420: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
5430: 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b  interp, aObjCmd[
5440: 69 5d 2e 7a 4e 61 6d 65 2c 20 61 4f 62 6a 43 6d  i].zName, aObjCm
5450: 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30  d[i].xProc, 0, 0
5460: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
5470: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
5480: 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 5f 65 78   sqlite3_auto_ex
5490: 74 65 6e 73 69 6f 6e 28 28 76 6f 69 64 2a 29 72  tension((void*)r
54a0: 65 67 69 73 74 65 72 54 65 73 74 46 75 6e 63 74  egisterTestFunct
54b0: 69 6f 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  ions);.  sqlite3
54c0: 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28  _auto_extension(
54d0: 28 76 6f 69 64 2a 29 4d 64 35 5f 52 65 67 69 73  (void*)Md5_Regis
54e0: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ter);.  return T
54f0: 43 4c 5f 4f 4b 3b 0a 7d 0a                       CL_OK;.}.