Index: third_party/sqlite/sqlite-src-3070603/test/enc2.test |
diff --git a/third_party/sqlite/sqlite-src-3070603/test/enc2.test b/third_party/sqlite/sqlite-src-3070603/test/enc2.test |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ce25bf39566da90c8ef9122e734d554f0ece0288 |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3070603/test/enc2.test |
@@ -0,0 +1,555 @@ |
+# 2002 May 24 |
+# |
+# The author disclaims copyright to this source code. In place of |
+# a legal notice, here is a blessing: |
+# |
+# May you do good and not evil. |
+# May you find forgiveness for yourself and forgive others. |
+# May you share freely, never taking more than you give. |
+# |
+#*********************************************************************** |
+# This file implements regression tests for SQLite library. The focus of |
+# this file is testing the SQLite routines used for converting between the |
+# various suported unicode encodings (UTF-8, UTF-16, UTF-16le and |
+# UTF-16be). |
+# |
+# $Id: enc2.test,v 1.29 2007/10/09 08:29:32 danielk1977 Exp $ |
+ |
+set testdir [file dirname $argv0] |
+source $testdir/tester.tcl |
+ |
+# If UTF16 support is disabled, ignore the tests in this file |
+# |
+ifcapable {!utf16} { |
+ finish_test |
+ return |
+} |
+ |
+# The rough organisation of tests in this file is: |
+# |
+# enc2.1.*: Simple tests with a UTF-8 db. |
+# enc2.2.*: Simple tests with a UTF-16LE db. |
+# enc2.3.*: Simple tests with a UTF-16BE db. |
+# enc2.4.*: Test that attached databases must have the same text encoding |
+# as the main database. |
+# enc2.5.*: Test the behaviour of the library when a collation sequence is |
+# not available for the most desirable text encoding. |
+# enc2.6.*: Similar test for user functions. |
+# enc2.7.*: Test that the VerifyCookie opcode protects against assuming the |
+# wrong text encoding for the database. |
+# enc2.8.*: Test sqlite3_complete16() |
+# |
+ |
+db close |
+ |
+# Return the UTF-8 representation of the supplied UTF-16 string $str. |
+proc utf8 {str} { |
+ # If $str ends in two 0x00 0x00 bytes, knock these off before |
+ # converting to UTF-8 using TCL. |
+ binary scan $str \c* vals |
+ if {[lindex $vals end]==0 && [lindex $vals end-1]==0} { |
+ set str [binary format \c* [lrange $vals 0 end-2]] |
+ } |
+ |
+ set r [encoding convertfrom unicode $str] |
+ return $r |
+} |
+ |
+# |
+# This proc contains all the tests in this file. It is run |
+# three times. Each time the file 'test.db' contains a database |
+# with the following contents: |
+set dbcontents { |
+ CREATE TABLE t1(a PRIMARY KEY, b, c); |
+ INSERT INTO t1 VALUES('one', 'I', 1); |
+} |
+# This proc tests that we can open and manipulate the test.db |
+# database, and that it is possible to retreive values in |
+# various text encodings. |
+# |
+proc run_test_script {t enc} { |
+ |
+# Open the database and pull out a (the) row. |
+do_test $t.1 { |
+ sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
+ execsql {SELECT * FROM t1} |
+} {one I 1} |
+ |
+# Insert some data |
+do_test $t.2 { |
+ execsql {INSERT INTO t1 VALUES('two', 'II', 2);} |
+ execsql {SELECT * FROM t1} |
+} {one I 1 two II 2} |
+ |
+# Insert some data |
+do_test $t.3 { |
+ execsql { |
+ INSERT INTO t1 VALUES('three','III',3); |
+ INSERT INTO t1 VALUES('four','IV',4); |
+ INSERT INTO t1 VALUES('five','V',5); |
+ } |
+ execsql {SELECT * FROM t1} |
+} {one I 1 two II 2 three III 3 four IV 4 five V 5} |
+ |
+# Use the index |
+do_test $t.4 { |
+ execsql { |
+ SELECT * FROM t1 WHERE a = 'one'; |
+ } |
+} {one I 1} |
+do_test $t.5 { |
+ execsql { |
+ SELECT * FROM t1 WHERE a = 'four'; |
+ } |
+} {four IV 4} |
+ifcapable subquery { |
+ do_test $t.6 { |
+ execsql { |
+ SELECT * FROM t1 WHERE a IN ('one', 'two'); |
+ } |
+ } {one I 1 two II 2} |
+} |
+ |
+# Now check that we can retrieve data in both UTF-16 and UTF-8 |
+do_test $t.7 { |
+ set STMT [sqlite3_prepare $DB "SELECT a FROM t1 WHERE c>3;" -1 TAIL] |
+ sqlite3_step $STMT |
+ sqlite3_column_text $STMT 0 |
+} {four} |
+ |
+do_test $t.8 { |
+ sqlite3_step $STMT |
+ utf8 [sqlite3_column_text16 $STMT 0] |
+} {five} |
+ |
+do_test $t.9 { |
+ sqlite3_finalize $STMT |
+} SQLITE_OK |
+ |
+ifcapable vacuum { |
+ execsql VACUUM |
+} |
+ |
+do_test $t.10 { |
+ db eval {PRAGMA encoding} |
+} $enc |
+ |
+} |
+ |
+# The three unicode encodings understood by SQLite. |
+set encodings [list UTF-8 UTF-16le UTF-16be] |
+ |
+set sqlite_os_trace 0 |
+set i 1 |
+foreach enc $encodings { |
+ file delete -force test.db |
+ sqlite3 db test.db |
+ db eval "PRAGMA encoding = \"$enc\"" |
+ execsql $dbcontents |
+ do_test enc2-$i.0.1 { |
+ db eval {PRAGMA encoding} |
+ } $enc |
+ do_test enc2-$i.0.2 { |
+ db eval {PRAGMA encoding=UTF8} |
+ db eval {PRAGMA encoding} |
+ } $enc |
+ do_test enc2-$i.0.3 { |
+ db eval {PRAGMA encoding=UTF16le} |
+ db eval {PRAGMA encoding} |
+ } $enc |
+ do_test enc2-$i.0.4 { |
+ db eval {PRAGMA encoding=UTF16be} |
+ db eval {PRAGMA encoding} |
+ } $enc |
+ |
+ db close |
+ run_test_script enc2-$i $enc |
+ db close |
+ incr i |
+} |
+ |
+# Test that it is an error to try to attach a database with a different |
+# encoding to the main database. |
+ifcapable attach { |
+ do_test enc2-4.1 { |
+ file delete -force test.db |
+ sqlite3 db test.db |
+ db eval "PRAGMA encoding = 'UTF-8'" |
+ db eval "CREATE TABLE abc(a, b, c);" |
+ } {} |
+ do_test enc2-4.2 { |
+ file delete -force test2.db |
+ sqlite3 db2 test2.db |
+ db2 eval "PRAGMA encoding = 'UTF-16'" |
+ db2 eval "CREATE TABLE abc(a, b, c);" |
+ } {} |
+ do_test enc2-4.3 { |
+ catchsql { |
+ ATTACH 'test2.db' as aux; |
+ } |
+ } {1 {attached databases must use the same text encoding as main database}} |
+ db2 close |
+ db close |
+} |
+ |
+# The following tests - enc2-5.* - test that SQLite selects the correct |
+# collation sequence when more than one is available. |
+ |
+set ::values [list one two three four five] |
+set ::test_collate_enc INVALID |
+proc test_collate {enc lhs rhs} { |
+ set ::test_collate_enc $enc |
+ set l [lsearch -exact $::values $lhs] |
+ set r [lsearch -exact $::values $rhs] |
+ set res [expr $l - $r] |
+ # puts "enc=$enc lhs=$lhs/$l rhs=$rhs/$r res=$res" |
+ return $res |
+} |
+ |
+file delete -force test.db |
+sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
+do_test enc2-5.0 { |
+ execsql { |
+ CREATE TABLE t5(a); |
+ INSERT INTO t5 VALUES('one'); |
+ INSERT INTO t5 VALUES('two'); |
+ INSERT INTO t5 VALUES('five'); |
+ INSERT INTO t5 VALUES('three'); |
+ INSERT INTO t5 VALUES('four'); |
+ } |
+} {} |
+do_test enc2-5.1 { |
+ add_test_collate $DB 1 1 1 |
+ set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate;}] |
+ lappend res $::test_collate_enc |
+} {one two three four five UTF-8} |
+do_test enc2-5.2 { |
+ add_test_collate $DB 0 1 0 |
+ set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] |
+ lappend res $::test_collate_enc |
+} {one two three four five UTF-16LE} |
+do_test enc2-5.3 { |
+ add_test_collate $DB 0 0 1 |
+ set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] |
+ lappend res $::test_collate_enc |
+} {one two three four five UTF-16BE} |
+ |
+db close |
+file delete -force test.db |
+sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
+execsql {pragma encoding = 'UTF-16LE'} |
+do_test enc2-5.4 { |
+ execsql { |
+ CREATE TABLE t5(a); |
+ INSERT INTO t5 VALUES('one'); |
+ INSERT INTO t5 VALUES('two'); |
+ INSERT INTO t5 VALUES('five'); |
+ INSERT INTO t5 VALUES('three'); |
+ INSERT INTO t5 VALUES('four'); |
+ } |
+} {} |
+do_test enc2-5.5 { |
+ add_test_collate $DB 1 1 1 |
+ set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] |
+ lappend res $::test_collate_enc |
+} {one two three four five UTF-16LE} |
+do_test enc2-5.6 { |
+ add_test_collate $DB 1 0 1 |
+ set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] |
+ lappend res $::test_collate_enc |
+} {one two three four five UTF-16BE} |
+do_test enc2-5.7 { |
+ add_test_collate $DB 1 0 0 |
+ set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] |
+ lappend res $::test_collate_enc |
+} {one two three four five UTF-8} |
+ |
+db close |
+file delete -force test.db |
+sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
+execsql {pragma encoding = 'UTF-16BE'} |
+do_test enc2-5.8 { |
+ execsql { |
+ CREATE TABLE t5(a); |
+ INSERT INTO t5 VALUES('one'); |
+ INSERT INTO t5 VALUES('two'); |
+ INSERT INTO t5 VALUES('five'); |
+ INSERT INTO t5 VALUES('three'); |
+ INSERT INTO t5 VALUES('four'); |
+ } |
+} {} |
+do_test enc2-5.9 { |
+ add_test_collate $DB 1 1 1 |
+ set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] |
+ lappend res $::test_collate_enc |
+} {one two three four five UTF-16BE} |
+do_test enc2-5.10 { |
+ add_test_collate $DB 1 1 0 |
+ set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] |
+ lappend res $::test_collate_enc |
+} {one two three four five UTF-16LE} |
+do_test enc2-5.11 { |
+ add_test_collate $DB 1 0 0 |
+ set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}] |
+ lappend res $::test_collate_enc |
+} {one two three four five UTF-8} |
+ |
+# Also test that a UTF-16 collation factory works. |
+do_test enc2-5-12 { |
+ add_test_collate $DB 0 0 0 |
+ catchsql { |
+ SELECT * FROM t5 ORDER BY 1 COLLATE test_collate |
+ } |
+} {1 {no such collation sequence: test_collate}} |
+do_test enc2-5.13 { |
+ add_test_collate_needed $DB |
+ set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate; }] |
+ lappend res $::test_collate_enc |
+} {one two three four five UTF-16BE} |
+do_test enc2-5.14 { |
+ set ::sqlite_last_needed_collation |
+} test_collate |
+ |
+db close |
+file delete -force test.db |
+ |
+do_test enc2-5.15 { |
+ sqlite3 db test.db; set ::DB [sqlite3_connection_pointer db] |
+ add_test_collate_needed $::DB |
+ set ::sqlite_last_needed_collation |
+} {} |
+do_test enc2-5.16 { |
+ execsql {CREATE TABLE t1(a varchar collate test_collate);} |
+} {} |
+do_test enc2-5.17 { |
+ set ::sqlite_last_needed_collation |
+} {test_collate} |
+ |
+# The following tests - enc2-6.* - test that SQLite selects the correct |
+# user function when more than one is available. |
+ |
+proc test_function {enc arg} { |
+ return "$enc $arg" |
+} |
+ |
+db close |
+file delete -force test.db |
+sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
+execsql {pragma encoding = 'UTF-8'} |
+do_test enc2-6.0 { |
+ execsql { |
+ CREATE TABLE t5(a); |
+ INSERT INTO t5 VALUES('one'); |
+ } |
+} {} |
+do_test enc2-6.1 { |
+ add_test_function $DB 1 1 1 |
+ execsql { |
+ SELECT test_function('sqlite') |
+ } |
+} {{UTF-8 sqlite}} |
+db close |
+sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
+do_test enc2-6.2 { |
+ add_test_function $DB 0 1 0 |
+ execsql { |
+ SELECT test_function('sqlite') |
+ } |
+} {{UTF-16LE sqlite}} |
+db close |
+sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
+do_test enc2-6.3 { |
+ add_test_function $DB 0 0 1 |
+ execsql { |
+ SELECT test_function('sqlite') |
+ } |
+} {{UTF-16BE sqlite}} |
+ |
+db close |
+file delete -force test.db |
+sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
+execsql {pragma encoding = 'UTF-16LE'} |
+do_test enc2-6.3 { |
+ execsql { |
+ CREATE TABLE t5(a); |
+ INSERT INTO t5 VALUES('sqlite'); |
+ } |
+} {} |
+do_test enc2-6.4 { |
+ add_test_function $DB 1 1 1 |
+ execsql { |
+ SELECT test_function('sqlite') |
+ } |
+} {{UTF-16LE sqlite}} |
+db close |
+sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
+do_test enc2-6.5 { |
+ add_test_function $DB 0 1 0 |
+ execsql { |
+ SELECT test_function('sqlite') |
+ } |
+} {{UTF-16LE sqlite}} |
+db close |
+sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
+do_test enc2-6.6 { |
+ add_test_function $DB 0 0 1 |
+ execsql { |
+ SELECT test_function('sqlite') |
+ } |
+} {{UTF-16BE sqlite}} |
+ |
+db close |
+file delete -force test.db |
+sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
+execsql {pragma encoding = 'UTF-16BE'} |
+do_test enc2-6.7 { |
+ execsql { |
+ CREATE TABLE t5(a); |
+ INSERT INTO t5 VALUES('sqlite'); |
+ } |
+} {} |
+do_test enc2-6.8 { |
+ add_test_function $DB 1 1 1 |
+ execsql { |
+ SELECT test_function('sqlite') |
+ } |
+} {{UTF-16BE sqlite}} |
+db close |
+sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
+do_test enc2-6.9 { |
+ add_test_function $DB 0 1 0 |
+ execsql { |
+ SELECT test_function('sqlite') |
+ } |
+} {{UTF-16LE sqlite}} |
+db close |
+sqlite3 db test.db; set DB [sqlite3_connection_pointer db] |
+do_test enc2-6.10 { |
+ add_test_function $DB 0 0 1 |
+ execsql { |
+ SELECT test_function('sqlite') |
+ } |
+} {{UTF-16BE sqlite}} |
+ |
+ |
+db close |
+file delete -force test.db |
+ |
+# The following tests - enc2-7.* - function as follows: |
+# |
+# 1: Open an empty database file assuming UTF-16 encoding. |
+# 2: Open the same database with a different handle assuming UTF-8. Create |
+# a table using this handle. |
+# 3: Read the sqlite_master table from the first handle. |
+# 4: Ensure the first handle recognises the database encoding is UTF-8. |
+# |
+do_test enc2-7.1 { |
+ sqlite3 db test.db |
+ execsql { |
+ PRAGMA encoding = 'UTF-16'; |
+ SELECT * FROM sqlite_master; |
+ } |
+} {} |
+do_test enc2-7.2 { |
+ set enc [execsql { |
+ PRAGMA encoding; |
+ }] |
+ string range $enc 0 end-2 ;# Chop off the "le" or "be" |
+} {UTF-16} |
+do_test enc2-7.3 { |
+ sqlite3 db2 test.db |
+ execsql { |
+ PRAGMA encoding = 'UTF-8'; |
+ CREATE TABLE abc(a, b, c); |
+ } db2 |
+} {} |
+do_test enc2-7.4 { |
+ execsql { |
+ SELECT * FROM sqlite_master; |
+ } |
+} "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}" |
+do_test enc2-7.5 { |
+ execsql { |
+ PRAGMA encoding; |
+ } |
+} {UTF-8} |
+ |
+db close |
+db2 close |
+ |
+proc utf16 {utf8} { |
+ set utf16 [encoding convertto unicode $utf8] |
+ append utf16 "\x00\x00" |
+ return $utf16 |
+} |
+ifcapable {complete} { |
+ do_test enc2-8.1 { |
+ sqlite3_complete16 [utf16 "SELECT * FROM t1;"] |
+ } {1} |
+ do_test enc2-8.2 { |
+ sqlite3_complete16 [utf16 "SELECT * FROM"] |
+ } {0} |
+} |
+ |
+# Test that the encoding of an empty database may still be set after the |
+# (empty) schema has been initialized. |
+file delete -force test.db |
+do_test enc2-9.1 { |
+ sqlite3 db test.db |
+ execsql { |
+ PRAGMA encoding = 'UTF-8'; |
+ PRAGMA encoding; |
+ } |
+} {UTF-8} |
+do_test enc2-9.2 { |
+ sqlite3 db test.db |
+ execsql { |
+ PRAGMA encoding = 'UTF-16le'; |
+ PRAGMA encoding; |
+ } |
+} {UTF-16le} |
+do_test enc2-9.3 { |
+ sqlite3 db test.db |
+ execsql { |
+ SELECT * FROM sqlite_master; |
+ PRAGMA encoding = 'UTF-8'; |
+ PRAGMA encoding; |
+ } |
+} {UTF-8} |
+do_test enc2-9.4 { |
+ sqlite3 db test.db |
+ execsql { |
+ PRAGMA encoding = 'UTF-16le'; |
+ CREATE TABLE abc(a, b, c); |
+ PRAGMA encoding; |
+ } |
+} {UTF-16le} |
+do_test enc2-9.5 { |
+ sqlite3 db test.db |
+ execsql { |
+ PRAGMA encoding = 'UTF-8'; |
+ PRAGMA encoding; |
+ } |
+} {UTF-16le} |
+ |
+# Ticket #1987. |
+# Disallow encoding changes once the encoding has been set. |
+# |
+do_test enc2-10.1 { |
+ db close |
+ file delete -force test.db test.db-journal |
+ sqlite3 db test.db |
+ db eval { |
+ PRAGMA encoding=UTF16; |
+ CREATE TABLE t1(a); |
+ PRAGMA encoding=UTF8; |
+ CREATE TABLE t2(b); |
+ } |
+ db close |
+ sqlite3 db test.db |
+ db eval { |
+ SELECT name FROM sqlite_master |
+ } |
+} {t1 t2} |
+ |
+finish_test |