/ Hex Artifact Content
Login

Artifact a55c4d5479ff2eb5c0a22d4d88e9528ab59c953b:


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 33 20 32 30 30 38 2f 30  .c,v 1.13 2008/0
0210: 38 2f 32 38 20 30 32 3a 32 36 3a 30 37 20 64 72  8/28 02:26:07 dr
0220: 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  h Exp $.*/.#incl
0230: 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a  ude "sqlite3.h".
0240: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22  #include "tcl.h"
0250: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
0260: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  b.h>.#include <s
0270: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
0280: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 0a 2f  e <assert.h>.../
0290: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
02a0: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
02b0: 63 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ce using sqlite3
02c0: 5f 6d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 74 68  _malloc(). If th
02d0: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  e.** allocation 
02e0: 66 61 69 6c 73 2c 20 63 61 6c 6c 20 73 71 6c 69  fails, call sqli
02f0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
0300: 5f 6e 6f 6d 65 6d 28 29 20 74 6f 20 6e 6f 74 69  _nomem() to noti
0310: 66 79 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  fy.** the databa
0320: 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6d  se handle that m
0330: 61 6c 6c 6f 63 28 29 20 68 61 73 20 66 61 69 6c  alloc() has fail
0340: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
0350: 69 64 20 2a 74 65 73 74 43 6f 6e 74 65 78 74 4d  id *testContextM
0360: 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 5f 63 6f  alloc(sqlite3_co
0370: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
0380: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 63 68  int nByte){.  ch
0390: 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
03a0: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
03b0: 20 69 66 28 20 21 7a 20 26 26 20 6e 42 79 74 65   if( !z && nByte
03c0: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
03d0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
03e0: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
03f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
0400: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
0410: 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20  ction generates 
0420: 61 20 73 74 72 69 6e 67 20 6f 66 20 72 61 6e 64  a string of rand
0430: 6f 6d 20 63 68 61 72 61 63 74 65 72 73 2e 20 20  om characters.  
0440: 55 73 65 64 20 66 6f 72 0a 2a 2a 20 67 65 6e 65  Used for.** gene
0450: 72 61 74 69 6e 67 20 74 65 73 74 20 64 61 74 61  rating test data
0460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0470: 20 72 61 6e 64 53 74 72 28 73 71 6c 69 74 65 33   randStr(sqlite3
0480: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
0490: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
04a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
04b0: 76 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  v){.  static con
04c0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
04d0: 20 7a 53 72 63 5b 5d 20 3d 20 0a 20 20 20 20 20   zSrc[] = .     
04e0: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
04f0: 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
0500: 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
0510: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
0520: 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
0530: 0a 20 20 20 20 20 22 2e 2d 21 2c 3a 2a 5e 2b 3d  .     ".-!,:*^+=
0540: 5f 7c 3f 2f 3c 3e 20 22 3b 0a 20 20 69 6e 74 20  _|?/<> ";.  int 
0550: 69 4d 69 6e 2c 20 69 4d 61 78 2c 20 6e 2c 20 72  iMin, iMax, n, r
0560: 2c 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  , i;.  unsigned 
0570: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
0580: 0a 0a 20 20 2f 2a 20 49 74 20 75 73 65 64 20 74  ..  /* It used t
0590: 6f 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  o be possible to
05a0: 20 63 61 6c 6c 20 72 61 6e 64 73 74 72 28 29 20   call randstr() 
05b0: 77 69 74 68 20 61 6e 79 20 6e 75 6d 62 65 72 20  with any number 
05c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2c 0a 20 20  of arguments,.  
05d0: 2a 2a 20 62 75 74 20 6e 6f 77 20 69 74 20 69 73  ** but now it is
05e0: 20 72 65 67 69 73 74 65 72 65 64 20 77 69 74 68   registered with
05f0: 20 53 51 4c 69 74 65 20 61 73 20 72 65 71 75 69   SQLite as requi
0600: 72 69 6e 67 20 65 78 61 63 74 6c 79 20 32 2e 0a  ring exactly 2..
0610: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 61 72    */.  assert(ar
0620: 67 63 3d 3d 32 29 3b 0a 0a 20 20 69 4d 69 6e 20  gc==2);..  iMin 
0630: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
0640: 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  int(argv[0]);.  
0650: 69 66 28 20 69 4d 69 6e 3c 30 20 29 20 69 4d 69  if( iMin<0 ) iMi
0660: 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 4d 69  n = 0;.  if( iMi
0670: 6e 3e 3d 73 69 7a 65 6f 66 28 7a 42 75 66 29 20  n>=sizeof(zBuf) 
0680: 29 20 69 4d 69 6e 20 3d 20 73 69 7a 65 6f 66 28  ) iMin = sizeof(
0690: 7a 42 75 66 29 2d 31 3b 0a 20 20 69 4d 61 78 20  zBuf)-1;.  iMax 
06a0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
06b0: 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  int(argv[1]);.  
06c0: 69 66 28 20 69 4d 61 78 3c 69 4d 69 6e 20 29 20  if( iMax<iMin ) 
06d0: 69 4d 61 78 20 3d 20 69 4d 69 6e 3b 0a 20 20 69  iMax = iMin;.  i
06e0: 66 28 20 69 4d 61 78 3e 3d 73 69 7a 65 6f 66 28  f( iMax>=sizeof(
06f0: 7a 42 75 66 29 20 29 20 69 4d 61 78 20 3d 20 73  zBuf) ) iMax = s
0700: 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 3b 0a 20  izeof(zBuf)-1;. 
0710: 20 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 69 66 28   n = iMin;.  if(
0720: 20 69 4d 61 78 3e 69 4d 69 6e 20 29 7b 0a 20 20   iMax>iMin ){.  
0730: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
0740: 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20  ness(sizeof(r), 
0750: 26 72 29 3b 0a 20 20 20 20 72 20 26 3d 20 30 78  &r);.    r &= 0x
0760: 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 6e 20  7fffffff;.    n 
0770: 2b 3d 20 72 25 28 69 4d 61 78 20 2b 20 31 20 2d  += r%(iMax + 1 -
0780: 20 69 4d 69 6e 29 3b 0a 20 20 7d 0a 20 20 61 73   iMin);.  }.  as
0790: 73 65 72 74 28 20 6e 3c 73 69 7a 65 6f 66 28 7a  sert( n<sizeof(z
07a0: 42 75 66 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Buf) );.  sqlite
07b0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 6e 2c 20  3_randomness(n, 
07c0: 7a 42 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d 30  zBuf);.  for(i=0
07d0: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
07e0: 20 7a 42 75 66 5b 69 5d 20 3d 20 7a 53 72 63 5b   zBuf[i] = zSrc[
07f0: 7a 42 75 66 5b 69 5d 25 28 73 69 7a 65 6f 66 28  zBuf[i]%(sizeof(
0800: 7a 53 72 63 29 2d 31 29 5d 3b 0a 20 20 7d 0a 20  zSrc)-1)];.  }. 
0810: 20 7a 42 75 66 5b 6e 5d 20 3d 20 30 3b 0a 20 20   zBuf[n] = 0;.  
0820: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
0830: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  ext(context, (ch
0840: 61 72 2a 29 7a 42 75 66 2c 20 6e 2c 20 53 51 4c  ar*)zBuf, n, SQL
0850: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
0860: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
0870: 6c 6f 77 69 6e 67 20 74 77 6f 20 53 51 4c 20 66  lowing two SQL f
0880: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  unctions are use
0890: 64 20 74 6f 20 74 65 73 74 20 72 65 74 75 72 6e  d to test return
08a0: 69 6e 67 20 61 20 74 65 78 74 0a 2a 2a 20 72 65  ing a text.** re
08b0: 73 75 6c 74 20 77 69 74 68 20 61 20 64 65 73 74  sult with a dest
08c0: 72 75 63 74 6f 72 2e 20 46 75 6e 63 74 69 6f 6e  ructor. Function
08d0: 20 27 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f   'test_destructo
08e0: 72 27 20 74 61 6b 65 73 20 6f 6e 65 20 61 72 67  r' takes one arg
08f0: 75 6d 65 6e 74 0a 2a 2a 20 61 6e 64 20 72 65 74  ument.** and ret
0900: 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 61 72  urns the same ar
0910: 67 75 6d 65 6e 74 20 69 6e 74 65 72 70 72 65 74  gument interpret
0920: 65 64 20 61 73 20 54 45 58 54 2e 20 41 20 64 65  ed as TEXT. A de
0930: 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 70  structor is.** p
0940: 61 73 73 65 64 20 77 69 74 68 20 74 68 65 20 73  assed with the s
0950: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
0960: 78 74 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  xt() call..**.**
0970: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 27 74   SQL function 't
0980: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  est_destructor_c
0990: 6f 75 6e 74 27 20 72 65 74 75 72 6e 73 20 74 68  ount' returns th
09a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  e number of outs
09b0: 74 61 6e 64 69 6e 67 20 0a 2a 2a 20 61 6c 6c 6f  tanding .** allo
09c0: 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20  cations made by 
09d0: 27 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72  'test_destructor
09e0: 27 3b 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  ';.**.** WARNING
09f0: 3a 20 4e 6f 74 20 74 68 72 65 61 64 73 61 66 65  : Not threadsafe
0a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0a10: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  test_destructor_
0a20: 63 6f 75 6e 74 5f 76 61 72 20 3d 20 30 3b 0a 73  count_var = 0;.s
0a30: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
0a40: 75 63 74 6f 72 28 76 6f 69 64 20 2a 70 29 7b 0a  uctor(void *p){.
0a50: 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 28    char *zVal = (
0a60: 63 68 61 72 20 2a 29 70 3b 0a 20 20 61 73 73 65  char *)p;.  asse
0a70: 72 74 28 7a 56 61 6c 29 3b 0a 20 20 7a 56 61 6c  rt(zVal);.  zVal
0a80: 2d 2d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  --;.  sqlite3_fr
0a90: 65 65 28 7a 56 61 6c 29 3b 0a 20 20 74 65 73 74  ee(zVal);.  test
0aa0: 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e  _destructor_coun
0ab0: 74 5f 76 61 72 2d 2d 3b 0a 7d 0a 73 74 61 74 69  t_var--;.}.stati
0ac0: 63 20 76 6f 69 64 20 74 65 73 74 5f 64 65 73 74  c void test_dest
0ad0: 72 75 63 74 6f 72 28 0a 20 20 73 71 6c 69 74 65  ructor(.  sqlite
0ae0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
0af0: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
0b00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0b10: 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 2a  argv.){.  char *
0b20: 7a 56 61 6c 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  zVal;.  int len;
0b30: 0a 20 20 0a 20 20 74 65 73 74 5f 64 65 73 74 72  .  .  test_destr
0b40: 75 63 74 6f 72 5f 63 6f 75 6e 74 5f 76 61 72 2b  uctor_count_var+
0b50: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  +;.  assert( nAr
0b60: 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71  g==1 );.  if( sq
0b70: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
0b80: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
0b90: 45 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b  E_NULL ) return;
0ba0: 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33  .  len = sqlite3
0bb0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
0bc0: 76 5b 30 5d 29 3b 20 0a 20 20 7a 56 61 6c 20 3d  v[0]); .  zVal =
0bd0: 20 74 65 73 74 43 6f 6e 74 65 78 74 4d 61 6c 6c   testContextMall
0be0: 6f 63 28 70 43 74 78 2c 20 6c 65 6e 2b 33 29 3b  oc(pCtx, len+3);
0bf0: 0a 20 20 69 66 28 20 21 7a 56 61 6c 20 29 7b 0a  .  if( !zVal ){.
0c00: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
0c10: 20 20 7a 56 61 6c 5b 6c 65 6e 2b 31 5d 20 3d 20    zVal[len+1] = 
0c20: 30 3b 0a 20 20 7a 56 61 6c 5b 6c 65 6e 2b 32 5d  0;.  zVal[len+2]
0c30: 20 3d 20 30 3b 0a 20 20 7a 56 61 6c 2b 2b 3b 0a   = 0;.  zVal++;.
0c40: 20 20 6d 65 6d 63 70 79 28 7a 56 61 6c 2c 20 73    memcpy(zVal, s
0c50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
0c60: 74 28 61 72 67 76 5b 30 5d 29 2c 20 6c 65 6e 29  t(argv[0]), len)
0c70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
0c80: 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 56  lt_text(pCtx, zV
0c90: 61 6c 2c 20 2d 31 2c 20 64 65 73 74 72 75 63 74  al, -1, destruct
0ca0: 6f 72 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53  or);.}.#ifndef S
0cb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
0cc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
0cd0: 74 5f 64 65 73 74 72 75 63 74 6f 72 31 36 28 0a  t_destructor16(.
0ce0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
0cf0: 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
0d00: 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
0d10: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
0d20: 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20    char *zVal;.  
0d30: 69 6e 74 20 6c 65 6e 3b 0a 20 20 0a 20 20 74 65  int len;.  .  te
0d40: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  st_destructor_co
0d50: 75 6e 74 5f 76 61 72 2b 2b 3b 0a 20 20 61 73 73  unt_var++;.  ass
0d60: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
0d70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
0d80: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
0d90: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
0da0: 20 72 65 74 75 72 6e 3b 0a 20 20 6c 65 6e 20 3d   return;.  len =
0db0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
0dc0: 79 74 65 73 31 36 28 61 72 67 76 5b 30 5d 29 3b  ytes16(argv[0]);
0dd0: 20 0a 20 20 7a 56 61 6c 20 3d 20 74 65 73 74 43   .  zVal = testC
0de0: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 70 43 74  ontextMalloc(pCt
0df0: 78 2c 20 6c 65 6e 2b 33 29 3b 0a 20 20 69 66 28  x, len+3);.  if(
0e00: 20 21 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72 65   !zVal ){.    re
0e10: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 56 61 6c  turn;.  }.  zVal
0e20: 5b 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 7a  [len+1] = 0;.  z
0e30: 56 61 6c 5b 6c 65 6e 2b 32 5d 20 3d 20 30 3b 0a  Val[len+2] = 0;.
0e40: 20 20 7a 56 61 6c 2b 2b 3b 0a 20 20 6d 65 6d 63    zVal++;.  memc
0e50: 70 79 28 7a 56 61 6c 2c 20 73 71 6c 69 74 65 33  py(zVal, sqlite3
0e60: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72  _value_text16(ar
0e70: 67 76 5b 30 5d 29 2c 20 6c 65 6e 29 3b 0a 20 20  gv[0]), len);.  
0e80: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
0e90: 65 78 74 31 36 28 70 43 74 78 2c 20 7a 56 61 6c  ext16(pCtx, zVal
0ea0: 2c 20 2d 31 2c 20 64 65 73 74 72 75 63 74 6f 72  , -1, destructor
0eb0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61 74  );.}.#endif.stat
0ec0: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 64 65 73  ic void test_des
0ed0: 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28 0a 20  tructor_count(. 
0ee0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
0ef0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
0f00: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
0f10: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
0f20: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0f30: 69 6e 74 28 70 43 74 78 2c 20 74 65 73 74 5f 64  int(pCtx, test_d
0f40: 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 5f  estructor_count_
0f50: 76 61 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  var);.}../*.** R
0f60: 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 65 73 74  outines for test
0f70: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
0f80: 67 65 74 5f 61 75 78 64 61 74 61 28 29 20 61 6e  get_auxdata() an
0f90: 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75  d sqlite3_set_au
0fa0: 78 64 61 74 61 28 29 0a 2a 2a 20 69 6e 74 65 72  xdata().** inter
0fb0: 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  face..**.** The 
0fc0: 74 65 73 74 5f 61 75 78 64 61 74 61 28 29 20 53  test_auxdata() S
0fd0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  QL function atte
0fe0: 6d 70 74 73 20 74 6f 20 72 65 67 69 73 74 65 72  mpts to register
0ff0: 20 65 61 63 68 20 6f 66 20 69 74 73 20 61 72 67   each of its arg
1000: 75 6d 65 6e 74 73 0a 2a 2a 20 61 73 20 61 75 78  uments.** as aux
1010: 69 6c 69 61 72 79 20 64 61 74 61 2e 20 20 49 66  iliary data.  If
1020: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 70 72   there are no pr
1030: 69 6f 72 20 72 65 67 69 73 74 72 61 74 69 6f 6e  ior registration
1040: 73 20 6f 66 20 61 75 78 20 64 61 74 61 20 66 6f  s of aux data fo
1050: 72 0a 2a 2a 20 74 68 61 74 20 61 72 67 75 6d 65  r.** that argume
1060: 6e 74 20 28 6d 65 61 6e 69 6e 67 20 74 68 65 20  nt (meaning the 
1070: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
1080: 61 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 74 68  a constant or th
1090: 69 73 20 69 73 20 69 74 73 20 66 69 72 73 74 0a  is is its first.
10a0: 2a 2a 20 63 61 6c 6c 29 20 74 68 65 6e 20 74 68  ** call) then th
10b0: 65 20 72 65 73 75 6c 74 20 66 6f 72 20 74 68 61  e result for tha
10c0: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 30 2e  t argument is 0.
10d0: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20    If there is a 
10e0: 70 72 69 6f 72 0a 2a 2a 20 72 65 67 69 73 74 72  prior.** registr
10f0: 61 74 69 6f 6e 2c 20 74 68 65 20 72 65 73 75 6c  ation, the resul
1100: 74 20 66 6f 72 20 74 68 61 74 20 61 72 67 75 6d  t for that argum
1110: 65 6e 74 20 69 73 20 31 2e 20 20 54 68 65 20 6f  ent is 1.  The o
1120: 76 65 72 61 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a  verall result.**
1130: 20 69 73 20 74 68 65 20 69 6e 64 69 76 69 64 75   is the individu
1140: 61 6c 20 61 72 67 75 6d 65 6e 74 20 72 65 73 75  al argument resu
1150: 6c 74 73 20 73 65 70 61 72 61 74 65 64 20 62 79  lts separated by
1160: 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
1170: 69 63 20 76 6f 69 64 20 66 72 65 65 5f 74 65 73  ic void free_tes
1180: 74 5f 61 75 78 64 61 74 61 28 76 6f 69 64 20 2a  t_auxdata(void *
1190: 70 29 20 7b 73 71 6c 69 74 65 33 5f 66 72 65 65  p) {sqlite3_free
11a0: 28 70 29 3b 7d 0a 73 74 61 74 69 63 20 76 6f 69  (p);}.static voi
11b0: 64 20 74 65 73 74 5f 61 75 78 64 61 74 61 28 0a  d test_auxdata(.
11c0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
11d0: 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
11e0: 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
11f0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
1200: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
1210: 2a 7a 52 65 74 20 3d 20 74 65 73 74 43 6f 6e 74  *zRet = testCont
1220: 65 78 74 4d 61 6c 6c 6f 63 28 70 43 74 78 2c 20  extMalloc(pCtx, 
1230: 6e 41 72 67 2a 32 29 3b 0a 20 20 69 66 28 20 21  nArg*2);.  if( !
1240: 7a 52 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  zRet ) return;. 
1250: 20 6d 65 6d 73 65 74 28 7a 52 65 74 2c 20 30 2c   memset(zRet, 0,
1260: 20 6e 41 72 67 2a 32 29 3b 0a 20 20 66 6f 72 28   nArg*2);.  for(
1270: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
1280: 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  ){.    char cons
1290: 74 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  t *z = (char*)sq
12a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
12b0: 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69  (argv[i]);.    i
12c0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 69 6e  f( z ){.      in
12d0: 74 20 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20  t n;.      char 
12e0: 2a 7a 41 75 78 20 3d 20 73 71 6c 69 74 65 33 5f  *zAux = sqlite3_
12f0: 67 65 74 5f 61 75 78 64 61 74 61 28 70 43 74 78  get_auxdata(pCtx
1300: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
1310: 7a 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20 20  zAux ){.        
1320: 7a 52 65 74 5b 69 2a 32 5d 20 3d 20 27 31 27 3b  zRet[i*2] = '1';
1330: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1340: 20 73 74 72 63 6d 70 28 7a 41 75 78 2c 7a 29 3d   strcmp(zAux,z)=
1350: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  =0 );.      }els
1360: 65 20 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  e {.        zRet
1370: 5b 69 2a 32 5d 20 3d 20 27 30 27 3b 0a 20 20 20  [i*2] = '0';.   
1380: 20 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73     }.      n = s
1390: 74 72 6c 65 6e 28 7a 29 20 2b 20 31 3b 0a 20 20  trlen(z) + 1;.  
13a0: 20 20 20 20 7a 41 75 78 20 3d 20 74 65 73 74 43      zAux = testC
13b0: 6f 6e 74 65 78 74 4d 61 6c 6c 6f 63 28 70 43 74  ontextMalloc(pCt
13c0: 78 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  x, n);.      if(
13d0: 20 7a 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20   zAux ){.       
13e0: 20 6d 65 6d 63 70 79 28 7a 41 75 78 2c 20 7a 2c   memcpy(zAux, z,
13f0: 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   n);.        sql
1400: 69 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61  ite3_set_auxdata
1410: 28 70 43 74 78 2c 20 69 2c 20 7a 41 75 78 2c 20  (pCtx, i, zAux, 
1420: 66 72 65 65 5f 74 65 73 74 5f 61 75 78 64 61 74  free_test_auxdat
1430: 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
1440: 20 20 7a 52 65 74 5b 69 2a 32 2b 31 5d 20 3d 20    zRet[i*2+1] = 
1450: 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ' ';.    }.  }. 
1460: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1470: 74 65 78 74 28 70 43 74 78 2c 20 7a 52 65 74 2c  text(pCtx, zRet,
1480: 20 32 2a 6e 41 72 67 2d 31 2c 20 66 72 65 65 5f   2*nArg-1, free_
1490: 74 65 73 74 5f 61 75 78 64 61 74 61 29 3b 0a 7d  test_auxdata);.}
14a0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 66 75 6e 63 74 69  ../*.** A functi
14b0: 6f 6e 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72  on to test error
14c0: 20 72 65 70 6f 72 74 69 6e 67 20 66 72 6f 6d 20   reporting from 
14d0: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 20  user functions. 
14e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
14f0: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20   returns a copy 
1500: 6f 66 20 69 74 73 20 66 69 72 73 74 20 61 72 67  of its first arg
1510: 75 6d 65 6e 74 20 61 73 20 74 68 65 20 65 72 72  ument as the err
1520: 6f 72 20 6d 65 73 73 61 67 65 2e 20 20 49 66 20  or message.  If 
1530: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72  the.** second ar
1540: 67 75 6d 65 6e 74 20 65 78 69 73 74 73 2c 20 69  gument exists, i
1550: 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20 65 72  t becomes the er
1560: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
1570: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 65 72  tic void test_er
1580: 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ror(.  sqlite3_c
1590: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
15a0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
15b0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
15c0: 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  v.){.  sqlite3_r
15d0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
15e0: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
15f0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1600: 5b 30 5d 29 2c 20 2d 31 29 3b 0a 20 20 69 66 28  [0]), -1);.  if(
1610: 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
1620: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
1630: 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20  rror_code(pCtx, 
1640: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
1650: 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 7d  t(argv[1]));.  }
1660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
1670: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1680: 63 6f 75 6e 74 65 72 28 58 29 20 66 75 6e 63 74  counter(X) funct
1690: 69 6f 6e 2e 20 20 49 66 20 58 20 69 73 20 61 6e  ion.  If X is an
16a0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73   integer.** cons
16b0: 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 66  tant, then the f
16c0: 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  irst invocation 
16d0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 58 2e 20 20  will return X.  
16e0: 54 68 65 20 73 65 63 6f 6e 64 20 58 2b 31 2e 0a  The second X+1..
16f0: 2a 2a 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** and so forth.
1700: 20 20 43 61 6e 20 62 65 20 75 73 65 64 20 28 66    Can be used (f
1710: 6f 72 20 65 78 61 6d 70 6c 65 29 20 74 6f 20 70  or example) to p
1720: 72 6f 76 69 64 65 20 61 20 73 65 71 75 65 6e 63  rovide a sequenc
1730: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 69 6e 20 61  e number.** in a
1740: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
1750: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e  static void coun
1760: 74 65 72 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  terFunc(.  sqlit
1770: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
1780: 2c 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  ,   /* Function 
1790: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
17a0: 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
17b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17c0: 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
17d0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ments */.  sqlit
17e0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 20  e3_value **argv 
17f0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 66 6f      /* Values fo
1800: 72 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 61  r all function a
1810: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
1820: 20 69 6e 74 20 2a 70 43 6f 75 6e 74 65 72 20 3d   int *pCounter =
1830: 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 67   (int*)sqlite3_g
1840: 65 74 5f 61 75 78 64 61 74 61 28 70 43 74 78 2c  et_auxdata(pCtx,
1850: 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 75 6e   0);.  if( pCoun
1860: 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  ter==0 ){.    pC
1870: 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33  ounter = sqlite3
1880: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
1890: 2a 70 43 6f 75 6e 74 65 72 29 20 29 3b 0a 20 20  *pCounter) );.  
18a0: 20 20 69 66 28 20 70 43 6f 75 6e 74 65 72 3d 3d    if( pCounter==
18b0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
18c0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
18d0: 6e 6f 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20  nomem(pCtx);.   
18e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
18f0: 0a 20 20 20 20 2a 70 43 6f 75 6e 74 65 72 20 3d  .    *pCounter =
1900: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
1910: 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  nt(argv[0]);.   
1920: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 78   sqlite3_set_aux
1930: 64 61 74 61 28 70 43 74 78 2c 20 30 2c 20 70 43  data(pCtx, 0, pC
1940: 6f 75 6e 74 65 72 2c 20 73 71 6c 69 74 65 33 5f  ounter, sqlite3_
1950: 66 72 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  free);.  }else{.
1960: 20 20 20 20 2b 2b 2a 70 43 6f 75 6e 74 65 72 3b      ++*pCounter;
1970: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
1980: 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20  esult_int(pCtx, 
1990: 2a 70 43 6f 75 6e 74 65 72 29 3b 0a 7d 0a 0a 0a  *pCounter);.}...
19a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
19b0: 69 6f 6e 20 74 61 6b 65 73 20 74 77 6f 20 61 72  ion takes two ar
19c0: 67 75 6d 65 6e 74 73 2e 20 20 49 74 20 70 65 72  guments.  It per
19d0: 66 6f 72 6d 61 6e 63 65 20 55 54 46 2d 38 2f 31  formance UTF-8/1
19e0: 36 20 74 79 70 65 0a 2a 2a 20 63 6f 6e 76 65 72  6 type.** conver
19f0: 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 66 69 72  sions on the fir
1a00: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 68 65 6e  st argument then
1a10: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20   returns a copy 
1a20: 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  of the second.**
1a30: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
1a40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1a50: 73 20 75 73 65 64 20 69 6e 20 63 61 73 65 73 20  s used in cases 
1a60: 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c  such as the foll
1a70: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
1a80: 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 69 73    SELECT test_is
1a90: 6f 6c 61 74 69 6f 6e 28 78 2c 78 29 20 46 52 4f  olation(x,x) FRO
1aa0: 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 57 65 20 77  M t1;.**.** We w
1ab0: 61 6e 74 20 74 6f 20 76 65 72 69 66 79 20 74 68  ant to verify th
1ac0: 61 74 20 74 68 65 20 74 79 70 65 20 63 6f 6e 76  at the type conv
1ad0: 65 72 73 69 6f 6e 73 20 74 68 61 74 20 6f 63 63  ersions that occ
1ae0: 75 72 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 69 72  ur on the.** fir
1af0: 73 74 20 61 72 67 75 6d 65 6e 74 20 64 6f 20 6e  st argument do n
1b00: 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  ot invalidate th
1b10: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1b20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1b30: 64 20 74 65 73 74 5f 69 73 6f 6c 61 74 69 6f 6e  d test_isolation
1b40: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1b50: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1b60: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1b70: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
1b80: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1b90: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
1ba0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1bb0: 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73  16(argv[0]);.  s
1bc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1bd0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71  t(argv[0]);.  sq
1be0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1bf0: 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73  16(argv[0]);.  s
1c00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1c10: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64  t(argv[0]);.#end
1c20: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  if.  sqlite3_res
1c30: 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20  ult_value(pCtx, 
1c40: 61 72 67 76 5b 31 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  argv[1]);.}../*.
1c50: 2a 2a 20 49 6e 76 6f 6b 65 20 61 6e 20 53 51 4c  ** Invoke an SQL
1c60: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 63 75 72   statement recur
1c70: 73 69 76 65 6c 79 2e 20 20 54 68 65 20 66 75 6e  sively.  The fun
1c80: 63 74 69 6f 6e 20 72 65 73 75 6c 74 20 69 73 20  ction result is 
1c90: 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 63 6f  the .** first co
1ca0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73  lumn of the firs
1cb0: 74 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  t row of the res
1cc0: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
1cd0: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 65 76 61  ic void test_eva
1ce0: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  l(.  sqlite3_con
1cf0: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
1d00: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
1d10: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1d20: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1d30: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1d40: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
1d50: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
1d60: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
1d70: 74 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  tx);.  const cha
1d80: 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20 7a 53 71 6c  r *zSql;..  zSql
1d90: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
1da0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
1db0: 76 5b 30 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  v[0]);.  rc = sq
1dc0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1dd0: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
1de0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
1df0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e00: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1e10: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
1e20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e30: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
1e40: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
1e50: 61 6c 75 65 28 70 43 74 78 2c 20 73 71 6c 69 74  alue(pCtx, sqlit
1e60: 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
1e70: 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20  pStmt, 0));.    
1e80: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
1e90: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1ea0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  t);.  }.  if( rc
1eb0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
1ec0: 72 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rr;.    assert( 
1ed0: 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
1ee0: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
1ef0: 70 72 69 6e 74 66 28 22 73 71 6c 69 74 65 33 5f  printf("sqlite3_
1f00: 70 72 65 70 61 72 65 5f 76 32 28 29 20 65 72 72  prepare_v2() err
1f10: 6f 72 3a 20 25 73 22 2c 73 71 6c 69 74 65 33 5f  or: %s",sqlite3_
1f20: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
1f30: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f40: 74 65 78 74 28 70 43 74 78 2c 20 7a 45 72 72 2c  text(pCtx, zErr,
1f50: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
1f60: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
1f70: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64  result_error_cod
1f80: 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d  e(pCtx, rc);.  }
1f90: 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .}...static int 
1fa0: 72 65 67 69 73 74 65 72 54 65 73 74 46 75 6e 63  registerTestFunc
1fb0: 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64  tions(sqlite3 *d
1fc0: 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  b){.  static con
1fd0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
1fe0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
1ff0: 20 20 20 73 69 67 6e 65 64 20 63 68 61 72 20 6e     signed char n
2000: 41 72 67 3b 0a 20 20 20 20 20 75 6e 73 69 67 6e  Arg;.     unsign
2010: 65 64 20 63 68 61 72 20 65 54 65 78 74 52 65 70  ed char eTextRep
2020: 3b 20 2f 2a 20 31 3a 20 55 54 46 2d 31 36 2e 20  ; /* 1: UTF-16. 
2030: 20 30 3a 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20   0: UTF-8 */.   
2040: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
2050: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
2060: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
2070: 75 65 20 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e  ue **);.  } aFun
2080: 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  cs[] = {.    { "
2090: 72 61 6e 64 73 74 72 22 2c 20 20 20 20 20 20 20  randstr",       
20a0: 20 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54          2, SQLIT
20b0: 45 5f 55 54 46 38 2c 20 72 61 6e 64 53 74 72 20  E_UTF8, randStr 
20c0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73     },.    { "tes
20d0: 74 5f 64 65 73 74 72 75 63 74 6f 72 22 2c 20 20  t_destructor",  
20e0: 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55       1, SQLITE_U
20f0: 54 46 38 2c 20 74 65 73 74 5f 64 65 73 74 72 75  TF8, test_destru
2100: 63 74 6f 72 7d 2c 0a 23 69 66 6e 64 65 66 20 53  ctor},.#ifndef S
2110: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
2120: 0a 20 20 20 20 7b 20 22 74 65 73 74 5f 64 65 73  .    { "test_des
2130: 74 72 75 63 74 6f 72 31 36 22 2c 20 20 20 20 20  tructor16",     
2140: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
2150: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 31  test_destructor1
2160: 36 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  6},.#endif.    {
2170: 20 22 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f   "test_destructo
2180: 72 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c  r_count", 0, SQL
2190: 49 54 45 5f 55 54 46 38 2c 20 74 65 73 74 5f 64  ITE_UTF8, test_d
21a0: 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 7d  estructor_count}
21b0: 2c 0a 20 20 20 20 7b 20 22 74 65 73 74 5f 61 75  ,.    { "test_au
21c0: 78 64 61 74 61 22 2c 20 20 20 20 20 20 20 20 20  xdata",         
21d0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
21e0: 20 74 65 73 74 5f 61 75 78 64 61 74 61 7d 2c 0a   test_auxdata},.
21f0: 20 20 20 20 7b 20 22 74 65 73 74 5f 65 72 72 6f      { "test_erro
2200: 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  r",            1
2210: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 74  , SQLITE_UTF8, t
2220: 65 73 74 5f 65 72 72 6f 72 7d 2c 0a 20 20 20 20  est_error},.    
2230: 7b 20 22 74 65 73 74 5f 65 72 72 6f 72 22 2c 20  { "test_error", 
2240: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 53 51             2, SQ
2250: 4c 49 54 45 5f 55 54 46 38 2c 20 74 65 73 74 5f  LITE_UTF8, test_
2260: 65 72 72 6f 72 7d 2c 0a 20 20 20 20 7b 20 22 74  error},.    { "t
2270: 65 73 74 5f 65 76 61 6c 22 2c 20 20 20 20 20 20  est_eval",      
2280: 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45         1, SQLITE
2290: 5f 55 54 46 38 2c 20 74 65 73 74 5f 65 76 61 6c  _UTF8, test_eval
22a0: 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73 74 5f 69  },.    { "test_i
22b0: 73 6f 6c 61 74 69 6f 6e 22 2c 20 20 20 20 20 20  solation",      
22c0: 20 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38    2, SQLITE_UTF8
22d0: 2c 20 74 65 73 74 5f 69 73 6f 6c 61 74 69 6f 6e  , test_isolation
22e0: 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73 74 5f 63  },.    { "test_c
22f0: 6f 75 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  ounter",        
2300: 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38    1, SQLITE_UTF8
2310: 2c 20 63 6f 75 6e 74 65 72 46 75 6e 63 7d 2c 0a  , counterFunc},.
2320: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20    };.  int i;.. 
2330: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2340: 6f 66 28 61 46 75 6e 63 73 29 2f 73 69 7a 65 6f  of(aFuncs)/sizeo
2350: 66 28 61 46 75 6e 63 73 5b 30 5d 29 3b 20 69 2b  f(aFuncs[0]); i+
2360: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
2370: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
2380: 64 62 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e  db, aFuncs[i].zN
2390: 61 6d 65 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 6e  ame, aFuncs[i].n
23a0: 41 72 67 2c 0a 20 20 20 20 20 20 20 20 61 46 75  Arg,.        aFu
23b0: 6e 63 73 5b 69 5d 2e 65 54 65 78 74 52 65 70 2c  ncs[i].eTextRep,
23c0: 20 30 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 78 46   0, aFuncs[i].xF
23d0: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
23e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c  OK;.}../*.** TCL
2400: 43 4d 44 3a 20 20 61 75 74 6f 69 6e 73 74 61 6c  CMD:  autoinstal
2410: 6c 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 73  l_test_functions
2420: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
2430: 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74  is TCL command t
2440: 6f 20 75 73 65 20 73 71 6c 69 74 65 33 5f 61 75  o use sqlite3_au
2450: 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 74  to_extension() t
2460: 6f 20 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 73  o cause.** the s
2470: 74 61 6e 64 61 72 64 20 73 65 74 20 6f 66 20 74  tandard set of t
2480: 65 73 74 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  est functions to
2490: 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   be loaded into 
24a0: 65 61 63 68 20 6e 65 77 0a 2a 2a 20 64 61 74 61  each new.** data
24b0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
24c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
24d0: 75 74 6f 69 6e 73 74 61 6c 6c 5f 74 65 73 74 5f  utoinstall_test_
24e0: 66 75 6e 63 73 28 0a 20 20 76 6f 69 64 20 2a 20  funcs(.  void * 
24f0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2500: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2510: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2520: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2530: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72  bjv[].){.  exter
2540: 6e 20 69 6e 74 20 4d 64 35 5f 52 65 67 69 73 74  n int Md5_Regist
2550: 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  er(sqlite3*);.  
2560: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
2570: 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28  _auto_extension(
2580: 28 76 6f 69 64 2a 29 72 65 67 69 73 74 65 72 54  (void*)registerT
2590: 65 73 74 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20  estFunctions);. 
25a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
25c0: 71 6c 69 74 65 33 5f 61 75 74 6f 5f 65 78 74 65  qlite3_auto_exte
25d0: 6e 73 69 6f 6e 28 28 76 6f 69 64 2a 29 4d 64 35  nsion((void*)Md5
25e0: 5f 52 65 67 69 73 74 65 72 29 3b 0a 20 20 7d 0a  _Register);.  }.
25f0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2600: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2610: 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20  ewIntObj(rc));. 
2620: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2630: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 62 6f 67 75 73  }../*.** A bogus
2640: 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 61   step function a
2650: 6e 64 20 66 69 6e 61 6c 69 7a 65 72 20 66 75 6e  nd finalizer fun
2660: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2670: 20 76 6f 69 64 20 74 53 74 65 70 28 73 71 6c 69   void tStep(sqli
2680: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 61 2c 20  te3_context *a, 
2690: 69 6e 74 20 62 2c 20 73 71 6c 69 74 65 33 5f 76  int b, sqlite3_v
26a0: 61 6c 75 65 20 2a 2a 63 29 7b 7d 0a 73 74 61 74  alue **c){}.stat
26b0: 69 63 20 76 6f 69 64 20 74 46 69 6e 61 6c 28 73  ic void tFinal(s
26c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
26d0: 61 29 7b 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  a){}.../*.** tcl
26e0: 63 6d 64 3a 20 20 61 62 75 73 65 5f 63 72 65 61  cmd:  abuse_crea
26f0: 74 65 5f 66 75 6e 63 74 69 6f 6e 0a 2a 2a 0a 2a  te_function.**.*
2700: 2a 20 4d 61 6b 65 20 76 61 72 69 6f 75 73 20 63  * Make various c
2710: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f  alls to sqlite3_
2720: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
2730: 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65  that do not have
2740: 20 76 61 6c 69 64 0a 2a 2a 20 70 61 72 61 6d 65   valid.** parame
2750: 74 65 72 73 2e 20 20 56 65 72 69 66 79 20 74 68  ters.  Verify th
2760: 61 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 6e  at the error con
2770: 64 69 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  dition is detect
2780: 65 64 20 61 6e 64 20 72 65 70 6f 72 74 65 64 2e  ed and reported.
2790: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
27a0: 62 75 73 65 5f 63 72 65 61 74 65 5f 66 75 6e 63  buse_create_func
27b0: 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
27c0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
27d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
27e0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
27f0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2800: 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e  jv[].){.  extern
2810: 20 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65   int getDbPointe
2820: 72 28 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 20 63  r(Tcl_Interp*, c
2830: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69  onst char*, sqli
2840: 74 65 33 2a 2a 29 3b 0a 20 20 73 71 6c 69 74 65  te3**);.  sqlite
2850: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
2860: 0a 20 20 69 6e 74 20 6d 78 41 72 67 3b 0a 0a 20  .  int mxArg;.. 
2870: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2880: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
2890: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
28a0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
28b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
28c0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
28d0: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
28e0: 74 78 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  tx", 1, SQLITE_U
28f0: 54 46 38 2c 20 30 2c 20 74 53 74 65 70 2c 74 53  TF8, 0, tStep,tS
2900: 74 65 70 2c 74 46 69 6e 61 6c 29 3b 0a 20 20 69  tep,tFinal);.  i
2910: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 45 52  f( rc!=SQLITE_ER
2920: 52 4f 52 20 29 20 67 6f 74 6f 20 61 62 75 73 65  ROR ) goto abuse
2930: 5f 65 72 72 3b 0a 20 20 69 66 28 20 73 71 6c 69  _err;.  if( sqli
2940: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 21  te3_errcode(db)!
2950: 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 20  =SQLITE_ERROR ) 
2960: 67 6f 74 6f 20 61 62 75 73 65 5f 65 72 72 3b 0a  goto abuse_err;.
2970: 20 20 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c    if( strcmp(sql
2980: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
2990: 20 22 62 61 64 20 70 61 72 61 6d 65 74 65 72 73   "bad parameters
29a0: 22 29 21 3d 30 20 29 20 67 6f 74 6f 20 61 62 75  ")!=0 ) goto abu
29b0: 73 65 5f 65 72 72 3b 0a 0a 20 20 72 63 20 3d 20  se_err;..  rc = 
29c0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
29d0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 78 22  unction(db, "tx"
29e0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
29f0: 2c 20 30 2c 20 74 53 74 65 70 2c 20 74 53 74 65  , 0, tStep, tSte
2a00: 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  p, 0);.  if( rc!
2a10: 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 20  =SQLITE_ERROR ) 
2a20: 67 6f 74 6f 20 61 62 75 73 65 5f 65 72 72 3b 0a  goto abuse_err;.
2a30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 65 72    if( sqlite3_er
2a40: 72 63 6f 64 65 28 64 62 29 21 3d 53 51 4c 49 54  rcode(db)!=SQLIT
2a50: 45 5f 45 52 52 4f 52 20 29 20 67 6f 74 6f 20 61  E_ERROR ) goto a
2a60: 62 75 73 65 5f 65 72 72 3b 0a 20 20 69 66 28 20  buse_err;.  if( 
2a70: 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 65  strcmp(sqlite3_e
2a80: 72 72 6d 73 67 28 64 62 29 2c 20 22 62 61 64 20  rrmsg(db), "bad 
2a90: 70 61 72 61 6d 65 74 65 72 73 22 29 21 3d 30 20  parameters")!=0 
2aa0: 29 20 67 6f 74 6f 20 61 62 75 73 65 5f 65 72 72  ) goto abuse_err
2ab0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
2ac0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
2ad0: 6e 28 64 62 2c 20 22 74 78 22 2c 20 31 2c 20 53  n(db, "tx", 1, S
2ae0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74  QLITE_UTF8, 0, t
2af0: 53 74 65 70 2c 20 30 2c 20 74 46 69 6e 61 6c 29  Step, 0, tFinal)
2b00: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2b10: 54 45 5f 45 52 52 4f 52 20 29 20 67 6f 74 6f 20  TE_ERROR ) goto 
2b20: 61 62 75 73 65 5f 65 72 72 3b 0a 20 20 69 66 28  abuse_err;.  if(
2b30: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
2b40: 28 64 62 29 21 3d 53 51 4c 49 54 45 5f 45 52 52  (db)!=SQLITE_ERR
2b50: 4f 52 20 29 20 67 6f 74 6f 20 61 62 75 73 65 5f  OR ) goto abuse_
2b60: 65 72 72 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  err;.  if( strcm
2b70: 70 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  p(sqlite3_errmsg
2b80: 28 64 62 29 2c 20 22 62 61 64 20 70 61 72 61 6d  (db), "bad param
2b90: 65 74 65 72 73 22 29 21 3d 30 20 29 20 67 6f 74  eters")!=0 ) got
2ba0: 6f 20 61 62 75 73 65 5f 65 72 72 3b 0a 0a 20 20  o abuse_err;..  
2bb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
2bc0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
2bd0: 20 22 74 78 22 2c 20 31 2c 20 53 51 4c 49 54 45   "tx", 1, SQLITE
2be0: 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 30 2c 20  _UTF8, 0, 0, 0, 
2bf0: 74 46 69 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  tFinal);.  if( r
2c00: 63 21 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c!=SQLITE_ERROR 
2c10: 29 20 67 6f 74 6f 20 61 62 75 73 65 5f 65 72 72  ) goto abuse_err
2c20: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
2c30: 65 72 72 63 6f 64 65 28 64 62 29 21 3d 53 51 4c  errcode(db)!=SQL
2c40: 49 54 45 5f 45 52 52 4f 52 20 29 20 67 6f 74 6f  ITE_ERROR ) goto
2c50: 20 61 62 75 73 65 5f 65 72 72 3b 0a 20 20 69 66   abuse_err;.  if
2c60: 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33  ( strcmp(sqlite3
2c70: 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 22 62 61  _errmsg(db), "ba
2c80: 64 20 70 61 72 61 6d 65 74 65 72 73 22 29 21 3d  d parameters")!=
2c90: 30 20 29 20 67 6f 74 6f 20 61 62 75 73 65 5f 65  0 ) goto abuse_e
2ca0: 72 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rr;..  rc = sqli
2cb0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
2cc0: 69 6f 6e 28 64 62 2c 20 22 74 78 22 2c 20 31 2c  ion(db, "tx", 1,
2cd0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
2ce0: 20 30 2c 20 74 53 74 65 70 2c 20 30 29 3b 0a 20   0, tStep, 0);. 
2cf0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d00: 45 52 52 4f 52 20 29 20 67 6f 74 6f 20 61 62 75  ERROR ) goto abu
2d10: 73 65 5f 65 72 72 3b 0a 20 20 69 66 28 20 73 71  se_err;.  if( sq
2d20: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
2d30: 29 21 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  )!=SQLITE_ERROR 
2d40: 29 20 67 6f 74 6f 20 61 62 75 73 65 5f 65 72 72  ) goto abuse_err
2d50: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 73  ;.  if( strcmp(s
2d60: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
2d70: 29 2c 20 22 62 61 64 20 70 61 72 61 6d 65 74 65  ), "bad paramete
2d80: 72 73 22 29 21 3d 30 20 29 20 67 6f 74 6f 20 61  rs")!=0 ) goto a
2d90: 62 75 73 65 5f 65 72 72 3b 0a 0a 20 20 72 63 20  buse_err;..  rc 
2da0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
2db0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
2dc0: 78 22 2c 20 2d 32 2c 20 53 51 4c 49 54 45 5f 55  x", -2, SQLITE_U
2dd0: 54 46 38 2c 20 30 2c 20 74 53 74 65 70 2c 20 30  TF8, 0, tStep, 0
2de0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
2df0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 20 67  SQLITE_ERROR ) g
2e00: 6f 74 6f 20 61 62 75 73 65 5f 65 72 72 3b 0a 20  oto abuse_err;. 
2e10: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 65 72 72   if( sqlite3_err
2e20: 63 6f 64 65 28 64 62 29 21 3d 53 51 4c 49 54 45  code(db)!=SQLITE
2e30: 5f 45 52 52 4f 52 20 29 20 67 6f 74 6f 20 61 62  _ERROR ) goto ab
2e40: 75 73 65 5f 65 72 72 3b 0a 20 20 69 66 28 20 73  use_err;.  if( s
2e50: 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 65 72  trcmp(sqlite3_er
2e60: 72 6d 73 67 28 64 62 29 2c 20 22 62 61 64 20 70  rmsg(db), "bad p
2e70: 61 72 61 6d 65 74 65 72 73 22 29 21 3d 30 20 29  arameters")!=0 )
2e80: 20 67 6f 74 6f 20 61 62 75 73 65 5f 65 72 72 3b   goto abuse_err;
2e90: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2ea0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
2eb0: 28 64 62 2c 20 22 74 78 22 2c 20 31 32 38 2c 20  (db, "tx", 128, 
2ec0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
2ed0: 74 53 74 65 70 2c 20 30 2c 20 30 29 3b 0a 20 20  tStep, 0, 0);.  
2ee0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 45  if( rc!=SQLITE_E
2ef0: 52 52 4f 52 20 29 20 67 6f 74 6f 20 61 62 75 73  RROR ) goto abus
2f00: 65 5f 65 72 72 3b 0a 20 20 69 66 28 20 73 71 6c  e_err;.  if( sql
2f10: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
2f20: 21 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  !=SQLITE_ERROR )
2f30: 20 67 6f 74 6f 20 61 62 75 73 65 5f 65 72 72 3b   goto abuse_err;
2f40: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 73 71  .  if( strcmp(sq
2f50: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
2f60: 2c 20 22 62 61 64 20 70 61 72 61 6d 65 74 65 72  , "bad parameter
2f70: 73 22 29 21 3d 30 20 29 20 67 6f 74 6f 20 61 62  s")!=0 ) goto ab
2f80: 75 73 65 5f 65 72 72 3b 0a 0a 20 20 72 63 20 3d  use_err;..  rc =
2f90: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
2fa0: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66 75  function(db, "fu
2fb0: 6e 63 78 78 22 0a 20 20 20 20 20 20 20 22 5f 31  ncxx".       "_1
2fc0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
2fd0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
2fe0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
2ff0: 22 0a 20 20 20 20 20 20 20 22 5f 31 32 33 34 35  ".       "_12345
3000: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
3010: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
3020: 38 39 5f 31 32 33 34 35 36 37 38 39 22 0a 20 20  89_123456789".  
3030: 20 20 20 20 20 22 5f 31 32 33 34 35 36 37 38 39       "_123456789
3040: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
3050: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
3060: 32 33 34 35 36 37 38 39 22 0a 20 20 20 20 20 20  23456789".      
3070: 20 22 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33   "_123456789_123
3080: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
3090: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
30a0: 36 37 38 39 22 0a 20 20 20 20 20 20 20 22 5f 31  6789".       "_1
30b0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
30c0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
30d0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
30e0: 22 2c 0a 20 20 20 20 20 20 20 31 2c 20 53 51 4c  ",.       1, SQL
30f0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 74 53 74  ITE_UTF8, 0, tSt
3100: 65 70 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  ep, 0, 0);.  if(
3110: 20 72 63 21 3d 53 51 4c 49 54 45 5f 45 52 52 4f   rc!=SQLITE_ERRO
3120: 52 20 29 20 67 6f 74 6f 20 61 62 75 73 65 5f 65  R ) goto abuse_e
3130: 72 72 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rr;.  if( sqlite
3140: 33 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d 53  3_errcode(db)!=S
3150: 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 20 67 6f  QLITE_ERROR ) go
3160: 74 6f 20 61 62 75 73 65 5f 65 72 72 3b 0a 20 20  to abuse_err;.  
3170: 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74  if( strcmp(sqlit
3180: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 22  e3_errmsg(db), "
3190: 62 61 64 20 70 61 72 61 6d 65 74 65 72 73 22 29  bad parameters")
31a0: 21 3d 30 20 29 20 67 6f 74 6f 20 61 62 75 73 65  !=0 ) goto abuse
31b0: 5f 65 72 72 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  _err;..  /* This
31c0: 20 6c 61 73 74 20 66 75 6e 63 74 69 6f 6e 20 72   last function r
31d0: 65 67 69 73 74 72 61 74 69 6f 6e 20 73 68 6f 75  egistration shou
31e0: 6c 64 20 61 63 74 75 61 6c 6c 79 20 77 6f 72 6b  ld actually work
31f0: 2e 20 20 47 65 6e 65 72 61 74 65 0a 20 20 2a 2a  .  Generate.  **
3200: 20 61 20 6e 6f 2d 6f 70 20 66 75 6e 63 74 69 6f   a no-op functio
3210: 6e 20 28 74 68 61 74 20 61 6c 77 61 79 73 20 72  n (that always r
3220: 65 74 75 72 6e 73 20 4e 55 4c 4c 29 20 61 6e 64  eturns NULL) and
3230: 20 77 68 69 63 68 20 68 61 73 20 74 68 65 0a 20   which has the. 
3240: 20 2a 2a 20 6d 61 78 69 6d 75 6d 2d 6c 65 6e 67   ** maximum-leng
3250: 74 68 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  th function name
3260: 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
3270: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   number of param
3280: 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  eters..  */.  sq
3290: 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20  lite3_limit(db, 
32a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
32b0: 43 54 49 4f 4e 5f 41 52 47 2c 20 31 30 30 30 30  CTION_ARG, 10000
32c0: 29 3b 0a 20 20 6d 78 41 72 67 20 3d 20 73 71 6c  );.  mxArg = sql
32d0: 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53  ite3_limit(db, S
32e0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
32f0: 54 49 4f 4e 5f 41 52 47 2c 20 2d 31 29 3b 0a 20  TION_ARG, -1);. 
3300: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
3310: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
3320: 2c 20 22 6e 75 6c 6c 78 22 0a 20 20 20 20 20 20  , "nullx".      
3330: 20 22 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33   "_123456789_123
3340: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
3350: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
3360: 36 37 38 39 22 0a 20 20 20 20 20 20 20 22 5f 31  6789".       "_1
3370: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
3380: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
3390: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
33a0: 22 0a 20 20 20 20 20 20 20 22 5f 31 32 33 34 35  ".       "_12345
33b0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
33c0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
33d0: 38 39 5f 31 32 33 34 35 36 37 38 39 22 0a 20 20  89_123456789".  
33e0: 20 20 20 20 20 22 5f 31 32 33 34 35 36 37 38 39       "_123456789
33f0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
3400: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
3410: 32 33 34 35 36 37 38 39 22 0a 20 20 20 20 20 20  23456789".      
3420: 20 22 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33   "_123456789_123
3430: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
3440: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
3450: 36 37 38 39 22 2c 0a 20 20 20 20 20 20 20 6d 78  6789",.       mx
3460: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
3470: 2c 20 30 2c 20 74 53 74 65 70 2c 20 30 2c 20 30  , 0, tStep, 0, 0
3480: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
3490: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62  ITE_OK ) goto ab
34a0: 75 73 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20  use_err;.       
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c0: 20 20 20 20 20 20 20 20 20 0a 20 20 72 65 74 75           .  retu
34d0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 61 62 75 73  rn TCL_OK;..abus
34e0: 65 5f 65 72 72 3a 0a 20 20 54 63 6c 5f 41 70 70  e_err:.  Tcl_App
34f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3500: 2c 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  , "sqlite3_creat
3510: 65 5f 66 75 6e 63 74 69 6f 6e 20 61 62 75 73 65  e_function abuse
3520: 64 20 74 65 73 74 20 66 61 69 6c 65 64 22 2c 20  d test failed", 
3530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3540: 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
3550: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3560: 52 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  R;.}..../*.** Re
3570: 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20  gister commands 
3580: 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74  with the TCL int
3590: 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74  erpreter..*/.int
35a0: 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63   Sqlitetest_func
35b0: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
35c0: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73 74 61   *interp){.  sta
35d0: 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
35e0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
35f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72      Tcl_ObjCmdPr
3600: 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61  oc *xProc;.  } a
3610: 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20  ObjCmd[] = {.   
3620: 20 20 7b 20 22 61 75 74 6f 69 6e 73 74 61 6c 6c    { "autoinstall
3630: 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 73 22  _test_functions"
3640: 2c 20 20 20 20 61 75 74 6f 69 6e 73 74 61 6c 6c  ,    autoinstall
3650: 5f 74 65 73 74 5f 66 75 6e 63 73 20 7d 2c 0a 20  _test_funcs },. 
3660: 20 20 20 20 7b 20 22 61 62 75 73 65 5f 63 72 65      { "abuse_cre
3670: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20  ate_function",  
3680: 20 20 20 20 20 20 20 61 62 75 73 65 5f 63 72 65         abuse_cre
3690: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c  ate_function  },
36a0: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
36b0: 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f   extern int Md5_
36c0: 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33  Register(sqlite3
36d0: 2a 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  *);..  for(i=0; 
36e0: 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  i<sizeof(aObjCmd
36f0: 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  )/sizeof(aObjCmd
3700: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
3710: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
3720: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62  mand(interp, aOb
3730: 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61  jCmd[i].zName, a
3740: 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c  ObjCmd[i].xProc,
3750: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71   0, 0);.  }.  sq
3760: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
3770: 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 61 75  ();.  sqlite3_au
3780: 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 28 76 6f  to_extension((vo
3790: 69 64 2a 29 72 65 67 69 73 74 65 72 54 65 73 74  id*)registerTest
37a0: 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 73 71  Functions);.  sq
37b0: 6c 69 74 65 33 5f 61 75 74 6f 5f 65 78 74 65 6e  lite3_auto_exten
37c0: 73 69 6f 6e 28 28 76 6f 69 64 2a 29 4d 64 35 5f  sion((void*)Md5_
37d0: 52 65 67 69 73 74 65 72 29 3b 0a 20 20 72 65 74  Register);.  ret
37e0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a        urn TCL_OK;.}.