/ Hex Artifact Content
Login

Artifact f5bc7f2d280670ecd79b9cf4f0f1760c607fe51f:


0000: 23 20 32 30 31 31 20 4d 61 72 63 68 20 31 35 0a  # 2011 March 15.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you give..#.#**
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 23 20 54 68 69 73 20 66 69 6c  *****.# This fil
0170: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67  e implements reg
0180: 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f  ression tests fo
0190: 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  r SQLite library
01a0: 2e 20 0a 23 0a 23 20 54 68 69 73 20 66 69 6c 65  . .#.# This file
01b0: 20 63 68 65 63 6b 73 20 74 6f 20 6d 61 6b 65 20   checks to make 
01c0: 73 75 72 65 20 53 51 4c 69 74 65 20 69 73 20 61  sure SQLite is a
01d0: 62 6c 65 20 74 6f 20 67 72 61 63 45 46 75 6c 6c  ble to gracEFull
01e0: 79 0a 23 20 68 61 6e 64 6c 65 20 6d 61 6c 66 6f  y.# handle malfo
01f0: 72 6d 65 64 20 55 54 46 2d 38 2e 0a 23 0a 0a 73  rmed UTF-8..#..s
0200: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
0210: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
0220: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
0230: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 70 72 6f  /tester.tcl..pro
0240: 63 20 75 74 66 38 5f 74 6f 5f 75 73 74 72 32 20  c utf8_to_ustr2 
0250: 7b 73 7d 20 7b 0a 20 20 73 65 74 20 72 20 22 22  {s} {.  set r ""
0260: 0a 20 20 66 6f 72 65 61 63 68 20 69 20 5b 73 70  .  foreach i [sp
0270: 6c 69 74 20 24 73 20 22 22 5d 20 7b 0a 20 20 20  lit $s ""] {.   
0280: 20 73 63 61 6e 20 24 69 20 25 63 20 63 0a 20 20   scan $i %c c.  
0290: 20 20 61 70 70 65 6e 64 20 72 20 5b 66 6f 72 6d    append r [form
02a0: 61 74 20 5c 5c 75 25 30 34 2e 34 58 20 24 63 5d  at \\u%04.4X $c]
02b0: 0a 20 20 7d 0a 20 20 73 65 74 20 72 0a 7d 0a 0a  .  }.  set r.}..
02c0: 70 72 6f 63 20 75 74 66 38 5f 74 6f 5f 68 73 74  proc utf8_to_hst
02d0: 72 20 7b 69 6e 7d 20 7b 0a 20 72 65 67 73 75 62  r {in} {. regsub
02e0: 20 2d 61 6c 6c 20 2d 2d 20 7b 28 2e 2e 29 7d 20   -all -- {(..)} 
02f0: 24 69 6e 20 7b 25 5b 66 6f 72 6d 61 74 20 22 25  $in {%[format "%
0300: 73 22 20 5c 31 5d 7d 20 6f 75 74 0a 20 73 75 62  s" \1]} out. sub
0310: 73 74 20 24 6f 75 74 0a 7d 0a 0a 70 72 6f 63 20  st $out.}..proc 
0320: 75 74 66 38 5f 74 6f 5f 78 73 74 72 20 7b 69 6e  utf8_to_xstr {in
0330: 7d 20 7b 0a 20 72 65 67 73 75 62 20 2d 61 6c 6c  } {. regsub -all
0340: 20 2d 2d 20 7b 28 2e 2e 29 7d 20 24 69 6e 20 7b   -- {(..)} $in {
0350: 5c 5c 5c 5c 78 5b 66 6f 72 6d 61 74 20 22 25 73  \\\\x[format "%s
0360: 22 20 5c 31 5d 7d 20 6f 75 74 0a 20 73 75 62 73  " \1]} out. subs
0370: 74 20 24 6f 75 74 0a 7d 0a 0a 70 72 6f 63 20 75  t $out.}..proc u
0380: 74 66 38 5f 74 6f 5f 75 73 74 72 20 7b 69 6e 7d  tf8_to_ustr {in}
0390: 20 7b 0a 20 72 65 67 73 75 62 20 2d 61 6c 6c 20   {. regsub -all 
03a0: 2d 2d 20 7b 28 2e 2e 29 7d 20 24 69 6e 20 7b 5c  -- {(..)} $in {\
03b0: 5c 5c 5c 75 5b 66 6f 72 6d 61 74 20 22 25 30 34  \\\u[format "%04
03c0: 2e 34 58 22 20 30 78 5c 31 5d 7d 20 6f 75 74 0a  .4X" 0x\1]} out.
03d0: 20 73 75 62 73 74 20 24 6f 75 74 0a 7d 0a 0a 64   subst $out.}..d
03e0: 6f 5f 74 65 73 74 20 62 61 64 75 74 66 32 2d 31  o_test badutf2-1
03f0: 2e 30 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .0 {.  db close.
0400: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65    forcedelete te
0410: 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20  st.db.  sqlite3 
0420: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20  db test.db.  db 
0430: 65 76 61 6c 20 22 50 52 41 47 4d 41 20 65 6e 63  eval "PRAGMA enc
0440: 6f 64 69 6e 67 20 3d 20 27 55 54 46 2d 38 27 22  oding = 'UTF-8'"
0450: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 62  .} {}..do_test b
0460: 61 64 75 74 66 32 2d 34 2e 30 20 7b 0a 20 20 73  adutf2-4.0 {.  s
0470: 65 74 20 53 20 5b 73 71 6c 69 74 65 33 5f 70 72  et S [sqlite3_pr
0480: 65 70 61 72 65 5f 76 32 20 64 62 20 22 53 45 4c  epare_v2 db "SEL
0490: 45 43 54 20 3f 22 20 2d 31 20 64 75 6d 6d 79 5d  ECT ?" -1 dummy]
04a0: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72  .  sqlite3_expir
04b0: 65 64 20 24 53 0a 7d 20 7b 30 7d 0a 20 20 20 20  ed $S.} {0}.    
04c0: 20 20 20 20 0a 66 6f 72 65 61 63 68 20 7b 20 69      .foreach { i
04d0: 20 6c 65 6e 20 75 76 61 6c 20 78 73 74 72 20 75   len uval xstr u
04e0: 73 74 72 20 75 32 75 20 7d 20 7b 0a 31 20 31 20  str u2u } {.1 1 
04f0: 30 30 20 20 20 20 20 5c 78 30 30 20 20 20 20 20  00     \x00     
0500: 20 20 20 20 7b 7d 20 20 20 20 20 20 20 20 7b 7d      {}        {}
0510: 0a 32 20 31 20 30 31 20 20 20 20 20 5c 78 30 31  .2 1 01     \x01
0520: 20 20 20 20 20 20 20 20 20 22 5c 5c 75 30 30 30           "\\u000
0530: 31 22 20 30 31 0a 33 20 31 20 33 46 20 20 20 20  1" 01.3 1 3F    
0540: 20 5c 78 33 46 20 20 20 20 20 20 20 20 20 22 5c   \x3F         "\
0550: 5c 75 30 30 33 46 22 20 33 46 0a 34 20 31 20 37  \u003F" 3F.4 1 7
0560: 46 20 20 20 20 20 5c 78 37 46 20 20 20 20 20 20  F     \x7F      
0570: 20 20 20 22 5c 5c 75 30 30 37 46 22 20 37 46 0a     "\\u007F" 7F.
0580: 35 20 31 20 38 30 20 20 20 20 20 5c 78 38 30 20  5 1 80     \x80 
0590: 20 20 20 20 20 20 20 20 22 5c 5c 75 30 30 38 30          "\\u0080
05a0: 22 20 43 32 38 30 0a 36 20 31 20 43 33 42 46 20  " C280.6 1 C3BF 
05b0: 20 20 5c 78 46 46 20 20 20 20 20 20 20 20 20 22    \xFF         "
05c0: 5c 5c 75 30 30 46 46 22 20 43 33 42 46 0a 37 20  \\u00FF" C3BF.7 
05d0: 33 20 45 46 42 46 42 44 20 5c 78 45 46 5c 78 42  3 EFBFBD \xEF\xB
05e0: 46 5c 78 42 44 20 22 5c 5c 75 46 46 46 44 22 20  F\xBD "\\uFFFD" 
05f0: 7b 7d 0a 7d 20 7b 0a 0a 20 20 73 65 74 20 68 73  {}.} {..  set hs
0600: 74 72 20 5b 20 75 74 66 38 5f 74 6f 5f 68 73 74  tr [ utf8_to_hst
0610: 72 20 24 75 76 61 6c 20 5d 0a 0a 20 20 69 66 63  r $uval ]..  ifc
0620: 61 70 61 62 6c 65 20 62 6c 6f 62 6c 69 74 20 7b  apable bloblit {
0630: 0a 20 20 20 20 69 66 20 7b 24 68 73 74 72 20 21  .    if {$hstr !
0640: 3d 20 22 25 30 30 22 7d 20 7b 0a 20 20 20 20 20  = "%00"} {.     
0650: 20 64 6f 5f 74 65 73 74 20 62 61 64 75 74 66 32   do_test badutf2
0660: 2d 32 2e 31 2e 24 69 20 7b 0a 20 20 20 20 20 20  -2.1.$i {.      
0670: 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45 43    set sql "SELEC
0680: 54 20 27 24 68 73 74 72 27 3d 43 41 53 54 28 78  T '$hstr'=CAST(x
0690: 27 24 75 76 61 6c 27 20 41 53 20 74 65 78 74 29  '$uval' AS text)
06a0: 20 41 53 20 78 3b 22 0a 20 20 20 20 20 20 20 20   AS x;".        
06b0: 73 65 74 20 72 65 73 20 5b 20 73 71 6c 69 74 65  set res [ sqlite
06c0: 33 5f 65 78 65 63 20 64 62 20 24 73 71 6c 20 5d  3_exec db $sql ]
06d0: 0a 20 20 20 20 20 20 20 20 6c 69 6e 64 65 78 20  .        lindex 
06e0: 5b 20 6c 69 6e 64 65 78 20 24 72 65 73 20 31 5d  [ lindex $res 1]
06f0: 20 31 0a 20 20 20 20 20 20 7d 20 7b 31 7d 0a 20   1.      } {1}. 
0700: 20 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61 64       do_test bad
0710: 75 74 66 32 2d 32 2e 32 2e 24 69 20 7b 0a 20 20  utf2-2.2.$i {.  
0720: 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 22 53        set sql "S
0730: 45 4c 45 43 54 20 43 41 53 54 28 27 24 68 73 74  ELECT CAST('$hst
0740: 72 27 20 41 53 20 62 6c 6f 62 29 3d 78 27 24 75  r' AS blob)=x'$u
0750: 76 61 6c 27 20 41 53 20 78 3b 22 0a 20 20 20 20  val' AS x;".    
0760: 20 20 20 20 73 65 74 20 72 65 73 20 5b 20 73 71      set res [ sq
0770: 6c 69 74 65 33 5f 65 78 65 63 20 64 62 20 24 73  lite3_exec db $s
0780: 71 6c 20 5d 0a 20 20 20 20 20 20 20 20 6c 69 6e  ql ].        lin
0790: 64 65 78 20 5b 20 6c 69 6e 64 65 78 20 24 72 65  dex [ lindex $re
07a0: 73 20 31 5d 20 31 0a 20 20 20 20 20 20 7d 20 7b  s 1] 1.      } {
07b0: 31 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 5f  1}.    }.    do_
07c0: 74 65 73 74 20 62 61 64 75 74 66 32 2d 32 2e 33  test badutf2-2.3
07d0: 2e 24 69 20 7b 0a 20 20 20 20 20 20 73 65 74 20  .$i {.      set 
07e0: 73 71 6c 20 22 53 45 4c 45 43 54 20 68 65 78 28  sql "SELECT hex(
07f0: 43 41 53 54 28 78 27 24 75 76 61 6c 27 20 41 53  CAST(x'$uval' AS
0800: 20 74 65 78 74 29 29 20 41 53 20 78 3b 22 0a 20   text)) AS x;". 
0810: 20 20 20 20 20 73 65 74 20 72 65 73 20 5b 20 73       set res [ s
0820: 71 6c 69 74 65 33 5f 65 78 65 63 20 64 62 20 24  qlite3_exec db $
0830: 73 71 6c 20 5d 0a 20 20 20 20 20 20 6c 69 6e 64  sql ].      lind
0840: 65 78 20 5b 20 6c 69 6e 64 65 78 20 24 72 65 73  ex [ lindex $res
0850: 20 31 5d 20 31 0a 20 20 20 20 7d 20 24 75 76 61   1] 1.    } $uva
0860: 6c 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61  l.    do_test ba
0870: 64 75 74 66 32 2d 32 2e 34 2e 24 69 20 7b 0a 20  dutf2-2.4.$i {. 
0880: 20 20 20 20 20 73 65 74 20 73 71 6c 20 22 53 45       set sql "SE
0890: 4c 45 43 54 20 68 65 78 28 43 41 53 54 28 78 27  LECT hex(CAST(x'
08a0: 24 75 76 61 6c 27 20 41 53 20 74 65 78 74 29 29  $uval' AS text))
08b0: 20 41 53 20 78 3b 22 0a 20 20 20 20 20 20 73 65   AS x;".      se
08c0: 74 20 72 65 73 20 5b 20 73 71 6c 69 74 65 33 5f  t res [ sqlite3_
08d0: 65 78 65 63 20 64 62 20 24 73 71 6c 20 5d 0a 20  exec db $sql ]. 
08e0: 20 20 20 20 20 6c 69 6e 64 65 78 20 5b 20 6c 69       lindex [ li
08f0: 6e 64 65 78 20 24 72 65 73 20 31 5d 20 31 0a 20  ndex $res 1] 1. 
0900: 20 20 20 7d 20 24 75 76 61 6c 0a 20 20 7d 0a 0a     } $uval.  }..
0910: 20 20 69 66 20 7b 24 68 73 74 72 20 21 3d 20 22    if {$hstr != "
0920: 25 30 30 22 7d 20 7b 0a 20 20 20 20 64 6f 5f 74  %00"} {.    do_t
0930: 65 73 74 20 62 61 64 75 74 66 32 2d 33 2e 31 2e  est badutf2-3.1.
0940: 24 69 20 7b 0a 20 20 20 20 20 20 73 65 74 20 73  $i {.      set s
0950: 71 6c 20 22 53 45 4c 45 43 54 20 68 65 78 28 27  ql "SELECT hex('
0960: 24 68 73 74 72 27 29 20 41 53 20 78 3b 22 0a 20  $hstr') AS x;". 
0970: 20 20 20 20 20 73 65 74 20 72 65 73 20 5b 20 73       set res [ s
0980: 71 6c 69 74 65 33 5f 65 78 65 63 20 64 62 20 24  qlite3_exec db $
0990: 73 71 6c 20 5d 0a 20 20 20 20 20 20 6c 69 6e 64  sql ].      lind
09a0: 65 78 20 5b 20 6c 69 6e 64 65 78 20 24 72 65 73  ex [ lindex $res
09b0: 20 31 5d 20 31 0a 20 20 20 20 7d 20 24 75 76 61   1] 1.    } $uva
09c0: 6c 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  l.  }..  do_test
09d0: 20 62 61 64 75 74 66 32 2d 34 2e 31 2e 24 69 20   badutf2-4.1.$i 
09e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
09f0: 73 65 74 20 24 53 0a 20 20 20 20 73 71 6c 69 74  set $S.    sqlit
0a00: 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53 20  e3_bind_text $S 
0a10: 31 20 24 78 73 74 72 20 24 6c 65 6e 0a 20 20 20  1 $xstr $len.   
0a20: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53   sqlite3_step $S
0a30: 0a 20 20 20 20 75 74 66 38 5f 74 6f 5f 75 73 74  .    utf8_to_ust
0a40: 72 32 20 5b 20 73 71 6c 69 74 65 33 5f 63 6f 6c  r2 [ sqlite3_col
0a50: 75 6d 6e 5f 74 65 78 74 20 24 53 20 30 20 5d 0a  umn_text $S 0 ].
0a60: 20 20 7d 20 24 75 73 74 72 0a 0a 20 20 69 66 63    } $ustr..  ifc
0a70: 61 70 61 62 6c 65 20 64 65 62 75 67 20 7b 0a 20  apable debug {. 
0a80: 20 20 20 64 6f 5f 74 65 73 74 20 62 61 64 75 74     do_test badut
0a90: 66 32 2d 35 2e 31 2e 24 69 20 7b 0a 20 20 20 20  f2-5.1.$i {.    
0aa0: 20 20 75 74 66 38 5f 74 6f 5f 75 74 66 38 20 24    utf8_to_utf8 $
0ab0: 75 76 61 6c 0a 20 20 20 20 7d 20 24 75 32 75 0a  uval.    } $u2u.
0ac0: 20 20 7d 0a 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20    }..}..do_test 
0ad0: 62 61 64 75 74 66 32 2d 34 2e 32 20 7b 0a 20 20  badutf2-4.2 {.  
0ae0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
0af0: 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   $S.} {SQLITE_OK
0b00: 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  }...finish_test.