/ Hex Artifact Content
Login

Artifact b001fa7f1b9e2dc5c2331de62fc641b5ab2bd7a1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 75  or testing the u
0190: 74 66 2e 63 20 6d 6f 64 75 6c 65 20 69 6e 20 53  tf.c module in S
01a0: 51 4c 69 74 65 2e 20 20 54 68 69 73 20 63 6f 64  QLite.  This cod
01b0: 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 63 6c  e.** is not incl
01c0: 75 64 65 64 20 69 6e 20 74 68 65 20 53 51 4c 69  uded in the SQLi
01d0: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 49 74 20  te library.  It 
01e0: 69 73 20 75 73 65 64 20 66 6f 72 20 61 75 74 6f  is used for auto
01f0: 6d 61 74 65 64 0a 2a 2a 20 74 65 73 74 69 6e 67  mated.** testing
0200: 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c   of the SQLite l
0210: 69 62 72 61 72 79 2e 20 53 70 65 63 69 66 69 63  ibrary. Specific
0220: 61 6c 6c 79 2c 20 74 68 65 20 63 6f 64 65 20 69  ally, the code i
0230: 6e 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 69  n this file.** i
0240: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
0250: 6e 67 20 74 68 65 20 53 51 4c 69 74 65 20 72 6f  ng the SQLite ro
0260: 75 74 69 6e 65 73 20 66 6f 72 20 63 6f 6e 76 65  utines for conve
0270: 72 74 69 6e 67 20 62 65 74 77 65 65 6e 0a 2a 2a  rting between.**
0280: 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 75 70   the various sup
0290: 70 6f 72 74 65 64 20 75 6e 69 63 6f 64 65 20 65  ported unicode e
02a0: 6e 63 6f 64 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20  ncodings..**.** 
02b0: 24 49 64 3a 20 74 65 73 74 35 2e 63 2c 76 20 31  $Id: test5.c,v 1
02c0: 2e 31 33 20 32 30 30 34 2f 30 36 2f 32 35 20 30  .13 2004/06/25 0
02d0: 32 3a 33 38 3a 35 35 20 64 61 6e 69 65 6c 6b 31  2:38:55 danielk1
02e0: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  977 Exp $.*/.#in
02f0: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0300: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 76 64  .h".#include "vd
0310: 62 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  beInt.h".#includ
0320: 65 20 22 6f 73 2e 68 22 20 20 20 20 20 20 20 20  e "os.h"        
0330: 20 2f 2a 20 74 6f 20 67 65 74 20 53 51 4c 49 54   /* to get SQLIT
0340: 45 5f 42 49 47 45 4e 44 49 41 4e 20 2a 2f 0a 23  E_BIGENDIAN */.#
0350: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
0360: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
0370: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0380: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  ring.h>../*.** T
0390: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
03a0: 74 20 69 73 20 61 20 54 43 4c 20 55 54 46 2d 38  t is a TCL UTF-8
03b0: 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20   string. Return 
03c0: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 0a 2a  the byte array.*
03d0: 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 74 68  * object with th
03e0: 65 20 65 6e 63 6f 64 65 64 20 72 65 70 72 65 73  e encoded repres
03f0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0400: 73 74 72 69 6e 67 2c 20 69 6e 63 6c 75 64 69 6e  string, includin
0410: 67 0a 2a 2a 20 74 68 65 20 4e 55 4c 4c 20 74 65  g.** the NULL te
0420: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  rminator..*/.sta
0430: 74 69 63 20 69 6e 74 20 62 69 6e 61 72 69 7a 65  tic int binarize
0440: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
0450: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
0460: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
0470: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
0480: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
0490: 0a 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  .){.  int len;. 
04a0: 20 63 68 61 72 20 2a 62 79 74 65 73 3b 0a 20 20   char *bytes;.  
04b0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20  Tcl_Obj *pRet;. 
04c0: 20 61 73 73 65 72 74 28 6f 62 6a 63 3d 3d 32 29   assert(objc==2)
04d0: 3b 0a 0a 20 20 62 79 74 65 73 20 3d 20 54 63 6c  ;..  bytes = Tcl
04e0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
04f0: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6c 65 6e 29  j(objv[1], &len)
0500: 3b 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e  ;.  pRet = Tcl_N
0510: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 62  ewByteArrayObj(b
0520: 79 74 65 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  ytes, len+1);.  
0530: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
0540: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
0550: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
0560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
0570: 20 74 65 73 74 5f 76 61 6c 75 65 5f 6f 76 65 72   test_value_over
0580: 68 65 61 64 20 3c 72 65 70 65 61 74 2d 63 6f 75  head <repeat-cou
0590: 6e 74 3e 20 3c 64 6f 2d 63 61 6c 6c 73 3e 2e 0a  nt> <do-calls>..
05a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
05b0: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  ne is used to te
05c0: 73 74 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  st the overhead 
05d0: 6f 66 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  of calls to.** s
05e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
05f0: 74 28 29 2c 20 6f 6e 20 61 20 76 61 6c 75 65 20  t(), on a value 
0600: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
0610: 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 20 54 68  UTF-8 string. Th
0620: 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
0630: 66 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  figure out wheth
0640: 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20  er or not it is 
0650: 61 20 70 72 6f 62 6c 65 6d 20 74 6f 20 75 73 65  a problem to use
0660: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 0a 2a   sqlite3_value.*
0670: 2a 20 73 74 72 75 63 74 75 72 65 73 20 77 69 74  * structures wit
0680: 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
0690: 65 6e 63 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ence functions..
06a0: 2a 2a 0a 2a 2a 20 49 66 20 3c 64 6f 2d 63 61 6c  **.** If <do-cal
06b0: 6c 73 3e 20 69 73 20 30 2c 20 74 68 65 6e 20 74  ls> is 0, then t
06c0: 68 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  he calls to sqli
06d0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29  te3_value_text()
06e0: 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
06f0: 61 6c 6c 79 20 6d 61 64 65 2e 0a 2a 2f 0a 73 74  ally made..*/.st
0700: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 76 61  atic int test_va
0710: 6c 75 65 5f 6f 76 65 72 68 65 61 64 28 0a 20 20  lue_overhead(.  
0720: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
0730: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
0740: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
0750: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
0760: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
0770: 20 20 69 6e 74 20 64 6f 5f 63 61 6c 6c 73 3b 0a    int do_calls;.
0780: 20 20 69 6e 74 20 72 65 70 65 61 74 5f 63 6f 75    int repeat_cou
0790: 6e 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  nt;.  int i;.  M
07a0: 65 6d 20 76 61 6c 3b 0a 20 20 63 6f 6e 73 74 20  em val;.  const 
07b0: 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 20 20 69  char *zVal;..  i
07c0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
07d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
07e0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
07f0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
0800: 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
0810: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
0820: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
0830: 29 2c 20 22 20 3c 72 65 70 65 61 74 2d 63 6f 75  ), " <repeat-cou
0840: 6e 74 3e 20 3c 64 6f 2d 63 61 6c 6c 73 3e 22 2c  nt> <do-calls>",
0850: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
0860: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
0870: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
0880: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
0890: 6f 62 6a 76 5b 31 5d 2c 20 26 72 65 70 65 61 74  objv[1], &repeat
08a0: 5f 63 6f 75 6e 74 29 20 29 20 72 65 74 75 72 6e  _count) ) return
08b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
08c0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
08d0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
08e0: 5b 32 5d 2c 20 26 64 6f 5f 63 61 6c 6c 73 29 20  [2], &do_calls) 
08f0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
0900: 4f 52 3b 0a 0a 20 20 76 61 6c 2e 66 6c 61 67 73  OR;..  val.flags
0910: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
0920: 65 72 6d 7c 4d 45 4d 5f 53 74 61 74 69 63 3b 0a  erm|MEM_Static;.
0930: 20 20 76 61 6c 2e 7a 20 3d 20 22 68 65 6c 6c 6f    val.z = "hello
0940: 20 77 6f 72 6c 64 22 3b 0a 20 20 76 61 6c 2e 74   world";.  val.t
0950: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
0960: 54 3b 0a 20 20 76 61 6c 2e 65 6e 63 20 3d 20 53  T;.  val.enc = S
0970: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20 66  QLITE_UTF8;..  f
0980: 6f 72 28 69 3d 30 3b 20 69 3c 72 65 70 65 61 74  or(i=0; i<repeat
0990: 5f 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  _count; i++){.  
09a0: 20 20 69 66 28 20 64 6f 5f 63 61 6c 6c 73 20 29    if( do_calls )
09b0: 7b 0a 20 20 20 20 20 20 7a 56 61 6c 20 3d 20 73  {.      zVal = s
09c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
09d0: 74 28 26 76 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  t(&val);.    }. 
09e0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
09f0: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  _OK;.}..static u
0a00: 38 20 6e 61 6d 65 5f 74 6f 5f 65 6e 63 28 54 63  8 name_to_enc(Tc
0a10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0a20: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 29  , Tcl_Obj *pObj)
0a30: 7b 0a 20 20 73 74 72 75 63 74 20 45 6e 63 4e 61  {.  struct EncNa
0a40: 6d 65 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  me {.    char *z
0a50: 4e 61 6d 65 3b 0a 20 20 20 20 75 38 20 65 6e 63  Name;.    u8 enc
0a60: 3b 0a 20 20 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d  ;.  } encnames[]
0a70: 20 3d 20 7b 0a 20 20 20 20 7b 20 22 55 54 46 38   = {.    { "UTF8
0a80: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d  ", SQLITE_UTF8 }
0a90: 2c 0a 20 20 20 20 7b 20 22 55 54 46 31 36 4c 45  ,.    { "UTF16LE
0aa0: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
0ab0: 45 20 7d 2c 0a 20 20 20 20 7b 20 22 55 54 46 31  E },.    { "UTF1
0ac0: 36 42 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  6BE", SQLITE_UTF
0ad0: 31 36 42 45 20 7d 2c 0a 20 20 20 20 7b 20 22 55  16BE },.    { "U
0ae0: 54 46 31 36 22 2c 20 53 51 4c 49 54 45 5f 55 54  TF16", SQLITE_UT
0af0: 46 31 36 4e 41 54 49 56 45 20 7d 2c 0a 20 20 20  F16NATIVE },.   
0b00: 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20   { 0, 0 }.  };. 
0b10: 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20   struct EncName 
0b20: 2a 70 45 6e 63 3b 0a 20 20 63 68 61 72 20 2a 7a  *pEnc;.  char *z
0b30: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
0b40: 28 70 4f 62 6a 29 3b 0a 20 20 66 6f 72 28 70 45  (pObj);.  for(pE
0b50: 6e 63 3d 26 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b  nc=&encnames[0];
0b60: 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45   pEnc->zName; pE
0b70: 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30  nc++){.    if( 0
0b80: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
0b90: 28 7a 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 29  (z, pEnc->zName)
0ba0: 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
0bb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
0bc0: 20 21 70 45 6e 63 2d 3e 65 6e 63 20 29 7b 0a 20   !pEnc->enc ){. 
0bd0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
0be0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20  ult(interp, "No 
0bf0: 73 75 63 68 20 65 6e 63 6f 64 69 6e 67 3a 20 22  such encoding: "
0c00: 2c 20 7a 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , z, 0);.  }.  r
0c10: 65 74 75 72 6e 20 70 45 6e 63 2d 3e 65 6e 63 3b  eturn pEnc->enc;
0c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
0c30: 20 20 20 74 65 73 74 5f 74 72 61 6e 73 6c 61 74     test_translat
0c40: 65 20 3c 73 74 72 69 6e 67 2f 62 6c 6f 62 3e 20  e <string/blob> 
0c50: 3c 66 72 6f 6d 20 65 6e 63 3e 20 3c 74 6f 20 65  <from enc> <to e
0c60: 6e 63 3e 20 3f 3c 74 72 61 6e 73 69 65 6e 74 3e  nc> ?<transient>
0c70: 3f 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ?.**.*/.static i
0c80: 6e 74 20 74 65 73 74 5f 74 72 61 6e 73 6c 61 74  nt test_translat
0c90: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
0ca0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
0cb0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
0cc0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
0cd0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
0ce0: 5d 0a 29 7b 0a 20 20 75 38 20 65 6e 63 5f 66 72  ].){.  u8 enc_fr
0cf0: 6f 6d 3b 0a 20 20 75 38 20 65 6e 63 5f 74 6f 3b  om;.  u8 enc_to;
0d00: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
0d10: 20 2a 70 56 61 6c 3b 0a 0a 20 20 63 68 61 72 20   *pVal;..  char 
0d20: 2a 7a 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  *z;.  int len;. 
0d30: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
0d40: 69 64 20 2a 70 29 20 3d 20 53 51 4c 49 54 45 5f  id *p) = SQLITE_
0d50: 53 54 41 54 49 43 3b 0a 0a 20 20 69 66 28 20 6f  STATIC;..  if( o
0d60: 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d  bjc!=4 && objc!=
0d70: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
0d80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0d90: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
0da0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
0db0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
0dc0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
0dd0: 76 5b 30 5d 2c 20 30 29 2c 20 0a 20 20 20 20 20  v[0], 0), .     
0de0: 20 20 20 22 20 3c 73 74 72 69 6e 67 2f 62 6c 6f     " <string/blo
0df0: 62 3e 20 3c 66 72 6f 6d 20 65 6e 63 3e 20 3c 74  b> <from enc> <t
0e00: 6f 20 65 6e 63 3e 22 2c 20 30 0a 20 20 20 20 29  o enc>", 0.    )
0e10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
0e20: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
0e30: 28 20 6f 62 6a 63 3d 3d 35 20 29 7b 0a 20 20 20  ( objc==5 ){.   
0e40: 20 78 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 46   xDel = sqlite3F
0e50: 72 65 65 58 3b 0a 20 20 7d 0a 0a 20 20 65 6e 63  reeX;.  }..  enc
0e60: 5f 66 72 6f 6d 20 3d 20 6e 61 6d 65 5f 74 6f 5f  _from = name_to_
0e70: 65 6e 63 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  enc(interp, objv
0e80: 5b 32 5d 29 3b 0a 20 20 69 66 28 20 21 65 6e 63  [2]);.  if( !enc
0e90: 5f 66 72 6f 6d 20 29 20 72 65 74 75 72 6e 20 54  _from ) return T
0ea0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 65 6e 63 5f  CL_ERROR;.  enc_
0eb0: 74 6f 20 3d 20 6e 61 6d 65 5f 74 6f 5f 65 6e 63  to = name_to_enc
0ec0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
0ed0: 29 3b 0a 20 20 69 66 28 20 21 65 6e 63 5f 74 6f  );.  if( !enc_to
0ee0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
0ef0: 52 4f 52 3b 0a 0a 20 20 70 56 61 6c 20 3d 20 73  ROR;..  pVal = s
0f00: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29  qlite3ValueNew()
0f10: 3b 0a 0a 20 20 69 66 28 20 65 6e 63 5f 66 72 6f  ;..  if( enc_fro
0f20: 6d 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29  m==SQLITE_UTF8 )
0f30: 7b 0a 20 20 20 20 7a 20 3d 20 54 63 6c 5f 47 65  {.    z = Tcl_Ge
0f40: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
0f50: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ;.    if( objc==
0f60: 35 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  5 ){.      z = s
0f70: 71 6c 69 74 65 53 74 72 44 75 70 28 7a 29 3b 0a  qliteStrDup(z);.
0f80: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
0f90: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
0fa0: 6c 2c 20 2d 31 2c 20 7a 2c 20 65 6e 63 5f 66 72  l, -1, z, enc_fr
0fb0: 6f 6d 2c 20 78 44 65 6c 29 3b 0a 20 20 7d 65 6c  om, xDel);.  }el
0fc0: 73 65 7b 0a 20 20 20 20 7a 20 3d 20 54 63 6c 5f  se{.    z = Tcl_
0fd0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
0fe0: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6c 65  Obj(objv[1], &le
0ff0: 6e 29 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  n);.    if( objc
1000: 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==5 ){.      cha
1010: 72 20 2a 7a 54 6d 70 20 3d 20 7a 3b 0a 20 20 20  r *zTmp = z;.   
1020: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c     z = sqliteMal
1030: 6c 6f 63 28 6c 65 6e 29 3b 0a 20 20 20 20 20 20  loc(len);.      
1040: 6d 65 6d 63 70 79 28 7a 2c 20 7a 54 6d 70 2c 20  memcpy(z, zTmp, 
1050: 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  len);.    }.    
1060: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
1070: 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 2c 20  tr(pVal, -1, z, 
1080: 65 6e 63 5f 66 72 6f 6d 2c 20 78 44 65 6c 29 3b  enc_from, xDel);
1090: 0a 20 20 7d 0a 0a 20 20 7a 20 3d 20 28 63 68 61  .  }..  z = (cha
10a0: 72 20 2a 29 73 71 6c 69 74 65 33 56 61 6c 75 65  r *)sqlite3Value
10b0: 54 65 78 74 28 70 56 61 6c 2c 20 65 6e 63 5f 74  Text(pVal, enc_t
10c0: 6f 29 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69  o);.  len = sqli
10d0: 74 65 33 56 61 6c 75 65 42 79 74 65 73 28 70 56  te3ValueBytes(pV
10e0: 61 6c 2c 20 65 6e 63 5f 74 6f 29 20 2b 20 28 65  al, enc_to) + (e
10f0: 6e 63 5f 74 6f 3d 3d 53 51 4c 49 54 45 5f 55 54  nc_to==SQLITE_UT
1100: 46 38 3f 31 3a 32 29 3b 0a 20 20 54 63 6c 5f 53  F8?1:2);.  Tcl_S
1110: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1120: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  rp, Tcl_NewByteA
1130: 72 72 61 79 4f 62 6a 28 7a 2c 20 6c 65 6e 29 29  rrayObj(z, len))
1140: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  ;..  sqlite3Valu
1150: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
1160: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1170: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 74  ../*.** Usage: t
1180: 72 61 6e 73 6c 61 74 65 5f 73 65 6c 66 74 65 73  ranslate_selftes
1190: 74 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  t.**.** Call sql
11a0: 69 74 65 33 75 74 66 53 65 6c 66 54 65 73 74 28  ite3utfSelfTest(
11b0: 29 20 74 6f 20 72 75 6e 20 74 68 65 20 69 6e 74  ) to run the int
11c0: 65 72 6e 61 6c 20 74 65 73 74 73 20 66 6f 72 20  ernal tests for 
11d0: 75 6e 69 63 6f 64 65 0a 2a 2a 20 74 72 61 6e 73  unicode.** trans
11e0: 6c 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65  lation. If there
11f0: 20 69 73 20 61 20 70 72 6f 62 6c 65 6d 20 61 6e   is a problem an
1200: 20 61 73 73 65 72 74 28 29 20 77 69 6c 6c 20 66   assert() will f
1210: 61 69 6c 2e 0a 2a 2a 2f 0a 76 6f 69 64 20 73 71  ail..**/.void sq
1220: 6c 69 74 65 33 75 74 66 53 65 6c 66 54 65 73 74  lite3utfSelfTest
1230: 28 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ();.static int t
1240: 65 73 74 5f 74 72 61 6e 73 6c 61 74 65 5f 73 65  est_translate_se
1250: 6c 66 74 65 73 74 28 0a 20 20 76 6f 69 64 20 2a  lftest(.  void *
1260: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1270: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1280: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1290: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
12a0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
12b0: 74 65 33 75 74 66 53 65 6c 66 54 65 73 74 28 29  te3utfSelfTest()
12c0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
12e0: 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64  Register command
12f0: 73 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69  s with the TCL i
1300: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69  nterpreter..*/.i
1310: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49  nt Sqlitetest5_I
1320: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
1330: 69 6e 74 65 72 70 29 7b 0a 20 20 73 74 61 74 69  interp){.  stati
1340: 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  c struct {.    c
1350: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
1360: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a  Tcl_ObjCmdProc *
1370: 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b  xProc;.  } aCmd[
1380: 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 62 69 6e  ] = {.    { "bin
1390: 61 72 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  arize",         
13a0: 20 20 20 20 20 20 20 28 54 63 6c 5f 4f 62 6a 43         (Tcl_ObjC
13b0: 6d 64 50 72 6f 63 2a 29 62 69 6e 61 72 69 7a 65  mdProc*)binarize
13c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 73 74 5f   },.    { "test_
13d0: 76 61 6c 75 65 5f 6f 76 65 72 68 65 61 64 22 2c  value_overhead",
13e0: 20 20 20 20 20 28 54 63 6c 5f 4f 62 6a 43 6d 64       (Tcl_ObjCmd
13f0: 50 72 6f 63 2a 29 74 65 73 74 5f 76 61 6c 75 65  Proc*)test_value
1400: 5f 6f 76 65 72 68 65 61 64 20 7d 2c 0a 20 20 20  _overhead },.   
1410: 20 7b 20 22 74 65 73 74 5f 74 72 61 6e 73 6c 61   { "test_transla
1420: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  te",          (T
1430: 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 74  cl_ObjCmdProc*)t
1440: 65 73 74 5f 74 72 61 6e 73 6c 61 74 65 20 20 20  est_translate   
1450: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 61 6e    },.    { "tran
1460: 73 6c 61 74 65 5f 73 65 6c 66 74 65 73 74 22 2c  slate_selftest",
1470: 20 20 20 20 20 20 28 54 63 6c 5f 4f 62 6a 43 6d        (Tcl_ObjCm
1480: 64 50 72 6f 63 2a 29 74 65 73 74 5f 74 72 61 6e  dProc*)test_tran
1490: 73 6c 61 74 65 5f 73 65 6c 66 74 65 73 74 7d 2c  slate_selftest},
14a0: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
14b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
14c0: 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28  of(aCmd)/sizeof(
14d0: 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aCmd[0]); i++){.
14e0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
14f0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
1500: 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20   aCmd[i].zName, 
1510: 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30  aCmd[i].xProc, 0
1520: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1530: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1540: 0a                                               .