xref: /sqlite-3.40.0/test/enc2.test (revision b5f0e405)
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