blob: 81e7bfd68cbbb386633b2e9bc17fd8f113462f94 [file] [log] [blame]
danielk1977e1cd9872004-05-22 10:33:04 +00001# 2002 May 24
2#
3# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
5#
6# May you do good and not evil.
7# May you find forgiveness for yourself and forgive others.
8# May you share freely, never taking more than you give.
9#
10#***********************************************************************
11# This file implements regression tests for SQLite library. The focus of
12# this file is testing the SQLite routines used for converting between the
13# various suported unicode encodings (UTF-8, UTF-16, UTF-16le and
14# UTF-16be).
15#
danielk1977e1cd9872004-05-22 10:33:04 +000016
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19
drh5436dc22004-11-14 04:04:17 +000020# If UTF16 support is disabled, ignore the tests in this file
21#
22ifcapable {!utf16} {
23 finish_test
24 return
25}
26
danielk1977f9d19a62004-06-14 08:26:35 +000027# The rough organisation of tests in this file is:
28#
29# enc2.1.*: Simple tests with a UTF-8 db.
30# enc2.2.*: Simple tests with a UTF-16LE db.
31# enc2.3.*: Simple tests with a UTF-16BE db.
32# enc2.4.*: Test that attached databases must have the same text encoding
33# as the main database.
mistachkin48864df2013-03-21 21:20:32 +000034# enc2.5.*: Test the behavior of the library when a collation sequence is
danielk1977f9d19a62004-06-14 08:26:35 +000035# not available for the most desirable text encoding.
danielk1977bc6ada42004-06-30 08:20:16 +000036# enc2.6.*: Similar test for user functions.
37# enc2.7.*: Test that the VerifyCookie opcode protects against assuming the
danielk1977f9d19a62004-06-14 08:26:35 +000038# wrong text encoding for the database.
danielk1977bc6ada42004-06-30 08:20:16 +000039# enc2.8.*: Test sqlite3_complete16()
40#
danielk1977f9d19a62004-06-14 08:26:35 +000041
danielk1977e1cd9872004-05-22 10:33:04 +000042db close
43
44# Return the UTF-8 representation of the supplied UTF-16 string $str.
45proc utf8 {str} {
46 # If $str ends in two 0x00 0x00 bytes, knock these off before
47 # converting to UTF-8 using TCL.
48 binary scan $str \c* vals
49 if {[lindex $vals end]==0 && [lindex $vals end-1]==0} {
50 set str [binary format \c* [lrange $vals 0 end-2]]
51 }
52
53 set r [encoding convertfrom unicode $str]
54 return $r
55}
56
57#
58# This proc contains all the tests in this file. It is run
59# three times. Each time the file 'test.db' contains a database
60# with the following contents:
61set dbcontents {
62 CREATE TABLE t1(a PRIMARY KEY, b, c);
63 INSERT INTO t1 VALUES('one', 'I', 1);
64}
65# This proc tests that we can open and manipulate the test.db
66# database, and that it is possible to retreive values in
67# various text encodings.
68#
danielk19778e227872004-06-07 07:52:17 +000069proc run_test_script {t enc} {
danielk1977e1cd9872004-05-22 10:33:04 +000070
71# Open the database and pull out a (the) row.
72do_test $t.1 {
drhdddca282006-01-03 00:33:50 +000073 sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk1977e1cd9872004-05-22 10:33:04 +000074 execsql {SELECT * FROM t1}
75} {one I 1}
76
77# Insert some data
78do_test $t.2 {
79 execsql {INSERT INTO t1 VALUES('two', 'II', 2);}
80 execsql {SELECT * FROM t1}
81} {one I 1 two II 2}
82
drh5f3b4ab2004-05-27 17:22:54 +000083# Insert some data
danielk1977e1cd9872004-05-22 10:33:04 +000084do_test $t.3 {
drh5f3b4ab2004-05-27 17:22:54 +000085 execsql {
86 INSERT INTO t1 VALUES('three','III',3);
87 INSERT INTO t1 VALUES('four','IV',4);
88 INSERT INTO t1 VALUES('five','V',5);
89 }
danielk1977e1cd9872004-05-22 10:33:04 +000090 execsql {SELECT * FROM t1}
91} {one I 1 two II 2 three III 3 four IV 4 five V 5}
92
93# Use the index
94do_test $t.4 {
95 execsql {
96 SELECT * FROM t1 WHERE a = 'one';
97 }
98} {one I 1}
99do_test $t.5 {
100 execsql {
101 SELECT * FROM t1 WHERE a = 'four';
102 }
103} {four IV 4}
danielk1977e61b9f42005-01-21 04:25:47 +0000104ifcapable subquery {
105 do_test $t.6 {
106 execsql {
107 SELECT * FROM t1 WHERE a IN ('one', 'two');
108 }
109 } {one I 1 two II 2}
110}
danielk1977e1cd9872004-05-22 10:33:04 +0000111
112# Now check that we can retrieve data in both UTF-16 and UTF-8
113do_test $t.7 {
114 set STMT [sqlite3_prepare $DB "SELECT a FROM t1 WHERE c>3;" -1 TAIL]
115 sqlite3_step $STMT
drheb2e1762004-05-27 01:53:56 +0000116 sqlite3_column_text $STMT 0
danielk1977e1cd9872004-05-22 10:33:04 +0000117} {four}
118
119do_test $t.8 {
120 sqlite3_step $STMT
drheb2e1762004-05-27 01:53:56 +0000121 utf8 [sqlite3_column_text16 $STMT 0]
danielk1977e1cd9872004-05-22 10:33:04 +0000122} {five}
123
124do_test $t.9 {
125 sqlite3_finalize $STMT
danielk19773cf86062004-05-26 10:11:05 +0000126} SQLITE_OK
danielk1977e1cd9872004-05-22 10:33:04 +0000127
drh802d69a2005-02-13 23:34:24 +0000128ifcapable vacuum {
129 execsql VACUUM
130}
131
danielk19778e227872004-06-07 07:52:17 +0000132do_test $t.10 {
133 db eval {PRAGMA encoding}
134} $enc
danielk1977e1cd9872004-05-22 10:33:04 +0000135
136}
137
138# The three unicode encodings understood by SQLite.
danielk19778e227872004-06-07 07:52:17 +0000139set encodings [list UTF-8 UTF-16le UTF-16be]
danielk1977e1cd9872004-05-22 10:33:04 +0000140
drh59eb6762004-06-13 23:07:04 +0000141set sqlite_os_trace 0
danielk1977e1cd9872004-05-22 10:33:04 +0000142set i 1
143foreach enc $encodings {
mistachkinfda06be2011-08-02 00:57:34 +0000144 forcedelete test.db
drhef4ac8f2004-06-19 00:16:31 +0000145 sqlite3 db test.db
danielk19778e227872004-06-07 07:52:17 +0000146 db eval "PRAGMA encoding = \"$enc\""
danielk1977e1cd9872004-05-22 10:33:04 +0000147 execsql $dbcontents
drhece3c722006-09-23 20:36:01 +0000148 do_test enc2-$i.0.1 {
149 db eval {PRAGMA encoding}
150 } $enc
151 do_test enc2-$i.0.2 {
152 db eval {PRAGMA encoding=UTF8}
153 db eval {PRAGMA encoding}
154 } $enc
155 do_test enc2-$i.0.3 {
156 db eval {PRAGMA encoding=UTF16le}
157 db eval {PRAGMA encoding}
158 } $enc
159 do_test enc2-$i.0.4 {
160 db eval {PRAGMA encoding=UTF16be}
161 db eval {PRAGMA encoding}
162 } $enc
163
danielk1977e1cd9872004-05-22 10:33:04 +0000164 db close
danielk19778e227872004-06-07 07:52:17 +0000165 run_test_script enc2-$i $enc
drh59eb6762004-06-13 23:07:04 +0000166 db close
danielk1977e1cd9872004-05-22 10:33:04 +0000167 incr i
168}
169
danielk1977c0391392004-06-09 12:30:04 +0000170# Test that it is an error to try to attach a database with a different
171# encoding to the main database.
danielk19775a8f9372007-10-09 08:29:32 +0000172ifcapable attach {
173 do_test enc2-4.1 {
mistachkinfda06be2011-08-02 00:57:34 +0000174 forcedelete test.db
danielk19775a8f9372007-10-09 08:29:32 +0000175 sqlite3 db test.db
176 db eval "PRAGMA encoding = 'UTF-8'"
177 db eval "CREATE TABLE abc(a, b, c);"
178 } {}
179 do_test enc2-4.2 {
mistachkinfda06be2011-08-02 00:57:34 +0000180 forcedelete test2.db
danielk19775a8f9372007-10-09 08:29:32 +0000181 sqlite3 db2 test2.db
182 db2 eval "PRAGMA encoding = 'UTF-16'"
183 db2 eval "CREATE TABLE abc(a, b, c);"
184 } {}
185 do_test enc2-4.3 {
186 catchsql {
187 ATTACH 'test2.db' as aux;
188 }
189 } {1 {attached databases must use the same text encoding as main database}}
190 db2 close
191 db close
192}
danielk19774e6af132004-06-10 14:01:08 +0000193
194# The following tests - enc2-5.* - test that SQLite selects the correct
195# collation sequence when more than one is available.
196
197set ::values [list one two three four five]
198set ::test_collate_enc INVALID
199proc test_collate {enc lhs rhs} {
200 set ::test_collate_enc $enc
201 set l [lsearch -exact $::values $lhs]
202 set r [lsearch -exact $::values $rhs]
203 set res [expr $l - $r]
drh4db38a72005-09-01 12:16:28 +0000204 # puts "enc=$enc lhs=$lhs/$l rhs=$rhs/$r res=$res"
danielk19774e6af132004-06-10 14:01:08 +0000205 return $res
206}
207
mistachkinfda06be2011-08-02 00:57:34 +0000208forcedelete test.db
drhdddca282006-01-03 00:33:50 +0000209sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19774e6af132004-06-10 14:01:08 +0000210do_test enc2-5.0 {
211 execsql {
212 CREATE TABLE t5(a);
213 INSERT INTO t5 VALUES('one');
214 INSERT INTO t5 VALUES('two');
215 INSERT INTO t5 VALUES('five');
216 INSERT INTO t5 VALUES('three');
217 INSERT INTO t5 VALUES('four');
218 }
219} {}
220do_test enc2-5.1 {
221 add_test_collate $DB 1 1 1
drh268803a2005-12-14 20:11:30 +0000222 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate;}]
danielk19774e6af132004-06-10 14:01:08 +0000223 lappend res $::test_collate_enc
224} {one two three four five UTF-8}
225do_test enc2-5.2 {
226 add_test_collate $DB 0 1 0
227 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
228 lappend res $::test_collate_enc
229} {one two three four five UTF-16LE}
danielk19774e6af132004-06-10 14:01:08 +0000230do_test enc2-5.3 {
231 add_test_collate $DB 0 0 1
232 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
233 lappend res $::test_collate_enc
234} {one two three four five UTF-16BE}
235
drh59eb6762004-06-13 23:07:04 +0000236db close
mistachkinfda06be2011-08-02 00:57:34 +0000237forcedelete test.db
drhdddca282006-01-03 00:33:50 +0000238sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19774e6af132004-06-10 14:01:08 +0000239execsql {pragma encoding = 'UTF-16LE'}
240do_test enc2-5.4 {
241 execsql {
242 CREATE TABLE t5(a);
243 INSERT INTO t5 VALUES('one');
244 INSERT INTO t5 VALUES('two');
245 INSERT INTO t5 VALUES('five');
246 INSERT INTO t5 VALUES('three');
247 INSERT INTO t5 VALUES('four');
248 }
249} {}
250do_test enc2-5.5 {
251 add_test_collate $DB 1 1 1
252 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
253 lappend res $::test_collate_enc
254} {one two three four five UTF-16LE}
255do_test enc2-5.6 {
256 add_test_collate $DB 1 0 1
257 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
258 lappend res $::test_collate_enc
259} {one two three four five UTF-16BE}
danielk19774e6af132004-06-10 14:01:08 +0000260do_test enc2-5.7 {
261 add_test_collate $DB 1 0 0
262 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
263 lappend res $::test_collate_enc
264} {one two three four five UTF-8}
265
drh59eb6762004-06-13 23:07:04 +0000266db close
mistachkinfda06be2011-08-02 00:57:34 +0000267forcedelete test.db
drhdddca282006-01-03 00:33:50 +0000268sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19774e6af132004-06-10 14:01:08 +0000269execsql {pragma encoding = 'UTF-16BE'}
270do_test enc2-5.8 {
271 execsql {
272 CREATE TABLE t5(a);
273 INSERT INTO t5 VALUES('one');
274 INSERT INTO t5 VALUES('two');
275 INSERT INTO t5 VALUES('five');
276 INSERT INTO t5 VALUES('three');
277 INSERT INTO t5 VALUES('four');
278 }
279} {}
280do_test enc2-5.9 {
281 add_test_collate $DB 1 1 1
282 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
283 lappend res $::test_collate_enc
284} {one two three four five UTF-16BE}
285do_test enc2-5.10 {
286 add_test_collate $DB 1 1 0
287 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
288 lappend res $::test_collate_enc
289} {one two three four five UTF-16LE}
danielk19774e6af132004-06-10 14:01:08 +0000290do_test enc2-5.11 {
291 add_test_collate $DB 1 0 0
292 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate}]
293 lappend res $::test_collate_enc
294} {one two three four five UTF-8}
danielk19770de0bb32004-06-10 05:59:24 +0000295
danielk1977312d6b32004-06-29 13:18:23 +0000296# Also test that a UTF-16 collation factory works.
danielk1977bc6ada42004-06-30 08:20:16 +0000297do_test enc2-5-12 {
danielk1977312d6b32004-06-29 13:18:23 +0000298 add_test_collate $DB 0 0 0
299 catchsql {
300 SELECT * FROM t5 ORDER BY 1 COLLATE test_collate
301 }
302} {1 {no such collation sequence: test_collate}}
303do_test enc2-5.13 {
304 add_test_collate_needed $DB
drh268803a2005-12-14 20:11:30 +0000305 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate; }]
danielk1977312d6b32004-06-29 13:18:23 +0000306 lappend res $::test_collate_enc
307} {one two three four five UTF-16BE}
drh268803a2005-12-14 20:11:30 +0000308do_test enc2-5.14 {
309 set ::sqlite_last_needed_collation
310} test_collate
danielk1977312d6b32004-06-29 13:18:23 +0000311
danielk1977f9d19a62004-06-14 08:26:35 +0000312db close
mistachkinfda06be2011-08-02 00:57:34 +0000313forcedelete test.db
danielk1977f9d19a62004-06-14 08:26:35 +0000314
drh268803a2005-12-14 20:11:30 +0000315do_test enc2-5.15 {
drhdddca282006-01-03 00:33:50 +0000316 sqlite3 db test.db; set ::DB [sqlite3_connection_pointer db]
drh268803a2005-12-14 20:11:30 +0000317 add_test_collate_needed $::DB
318 set ::sqlite_last_needed_collation
319} {}
320do_test enc2-5.16 {
321 execsql {CREATE TABLE t1(a varchar collate test_collate);}
322} {}
323do_test enc2-5.17 {
324 set ::sqlite_last_needed_collation
325} {test_collate}
326
danielk1977bc6ada42004-06-30 08:20:16 +0000327# The following tests - enc2-6.* - test that SQLite selects the correct
328# user function when more than one is available.
danielk19779d951762004-06-23 12:15:55 +0000329
330proc test_function {enc arg} {
331 return "$enc $arg"
332}
333
drh0acb23d2006-01-23 15:59:55 +0000334db close
mistachkinfda06be2011-08-02 00:57:34 +0000335forcedelete test.db
drhdddca282006-01-03 00:33:50 +0000336sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000337execsql {pragma encoding = 'UTF-8'}
338do_test enc2-6.0 {
339 execsql {
340 CREATE TABLE t5(a);
341 INSERT INTO t5 VALUES('one');
342 }
343} {}
344do_test enc2-6.1 {
345 add_test_function $DB 1 1 1
346 execsql {
347 SELECT test_function('sqlite')
348 }
349} {{UTF-8 sqlite}}
danielk1977e12c17b2004-06-23 12:35:14 +0000350db close
drhdddca282006-01-03 00:33:50 +0000351sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000352do_test enc2-6.2 {
353 add_test_function $DB 0 1 0
354 execsql {
355 SELECT test_function('sqlite')
356 }
357} {{UTF-16LE sqlite}}
danielk1977e12c17b2004-06-23 12:35:14 +0000358db close
drhdddca282006-01-03 00:33:50 +0000359sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000360do_test enc2-6.3 {
361 add_test_function $DB 0 0 1
362 execsql {
363 SELECT test_function('sqlite')
364 }
365} {{UTF-16BE sqlite}}
366
drh2ec81642004-06-28 11:52:45 +0000367db close
mistachkinfda06be2011-08-02 00:57:34 +0000368forcedelete test.db
drhdddca282006-01-03 00:33:50 +0000369sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000370execsql {pragma encoding = 'UTF-16LE'}
371do_test enc2-6.3 {
372 execsql {
373 CREATE TABLE t5(a);
374 INSERT INTO t5 VALUES('sqlite');
375 }
376} {}
377do_test enc2-6.4 {
378 add_test_function $DB 1 1 1
379 execsql {
380 SELECT test_function('sqlite')
381 }
382} {{UTF-16LE sqlite}}
danielk1977e12c17b2004-06-23 12:35:14 +0000383db close
drhdddca282006-01-03 00:33:50 +0000384sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000385do_test enc2-6.5 {
386 add_test_function $DB 0 1 0
387 execsql {
388 SELECT test_function('sqlite')
389 }
390} {{UTF-16LE sqlite}}
danielk1977e12c17b2004-06-23 12:35:14 +0000391db close
drhdddca282006-01-03 00:33:50 +0000392sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000393do_test enc2-6.6 {
394 add_test_function $DB 0 0 1
395 execsql {
396 SELECT test_function('sqlite')
397 }
398} {{UTF-16BE sqlite}}
399
drh2ec81642004-06-28 11:52:45 +0000400db close
mistachkinfda06be2011-08-02 00:57:34 +0000401forcedelete test.db
drhdddca282006-01-03 00:33:50 +0000402sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000403execsql {pragma encoding = 'UTF-16BE'}
404do_test enc2-6.7 {
405 execsql {
406 CREATE TABLE t5(a);
407 INSERT INTO t5 VALUES('sqlite');
408 }
409} {}
410do_test enc2-6.8 {
411 add_test_function $DB 1 1 1
412 execsql {
413 SELECT test_function('sqlite')
414 }
415} {{UTF-16BE sqlite}}
danielk1977e12c17b2004-06-23 12:35:14 +0000416db close
drhdddca282006-01-03 00:33:50 +0000417sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000418do_test enc2-6.9 {
419 add_test_function $DB 0 1 0
420 execsql {
421 SELECT test_function('sqlite')
422 }
423} {{UTF-16LE sqlite}}
danielk1977e12c17b2004-06-23 12:35:14 +0000424db close
drhdddca282006-01-03 00:33:50 +0000425sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
danielk19779d951762004-06-23 12:15:55 +0000426do_test enc2-6.10 {
427 add_test_function $DB 0 0 1
428 execsql {
429 SELECT test_function('sqlite')
430 }
431} {{UTF-16BE sqlite}}
432
danielk1977312d6b32004-06-29 13:18:23 +0000433
danielk19779d951762004-06-23 12:15:55 +0000434db close
mistachkinfda06be2011-08-02 00:57:34 +0000435forcedelete test.db
danielk19779d951762004-06-23 12:15:55 +0000436
danielk1977bc6ada42004-06-30 08:20:16 +0000437# The following tests - enc2-7.* - function as follows:
danielk1977f9d19a62004-06-14 08:26:35 +0000438#
439# 1: Open an empty database file assuming UTF-16 encoding.
440# 2: Open the same database with a different handle assuming UTF-8. Create
441# a table using this handle.
442# 3: Read the sqlite_master table from the first handle.
443# 4: Ensure the first handle recognises the database encoding is UTF-8.
444#
danielk19779d951762004-06-23 12:15:55 +0000445do_test enc2-7.1 {
drhef4ac8f2004-06-19 00:16:31 +0000446 sqlite3 db test.db
danielk1977f9d19a62004-06-14 08:26:35 +0000447 execsql {
448 PRAGMA encoding = 'UTF-16';
449 SELECT * FROM sqlite_master;
450 }
451} {}
danielk19779d951762004-06-23 12:15:55 +0000452do_test enc2-7.2 {
danielk1977f9d19a62004-06-14 08:26:35 +0000453 set enc [execsql {
454 PRAGMA encoding;
455 }]
456 string range $enc 0 end-2 ;# Chop off the "le" or "be"
457} {UTF-16}
danielk19779d951762004-06-23 12:15:55 +0000458do_test enc2-7.3 {
drhef4ac8f2004-06-19 00:16:31 +0000459 sqlite3 db2 test.db
danielk1977f9d19a62004-06-14 08:26:35 +0000460 execsql {
461 PRAGMA encoding = 'UTF-8';
462 CREATE TABLE abc(a, b, c);
463 } db2
464} {}
danielk19779d951762004-06-23 12:15:55 +0000465do_test enc2-7.4 {
danielk1977f9d19a62004-06-14 08:26:35 +0000466 execsql {
467 SELECT * FROM sqlite_master;
468 }
danielk197745901d62004-11-10 15:27:38 +0000469} "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}"
danielk19779d951762004-06-23 12:15:55 +0000470do_test enc2-7.5 {
danielk1977f9d19a62004-06-14 08:26:35 +0000471 execsql {
472 PRAGMA encoding;
473 }
474} {UTF-8}
475
476db close
477db2 close
478
danielk1977bc6ada42004-06-30 08:20:16 +0000479proc utf16 {utf8} {
480 set utf16 [encoding convertto unicode $utf8]
481 append utf16 "\x00\x00"
482 return $utf16
483}
drhccae6022005-02-26 17:31:26 +0000484ifcapable {complete} {
485 do_test enc2-8.1 {
486 sqlite3_complete16 [utf16 "SELECT * FROM t1;"]
487 } {1}
488 do_test enc2-8.2 {
489 sqlite3_complete16 [utf16 "SELECT * FROM"]
490 } {0}
491}
danielk1977f9d19a62004-06-14 08:26:35 +0000492
danielk1977b82e7ed2006-01-11 14:09:31 +0000493# Test that the encoding of an empty database may still be set after the
494# (empty) schema has been initialized.
mistachkinfda06be2011-08-02 00:57:34 +0000495forcedelete test.db
danielk1977b82e7ed2006-01-11 14:09:31 +0000496do_test enc2-9.1 {
497 sqlite3 db test.db
498 execsql {
499 PRAGMA encoding = 'UTF-8';
500 PRAGMA encoding;
501 }
502} {UTF-8}
503do_test enc2-9.2 {
504 sqlite3 db test.db
505 execsql {
506 PRAGMA encoding = 'UTF-16le';
507 PRAGMA encoding;
508 }
509} {UTF-16le}
510do_test enc2-9.3 {
511 sqlite3 db test.db
512 execsql {
513 SELECT * FROM sqlite_master;
514 PRAGMA encoding = 'UTF-8';
515 PRAGMA encoding;
516 }
517} {UTF-8}
518do_test enc2-9.4 {
519 sqlite3 db test.db
520 execsql {
521 PRAGMA encoding = 'UTF-16le';
522 CREATE TABLE abc(a, b, c);
523 PRAGMA encoding;
524 }
525} {UTF-16le}
526do_test enc2-9.5 {
527 sqlite3 db test.db
528 execsql {
529 PRAGMA encoding = 'UTF-8';
530 PRAGMA encoding;
531 }
532} {UTF-16le}
533
drhece3c722006-09-23 20:36:01 +0000534# Ticket #1987.
535# Disallow encoding changes once the encoding has been set.
536#
537do_test enc2-10.1 {
538 db close
mistachkinfda06be2011-08-02 00:57:34 +0000539 forcedelete test.db test.db-journal
drhece3c722006-09-23 20:36:01 +0000540 sqlite3 db test.db
541 db eval {
542 PRAGMA encoding=UTF16;
543 CREATE TABLE t1(a);
544 PRAGMA encoding=UTF8;
545 CREATE TABLE t2(b);
546 }
547 db close
548 sqlite3 db test.db
549 db eval {
550 SELECT name FROM sqlite_master
551 }
552} {t1 t2}
553
drhb5f0e402020-01-15 16:20:16 +0000554# 2020-01-15 ticket a08879a4a476eea9
555# Do not allow a database connection encoding change unless *all*
556# attached databases are empty.
557#
558reset_db
559do_execsql_test enc2-11.10 {
560 PRAGMA encoding=UTF8;
561 CREATE TEMP TABLE t1(x);
562 INSERT INTO t1 VALUES('this is a test');
563 PRAGMA encoding=UTF16;
564 SELECT * FROM t1;
565} {{this is a test}}
566
danielk1977e1cd9872004-05-22 10:33:04 +0000567finish_test