aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/sqlite/unix/sqlite-3.5.1/test/enc2.test
diff options
context:
space:
mode:
authordan miller2007-10-20 02:49:29 +0000
committerdan miller2007-10-20 02:49:29 +0000
commite36d23a85ebff914d74bb541558c2b6082b78edb (patch)
tree54b58fdf162e78af64055282a6035c8d2443389d /libraries/sqlite/unix/sqlite-3.5.1/test/enc2.test
parent* Fixed an issue whereby avatar chat distances were being calculated against ... (diff)
downloadopensim-SC-e36d23a85ebff914d74bb541558c2b6082b78edb.zip
opensim-SC-e36d23a85ebff914d74bb541558c2b6082b78edb.tar.gz
opensim-SC-e36d23a85ebff914d74bb541558c2b6082b78edb.tar.bz2
opensim-SC-e36d23a85ebff914d74bb541558c2b6082b78edb.tar.xz
sqlite source (unix build) added to libraries
Diffstat (limited to 'libraries/sqlite/unix/sqlite-3.5.1/test/enc2.test')
-rw-r--r--libraries/sqlite/unix/sqlite-3.5.1/test/enc2.test554
1 files changed, 554 insertions, 0 deletions
diff --git a/libraries/sqlite/unix/sqlite-3.5.1/test/enc2.test b/libraries/sqlite/unix/sqlite-3.5.1/test/enc2.test
new file mode 100644
index 0000000..03d4cbd
--- /dev/null
+++ b/libraries/sqlite/unix/sqlite-3.5.1/test/enc2.test
@@ -0,0 +1,554 @@
1# 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#
16# $Id: enc2.test,v 1.28 2006/09/23 20:36:03 drh Exp $
17
18set testdir [file dirname $argv0]
19source $testdir/tester.tcl
20
21# If UTF16 support is disabled, ignore the tests in this file
22#
23ifcapable {!utf16} {
24 finish_test
25 return
26}
27
28# The rough organisation of tests in this file is:
29#
30# enc2.1.*: Simple tests with a UTF-8 db.
31# enc2.2.*: Simple tests with a UTF-16LE db.
32# enc2.3.*: Simple tests with a UTF-16BE db.
33# enc2.4.*: Test that attached databases must have the same text encoding
34# as the main database.
35# enc2.5.*: Test the behaviour of the library when a collation sequence is
36# not available for the most desirable text encoding.
37# enc2.6.*: Similar test for user functions.
38# enc2.7.*: Test that the VerifyCookie opcode protects against assuming the
39# wrong text encoding for the database.
40# enc2.8.*: Test sqlite3_complete16()
41#
42
43db close
44
45# Return the UTF-8 representation of the supplied UTF-16 string $str.
46proc utf8 {str} {
47 # If $str ends in two 0x00 0x00 bytes, knock these off before
48 # converting to UTF-8 using TCL.
49 binary scan $str \c* vals
50 if {[lindex $vals end]==0 && [lindex $vals end-1]==0} {
51 set str [binary format \c* [lrange $vals 0 end-2]]
52 }
53
54 set r [encoding convertfrom unicode $str]
55 return $r
56}
57
58#
59# This proc contains all the tests in this file. It is run
60# three times. Each time the file 'test.db' contains a database
61# with the following contents:
62set dbcontents {
63 CREATE TABLE t1(a PRIMARY KEY, b, c);
64 INSERT INTO t1 VALUES('one', 'I', 1);
65}
66# This proc tests that we can open and manipulate the test.db
67# database, and that it is possible to retreive values in
68# various text encodings.
69#
70proc run_test_script {t enc} {
71
72# Open the database and pull out a (the) row.
73do_test $t.1 {
74 sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
75 execsql {SELECT * FROM t1}
76} {one I 1}
77
78# Insert some data
79do_test $t.2 {
80 execsql {INSERT INTO t1 VALUES('two', 'II', 2);}
81 execsql {SELECT * FROM t1}
82} {one I 1 two II 2}
83
84# Insert some data
85do_test $t.3 {
86 execsql {
87 INSERT INTO t1 VALUES('three','III',3);
88 INSERT INTO t1 VALUES('four','IV',4);
89 INSERT INTO t1 VALUES('five','V',5);
90 }
91 execsql {SELECT * FROM t1}
92} {one I 1 two II 2 three III 3 four IV 4 five V 5}
93
94# Use the index
95do_test $t.4 {
96 execsql {
97 SELECT * FROM t1 WHERE a = 'one';
98 }
99} {one I 1}
100do_test $t.5 {
101 execsql {
102 SELECT * FROM t1 WHERE a = 'four';
103 }
104} {four IV 4}
105ifcapable subquery {
106 do_test $t.6 {
107 execsql {
108 SELECT * FROM t1 WHERE a IN ('one', 'two');
109 }
110 } {one I 1 two II 2}
111}
112
113# Now check that we can retrieve data in both UTF-16 and UTF-8
114do_test $t.7 {
115 set STMT [sqlite3_prepare $DB "SELECT a FROM t1 WHERE c>3;" -1 TAIL]
116 sqlite3_step $STMT
117 sqlite3_column_text $STMT 0
118} {four}
119
120do_test $t.8 {
121 sqlite3_step $STMT
122 utf8 [sqlite3_column_text16 $STMT 0]
123} {five}
124
125do_test $t.9 {
126 sqlite3_finalize $STMT
127} SQLITE_OK
128
129ifcapable vacuum {
130 execsql VACUUM
131}
132
133do_test $t.10 {
134 db eval {PRAGMA encoding}
135} $enc
136
137}
138
139# The three unicode encodings understood by SQLite.
140set encodings [list UTF-8 UTF-16le UTF-16be]
141
142set sqlite_os_trace 0
143set i 1
144foreach enc $encodings {
145 file delete -force test.db
146 sqlite3 db test.db
147 db eval "PRAGMA encoding = \"$enc\""
148 execsql $dbcontents
149 do_test enc2-$i.0.1 {
150 db eval {PRAGMA encoding}
151 } $enc
152 do_test enc2-$i.0.2 {
153 db eval {PRAGMA encoding=UTF8}
154 db eval {PRAGMA encoding}
155 } $enc
156 do_test enc2-$i.0.3 {
157 db eval {PRAGMA encoding=UTF16le}
158 db eval {PRAGMA encoding}
159 } $enc
160 do_test enc2-$i.0.4 {
161 db eval {PRAGMA encoding=UTF16be}
162 db eval {PRAGMA encoding}
163 } $enc
164
165 db close
166 run_test_script enc2-$i $enc
167 db close
168 incr i
169}
170
171# Test that it is an error to try to attach a database with a different
172# encoding to the main database.
173do_test enc2-4.1 {
174 file delete -force test.db
175 sqlite3 db test.db
176 db eval "PRAGMA encoding = 'UTF-8'"
177 db eval "CREATE TABLE abc(a, b, c);"
178} {}
179do_test enc2-4.2 {
180 file delete -force test2.db
181 sqlite3 db2 test2.db
182 db2 eval "PRAGMA encoding = 'UTF-16'"
183 db2 eval "CREATE TABLE abc(a, b, c);"
184} {}
185do_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
191db2 close
192db close
193
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]
204 # puts "enc=$enc lhs=$lhs/$l rhs=$rhs/$r res=$res"
205 return $res
206}
207
208file delete -force test.db
209sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
210do_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
222 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate;}]
223 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}
230do_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
236db close
237file delete -force test.db
238sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
239execsql {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}
260do_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
266db close
267file delete -force test.db
268sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
269execsql {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}
290do_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}
295
296# Also test that a UTF-16 collation factory works.
297do_test enc2-5-12 {
298 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
305 set res [execsql {SELECT * FROM t5 ORDER BY 1 COLLATE test_collate; }]
306 lappend res $::test_collate_enc
307} {one two three four five UTF-16BE}
308do_test enc2-5.14 {
309 set ::sqlite_last_needed_collation
310} test_collate
311
312db close
313file delete -force test.db
314
315do_test enc2-5.15 {
316 sqlite3 db test.db; set ::DB [sqlite3_connection_pointer db]
317 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
327# The following tests - enc2-6.* - test that SQLite selects the correct
328# user function when more than one is available.
329
330proc test_function {enc arg} {
331 return "$enc $arg"
332}
333
334db close
335file delete -force test.db
336sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
337execsql {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}}
350db close
351sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
352do_test enc2-6.2 {
353 add_test_function $DB 0 1 0
354 execsql {
355 SELECT test_function('sqlite')
356 }
357} {{UTF-16LE sqlite}}
358db close
359sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
360do_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
367db close
368file delete -force test.db
369sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
370execsql {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}}
383db close
384sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
385do_test enc2-6.5 {
386 add_test_function $DB 0 1 0
387 execsql {
388 SELECT test_function('sqlite')
389 }
390} {{UTF-16LE sqlite}}
391db close
392sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
393do_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
400db close
401file delete -force test.db
402sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
403execsql {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}}
416db close
417sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
418do_test enc2-6.9 {
419 add_test_function $DB 0 1 0
420 execsql {
421 SELECT test_function('sqlite')
422 }
423} {{UTF-16LE sqlite}}
424db close
425sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
426do_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
433
434db close
435file delete -force test.db
436
437# The following tests - enc2-7.* - function as follows:
438#
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#
445do_test enc2-7.1 {
446 sqlite3 db test.db
447 execsql {
448 PRAGMA encoding = 'UTF-16';
449 SELECT * FROM sqlite_master;
450 }
451} {}
452do_test enc2-7.2 {
453 set enc [execsql {
454 PRAGMA encoding;
455 }]
456 string range $enc 0 end-2 ;# Chop off the "le" or "be"
457} {UTF-16}
458do_test enc2-7.3 {
459 sqlite3 db2 test.db
460 execsql {
461 PRAGMA encoding = 'UTF-8';
462 CREATE TABLE abc(a, b, c);
463 } db2
464} {}
465do_test enc2-7.4 {
466 execsql {
467 SELECT * FROM sqlite_master;
468 }
469} "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}"
470do_test enc2-7.5 {
471 execsql {
472 PRAGMA encoding;
473 }
474} {UTF-8}
475
476db close
477db2 close
478
479proc utf16 {utf8} {
480 set utf16 [encoding convertto unicode $utf8]
481 append utf16 "\x00\x00"
482 return $utf16
483}
484ifcapable {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}
492
493# Test that the encoding of an empty database may still be set after the
494# (empty) schema has been initialized.
495file delete -force test.db
496do_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
534# Ticket #1987.
535# Disallow encoding changes once the encoding has been set.
536#
537do_test enc2-10.1 {
538 db close
539 file delete -force test.db test.db-journal
540 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
554finish_test