/ Hex Artifact Content
Login

Artifact c6e9d7cfbd7bb0bd7c392a10d76adab4b48e813b:


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 2a 0a 2a  st scripts..**.*
01f0: 2a 20 24 49 64 3a 20 74 65 73 74 5f 66 75 6e 63  * $Id: test_func
0200: 2e 63 2c 76 20 31 2e 31 36 20 32 30 30 39 2f 30  .c,v 1.16 2009/0
0210: 37 2f 32 32 20 30 37 3a 32 37 3a 35 37 20 64 61  7/22 07:27:57 da
0220: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
0230: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0240: 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ite3.h".#include
0250: 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64   "tcl.h".#includ
0260: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e  e <stdlib.h>.#in
0270: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
0280: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
0290: 74 2e 68 3e 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  t.h>.../*.** All
02a0: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
02b0: 73 20 6f 66 20 73 70 61 63 65 20 75 73 69 6e 67  s of space using
02c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
02d0: 29 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 6c 6c  ). If the.** all
02e0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 63  ocation fails, c
02f0: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 72 65 73 75  all sqlite3_resu
0300: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 29  lt_error_nomem()
0310: 20 74 6f 20 6e 6f 74 69 66 79 0a 2a 2a 20 74 68   to notify.** th
0320: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
0330: 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 28 29 20  e that malloc() 
0340: 68 61 73 20 66 61 69 6c 65 64 2e 0a 2a 2f 0a 73  has failed..*/.s
0350: 74 61 74 69 63 20 76 6f 69 64 20 2a 74 65 73 74  tatic void *test
0360: 43 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 73 71  ContextMalloc(sq
0370: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
0380: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 6e 42 79 74  ontext, int nByt
0390: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20  e){.  char *z = 
03a0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
03b0: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21 7a 20  Byte);.  if( !z 
03c0: 26 26 20 6e 42 79 74 65 3e 30 20 29 7b 0a 20 20  && nByte>0 ){.  
03d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
03e0: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
03f0: 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  text);.  }.  ret
0400: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
0410: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65  This function ge
0420: 6e 65 72 61 74 65 73 20 61 20 73 74 72 69 6e 67  nerates a string
0430: 20 6f 66 20 72 61 6e 64 6f 6d 20 63 68 61 72 61   of random chara
0440: 63 74 65 72 73 2e 20 20 55 73 65 64 20 66 6f 72  cters.  Used for
0450: 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 74  .** generating t
0460: 65 73 74 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  est data..*/.sta
0470: 74 69 63 20 76 6f 69 64 20 72 61 6e 64 53 74 72  tic void randStr
0480: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
0490: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
04a0: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
04b0: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 73 74  ue **argv){.  st
04c0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
04d0: 6e 65 64 20 63 68 61 72 20 7a 53 72 63 5b 5d 20  ned char zSrc[] 
04e0: 3d 20 0a 20 20 20 20 20 22 61 62 63 64 65 66 67  = .     "abcdefg
04f0: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
0500: 78 79 7a 22 0a 20 20 20 20 20 22 41 42 43 44 45  xyz".     "ABCDE
0510: 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
0520: 56 57 58 59 5a 22 0a 20 20 20 20 20 22 30 31 32  VWXYZ".     "012
0530: 33 34 35 36 37 38 39 22 0a 20 20 20 20 20 22 2e  3456789".     ".
0540: 2d 21 2c 3a 2a 5e 2b 3d 5f 7c 3f 2f 3c 3e 20 22  -!,:*^+=_|?/<> "
0550: 3b 0a 20 20 69 6e 74 20 69 4d 69 6e 2c 20 69 4d  ;.  int iMin, iM
0560: 61 78 2c 20 6e 2c 20 72 2c 20 69 3b 0a 20 20 75  ax, n, r, i;.  u
0570: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 42 75  nsigned char zBu
0580: 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 2f 2a 20 49  f[1000];..  /* I
0590: 74 20 75 73 65 64 20 74 6f 20 62 65 20 70 6f 73  t used to be pos
05a0: 73 69 62 6c 65 20 74 6f 20 63 61 6c 6c 20 72 61  sible to call ra
05b0: 6e 64 73 74 72 28 29 20 77 69 74 68 20 61 6e 79  ndstr() with any
05c0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
05d0: 65 6e 74 73 2c 0a 20 20 2a 2a 20 62 75 74 20 6e  ents,.  ** but n
05e0: 6f 77 20 69 74 20 69 73 20 72 65 67 69 73 74 65  ow it is registe
05f0: 72 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 20  red with SQLite 
0600: 61 73 20 72 65 71 75 69 72 69 6e 67 20 65 78 61  as requiring exa
0610: 63 74 6c 79 20 32 2e 0a 20 20 2a 2f 0a 20 20 61  ctly 2..  */.  a
0620: 73 73 65 72 74 28 61 72 67 63 3d 3d 32 29 3b 0a  ssert(argc==2);.
0630: 0a 20 20 69 4d 69 6e 20 3d 20 73 71 6c 69 74 65  .  iMin = sqlite
0640: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
0650: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 69 4d 69 6e  [0]);.  if( iMin
0660: 3c 30 20 29 20 69 4d 69 6e 20 3d 20 30 3b 0a 20  <0 ) iMin = 0;. 
0670: 20 69 66 28 20 69 4d 69 6e 3e 3d 73 69 7a 65 6f   if( iMin>=sizeo
0680: 66 28 7a 42 75 66 29 20 29 20 69 4d 69 6e 20 3d  f(zBuf) ) iMin =
0690: 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 3b   sizeof(zBuf)-1;
06a0: 0a 20 20 69 4d 61 78 20 3d 20 73 71 6c 69 74 65  .  iMax = sqlite
06b0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
06c0: 5b 31 5d 29 3b 0a 20 20 69 66 28 20 69 4d 61 78  [1]);.  if( iMax
06d0: 3c 69 4d 69 6e 20 29 20 69 4d 61 78 20 3d 20 69  <iMin ) iMax = i
06e0: 4d 69 6e 3b 0a 20 20 69 66 28 20 69 4d 61 78 3e  Min;.  if( iMax>
06f0: 3d 73 69 7a 65 6f 66 28 7a 42 75 66 29 20 29 20  =sizeof(zBuf) ) 
0700: 69 4d 61 78 20 3d 20 73 69 7a 65 6f 66 28 7a 42  iMax = sizeof(zB
0710: 75 66 29 2d 31 3b 0a 20 20 6e 20 3d 20 69 4d 69  uf)-1;.  n = iMi
0720: 6e 3b 0a 20 20 69 66 28 20 69 4d 61 78 3e 69 4d  n;.  if( iMax>iM
0730: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
0740: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
0750: 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20  eof(r), &r);.   
0760: 20 72 20 26 3d 20 30 78 37 66 66 66 66 66 66 66   r &= 0x7fffffff
0770: 3b 0a 20 20 20 20 6e 20 2b 3d 20 72 25 28 69 4d  ;.    n += r%(iM
0780: 61 78 20 2b 20 31 20 2d 20 69 4d 69 6e 29 3b 0a  ax + 1 - iMin);.
0790: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3c    }.  assert( n<
07a0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 20 29 3b 0a  sizeof(zBuf) );.
07b0: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
07c0: 6e 65 73 73 28 6e 2c 20 7a 42 75 66 29 3b 0a 20  ness(n, zBuf);. 
07d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
07e0: 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 69 5d  ++){.    zBuf[i]
07f0: 20 3d 20 7a 53 72 63 5b 7a 42 75 66 5b 69 5d 25   = zSrc[zBuf[i]%
0800: 28 73 69 7a 65 6f 66 28 7a 53 72 63 29 2d 31 29  (sizeof(zSrc)-1)
0810: 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6e 5d  ];.  }.  zBuf[n]
0820: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
0830: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
0840: 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 42 75 66  ext, (char*)zBuf
0850: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
0860: 53 49 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  SIENT);.}../*.**
0870: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
0880: 77 6f 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  wo SQL functions
0890: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 65 73   are used to tes
08a0: 74 20 72 65 74 75 72 6e 69 6e 67 20 61 20 74 65  t returning a te
08b0: 78 74 0a 2a 2a 20 72 65 73 75 6c 74 20 77 69 74  xt.** result wit
08c0: 68 20 61 20 64 65 73 74 72 75 63 74 6f 72 2e 20  h a destructor. 
08d0: 46 75 6e 63 74 69 6f 6e 20 27 74 65 73 74 5f 64  Function 'test_d
08e0: 65 73 74 72 75 63 74 6f 72 27 20 74 61 6b 65 73  estructor' takes
08f0: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a   one argument.**
0900: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
0910: 20 73 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69   same argument i
0920: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 54 45  nterpreted as TE
0930: 58 54 2e 20 41 20 64 65 73 74 72 75 63 74 6f 72  XT. A destructor
0940: 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 77 69   is.** passed wi
0950: 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 72  th the sqlite3_r
0960: 65 73 75 6c 74 5f 74 65 78 74 28 29 20 63 61 6c  esult_text() cal
0970: 6c 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e  l..**.** SQL fun
0980: 63 74 69 6f 6e 20 27 74 65 73 74 5f 64 65 73 74  ction 'test_dest
0990: 72 75 63 74 6f 72 5f 63 6f 75 6e 74 27 20 72 65  ructor_count' re
09a0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
09b0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
09c0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  .** allocations 
09d0: 6d 61 64 65 20 62 79 20 27 74 65 73 74 5f 64 65  made by 'test_de
09e0: 73 74 72 75 63 74 6f 72 27 3b 0a 2a 2a 0a 2a 2a  structor';.**.**
09f0: 20 57 41 52 4e 49 4e 47 3a 20 4e 6f 74 20 74 68   WARNING: Not th
0a00: 72 65 61 64 73 61 66 65 2e 0a 2a 2f 0a 73 74 61  readsafe..*/.sta
0a10: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 65 73  tic int test_des
0a20: 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 5f 76 61  tructor_count_va
0a30: 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f  r = 0;.static vo
0a40: 69 64 20 64 65 73 74 72 75 63 74 6f 72 28 76 6f  id destructor(vo
0a50: 69 64 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  id *p){.  char *
0a60: 7a 56 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 70  zVal = (char *)p
0a70: 3b 0a 20 20 61 73 73 65 72 74 28 7a 56 61 6c 29  ;.  assert(zVal)
0a80: 3b 0a 20 20 7a 56 61 6c 2d 2d 3b 0a 20 20 73 71  ;.  zVal--;.  sq
0a90: 6c 69 74 65 33 5f 66 72 65 65 28 7a 56 61 6c 29  lite3_free(zVal)
0aa0: 3b 0a 20 20 74 65 73 74 5f 64 65 73 74 72 75 63  ;.  test_destruc
0ab0: 74 6f 72 5f 63 6f 75 6e 74 5f 76 61 72 2d 2d 3b  tor_count_var--;
0ac0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
0ad0: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28 0a  est_destructor(.
0ae0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
0af0: 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
0b00: 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
0b10: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
0b20: 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20    char *zVal;.  
0b30: 69 6e 74 20 6c 65 6e 3b 0a 20 20 0a 20 20 74 65  int len;.  .  te
0b40: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  st_destructor_co
0b50: 75 6e 74 5f 76 61 72 2b 2b 3b 0a 20 20 61 73 73  unt_var++;.  ass
0b60: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
0b70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
0b80: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
0b90: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
0ba0: 20 72 65 74 75 72 6e 3b 0a 20 20 6c 65 6e 20 3d   return;.  len =
0bb0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
0bc0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 20 0a  ytes(argv[0]); .
0bd0: 20 20 7a 56 61 6c 20 3d 20 74 65 73 74 43 6f 6e    zVal = testCon
0be0: 74 65 78 74 4d 61 6c 6c 6f 63 28 70 43 74 78 2c  textMalloc(pCtx,
0bf0: 20 6c 65 6e 2b 33 29 3b 0a 20 20 69 66 28 20 21   len+3);.  if( !
0c00: 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  zVal ){.    retu
0c10: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 56 61 6c 5b 6c  rn;.  }.  zVal[l
0c20: 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 7a 56 61  en+1] = 0;.  zVa
0c30: 6c 5b 6c 65 6e 2b 32 5d 20 3d 20 30 3b 0a 20 20  l[len+2] = 0;.  
0c40: 7a 56 61 6c 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  zVal++;.  memcpy
0c50: 28 7a 56 61 6c 2c 20 73 71 6c 69 74 65 33 5f 76  (zVal, sqlite3_v
0c60: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
0c70: 5d 29 2c 20 6c 65 6e 29 3b 0a 20 20 73 71 6c 69  ]), len);.  sqli
0c80: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
0c90: 70 43 74 78 2c 20 7a 56 61 6c 2c 20 2d 31 2c 20  pCtx, zVal, -1, 
0ca0: 64 65 73 74 72 75 63 74 6f 72 29 3b 0a 7d 0a 23  destructor);.}.#
0cb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0cc0: 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20  IT_UTF16.static 
0cd0: 76 6f 69 64 20 74 65 73 74 5f 64 65 73 74 72 75  void test_destru
0ce0: 63 74 6f 72 31 36 28 0a 20 20 73 71 6c 69 74 65  ctor16(.  sqlite
0cf0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
0d00: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
0d10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0d20: 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 2a  argv.){.  char *
0d30: 7a 56 61 6c 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  zVal;.  int len;
0d40: 0a 20 20 0a 20 20 74 65 73 74 5f 64 65 73 74 72  .  .  test_destr
0d50: 75 63 74 6f 72 5f 63 6f 75 6e 74 5f 76 61 72 2b  uctor_count_var+
0d60: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  +;.  assert( nAr
0d70: 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71  g==1 );.  if( sq
0d80: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
0d90: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
0da0: 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b  E_NULL ) return;
0db0: 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33  .  len = sqlite3
0dc0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28 61  _value_bytes16(a
0dd0: 72 67 76 5b 30 5d 29 3b 20 0a 20 20 7a 56 61 6c  rgv[0]); .  zVal
0de0: 20 3d 20 74 65 73 74 43 6f 6e 74 65 78 74 4d 61   = testContextMa
0df0: 6c 6c 6f 63 28 70 43 74 78 2c 20 6c 65 6e 2b 33  lloc(pCtx, len+3
0e00: 29 3b 0a 20 20 69 66 28 20 21 7a 56 61 6c 20 29  );.  if( !zVal )
0e10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
0e20: 7d 0a 20 20 7a 56 61 6c 5b 6c 65 6e 2b 31 5d 20  }.  zVal[len+1] 
0e30: 3d 20 30 3b 0a 20 20 7a 56 61 6c 5b 6c 65 6e 2b  = 0;.  zVal[len+
0e40: 32 5d 20 3d 20 30 3b 0a 20 20 7a 56 61 6c 2b 2b  2] = 0;.  zVal++
0e50: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 56 61 6c 2c  ;.  memcpy(zVal,
0e60: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
0e70: 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 2c 20  ext16(argv[0]), 
0e80: 6c 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  len);.  sqlite3_
0e90: 72 65 73 75 6c 74 5f 74 65 78 74 31 36 28 70 43  result_text16(pC
0ea0: 74 78 2c 20 7a 56 61 6c 2c 20 2d 31 2c 20 64 65  tx, zVal, -1, de
0eb0: 73 74 72 75 63 74 6f 72 29 3b 0a 7d 0a 23 65 6e  structor);.}.#en
0ec0: 64 69 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20  dif.static void 
0ed0: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  test_destructor_
0ee0: 63 6f 75 6e 74 28 0a 20 20 73 71 6c 69 74 65 33  count(.  sqlite3
0ef0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
0f00: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
0f10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
0f20: 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
0f30: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78  _result_int(pCtx
0f40: 2c 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f  , test_destructo
0f50: 72 5f 63 6f 75 6e 74 5f 76 61 72 29 3b 0a 7d 0a  r_count_var);.}.
0f60: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
0f70: 77 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 66  wing aggregate f
0f80: 75 6e 63 74 69 6f 6e 2c 20 74 65 73 74 5f 61 67  unction, test_ag
0f90: 67 5f 65 72 72 6d 73 67 31 36 28 29 2c 20 74 61  g_errmsg16(), ta
0fa0: 6b 65 73 20 7a 65 72 6f 20 0a 2a 2a 20 61 72 67  kes zero .** arg
0fb0: 75 6d 65 6e 74 73 2e 20 49 74 20 72 65 74 75 72  uments. It retur
0fc0: 6e 73 20 74 68 65 20 74 65 78 74 20 76 61 6c 75  ns the text valu
0fd0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
0fe0: 65 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  e sqlite3_errmsg
0ff0: 31 36 28 29 0a 2a 2a 20 41 50 49 20 66 75 6e 63  16().** API func
1000: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
1010: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
1020: 4d 61 6c 6c 6f 63 28 76 6f 69 64 29 3b 0a 76 6f  Malloc(void);.vo
1030: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  id sqlite3EndBen
1040: 69 67 6e 4d 61 6c 6c 6f 63 28 76 6f 69 64 29 3b  ignMalloc(void);
1050: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
1060: 74 5f 61 67 67 5f 65 72 72 6d 73 67 31 36 5f 73  t_agg_errmsg16_s
1070: 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  tep(sqlite3_cont
1080: 65 78 74 20 2a 61 2c 20 69 6e 74 20 62 2c 73 71  ext *a, int b,sq
1090: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 63 29  lite3_value **c)
10a0: 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  {.}.static void 
10b0: 74 65 73 74 5f 61 67 67 5f 65 72 72 6d 73 67 31  test_agg_errmsg1
10c0: 36 5f 66 69 6e 61 6c 28 73 71 6c 69 74 65 33 5f  6_final(sqlite3_
10d0: 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 23  context *ctx){.#
10e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10f0: 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73 74  IT_UTF16.  const
1100: 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 73 71 6c 69   void *z;.  sqli
1110: 74 65 33 20 2a 20 64 62 20 3d 20 73 71 6c 69 74  te3 * db = sqlit
1120: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
1130: 6e 64 6c 65 28 63 74 78 29 3b 0a 20 20 73 71 6c  ndle(ctx);.  sql
1140: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
1150: 6f 6e 74 65 78 74 28 63 74 78 2c 20 32 30 34 38  ontext(ctx, 2048
1160: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
1170: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
1180: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 65  .  z = sqlite3_e
1190: 72 72 6d 73 67 31 36 28 64 62 29 3b 0a 20 20 73  rrmsg16(db);.  s
11a0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
11b0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 73 71 6c 69 74  alloc();.  sqlit
11c0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
11d0: 28 63 74 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  (ctx, z, -1, SQL
11e0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
11f0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
1200: 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 65 73  Routines for tes
1210: 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  ting the sqlite3
1220: 5f 67 65 74 5f 61 75 78 64 61 74 61 28 29 20 61  _get_auxdata() a
1230: 6e 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61  nd sqlite3_set_a
1240: 75 78 64 61 74 61 28 29 0a 2a 2a 20 69 6e 74 65  uxdata().** inte
1250: 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rface..**.** The
1260: 20 74 65 73 74 5f 61 75 78 64 61 74 61 28 29 20   test_auxdata() 
1270: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  SQL function att
1280: 65 6d 70 74 73 20 74 6f 20 72 65 67 69 73 74 65  empts to registe
1290: 72 20 65 61 63 68 20 6f 66 20 69 74 73 20 61 72  r each of its ar
12a0: 67 75 6d 65 6e 74 73 0a 2a 2a 20 61 73 20 61 75  guments.** as au
12b0: 78 69 6c 69 61 72 79 20 64 61 74 61 2e 20 20 49  xiliary data.  I
12c0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 70  f there are no p
12d0: 72 69 6f 72 20 72 65 67 69 73 74 72 61 74 69 6f  rior registratio
12e0: 6e 73 20 6f 66 20 61 75 78 20 64 61 74 61 20 66  ns of aux data f
12f0: 6f 72 0a 2a 2a 20 74 68 61 74 20 61 72 67 75 6d  or.** that argum
1300: 65 6e 74 20 28 6d 65 61 6e 69 6e 67 20 74 68 65  ent (meaning the
1310: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
1320: 20 61 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 74   a constant or t
1330: 68 69 73 20 69 73 20 69 74 73 20 66 69 72 73 74  his is its first
1340: 0a 2a 2a 20 63 61 6c 6c 29 20 74 68 65 6e 20 74  .** call) then t
1350: 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 74 68  he result for th
1360: 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 30  at argument is 0
1370: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
1380: 20 70 72 69 6f 72 0a 2a 2a 20 72 65 67 69 73 74   prior.** regist
1390: 72 61 74 69 6f 6e 2c 20 74 68 65 20 72 65 73 75  ration, the resu
13a0: 6c 74 20 66 6f 72 20 74 68 61 74 20 61 72 67 75  lt for that argu
13b0: 6d 65 6e 74 20 69 73 20 31 2e 20 20 54 68 65 20  ment is 1.  The 
13c0: 6f 76 65 72 61 6c 6c 20 72 65 73 75 6c 74 0a 2a  overall result.*
13d0: 2a 20 69 73 20 74 68 65 20 69 6e 64 69 76 69 64  * is the individ
13e0: 75 61 6c 20 61 72 67 75 6d 65 6e 74 20 72 65 73  ual argument res
13f0: 75 6c 74 73 20 73 65 70 61 72 61 74 65 64 20 62  ults separated b
1400: 79 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  y spaces..*/.sta
1410: 74 69 63 20 76 6f 69 64 20 66 72 65 65 5f 74 65  tic void free_te
1420: 73 74 5f 61 75 78 64 61 74 61 28 76 6f 69 64 20  st_auxdata(void 
1430: 2a 70 29 20 7b 73 71 6c 69 74 65 33 5f 66 72 65  *p) {sqlite3_fre
1440: 65 28 70 29 3b 7d 0a 73 74 61 74 69 63 20 76 6f  e(p);}.static vo
1450: 69 64 20 74 65 73 74 5f 61 75 78 64 61 74 61 28  id test_auxdata(
1460: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1470: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
1480: 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
1490: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
14a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
14b0: 20 2a 7a 52 65 74 20 3d 20 74 65 73 74 43 6f 6e   *zRet = testCon
14c0: 74 65 78 74 4d 61 6c 6c 6f 63 28 70 43 74 78 2c  textMalloc(pCtx,
14d0: 20 6e 41 72 67 2a 32 29 3b 0a 20 20 69 66 28 20   nArg*2);.  if( 
14e0: 21 7a 52 65 74 20 29 20 72 65 74 75 72 6e 3b 0a  !zRet ) return;.
14f0: 20 20 6d 65 6d 73 65 74 28 7a 52 65 74 2c 20 30    memset(zRet, 0
1500: 2c 20 6e 41 72 67 2a 32 29 3b 0a 20 20 66 6f 72  , nArg*2);.  for
1510: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
1520: 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e  +){.    char con
1530: 73 74 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 73  st *z = (char*)s
1540: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1550: 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  t(argv[i]);.    
1560: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 69  if( z ){.      i
1570: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 68 61 72  nt n;.      char
1580: 20 2a 7a 41 75 78 20 3d 20 73 71 6c 69 74 65 33   *zAux = sqlite3
1590: 5f 67 65 74 5f 61 75 78 64 61 74 61 28 70 43 74  _get_auxdata(pCt
15a0: 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  x, i);.      if(
15b0: 20 7a 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20   zAux ){.       
15c0: 20 7a 52 65 74 5b 69 2a 32 5d 20 3d 20 27 31 27   zRet[i*2] = '1'
15d0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15e0: 28 20 73 74 72 63 6d 70 28 7a 41 75 78 2c 7a 29  ( strcmp(zAux,z)
15f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ==0 );.      }el
1600: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  se {.        zRe
1610: 74 5b 69 2a 32 5d 20 3d 20 27 30 27 3b 0a 20 20  t[i*2] = '0';.  
1620: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20      }.      n = 
1630: 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31 3b 0a 20  strlen(z) + 1;. 
1640: 20 20 20 20 20 7a 41 75 78 20 3d 20 74 65 73 74       zAux = test
1650: 43 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 70 43  ContextMalloc(pC
1660: 74 78 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  tx, n);.      if
1670: 28 20 7a 41 75 78 20 29 7b 0a 20 20 20 20 20 20  ( zAux ){.      
1680: 20 20 6d 65 6d 63 70 79 28 7a 41 75 78 2c 20 7a    memcpy(zAux, z
1690: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , n);.        sq
16a0: 6c 69 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74  lite3_set_auxdat
16b0: 61 28 70 43 74 78 2c 20 69 2c 20 7a 41 75 78 2c  a(pCtx, i, zAux,
16c0: 20 66 72 65 65 5f 74 65 73 74 5f 61 75 78 64 61   free_test_auxda
16d0: 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
16e0: 20 20 20 7a 52 65 74 5b 69 2a 32 2b 31 5d 20 3d     zRet[i*2+1] =
16f0: 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   ' ';.    }.  }.
1700: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1710: 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 52 65 74  _text(pCtx, zRet
1720: 2c 20 32 2a 6e 41 72 67 2d 31 2c 20 66 72 65 65  , 2*nArg-1, free
1730: 5f 74 65 73 74 5f 61 75 78 64 61 74 61 29 3b 0a  _test_auxdata);.
1740: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 66 75 6e 63 74  }../*.** A funct
1750: 69 6f 6e 20 74 6f 20 74 65 73 74 20 65 72 72 6f  ion to test erro
1760: 72 20 72 65 70 6f 72 74 69 6e 67 20 66 72 6f 6d  r reporting from
1770: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e   user functions.
1780: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
1790: 2a 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79  * returns a copy
17a0: 20 6f 66 20 69 74 73 20 66 69 72 73 74 20 61 72   of its first ar
17b0: 67 75 6d 65 6e 74 20 61 73 20 74 68 65 20 65 72  gument as the er
17c0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 20 49 66  ror message.  If
17d0: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61   the.** second a
17e0: 72 67 75 6d 65 6e 74 20 65 78 69 73 74 73 2c 20  rgument exists, 
17f0: 69 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20 65  it becomes the e
1800: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
1810: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 65  atic void test_e
1820: 72 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  rror(.  sqlite3_
1830: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
1840: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
1850: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1860: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  gv.){.  sqlite3_
1870: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
1880: 78 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  x, (char*)sqlite
1890: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
18a0: 76 5b 30 5d 29 2c 20 2d 31 29 3b 0a 20 20 69 66  v[0]), -1);.  if
18b0: 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
18c0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
18d0: 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c  error_code(pCtx,
18e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
18f0: 6e 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20  nt(argv[1]));.  
1900: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  }.}../*.** Imple
1910: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1920: 20 63 6f 75 6e 74 65 72 28 58 29 20 66 75 6e 63   counter(X) func
1930: 74 69 6f 6e 2e 20 20 49 66 20 58 20 69 73 20 61  tion.  If X is a
1940: 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e  n integer.** con
1950: 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  stant, then the 
1960: 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e  first invocation
1970: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 58 2e 20   will return X. 
1980: 20 54 68 65 20 73 65 63 6f 6e 64 20 58 2b 31 2e   The second X+1.
1990: 0a 2a 2a 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  .** and so forth
19a0: 2e 20 20 43 61 6e 20 62 65 20 75 73 65 64 20 28  .  Can be used (
19b0: 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 74 6f 20  for example) to 
19c0: 70 72 6f 76 69 64 65 20 61 20 73 65 71 75 65 6e  provide a sequen
19d0: 63 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 69 6e 20  ce number.** in 
19e0: 61 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  a result set..*/
19f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75  .static void cou
1a00: 6e 74 65 72 46 75 6e 63 28 0a 20 20 73 71 6c 69  nterFunc(.  sqli
1a10: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
1a20: 78 2c 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  x,   /* Function
1a30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
1a40: 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
1a50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1a60: 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
1a70: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69  uments */.  sqli
1a80: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
1a90: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 66       /* Values f
1aa0: 6f 72 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  or all function 
1ab0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1ac0: 20 20 69 6e 74 20 2a 70 43 6f 75 6e 74 65 72 20    int *pCounter 
1ad0: 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f  = (int*)sqlite3_
1ae0: 67 65 74 5f 61 75 78 64 61 74 61 28 70 43 74 78  get_auxdata(pCtx
1af0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 75  , 0);.  if( pCou
1b00: 6e 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nter==0 ){.    p
1b10: 43 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  Counter = sqlite
1b20: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
1b30: 28 2a 70 43 6f 75 6e 74 65 72 29 20 29 3b 0a 20  (*pCounter) );. 
1b40: 20 20 20 69 66 28 20 70 43 6f 75 6e 74 65 72 3d     if( pCounter=
1b50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1b60: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
1b70: 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20  _nomem(pCtx);.  
1b80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1b90: 7d 0a 20 20 20 20 2a 70 43 6f 75 6e 74 65 72 20  }.    *pCounter 
1ba0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1bb0: 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  int(argv[0]);.  
1bc0: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
1bd0: 78 64 61 74 61 28 70 43 74 78 2c 20 30 2c 20 70  xdata(pCtx, 0, p
1be0: 43 6f 75 6e 74 65 72 2c 20 73 71 6c 69 74 65 33  Counter, sqlite3
1bf0: 5f 66 72 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  _free);.  }else{
1c00: 0a 20 20 20 20 2b 2b 2a 70 43 6f 75 6e 74 65 72  .    ++*pCounter
1c10: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1c20: 72 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c  result_int(pCtx,
1c30: 20 2a 70 43 6f 75 6e 74 65 72 29 3b 0a 7d 0a 0a   *pCounter);.}..
1c40: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1c50: 74 69 6f 6e 20 74 61 6b 65 73 20 74 77 6f 20 61  tion takes two a
1c60: 72 67 75 6d 65 6e 74 73 2e 20 20 49 74 20 70 65  rguments.  It pe
1c70: 72 66 6f 72 6d 61 6e 63 65 20 55 54 46 2d 38 2f  rformance UTF-8/
1c80: 31 36 20 74 79 70 65 0a 2a 2a 20 63 6f 6e 76 65  16 type.** conve
1c90: 72 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 66 69  rsions on the fi
1ca0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 68 65  rst argument the
1cb0: 6e 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79  n returns a copy
1cc0: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   of the second.*
1cd0: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
1ce0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1cf0: 69 73 20 75 73 65 64 20 69 6e 20 63 61 73 65 73  is used in cases
1d00: 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c   such as the fol
1d10: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
1d20: 20 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 69     SELECT test_i
1d30: 73 6f 6c 61 74 69 6f 6e 28 78 2c 78 29 20 46 52  solation(x,x) FR
1d40: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 57 65 20  OM t1;.**.** We 
1d50: 77 61 6e 74 20 74 6f 20 76 65 72 69 66 79 20 74  want to verify t
1d60: 68 61 74 20 74 68 65 20 74 79 70 65 20 63 6f 6e  hat the type con
1d70: 76 65 72 73 69 6f 6e 73 20 74 68 61 74 20 6f 63  versions that oc
1d80: 63 75 72 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 69  cur on the.** fi
1d90: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 64 6f 20  rst argument do 
1da0: 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74  not invalidate t
1db0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1dc0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
1dd0: 69 64 20 74 65 73 74 5f 69 73 6f 6c 61 74 69 6f  id test_isolatio
1de0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
1df0: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
1e00: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
1e10: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1e20: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1e30: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
1e40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1e50: 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  t16(argv[0]);.  
1e60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1e70: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73  xt(argv[0]);.  s
1e80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1e90: 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  t16(argv[0]);.  
1ea0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1eb0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e  xt(argv[0]);.#en
1ec0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  dif.  sqlite3_re
1ed0: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
1ee0: 20 61 72 67 76 5b 31 5d 29 3b 0a 7d 0a 0a 2f 2a   argv[1]);.}../*
1ef0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 6e 20 53 51  .** Invoke an SQ
1f00: 4c 20 73 74 61 74 65 6d 65 6e 74 20 72 65 63 75  L statement recu
1f10: 72 73 69 76 65 6c 79 2e 20 20 54 68 65 20 66 75  rsively.  The fu
1f20: 6e 63 74 69 6f 6e 20 72 65 73 75 6c 74 20 69 73  nction result is
1f30: 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 63   the .** first c
1f40: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72  olumn of the fir
1f50: 73 74 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  st row of the re
1f60: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
1f70: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 65 76  tic void test_ev
1f80: 61 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  al(.  sqlite3_co
1f90: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
1fa0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
1fb0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
1fc0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1fd0: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1fe0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
1ff0: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
2000: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70  text_db_handle(p
2010: 43 74 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Ctx);.  const ch
2020: 61 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20 7a 53 71  ar *zSql;..  zSq
2030: 6c 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  l = (char*)sqlit
2040: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
2050: 67 76 5b 30 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[0]);.  rc = s
2060: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2070: 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
2080: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
2090: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
20b0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
20c0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20d0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
20e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
20f0: 76 61 6c 75 65 28 70 43 74 78 2c 20 73 71 6c 69  value(pCtx, sqli
2100: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
2110: 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20  (pStmt, 0));.   
2120: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
2130: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2140: 6d 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  mt);.  }.  if( r
2150: 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  c ){.    char *z
2160: 45 72 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Err;.    assert(
2170: 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20   pStmt==0 );.   
2180: 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
2190: 6d 70 72 69 6e 74 66 28 22 73 71 6c 69 74 65 33  mprintf("sqlite3
21a0: 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 65 72  _prepare_v2() er
21b0: 72 6f 72 3a 20 25 73 22 2c 73 71 6c 69 74 65 33  ror: %s",sqlite3
21c0: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
21d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
21e0: 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 45 72 72  _text(pCtx, zErr
21f0: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72  , -1, sqlite3_fr
2200: 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
2210: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
2220: 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20  de(pCtx, rc);.  
2230: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 63 6f 6e 76  }.}.../*.** conv
2240: 65 72 74 20 6f 6e 65 20 63 68 61 72 61 63 74 65  ert one characte
2250: 72 20 66 72 6f 6d 20 68 65 78 20 74 6f 20 62 69  r from hex to bi
2260: 6e 61 72 79 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nary.*/.static i
2270: 6e 74 20 74 65 73 74 48 65 78 43 68 61 72 28 63  nt testHexChar(c
2280: 68 61 72 20 63 29 7b 0a 20 20 69 66 28 20 63 3e  har c){.  if( c>
2290: 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29  ='0' && c<='9' )
22a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 20 2d  {.    return c -
22b0: 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69 66   '0';.  }else if
22c0: 28 20 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27  ( c>='a' && c<='
22d0: 66 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  f' ){.    return
22e0: 20 63 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20   c - 'a' + 10;. 
22f0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 41   }else if( c>='A
2300: 27 20 26 26 20 63 3c 3d 27 46 27 20 29 7b 0a 20  ' && c<='F' ){. 
2310: 20 20 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41     return c - 'A
2320: 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65  ' + 10;.  }.  re
2330: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2340: 20 43 6f 6e 76 65 72 74 20 68 65 78 20 74 6f 20   Convert hex to 
2350: 62 69 6e 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  binary..*/.stati
2360: 63 20 76 6f 69 64 20 74 65 73 74 48 65 78 54 6f  c void testHexTo
2370: 42 69 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Bin(const char *
2380: 7a 49 6e 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29  zIn, char *zOut)
2390: 7b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30  {.  while( zIn[0
23a0: 5d 20 26 26 20 7a 49 6e 5b 31 5d 20 29 7b 0a 20  ] && zIn[1] ){. 
23b0: 20 20 20 2a 28 7a 4f 75 74 2b 2b 29 20 3d 20 28     *(zOut++) = (
23c0: 74 65 73 74 48 65 78 43 68 61 72 28 7a 49 6e 5b  testHexChar(zIn[
23d0: 30 5d 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65  0])<<4) + testHe
23e0: 78 43 68 61 72 28 7a 49 6e 5b 31 5d 29 3b 0a 20  xChar(zIn[1]);. 
23f0: 20 20 20 7a 49 6e 20 2b 3d 20 32 3b 0a 20 20 7d     zIn += 2;.  }
2400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 68  .}../*.**      h
2410: 65 78 5f 74 6f 5f 75 74 66 31 36 62 65 28 48 45  ex_to_utf16be(HE
2420: 58 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  X).**.** Convert
2430: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
2440: 67 20 66 72 6f 6d 20 48 45 58 20 69 6e 74 6f 20  g from HEX into 
2450: 62 69 6e 61 72 79 2e 20 20 54 68 65 6e 20 72 65  binary.  Then re
2460: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  turn the.** resu
2470: 6c 74 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  lt using sqlite3
2480: 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65  _result_text16le
2490: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
24a0: 69 64 20 74 65 73 74 48 65 78 54 6f 55 74 66 31  id testHexToUtf1
24b0: 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  6be(.  sqlite3_c
24c0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
24d0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
24e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
24f0: 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  v.){.  int n;.  
2500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b  const char *zIn;
2510: 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20  .  char *zOut;. 
2520: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
2530: 20 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65   );.  n = sqlite
2540: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
2550: 67 76 5b 30 5d 29 3b 0a 20 20 7a 49 6e 20 3d 20  gv[0]);.  zIn = 
2560: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
2570: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
2580: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 4f 75 74  argv[0]);.  zOut
2590: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
25a0: 63 28 20 6e 2f 32 20 29 3b 0a 20 20 69 66 28 20  c( n/2 );.  if( 
25b0: 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  zOut==0 ){.    s
25c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
25d0: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
25e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65  .  }else{.    te
25f0: 73 74 48 65 78 54 6f 42 69 6e 28 7a 49 6e 2c 20  stHexToBin(zIn, 
2600: 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
2610: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
2620: 62 65 28 70 43 74 78 2c 20 7a 4f 75 74 2c 20 6e  be(pCtx, zOut, n
2630: 2f 32 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /2, sqlite3_free
2640: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2650: 20 20 20 20 20 68 65 78 5f 74 6f 5f 75 74 66 38       hex_to_utf8
2660: 28 48 45 58 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76  (HEX).**.** Conv
2670: 65 72 74 20 74 68 65 20 69 6e 70 75 74 20 73 74  ert the input st
2680: 72 69 6e 67 20 66 72 6f 6d 20 48 45 58 20 69 6e  ring from HEX in
2690: 74 6f 20 62 69 6e 61 72 79 2e 20 20 54 68 65 6e  to binary.  Then
26a0: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72   return the.** r
26b0: 65 73 75 6c 74 20 75 73 69 6e 67 20 73 71 6c 69  esult using sqli
26c0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31  te3_result_text1
26d0: 36 6c 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  6le()..*/.static
26e0: 20 76 6f 69 64 20 74 65 73 74 48 65 78 54 6f 55   void testHexToU
26f0: 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tf8(.  sqlite3_c
2700: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
2710: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
2720: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
2730: 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  v.){.  int n;.  
2740: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b  const char *zIn;
2750: 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20  .  char *zOut;. 
2760: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
2770: 20 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65   );.  n = sqlite
2780: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
2790: 67 76 5b 30 5d 29 3b 0a 20 20 7a 49 6e 20 3d 20  gv[0]);.  zIn = 
27a0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
27b0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
27c0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 4f 75 74  argv[0]);.  zOut
27d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
27e0: 63 28 20 6e 2f 32 20 29 3b 0a 20 20 69 66 28 20  c( n/2 );.  if( 
27f0: 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  zOut==0 ){.    s
2800: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2810: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
2820: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65  .  }else{.    te
2830: 73 74 48 65 78 54 6f 42 69 6e 28 7a 49 6e 2c 20  stHexToBin(zIn, 
2840: 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
2850: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
2860: 43 74 78 2c 20 7a 4f 75 74 2c 20 6e 2f 32 2c 20  Ctx, zOut, n/2, 
2870: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
2880: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20   }.}../*.**     
2890: 20 68 65 78 5f 74 6f 5f 75 74 66 31 36 6c 65 28   hex_to_utf16le(
28a0: 48 45 58 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65  HEX).**.** Conve
28b0: 72 74 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  rt the input str
28c0: 69 6e 67 20 66 72 6f 6d 20 48 45 58 20 69 6e 74  ing from HEX int
28d0: 6f 20 62 69 6e 61 72 79 2e 20 20 54 68 65 6e 20  o binary.  Then 
28e0: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72 65  return the.** re
28f0: 73 75 6c 74 20 75 73 69 6e 67 20 73 71 6c 69 74  sult using sqlit
2900: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
2910: 6c 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  le()..*/.static 
2920: 76 6f 69 64 20 74 65 73 74 48 65 78 54 6f 55 74  void testHexToUt
2930: 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  f16le(.  sqlite3
2940: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
2950: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
2960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2970: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  rgv.){.  int n;.
2980: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
2990: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b  n;.  char *zOut;
29a0: 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d  .  assert( nArg=
29b0: 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  =1 );.  n = sqli
29c0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
29d0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 49 6e 20  argv[0]);.  zIn 
29e0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
29f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
2a00: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 4f  t(argv[0]);.  zO
2a10: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ut = sqlite3_mal
2a20: 6c 6f 63 28 20 6e 2f 32 20 29 3b 0a 20 20 69 66  loc( n/2 );.  if
2a30: 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  ( zOut==0 ){.   
2a40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2a50: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78  error_nomem(pCtx
2a60: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2a70: 74 65 73 74 48 65 78 54 6f 42 69 6e 28 7a 49 6e  testHexToBin(zIn
2a80: 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  , zOut);.    sql
2a90: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
2aa0: 31 36 6c 65 28 70 43 74 78 2c 20 7a 4f 75 74 2c  16le(pCtx, zOut,
2ab0: 20 6e 2f 32 2c 20 73 71 6c 69 74 65 33 5f 66 72   n/2, sqlite3_fr
2ac0: 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ee);.  }.}..stat
2ad0: 69 63 20 69 6e 74 20 72 65 67 69 73 74 65 72 54  ic int registerT
2ae0: 65 73 74 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c  estFunctions(sql
2af0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61  ite3 *db){.  sta
2b00: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2b10: 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
2b20: 61 6d 65 3b 0a 20 20 20 20 20 73 69 67 6e 65 64  ame;.     signed
2b30: 20 63 68 61 72 20 6e 41 72 67 3b 0a 20 20 20 20   char nArg;.    
2b40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65   unsigned char e
2b50: 54 65 78 74 52 65 70 3b 20 2f 2a 20 31 3a 20 55  TextRep; /* 1: U
2b60: 54 46 2d 31 36 2e 20 20 30 3a 20 55 54 46 2d 38  TF-16.  0: UTF-8
2b70: 20 2a 2f 0a 20 20 20 20 20 76 6f 69 64 20 28 2a   */.     void (*
2b80: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
2b90: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
2ba0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 3b 0a 20  te3_value **);. 
2bb0: 20 7d 20 61 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a   } aFuncs[] = {.
2bc0: 20 20 20 20 7b 20 22 72 61 6e 64 73 74 72 22 2c      { "randstr",
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
2be0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 72  , SQLITE_UTF8, r
2bf0: 61 6e 64 53 74 72 20 20 20 20 7d 2c 0a 20 20 20  andStr    },.   
2c00: 20 7b 20 22 74 65 73 74 5f 64 65 73 74 72 75 63   { "test_destruc
2c10: 74 6f 72 22 2c 20 20 20 20 20 20 20 31 2c 20 53  tor",       1, S
2c20: 51 4c 49 54 45 5f 55 54 46 38 2c 20 74 65 73 74  QLITE_UTF8, test
2c30: 5f 64 65 73 74 72 75 63 74 6f 72 7d 2c 0a 23 69  _destructor},.#i
2c40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c50: 54 5f 55 54 46 31 36 0a 20 20 20 20 7b 20 22 74  T_UTF16.    { "t
2c60: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 31 36  est_destructor16
2c70: 22 2c 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45  ",     1, SQLITE
2c80: 5f 55 54 46 38 2c 20 74 65 73 74 5f 64 65 73 74  _UTF8, test_dest
2c90: 72 75 63 74 6f 72 31 36 7d 2c 0a 20 20 20 20 7b  ructor16},.    {
2ca0: 20 22 68 65 78 5f 74 6f 5f 75 74 66 31 36 62 65   "hex_to_utf16be
2cb0: 22 2c 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c  ",        1, SQL
2cc0: 49 54 45 5f 55 54 46 38 2c 20 74 65 73 74 48 65  ITE_UTF8, testHe
2cd0: 78 54 6f 55 74 66 31 36 62 65 7d 2c 0a 20 20 20  xToUtf16be},.   
2ce0: 20 7b 20 22 68 65 78 5f 74 6f 5f 75 74 66 31 36   { "hex_to_utf16
2cf0: 6c 65 22 2c 20 20 20 20 20 20 20 20 31 2c 20 53  le",        1, S
2d00: 51 4c 49 54 45 5f 55 54 46 38 2c 20 74 65 73 74  QLITE_UTF8, test
2d10: 48 65 78 54 6f 55 74 66 31 36 6c 65 7d 2c 0a 23  HexToUtf16le},.#
2d20: 65 6e 64 69 66 0a 20 20 20 20 7b 20 22 68 65 78  endif.    { "hex
2d30: 5f 74 6f 5f 75 74 66 38 22 2c 20 20 20 20 20 20  _to_utf8",      
2d40: 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55       1, SQLITE_U
2d50: 54 46 38 2c 20 74 65 73 74 48 65 78 54 6f 55 74  TF8, testHexToUt
2d60: 66 38 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73 74  f8},.    { "test
2d70: 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e  _destructor_coun
2d80: 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54  t", 0, SQLITE_UT
2d90: 46 38 2c 20 74 65 73 74 5f 64 65 73 74 72 75 63  F8, test_destruc
2da0: 74 6f 72 5f 63 6f 75 6e 74 7d 2c 0a 20 20 20 20  tor_count},.    
2db0: 7b 20 22 74 65 73 74 5f 61 75 78 64 61 74 61 22  { "test_auxdata"
2dc0: 2c 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51  ,         -1, SQ
2dd0: 4c 49 54 45 5f 55 54 46 38 2c 20 74 65 73 74 5f  LITE_UTF8, test_
2de0: 61 75 78 64 61 74 61 7d 2c 0a 20 20 20 20 7b 20  auxdata},.    { 
2df0: 22 74 65 73 74 5f 65 72 72 6f 72 22 2c 20 20 20  "test_error",   
2e00: 20 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49           1, SQLI
2e10: 54 45 5f 55 54 46 38 2c 20 74 65 73 74 5f 65 72  TE_UTF8, test_er
2e20: 72 6f 72 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73  ror},.    { "tes
2e30: 74 5f 65 72 72 6f 72 22 2c 20 20 20 20 20 20 20  t_error",       
2e40: 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45 5f 55       2, SQLITE_U
2e50: 54 46 38 2c 20 74 65 73 74 5f 65 72 72 6f 72 7d  TF8, test_error}
2e60: 2c 0a 20 20 20 20 7b 20 22 74 65 73 74 5f 65 76  ,.    { "test_ev
2e70: 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  al",            
2e80: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
2e90: 20 74 65 73 74 5f 65 76 61 6c 7d 2c 0a 20 20 20   test_eval},.   
2ea0: 20 7b 20 22 74 65 73 74 5f 69 73 6f 6c 61 74 69   { "test_isolati
2eb0: 6f 6e 22 2c 20 20 20 20 20 20 20 20 32 2c 20 53  on",        2, S
2ec0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 74 65 73 74  QLITE_UTF8, test
2ed0: 5f 69 73 6f 6c 61 74 69 6f 6e 7d 2c 0a 20 20 20  _isolation},.   
2ee0: 20 7b 20 22 74 65 73 74 5f 63 6f 75 6e 74 65 72   { "test_counter
2ef0: 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 53  ",          1, S
2f00: 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 6f 75 6e  QLITE_UTF8, coun
2f10: 74 65 72 46 75 6e 63 7d 2c 0a 20 20 7d 3b 0a 20  terFunc},.  };. 
2f20: 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69   int i;..  for(i
2f30: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 46 75  =0; i<sizeof(aFu
2f40: 6e 63 73 29 2f 73 69 7a 65 6f 66 28 61 46 75 6e  ncs)/sizeof(aFun
2f50: 63 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  cs[0]); i++){.  
2f60: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
2f70: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 46  _function(db, aF
2f80: 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61  uncs[i].zName, a
2f90: 46 75 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c 0a 20  Funcs[i].nArg,. 
2fa0: 20 20 20 20 20 20 20 61 46 75 6e 63 73 5b 69 5d         aFuncs[i]
2fb0: 2e 65 54 65 78 74 52 65 70 2c 20 30 2c 20 61 46  .eTextRep, 0, aF
2fc0: 75 6e 63 73 5b 69 5d 2e 78 46 75 6e 63 2c 20 30  uncs[i].xFunc, 0
2fd0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  , 0);.  }..  sql
2fe0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
2ff0: 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 61  tion(db, "test_a
3000: 67 67 5f 65 72 72 6d 73 67 31 36 22 2c 20 30 2c  gg_errmsg16", 0,
3010: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
3020: 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74 5f 61  0, .      test_a
3030: 67 67 5f 65 72 72 6d 73 67 31 36 5f 73 74 65 70  gg_errmsg16_step
3040: 2c 20 74 65 73 74 5f 61 67 67 5f 65 72 72 6d 73  , test_agg_errms
3050: 67 31 36 5f 66 69 6e 61 6c 29 3b 0a 20 20 20 20  g16_final);.    
3060: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
3070: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
3080: 54 43 4c 43 4d 44 3a 20 20 61 75 74 6f 69 6e 73  TCLCMD:  autoins
3090: 74 61 6c 6c 5f 74 65 73 74 5f 66 75 6e 63 74 69  tall_test_functi
30a0: 6f 6e 73 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  ons.**.** Invoke
30b0: 20 74 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   this TCL comman
30c0: 64 20 74 6f 20 75 73 65 20 73 71 6c 69 74 65 33  d to use sqlite3
30d0: 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28  _auto_extension(
30e0: 29 20 74 6f 20 63 61 75 73 65 0a 2a 2a 20 74 68  ) to cause.** th
30f0: 65 20 73 74 61 6e 64 61 72 64 20 73 65 74 20 6f  e standard set o
3100: 66 20 74 65 73 74 20 66 75 6e 63 74 69 6f 6e 73  f test functions
3110: 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e   to be loaded in
3120: 74 6f 20 65 61 63 68 20 6e 65 77 0a 2a 2a 20 64  to each new.** d
3130: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3140: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
3150: 74 20 61 75 74 6f 69 6e 73 74 61 6c 6c 5f 74 65  t autoinstall_te
3160: 73 74 5f 66 75 6e 63 73 28 0a 20 20 76 6f 69 64  st_funcs(.  void
3170: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
3180: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3190: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
31a0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
31b0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78  T objv[].){.  ex
31c0: 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f 52 65 67  tern int Md5_Reg
31d0: 69 73 74 65 72 28 73 71 6c 69 74 65 33 2a 29 3b  ister(sqlite3*);
31e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
31f0: 74 65 33 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69  te3_auto_extensi
3200: 6f 6e 28 28 76 6f 69 64 2a 29 72 65 67 69 73 74  on((void*)regist
3210: 65 72 54 65 73 74 46 75 6e 63 74 69 6f 6e 73 29  erTestFunctions)
3220: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
3230: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
3240: 3d 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 5f 65  = sqlite3_auto_e
3250: 78 74 65 6e 73 69 6f 6e 28 28 76 6f 69 64 2a 29  xtension((void*)
3260: 4d 64 35 5f 52 65 67 69 73 74 65 72 29 3b 0a 20  Md5_Register);. 
3270: 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
3280: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
3290: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
32a0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
32b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 62 6f  K;.}../*.** A bo
32c0: 67 75 73 20 73 74 65 70 20 66 75 6e 63 74 69 6f  gus step functio
32d0: 6e 20 61 6e 64 20 66 69 6e 61 6c 69 7a 65 72 20  n and finalizer 
32e0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
32f0: 74 69 63 20 76 6f 69 64 20 74 53 74 65 70 28 73  tic void tStep(s
3300: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3310: 61 2c 20 69 6e 74 20 62 2c 20 73 71 6c 69 74 65  a, int b, sqlite
3320: 33 5f 76 61 6c 75 65 20 2a 2a 63 29 7b 7d 0a 73  3_value **c){}.s
3330: 74 61 74 69 63 20 76 6f 69 64 20 74 46 69 6e 61  tatic void tFina
3340: 6c 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  l(sqlite3_contex
3350: 74 20 2a 61 29 7b 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  t *a){}.../*.** 
3360: 74 63 6c 63 6d 64 3a 20 20 61 62 75 73 65 5f 63  tclcmd:  abuse_c
3370: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 0a 2a  reate_function.*
3380: 2a 0a 2a 2a 20 4d 61 6b 65 20 76 61 72 69 6f 75  *.** Make variou
3390: 73 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  s calls to sqlit
33a0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
33b0: 6f 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68  on that do not h
33c0: 61 76 65 20 76 61 6c 69 64 0a 2a 2a 20 70 61 72  ave valid.** par
33d0: 61 6d 65 74 65 72 73 2e 20 20 56 65 72 69 66 79  ameters.  Verify
33e0: 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72 20   that the error 
33f0: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 64 65 74  condition is det
3400: 65 63 74 65 64 20 61 6e 64 20 72 65 70 6f 72 74  ected and report
3410: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
3420: 74 20 61 62 75 73 65 5f 63 72 65 61 74 65 5f 66  t abuse_create_f
3430: 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20  unction(.  void 
3440: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
3450: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3460: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
3470: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
3480: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74   objv[].){.  ext
3490: 65 72 6e 20 69 6e 74 20 67 65 74 44 62 50 6f 69  ern int getDbPoi
34a0: 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 2a  nter(Tcl_Interp*
34b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73  , const char*, s
34c0: 71 6c 69 74 65 33 2a 2a 29 3b 0a 20 20 73 71 6c  qlite3**);.  sql
34d0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
34e0: 72 63 3b 0a 20 20 69 6e 74 20 6d 78 41 72 67 3b  rc;.  int mxArg;
34f0: 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
3500: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
3510: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
3520: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
3530: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
3540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
3550: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
3560: 2c 20 22 74 78 22 2c 20 31 2c 20 53 51 4c 49 54  , "tx", 1, SQLIT
3570: 45 5f 55 54 46 38 2c 20 30 2c 20 74 53 74 65 70  E_UTF8, 0, tStep
3580: 2c 74 53 74 65 70 2c 74 46 69 6e 61 6c 29 3b 0a  ,tStep,tFinal);.
3590: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
35a0: 5f 4d 49 53 55 53 45 20 29 20 67 6f 74 6f 20 61  _MISUSE ) goto a
35b0: 62 75 73 65 5f 65 72 72 3b 0a 0a 20 20 72 63 20  buse_err;..  rc 
35c0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
35d0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
35e0: 78 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  x", 1, SQLITE_UT
35f0: 46 38 2c 20 30 2c 20 74 53 74 65 70 2c 20 74 53  F8, 0, tStep, tS
3600: 74 65 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tep, 0);.  if( r
3610: 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  c!=SQLITE_MISUSE
3620: 20 29 20 67 6f 74 6f 20 61 62 75 73 65 5f 65 72   ) goto abuse_er
3630: 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r;..  rc = sqlit
3640: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
3650: 6f 6e 28 64 62 2c 20 22 74 78 22 2c 20 31 2c 20  on(db, "tx", 1, 
3660: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
3670: 74 53 74 65 70 2c 20 30 2c 20 74 46 69 6e 61 6c  tStep, 0, tFinal
3680: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
3690: 49 54 45 5f 4d 49 53 55 53 45 29 20 67 6f 74 6f  ITE_MISUSE) goto
36a0: 20 61 62 75 73 65 5f 65 72 72 3b 0a 0a 20 20 72   abuse_err;..  r
36b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
36c0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
36d0: 22 74 78 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  "tx", 1, SQLITE_
36e0: 55 54 46 38 2c 20 30 2c 20 30 2c 20 30 2c 20 74  UTF8, 0, 0, 0, t
36f0: 46 69 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  Final);.  if( rc
3700: 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  !=SQLITE_MISUSE 
3710: 29 20 67 6f 74 6f 20 61 62 75 73 65 5f 65 72 72  ) goto abuse_err
3720: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
3730: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
3740: 6e 28 64 62 2c 20 22 74 78 22 2c 20 31 2c 20 53  n(db, "tx", 1, S
3750: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30  QLITE_UTF8, 0, 0
3760: 2c 20 74 53 74 65 70 2c 20 30 29 3b 0a 20 20 69  , tStep, 0);.  i
3770: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49  f( rc!=SQLITE_MI
3780: 53 55 53 45 20 29 20 67 6f 74 6f 20 61 62 75 73  SUSE ) goto abus
3790: 65 5f 65 72 72 3b 0a 0a 20 20 72 63 20 3d 20 73  e_err;..  rc = s
37a0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
37b0: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 78 22 2c  nction(db, "tx",
37c0: 20 2d 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -2, SQLITE_UTF8
37d0: 2c 20 30 2c 20 74 53 74 65 70 2c 20 30 2c 20 30  , 0, tStep, 0, 0
37e0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
37f0: 49 54 45 5f 4d 49 53 55 53 45 20 29 20 67 6f 74  ITE_MISUSE ) got
3800: 6f 20 61 62 75 73 65 5f 65 72 72 3b 0a 0a 20 20  o abuse_err;..  
3810: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
3820: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
3830: 20 22 74 78 22 2c 20 31 32 38 2c 20 53 51 4c 49   "tx", 128, SQLI
3840: 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 53 74 65  TE_UTF8, 0, tSte
3850: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  p, 0, 0);.  if( 
3860: 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53  rc!=SQLITE_MISUS
3870: 45 20 29 20 67 6f 74 6f 20 61 62 75 73 65 5f 65  E ) goto abuse_e
3880: 72 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rr;..  rc = sqli
3890: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
38a0: 69 6f 6e 28 64 62 2c 20 22 66 75 6e 63 78 78 22  ion(db, "funcxx"
38b0: 0a 20 20 20 20 20 20 20 22 5f 31 32 33 34 35 36  .       "_123456
38c0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
38d0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
38e0: 39 5f 31 32 33 34 35 36 37 38 39 22 0a 20 20 20  9_123456789".   
38f0: 20 20 20 20 22 5f 31 32 33 34 35 36 37 38 39 5f      "_123456789_
3900: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
3910: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
3920: 33 34 35 36 37 38 39 22 0a 20 20 20 20 20 20 20  3456789".       
3930: 22 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  "_123456789_1234
3940: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
3950: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
3960: 37 38 39 22 0a 20 20 20 20 20 20 20 22 5f 31 32  789".       "_12
3970: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
3980: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
3990: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 22  56789_123456789"
39a0: 0a 20 20 20 20 20 20 20 22 5f 31 32 33 34 35 36  .       "_123456
39b0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
39c0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
39d0: 39 5f 31 32 33 34 35 36 37 38 39 22 2c 0a 20 20  9_123456789",.  
39e0: 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55       1, SQLITE_U
39f0: 54 46 38 2c 20 30 2c 20 74 53 74 65 70 2c 20 30  TF8, 0, tStep, 0
3a00: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
3a10: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 20  SQLITE_MISUSE ) 
3a20: 67 6f 74 6f 20 61 62 75 73 65 5f 65 72 72 3b 0a  goto abuse_err;.
3a30: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 61 73 74 20  .  /* This last 
3a40: 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74 72  function registr
3a50: 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 63 74  ation should act
3a60: 75 61 6c 6c 79 20 77 6f 72 6b 2e 20 20 47 65 6e  ually work.  Gen
3a70: 65 72 61 74 65 0a 20 20 2a 2a 20 61 20 6e 6f 2d  erate.  ** a no-
3a80: 6f 70 20 66 75 6e 63 74 69 6f 6e 20 28 74 68 61  op function (tha
3a90: 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
3aa0: 20 4e 55 4c 4c 29 20 61 6e 64 20 77 68 69 63 68   NULL) and which
3ab0: 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6d 61   has the.  ** ma
3ac0: 78 69 6d 75 6d 2d 6c 65 6e 67 74 68 20 66 75 6e  ximum-length fun
3ad0: 63 74 69 6f 6e 20 6e 61 6d 65 20 61 6e 64 20 74  ction name and t
3ae0: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
3af0: 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 2e  r of parameters.
3b00: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
3b10: 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45  limit(db, SQLITE
3b20: 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
3b30: 41 52 47 2c 20 31 30 30 30 30 29 3b 0a 20 20 6d  ARG, 10000);.  m
3b40: 78 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6c  xArg = sqlite3_l
3b50: 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  imit(db, SQLITE_
3b60: 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
3b70: 52 47 2c 20 2d 31 29 3b 0a 20 20 72 63 20 3d 20  RG, -1);.  rc = 
3b80: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
3b90: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6e 75 6c  unction(db, "nul
3ba0: 6c 78 22 0a 20 20 20 20 20 20 20 22 5f 31 32 33  lx".       "_123
3bb0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
3bc0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
3bd0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 22 0a  6789_123456789".
3be0: 20 20 20 20 20 20 20 22 5f 31 32 33 34 35 36 37         "_1234567
3bf0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
3c00: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
3c10: 5f 31 32 33 34 35 36 37 38 39 22 0a 20 20 20 20  _123456789".    
3c20: 20 20 20 22 5f 31 32 33 34 35 36 37 38 39 5f 31     "_123456789_1
3c30: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
3c40: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
3c50: 34 35 36 37 38 39 22 0a 20 20 20 20 20 20 20 22  456789".       "
3c60: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
3c70: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
3c80: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
3c90: 38 39 22 0a 20 20 20 20 20 20 20 22 5f 31 32 33  89".       "_123
3ca0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
3cb0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
3cc0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 22 2c  6789_123456789",
3cd0: 0a 20 20 20 20 20 20 20 6d 78 41 72 67 2c 20 53  .       mxArg, S
3ce0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74  QLITE_UTF8, 0, t
3cf0: 53 74 65 70 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Step, 0, 0);.  i
3d00: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
3d10: 20 29 20 67 6f 74 6f 20 61 62 75 73 65 5f 65 72   ) goto abuse_er
3d20: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d40: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c     .  return TCL
3d50: 5f 4f 4b 3b 0a 0a 61 62 75 73 65 5f 65 72 72 3a  _OK;..abuse_err:
3d60: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
3d70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ult(interp, "sql
3d80: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
3d90: 74 69 6f 6e 20 61 62 75 73 65 64 20 74 65 73 74  tion abused test
3da0: 20 66 61 69 6c 65 64 22 2c 20 0a 20 20 20 20 20   failed", .     
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
3dc0: 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  har*)0);.  retur
3dd0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
3de0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 63  /*.** Register c
3df0: 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74 68 65  ommands with the
3e00: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3e10: 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74  ..*/.int Sqlitet
3e20: 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63  est_func_Init(Tc
3e30: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3e40: 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  ){.  static stru
3e50: 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
3e60: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f  zName;.     Tcl_
3e70: 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f  ObjCmdProc *xPro
3e80: 63 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d  c;.  } aObjCmd[]
3e90: 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 61 75 74   = {.     { "aut
3ea0: 6f 69 6e 73 74 61 6c 6c 5f 74 65 73 74 5f 66 75  oinstall_test_fu
3eb0: 6e 63 74 69 6f 6e 73 22 2c 20 20 20 20 61 75 74  nctions",    aut
3ec0: 6f 69 6e 73 74 61 6c 6c 5f 74 65 73 74 5f 66 75  oinstall_test_fu
3ed0: 6e 63 73 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61  ncs },.     { "a
3ee0: 62 75 73 65 5f 63 72 65 61 74 65 5f 66 75 6e 63  buse_create_func
3ef0: 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 61  tion",         a
3f00: 62 75 73 65 5f 63 72 65 61 74 65 5f 66 75 6e 63  buse_create_func
3f10: 74 69 6f 6e 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20  tion  },.  };.  
3f20: 69 6e 74 20 69 3b 0a 20 20 65 78 74 65 72 6e 20  int i;.  extern 
3f30: 69 6e 74 20 4d 64 35 5f 52 65 67 69 73 74 65 72  int Md5_Register
3f40: 28 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 20 20 66  (sqlite3*);..  f
3f50: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
3f60: 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66  (aObjCmd)/sizeof
3f70: 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b  (aObjCmd[0]); i+
3f80: 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  +){.    Tcl_Crea
3f90: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
3fa0: 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e  erp, aObjCmd[i].
3fb0: 7a 4e 61 6d 65 2c 20 61 4f 62 6a 43 6d 64 5b 69  zName, aObjCmd[i
3fc0: 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a  ].xProc, 0, 0);.
3fd0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e    }.  sqlite3_in
3fe0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 73 71  itialize();.  sq
3ff0: 6c 69 74 65 33 5f 61 75 74 6f 5f 65 78 74 65 6e  lite3_auto_exten
4000: 73 69 6f 6e 28 28 76 6f 69 64 2a 29 72 65 67 69  sion((void*)regi
4010: 73 74 65 72 54 65 73 74 46 75 6e 63 74 69 6f 6e  sterTestFunction
4020: 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 61 75  s);.  sqlite3_au
4030: 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 28 76 6f  to_extension((vo
4040: 69 64 2a 29 4d 64 35 5f 52 65 67 69 73 74 65 72  id*)Md5_Register
4050: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
4060: 4f 4b 3b 0a 7d 0a                                OK;.}.