1e1cd9874Sdanielk1977# 2002 May 24 2e1cd9874Sdanielk1977# 3e1cd9874Sdanielk1977# The author disclaims copyright to this source code. In place of 4e1cd9874Sdanielk1977# a legal notice, here is a blessing: 5e1cd9874Sdanielk1977# 6e1cd9874Sdanielk1977# May you do good and not evil. 7e1cd9874Sdanielk1977# May you find forgiveness for yourself and forgive others. 8e1cd9874Sdanielk1977# May you share freely, never taking more than you give. 9e1cd9874Sdanielk1977# 10e1cd9874Sdanielk1977#*********************************************************************** 11e1cd9874Sdanielk1977# This file implements regression tests for SQLite library. The focus of 12e1cd9874Sdanielk1977# this file is testing the SQLite routines used for converting between the 13e1cd9874Sdanielk1977# various suported unicode encodings (UTF-8, UTF-16, UTF-16le and 14e1cd9874Sdanielk1977# UTF-16be). 15e1cd9874Sdanielk1977# 16e1cd9874Sdanielk1977 17e1cd9874Sdanielk1977set testdir [file dirname $argv0] 18e1cd9874Sdanielk1977source $testdir/tester.tcl 19e1cd9874Sdanielk1977 205436dc2dSdrh# If UTF16 support is disabled, ignore the tests in this file 215436dc2dSdrh# 225436dc2dSdrhifcapable {!utf16} { 235436dc2dSdrh finish_test 245436dc2dSdrh return 255436dc2dSdrh} 265436dc2dSdrh 27f9d19a6bSdanielk1977# The rough organisation of tests in this file is: 28f9d19a6bSdanielk1977# 29f9d19a6bSdanielk1977# enc2.1.*: Simple tests with a UTF-8 db. 30f9d19a6bSdanielk1977# enc2.2.*: Simple tests with a UTF-16LE db. 31f9d19a6bSdanielk1977# enc2.3.*: Simple tests with a UTF-16BE db. 32f9d19a6bSdanielk1977# enc2.4.*: Test that attached databases must have the same text encoding 33f9d19a6bSdanielk1977# as the main database. 3448864df9Smistachkin# enc2.5.*: Test the behavior of the library when a collation sequence is 35f9d19a6bSdanielk1977# not available for the most desirable text encoding. 36bc6ada41Sdanielk1977# enc2.6.*: Similar test for user functions. 37bc6ada41Sdanielk1977# enc2.7.*: Test that the VerifyCookie opcode protects against assuming the 38f9d19a6bSdanielk1977# wrong text encoding for the database. 39bc6ada41Sdanielk1977# enc2.8.*: Test sqlite3_complete16() 40bc6ada41Sdanielk1977# 41f9d19a6bSdanielk1977 42e1cd9874Sdanielk1977db close 43e1cd9874Sdanielk1977 44e1cd9874Sdanielk1977# Return the UTF-8 representation of the supplied UTF-16 string $str. 45e1cd9874Sdanielk1977proc utf8 {str} { 46e1cd9874Sdanielk1977 # If $str ends in two 0x00 0x00 bytes, knock these off before 47e1cd9874Sdanielk1977 # converting to UTF-8 using TCL. 48e1cd9874Sdanielk1977 binary scan $str \c* vals 49e1cd9874Sdanielk1977 if {[lindex $vals end]==0 && [lindex $vals end-1]==0} { 50e1cd9874Sdanielk1977 set str [binary format \c* [lrange $vals 0 end-2]] 51e1cd9874Sdanielk1977 } 52e1cd9874Sdanielk1977 53e1cd9874Sdanielk1977 set r [encoding convertfrom unicode $str] 54e1cd9874Sdanielk1977 return $r 55e1cd9874Sdanielk1977} 56e1cd9874Sdanielk1977 57e1cd9874Sdanielk1977# 58e1cd9874Sdanielk1977# This proc contains all the tests in this file. It is run 59e1cd9874Sdanielk1977# three times. Each time the file 'test.db' contains a database 60e1cd9874Sdanielk1977# with the following contents: 61e1cd9874Sdanielk1977set dbcontents { 62e1cd9874Sdanielk1977 CREATE TABLE t1(a PRIMARY KEY, b, c); 63e1cd9874Sdanielk1977 INSERT INTO t1 VALUES('one', 'I', 1); 64e1cd9874Sdanielk1977} 65e1cd9874Sdanielk1977# This proc tests that we can open and manipulate the test.db 66e1cd9874Sdanielk1977# database, and that it is possible to retreive values in 67e1cd9874Sdanielk1977# various text encodings. 68e1cd9874Sdanielk1977# 698e227875Sdanielk1977proc run_test_script {t enc} { 70e1cd9874Sdanielk1977 71e1cd9874Sdanielk1977# Open the database and pull out a (the) row. 72e1cd9874Sdanielk1977do_test $t.1 { 73dddca286Sdrh sqlite3 db test.db; set DB [sqlite3_connection_pointer db] 74e1cd9874Sdanielk1977 execsql {SELECT * FROM t1} 75e1cd9874Sdanielk1977} {one I 1} 76e1cd9874Sdanielk1977 77e1cd9874Sdanielk1977# Insert some data 78e1cd9874Sdanielk1977do_test $t.2 { 79e1cd9874Sdanielk1977 execsql {INSERT INTO t1 VALUES('two', 'II', 2);} 80e1cd9874Sdanielk1977 execsql {SELECT * FROM t1} 81e1cd9874Sdanielk1977} {one I 1 two II 2} 82e1cd9874Sdanielk1977 835f3b4ab5Sdrh# Insert some data 84e1cd9874Sdanielk1977do_test $t.3 { 855f3b4ab5Sdrh execsql { 865f3b4ab5Sdrh INSERT INTO t1 VALUES('three','III',3); 875f3b4ab5Sdrh INSERT INTO t1 VALUES('four','IV',4); 885f3b4ab5Sdrh INSERT INTO t1 VALUES('five','V',5); 895f3b4ab5Sdrh } 90e1cd9874Sdanielk1977 execsql {SELECT * FROM t1} 91e1cd9874Sdanielk1977} {one I 1 two II 2 three III 3 four IV 4 five V 5} 92e1cd9874Sdanielk1977 93e1cd9874Sdanielk1977# Use the index 94e1cd9874Sdanielk1977do_test $t.4 { 95e1cd9874Sdanielk1977 execsql { 96e1cd9874Sdanielk1977 SELECT * FROM t1 WHERE a = 'one'; 97e1cd9874Sdanielk1977 } 98e1cd9874Sdanielk1977} {one I 1} 99e1cd9874Sdanielk1977do_test $t.5 { 100e1cd9874Sdanielk1977 execsql { 101e1cd9874Sdanielk1977 SELECT * FROM t1 WHERE a = 'four'; 102e1cd9874Sdanielk1977 } 103e1cd9874Sdanielk1977} {four IV 4} 104e61b9f4fSdanielk1977ifcapable subquery { 105e1cd9874Sdanielk1977 do_test $t.6 { 106e1cd9874Sdanielk1977 execsql { 107e1cd9874Sdanielk1977 SELECT * FROM t1 WHERE a IN ('one', 'two'); 108e1cd9874Sdanielk1977 } 109e1cd9874Sdanielk1977 } {one I 1 two II 2} 110e61b9f4fSdanielk1977} 111e1cd9874Sdanielk1977 112e1cd9874Sdanielk1977# Now check that we can retrieve data in both UTF-16 and UTF-8 113e1cd9874Sdanielk1977do_test $t.7 { 114e1cd9874Sdanielk1977 set STMT [sqlite3_prepare $DB "SELECT a FROM t1 WHERE c>3;" -1 TAIL] 115e1cd9874Sdanielk1977 sqlite3_step $STMT 116eb2e176aSdrh sqlite3_column_text $STMT 0 117e1cd9874Sdanielk1977} {four} 118e1cd9874Sdanielk1977 119e1cd9874Sdanielk1977do_test $t.8 { 120e1cd9874Sdanielk1977 sqlite3_step $STMT 121eb2e176aSdrh utf8 [sqlite3_column_text16 $STMT 0] 122e1cd9874Sdanielk1977} {five} 123e1cd9874Sdanielk1977 124e1cd9874Sdanielk1977do_test $t.9 { 125e1cd9874Sdanielk1977 sqlite3_finalize $STMT 1263cf86063Sdanielk1977} SQLITE_OK 127e1cd9874Sdanielk1977 128802d69a7Sdrhifcapable vacuum { 129802d69a7Sdrh execsql VACUUM 130802d69a7Sdrh} 131802d69a7Sdrh 1328e227875Sdanielk1977do_test $t.10 { 1338e227875Sdanielk1977 db eval {PRAGMA encoding} 1348e227875Sdanielk1977} $enc 135e1cd9874Sdanielk1977 136e1cd9874Sdanielk1977} 137e1cd9874Sdanielk1977 138e1cd9874Sdanielk1977# The three unicode encodings understood by SQLite. 1398e227875Sdanielk1977set encodings [list UTF-8 UTF-16le UTF-16be] 140e1cd9874Sdanielk1977 14159eb6760Sdrhset sqlite_os_trace 0 142e1cd9874Sdanielk1977set i 1 143e1cd9874Sdanielk1977foreach enc $encodings { 144fda06befSmistachkin forcedelete test.db 145ef4ac8f9Sdrh sqlite3 db test.db 1468e227875Sdanielk1977 db eval "PRAGMA encoding = \"$enc\"" 147e1cd9874Sdanielk1977 execsql $dbcontents 148ece3c728Sdrh do_test enc2-$i.0.1 { 149ece3c728Sdrh db eval {PRAGMA encoding} 150ece3c728Sdrh } $enc 151ece3c728Sdrh do_test enc2-$i.0.2 { 152ece3c728Sdrh db eval {PRAGMA encoding=UTF8} 153ece3c728Sdrh db eval {PRAGMA encoding} 154ece3c728Sdrh } $enc 155ece3c728Sdrh do_test enc2-$i.0.3 { 156ece3c728Sdrh db eval {PRAGMA encoding=UTF16le} 157ece3c728Sdrh db eval {PRAGMA encoding} 158ece3c728Sdrh } $enc 159ece3c728Sdrh do_test enc2-$i.0.4 { 160ece3c728Sdrh db eval {PRAGMA encoding=UTF16be} 161ece3c728Sdrh db eval {PRAGMA encoding} 162ece3c728Sdrh } $enc 163ece3c728Sdrh 164e1cd9874Sdanielk1977 db close 1658e227875Sdanielk1977 run_test_script enc2-$i $enc 16659eb6760Sdrh db close 167e1cd9874Sdanielk1977 incr i 168e1cd9874Sdanielk1977} 169e1cd9874Sdanielk1977 170c0391398Sdanielk1977# Test that it is an error to try to attach a database with a different 171c0391398Sdanielk1977# encoding to the main database. 1725a8f9374Sdanielk1977ifcapable attach { 173c0391398Sdanielk1977 do_test enc2-4.1 { 174fda06befSmistachkin forcedelete test.db 175ef4ac8f9Sdrh sqlite3 db test.db 176c0391398Sdanielk1977 db eval "PRAGMA encoding = 'UTF-8'" 177c0391398Sdanielk1977 db eval "CREATE TABLE abc(a, b, c);" 178c0391398Sdanielk1977 } {} 179c0391398Sdanielk1977 do_test enc2-4.2 { 180fda06befSmistachkin forcedelete test2.db 181ef4ac8f9Sdrh sqlite3 db2 test2.db 182c0391398Sdanielk1977 db2 eval "PRAGMA encoding = 'UTF-16'" 183c0391398Sdanielk1977 db2 eval "CREATE TABLE abc(a, b, c);" 184c0391398Sdanielk1977 } {} 185c0391398Sdanielk1977 do_test enc2-4.3 { 186c0391398Sdanielk1977 catchsql { 187c0391398Sdanielk1977 ATTACH 'test2.db' as aux; 188c0391398Sdanielk1977 } 189c0391398Sdanielk1977 } {1 {attached databases must use the same text encoding as main database}} 1900de0bb33Sdanielk1977 db2 close 1914e6af134Sdanielk1977 db close 1925a8f9374Sdanielk1977} 1934e6af134Sdanielk1977 1944e6af134Sdanielk1977# The following tests - enc2-5.* - test that SQLite selects the correct 1954e6af134Sdanielk1977# collation sequence when more than one is available. 1964e6af134Sdanielk1977 1974e6af134Sdanielk1977set ::values [list one two three four five] 1984e6af134Sdanielk1977set ::test_collate_enc INVALID 1994e6af134Sdanielk1977proc test_collate {enc lhs rhs} { 2004e6af134Sdanielk1977 set ::test_collate_enc $enc 2014e6af134Sdanielk1977 set l [lsearch -exact $::values $lhs] 2024e6af134Sdanielk1977 set r [lsearch -exact $::values $rhs] 2034e6af134Sdanielk1977 set res [expr $l - $r] 2044db38a70Sdrh # puts "enc=$enc lhs=$lhs/$l rhs=$rhs/$r res=$res" 2054e6af134Sdanielk1977 return $res 2064e6af134Sdanielk1977} 2074e6af134Sdanielk1977 208fda06befSmistachkinforcedelete test.db 209dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db] 2104e6af134Sdanielk1977do_test enc2-5.0 { 2114e6af134Sdanielk1977 execsql { 2124e6af134Sdanielk1977 CREATE TABLE t5(a); 2134e6af134Sdanielk1977 INSERT INTO t5 VALUES('one'); 2144e6af134Sdanielk1977 INSERT INTO t5 VALUES('two'); 2154e6af134Sdanielk1977 INSERT INTO t5 VALUES('five'); 2164e6af134Sdanielk1977 INSERT INTO t5 VALUES('three'); 2174e6af134Sdanielk1977 INSERT INTO t5 VALUES('four'); 2184e6af134Sdanielk1977 } 2194e6af134Sdanielk1977} {} 2204e6af134Sdanielk1977do_test enc2-5.1 { 2214e6af134Sdanielk1977 add_test_collate $DB 1 1 1 222268803a9Sdrh set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate;}] 2234e6af134Sdanielk1977 lappend res $::test_collate_enc 2244e6af134Sdanielk1977} {one two three four five UTF-8} 2254e6af134Sdanielk1977do_test enc2-5.2 { 2264e6af134Sdanielk1977 add_test_collate $DB 0 1 0 2274e6af134Sdanielk1977 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] 2284e6af134Sdanielk1977 lappend res $::test_collate_enc 2294e6af134Sdanielk1977} {one two three four five UTF-16LE} 2304e6af134Sdanielk1977do_test enc2-5.3 { 2314e6af134Sdanielk1977 add_test_collate $DB 0 0 1 2324e6af134Sdanielk1977 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] 2334e6af134Sdanielk1977 lappend res $::test_collate_enc 2344e6af134Sdanielk1977} {one two three four five UTF-16BE} 2354e6af134Sdanielk1977 23659eb6760Sdrhdb close 237fda06befSmistachkinforcedelete test.db 238dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db] 2394e6af134Sdanielk1977execsql {pragma encoding = 'UTF-16LE'} 2404e6af134Sdanielk1977do_test enc2-5.4 { 2414e6af134Sdanielk1977 execsql { 2424e6af134Sdanielk1977 CREATE TABLE t5(a); 2434e6af134Sdanielk1977 INSERT INTO t5 VALUES('one'); 2444e6af134Sdanielk1977 INSERT INTO t5 VALUES('two'); 2454e6af134Sdanielk1977 INSERT INTO t5 VALUES('five'); 2464e6af134Sdanielk1977 INSERT INTO t5 VALUES('three'); 2474e6af134Sdanielk1977 INSERT INTO t5 VALUES('four'); 2484e6af134Sdanielk1977 } 2494e6af134Sdanielk1977} {} 2504e6af134Sdanielk1977do_test enc2-5.5 { 2514e6af134Sdanielk1977 add_test_collate $DB 1 1 1 2524e6af134Sdanielk1977 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] 2534e6af134Sdanielk1977 lappend res $::test_collate_enc 2544e6af134Sdanielk1977} {one two three four five UTF-16LE} 2554e6af134Sdanielk1977do_test enc2-5.6 { 2564e6af134Sdanielk1977 add_test_collate $DB 1 0 1 2574e6af134Sdanielk1977 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] 2584e6af134Sdanielk1977 lappend res $::test_collate_enc 2594e6af134Sdanielk1977} {one two three four five UTF-16BE} 2604e6af134Sdanielk1977do_test enc2-5.7 { 2614e6af134Sdanielk1977 add_test_collate $DB 1 0 0 2624e6af134Sdanielk1977 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] 2634e6af134Sdanielk1977 lappend res $::test_collate_enc 2644e6af134Sdanielk1977} {one two three four five UTF-8} 2654e6af134Sdanielk1977 26659eb6760Sdrhdb close 267fda06befSmistachkinforcedelete test.db 268dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db] 2694e6af134Sdanielk1977execsql {pragma encoding = 'UTF-16BE'} 2704e6af134Sdanielk1977do_test enc2-5.8 { 2714e6af134Sdanielk1977 execsql { 2724e6af134Sdanielk1977 CREATE TABLE t5(a); 2734e6af134Sdanielk1977 INSERT INTO t5 VALUES('one'); 2744e6af134Sdanielk1977 INSERT INTO t5 VALUES('two'); 2754e6af134Sdanielk1977 INSERT INTO t5 VALUES('five'); 2764e6af134Sdanielk1977 INSERT INTO t5 VALUES('three'); 2774e6af134Sdanielk1977 INSERT INTO t5 VALUES('four'); 2784e6af134Sdanielk1977 } 2794e6af134Sdanielk1977} {} 2804e6af134Sdanielk1977do_test enc2-5.9 { 2814e6af134Sdanielk1977 add_test_collate $DB 1 1 1 2824e6af134Sdanielk1977 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] 2834e6af134Sdanielk1977 lappend res $::test_collate_enc 2844e6af134Sdanielk1977} {one two three four five UTF-16BE} 2854e6af134Sdanielk1977do_test enc2-5.10 { 2864e6af134Sdanielk1977 add_test_collate $DB 1 1 0 2874e6af134Sdanielk1977 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] 2884e6af134Sdanielk1977 lappend res $::test_collate_enc 2894e6af134Sdanielk1977} {one two three four five UTF-16LE} 2904e6af134Sdanielk1977do_test enc2-5.11 { 2914e6af134Sdanielk1977 add_test_collate $DB 1 0 0 2924e6af134Sdanielk1977 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] 2934e6af134Sdanielk1977 lappend res $::test_collate_enc 2944e6af134Sdanielk1977} {one two three four five UTF-8} 2950de0bb33Sdanielk1977 296312d6b36Sdanielk1977# Also test that a UTF-16 collation factory works. 297bc6ada41Sdanielk1977do_test enc2-5-12 { 298312d6b36Sdanielk1977 add_test_collate $DB 0 0 0 299312d6b36Sdanielk1977 catchsql { 300312d6b36Sdanielk1977 SELECT * FROM t5 ORDER BY 1 COLLATE test_collate 301312d6b36Sdanielk1977 } 302312d6b36Sdanielk1977} {1 {no such collation sequence: test_collate}} 303312d6b36Sdanielk1977do_test enc2-5.13 { 304312d6b36Sdanielk1977 add_test_collate_needed $DB 305268803a9Sdrh set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate; }] 306312d6b36Sdanielk1977 lappend res $::test_collate_enc 307312d6b36Sdanielk1977} {one two three four five UTF-16BE} 308268803a9Sdrhdo_test enc2-5.14 { 309268803a9Sdrh set ::sqlite_last_needed_collation 310268803a9Sdrh} test_collate 311312d6b36Sdanielk1977 312f9d19a6bSdanielk1977db close 313fda06befSmistachkinforcedelete test.db 314f9d19a6bSdanielk1977 315268803a9Sdrhdo_test enc2-5.15 { 316dddca286Sdrh sqlite3 db test.db; set ::DB [sqlite3_connection_pointer db] 317268803a9Sdrh add_test_collate_needed $::DB 318268803a9Sdrh set ::sqlite_last_needed_collation 319268803a9Sdrh} {} 320268803a9Sdrhdo_test enc2-5.16 { 321268803a9Sdrh execsql {CREATE TABLE t1(a varchar collate test_collate);} 322268803a9Sdrh} {} 323268803a9Sdrhdo_test enc2-5.17 { 324268803a9Sdrh set ::sqlite_last_needed_collation 325268803a9Sdrh} {test_collate} 326268803a9Sdrh 327bc6ada41Sdanielk1977# The following tests - enc2-6.* - test that SQLite selects the correct 328bc6ada41Sdanielk1977# user function when more than one is available. 3299d951766Sdanielk1977 3309d951766Sdanielk1977proc test_function {enc arg} { 3319d951766Sdanielk1977 return "$enc $arg" 3329d951766Sdanielk1977} 3339d951766Sdanielk1977 3340acb23dcSdrhdb close 335fda06befSmistachkinforcedelete test.db 336dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db] 3379d951766Sdanielk1977execsql {pragma encoding = 'UTF-8'} 3389d951766Sdanielk1977do_test enc2-6.0 { 3399d951766Sdanielk1977 execsql { 3409d951766Sdanielk1977 CREATE TABLE t5(a); 3419d951766Sdanielk1977 INSERT INTO t5 VALUES('one'); 3429d951766Sdanielk1977 } 3439d951766Sdanielk1977} {} 3449d951766Sdanielk1977do_test enc2-6.1 { 3459d951766Sdanielk1977 add_test_function $DB 1 1 1 3469d951766Sdanielk1977 execsql { 3479d951766Sdanielk1977 SELECT test_function('sqlite') 3489d951766Sdanielk1977 } 3499d951766Sdanielk1977} {{UTF-8 sqlite}} 350e12c17baSdanielk1977db close 351dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db] 3529d951766Sdanielk1977do_test enc2-6.2 { 3539d951766Sdanielk1977 add_test_function $DB 0 1 0 3549d951766Sdanielk1977 execsql { 3559d951766Sdanielk1977 SELECT test_function('sqlite') 3569d951766Sdanielk1977 } 3579d951766Sdanielk1977} {{UTF-16LE sqlite}} 358e12c17baSdanielk1977db close 359dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db] 3609d951766Sdanielk1977do_test enc2-6.3 { 3619d951766Sdanielk1977 add_test_function $DB 0 0 1 3629d951766Sdanielk1977 execsql { 3639d951766Sdanielk1977 SELECT test_function('sqlite') 3649d951766Sdanielk1977 } 3659d951766Sdanielk1977} {{UTF-16BE sqlite}} 3669d951766Sdanielk1977 3672ec81649Sdrhdb close 368fda06befSmistachkinforcedelete test.db 369dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db] 3709d951766Sdanielk1977execsql {pragma encoding = 'UTF-16LE'} 3719d951766Sdanielk1977do_test enc2-6.3 { 3729d951766Sdanielk1977 execsql { 3739d951766Sdanielk1977 CREATE TABLE t5(a); 3749d951766Sdanielk1977 INSERT INTO t5 VALUES('sqlite'); 3759d951766Sdanielk1977 } 3769d951766Sdanielk1977} {} 3779d951766Sdanielk1977do_test enc2-6.4 { 3789d951766Sdanielk1977 add_test_function $DB 1 1 1 3799d951766Sdanielk1977 execsql { 3809d951766Sdanielk1977 SELECT test_function('sqlite') 3819d951766Sdanielk1977 } 3829d951766Sdanielk1977} {{UTF-16LE sqlite}} 383e12c17baSdanielk1977db close 384dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db] 3859d951766Sdanielk1977do_test enc2-6.5 { 3869d951766Sdanielk1977 add_test_function $DB 0 1 0 3879d951766Sdanielk1977 execsql { 3889d951766Sdanielk1977 SELECT test_function('sqlite') 3899d951766Sdanielk1977 } 3909d951766Sdanielk1977} {{UTF-16LE sqlite}} 391e12c17baSdanielk1977db close 392dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db] 3939d951766Sdanielk1977do_test enc2-6.6 { 3949d951766Sdanielk1977 add_test_function $DB 0 0 1 3959d951766Sdanielk1977 execsql { 3969d951766Sdanielk1977 SELECT test_function('sqlite') 3979d951766Sdanielk1977 } 3989d951766Sdanielk1977} {{UTF-16BE sqlite}} 3999d951766Sdanielk1977 4002ec81649Sdrhdb close 401fda06befSmistachkinforcedelete test.db 402dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db] 4039d951766Sdanielk1977execsql {pragma encoding = 'UTF-16BE'} 4049d951766Sdanielk1977do_test enc2-6.7 { 4059d951766Sdanielk1977 execsql { 4069d951766Sdanielk1977 CREATE TABLE t5(a); 4079d951766Sdanielk1977 INSERT INTO t5 VALUES('sqlite'); 4089d951766Sdanielk1977 } 4099d951766Sdanielk1977} {} 4109d951766Sdanielk1977do_test enc2-6.8 { 4119d951766Sdanielk1977 add_test_function $DB 1 1 1 4129d951766Sdanielk1977 execsql { 4139d951766Sdanielk1977 SELECT test_function('sqlite') 4149d951766Sdanielk1977 } 4159d951766Sdanielk1977} {{UTF-16BE sqlite}} 416e12c17baSdanielk1977db close 417dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db] 4189d951766Sdanielk1977do_test enc2-6.9 { 4199d951766Sdanielk1977 add_test_function $DB 0 1 0 4209d951766Sdanielk1977 execsql { 4219d951766Sdanielk1977 SELECT test_function('sqlite') 4229d951766Sdanielk1977 } 4239d951766Sdanielk1977} {{UTF-16LE sqlite}} 424e12c17baSdanielk1977db close 425dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db] 4269d951766Sdanielk1977do_test enc2-6.10 { 4279d951766Sdanielk1977 add_test_function $DB 0 0 1 4289d951766Sdanielk1977 execsql { 4299d951766Sdanielk1977 SELECT test_function('sqlite') 4309d951766Sdanielk1977 } 4319d951766Sdanielk1977} {{UTF-16BE sqlite}} 4329d951766Sdanielk1977 433312d6b36Sdanielk1977 4349d951766Sdanielk1977db close 435fda06befSmistachkinforcedelete test.db 4369d951766Sdanielk1977 437bc6ada41Sdanielk1977# The following tests - enc2-7.* - function as follows: 438f9d19a6bSdanielk1977# 439f9d19a6bSdanielk1977# 1: Open an empty database file assuming UTF-16 encoding. 440f9d19a6bSdanielk1977# 2: Open the same database with a different handle assuming UTF-8. Create 441f9d19a6bSdanielk1977# a table using this handle. 442f9d19a6bSdanielk1977# 3: Read the sqlite_master table from the first handle. 443f9d19a6bSdanielk1977# 4: Ensure the first handle recognises the database encoding is UTF-8. 444f9d19a6bSdanielk1977# 4459d951766Sdanielk1977do_test enc2-7.1 { 446ef4ac8f9Sdrh sqlite3 db test.db 447f9d19a6bSdanielk1977 execsql { 448f9d19a6bSdanielk1977 PRAGMA encoding = 'UTF-16'; 449f9d19a6bSdanielk1977 SELECT * FROM sqlite_master; 450f9d19a6bSdanielk1977 } 451f9d19a6bSdanielk1977} {} 4529d951766Sdanielk1977do_test enc2-7.2 { 453f9d19a6bSdanielk1977 set enc [execsql { 454f9d19a6bSdanielk1977 PRAGMA encoding; 455f9d19a6bSdanielk1977 }] 456f9d19a6bSdanielk1977 string range $enc 0 end-2 ;# Chop off the "le" or "be" 457f9d19a6bSdanielk1977} {UTF-16} 4589d951766Sdanielk1977do_test enc2-7.3 { 459ef4ac8f9Sdrh sqlite3 db2 test.db 460f9d19a6bSdanielk1977 execsql { 461f9d19a6bSdanielk1977 PRAGMA encoding = 'UTF-8'; 462f9d19a6bSdanielk1977 CREATE TABLE abc(a, b, c); 463f9d19a6bSdanielk1977 } db2 464f9d19a6bSdanielk1977} {} 4659d951766Sdanielk1977do_test enc2-7.4 { 466f9d19a6bSdanielk1977 execsql { 467f9d19a6bSdanielk1977 SELECT * FROM sqlite_master; 468f9d19a6bSdanielk1977 } 46945901d62Sdanielk1977} "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}" 4709d951766Sdanielk1977do_test enc2-7.5 { 471f9d19a6bSdanielk1977 execsql { 472f9d19a6bSdanielk1977 PRAGMA encoding; 473f9d19a6bSdanielk1977 } 474f9d19a6bSdanielk1977} {UTF-8} 475f9d19a6bSdanielk1977 476f9d19a6bSdanielk1977db close 477f9d19a6bSdanielk1977db2 close 478f9d19a6bSdanielk1977 479bc6ada41Sdanielk1977proc utf16 {utf8} { 480bc6ada41Sdanielk1977 set utf16 [encoding convertto unicode $utf8] 481bc6ada41Sdanielk1977 append utf16 "\x00\x00" 482bc6ada41Sdanielk1977 return $utf16 483bc6ada41Sdanielk1977} 484ccae6026Sdrhifcapable {complete} { 485bc6ada41Sdanielk1977 do_test enc2-8.1 { 486bc6ada41Sdanielk1977 sqlite3_complete16 [utf16 "SELECT * FROM t1;"] 487bc6ada41Sdanielk1977 } {1} 488bc6ada41Sdanielk1977 do_test enc2-8.2 { 489bc6ada41Sdanielk1977 sqlite3_complete16 [utf16 "SELECT * FROM"] 490bc6ada41Sdanielk1977 } {0} 491ccae6026Sdrh} 492f9d19a6bSdanielk1977 493b82e7edaSdanielk1977# Test that the encoding of an empty database may still be set after the 494b82e7edaSdanielk1977# (empty) schema has been initialized. 495fda06befSmistachkinforcedelete test.db 496b82e7edaSdanielk1977do_test enc2-9.1 { 497b82e7edaSdanielk1977 sqlite3 db test.db 498b82e7edaSdanielk1977 execsql { 499b82e7edaSdanielk1977 PRAGMA encoding = 'UTF-8'; 500b82e7edaSdanielk1977 PRAGMA encoding; 501b82e7edaSdanielk1977 } 502b82e7edaSdanielk1977} {UTF-8} 503b82e7edaSdanielk1977do_test enc2-9.2 { 504b82e7edaSdanielk1977 sqlite3 db test.db 505b82e7edaSdanielk1977 execsql { 506b82e7edaSdanielk1977 PRAGMA encoding = 'UTF-16le'; 507b82e7edaSdanielk1977 PRAGMA encoding; 508b82e7edaSdanielk1977 } 509b82e7edaSdanielk1977} {UTF-16le} 510b82e7edaSdanielk1977do_test enc2-9.3 { 511b82e7edaSdanielk1977 sqlite3 db test.db 512b82e7edaSdanielk1977 execsql { 513b82e7edaSdanielk1977 SELECT * FROM sqlite_master; 514b82e7edaSdanielk1977 PRAGMA encoding = 'UTF-8'; 515b82e7edaSdanielk1977 PRAGMA encoding; 516b82e7edaSdanielk1977 } 517b82e7edaSdanielk1977} {UTF-8} 518b82e7edaSdanielk1977do_test enc2-9.4 { 519b82e7edaSdanielk1977 sqlite3 db test.db 520b82e7edaSdanielk1977 execsql { 521b82e7edaSdanielk1977 PRAGMA encoding = 'UTF-16le'; 522b82e7edaSdanielk1977 CREATE TABLE abc(a, b, c); 523b82e7edaSdanielk1977 PRAGMA encoding; 524b82e7edaSdanielk1977 } 525b82e7edaSdanielk1977} {UTF-16le} 526b82e7edaSdanielk1977do_test enc2-9.5 { 527b82e7edaSdanielk1977 sqlite3 db test.db 528b82e7edaSdanielk1977 execsql { 529b82e7edaSdanielk1977 PRAGMA encoding = 'UTF-8'; 530b82e7edaSdanielk1977 PRAGMA encoding; 531b82e7edaSdanielk1977 } 532b82e7edaSdanielk1977} {UTF-16le} 533b82e7edaSdanielk1977 534ece3c728Sdrh# Ticket #1987. 535ece3c728Sdrh# Disallow encoding changes once the encoding has been set. 536ece3c728Sdrh# 537ece3c728Sdrhdo_test enc2-10.1 { 538ece3c728Sdrh db close 539fda06befSmistachkin forcedelete test.db test.db-journal 540ece3c728Sdrh sqlite3 db test.db 541ece3c728Sdrh db eval { 542ece3c728Sdrh PRAGMA encoding=UTF16; 543ece3c728Sdrh CREATE TABLE t1(a); 544ece3c728Sdrh PRAGMA encoding=UTF8; 545ece3c728Sdrh CREATE TABLE t2(b); 546ece3c728Sdrh } 547ece3c728Sdrh db close 548ece3c728Sdrh sqlite3 db test.db 549ece3c728Sdrh db eval { 550ece3c728Sdrh SELECT name FROM sqlite_master 551ece3c728Sdrh } 552ece3c728Sdrh} {t1 t2} 553ece3c728Sdrh 554*b5f0e405Sdrh# 2020-01-15 ticket a08879a4a476eea9 555*b5f0e405Sdrh# Do not allow a database connection encoding change unless *all* 556*b5f0e405Sdrh# attached databases are empty. 557*b5f0e405Sdrh# 558*b5f0e405Sdrhreset_db 559*b5f0e405Sdrhdo_execsql_test enc2-11.10 { 560*b5f0e405Sdrh PRAGMA encoding=UTF8; 561*b5f0e405Sdrh CREATE TEMP TABLE t1(x); 562*b5f0e405Sdrh INSERT INTO t1 VALUES('this is a test'); 563*b5f0e405Sdrh PRAGMA encoding=UTF16; 564*b5f0e405Sdrh SELECT * FROM t1; 565*b5f0e405Sdrh} {{this is a test}} 566*b5f0e405Sdrh 567e1cd9874Sdanielk1977finish_test 568