1: # 2006 February 16
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: #
12: # This file contains code to verify that the SQLITE_UTF16_ALIGNED
13: # flag passed into the sqlite3_create_collation() function insures
14: # that all strings passed to that function are aligned on an even
15: # byte boundary.
16: #
17: # $Id: utf16align.test,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $
18:
19: set testdir [file dirname $argv0]
20: source $testdir/tester.tcl
21:
22: # Skip this entire test if we do not support UTF16
23: #
24: ifcapable !utf16 {
25: finish_test
26: return
27: }
28:
29: # Create a database with a UTF16 encoding. Put in lots of string
30: # data of varying lengths.
31: #
32: do_test utf16align-1.0 {
33: set unaligned_string_counter 0
34: add_alignment_test_collations [sqlite3_connection_pointer db]
35: execsql {
36: PRAGMA encoding=UTF16;
37: CREATE TABLE t1(
38: id INTEGER PRIMARY KEY,
39: spacer TEXT,
40: a TEXT COLLATE utf16_aligned,
41: b TEXT COLLATE utf16_unaligned
42: );
43: INSERT INTO t1(a) VALUES("abc");
44: INSERT INTO t1(a) VALUES("defghi");
45: INSERT INTO t1(a) VALUES("jklmnopqrstuv");
46: INSERT INTO t1(a) VALUES("wxyz0123456789-");
47: UPDATE t1 SET b=a||'-'||a;
48: INSERT INTO t1(a,b) SELECT a||b, b||a FROM t1;
49: INSERT INTO t1(a,b) SELECT a||b, b||a FROM t1;
50: INSERT INTO t1(a,b) SELECT a||b, b||a FROM t1;
51: INSERT INTO t1(a,b) VALUES('one','two');
52: INSERT INTO t1(a,b) SELECT a, b FROM t1;
53: UPDATE t1 SET spacer = CASE WHEN rowid&1 THEN 'x' ELSE 'xx' END;
54: SELECT count(*) FROM t1;
55: }
56: } 66
57: do_test utf16align-1.1 {
58: set unaligned_string_counter
59: } 0
60:
61: # Creating an index that uses the unaligned collation. We should see
62: # some unaligned strings passed to the collating function.
63: #
64: do_test utf16align-1.2 {
65: execsql {
66: CREATE INDEX t1i1 ON t1(spacer, b);
67: }
68: # puts $unaligned_string_counter
69: expr {$unaligned_string_counter>0}
70: } 1
71:
72: # Create another index that uses the aligned collation. This time
73: # there should be no unaligned accesses
74: #
75: do_test utf16align-1.3 {
76: set unaligned_string_counter 0
77: execsql {
78: CREATE INDEX t1i2 ON t1(spacer, a);
79: }
80: expr {$unaligned_string_counter>0}
81: } 0
82: integrity_check utf16align-1.4
83:
84: # ticket #3482
85: #
86: db close
87: sqlite3 db :memory:
88: do_test utf16align-2.1 {
89: db eval {
90: PRAGMA encoding=UTF16be;
91: SELECT hex(ltrim(x'6efcda'));
92: }
93: } {6EFC}
94:
95: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>