|
1 # |
|
2 # 2007 November 12 |
|
3 # |
|
4 # The author disclaims copyright to this source code. In place of |
|
5 # a legal notice, here is a blessing: |
|
6 # |
|
7 # May you do good and not evil. |
|
8 # May you find forgiveness for yourself and forgive others. |
|
9 # May you share freely, never taking more than you give. |
|
10 # |
|
11 #*********************************************************************** |
|
12 # This file implements regression tests for SQLite library. The |
|
13 # focus of this script is making sure that the names of collation |
|
14 # sequences may be quoted using double quotes in SQL statements. |
|
15 # |
|
16 # $Id: collate9.test,v 1.2 2008/07/10 00:32:42 drh Exp $ |
|
17 |
|
18 set testdir [file dirname $argv0] |
|
19 source $testdir/tester.tcl |
|
20 |
|
21 proc reverse_sort {lhs rhs} { |
|
22 return [string compare $rhs $lhs] |
|
23 } |
|
24 db collate "reverse sort" reverse_sort |
|
25 |
|
26 # This procedure executes the SQL. Then it checks to see if the OP_Sort |
|
27 # opcode was executed. If an OP_Sort did occur, then "sort" is appended |
|
28 # to the result. If no OP_Sort happened, then "nosort" is appended. |
|
29 # |
|
30 # This procedure is used to check to make sure sorting is or is not |
|
31 # occurring as expected. |
|
32 # |
|
33 proc cksort {sql} { |
|
34 set ::sqlite_sort_count 0 |
|
35 set data [execsql $sql] |
|
36 if {$::sqlite_sort_count} {set x sort} {set x nosort} |
|
37 lappend data $x |
|
38 return $data |
|
39 } |
|
40 |
|
41 # Test plan: |
|
42 # |
|
43 # collate9-1.* - Test collation sequences attached to table columns |
|
44 # collate9-2.* - Test collation sequences attached to expressions |
|
45 # collate9-3.* - Test collation sequences attached to an index |
|
46 # collate9-4.* - Test collation sequences as an argument to REINDEX |
|
47 # |
|
48 |
|
49 do_test collate9-1.1 { |
|
50 execsql { |
|
51 CREATE TABLE xy(x COLLATE "reverse sort", y COLLATE binary); |
|
52 INSERT INTO xy VALUES('one', 'one'); |
|
53 INSERT INTO xy VALUES('two', 'two'); |
|
54 INSERT INTO xy VALUES('three', 'three'); |
|
55 } |
|
56 } {} |
|
57 do_test collate9-1.2 { |
|
58 execsql { |
|
59 SELECT x FROM xy ORDER BY x |
|
60 } |
|
61 } {two three one} |
|
62 do_test collate9-1.3 { |
|
63 execsql { |
|
64 SELECT y FROM xy ORDER BY y |
|
65 } |
|
66 } {one three two} |
|
67 do_test collate9-1.4 { |
|
68 cksort { |
|
69 SELECT x FROM xy ORDER BY x |
|
70 } |
|
71 } {two three one sort} |
|
72 do_test collate9-1.5 { |
|
73 execsql { |
|
74 CREATE INDEX xy_i ON xy(x) |
|
75 } |
|
76 } {} |
|
77 do_test collate9-1.6 { |
|
78 cksort { |
|
79 SELECT x FROM xy ORDER BY x |
|
80 } |
|
81 } {two three one nosort} |
|
82 |
|
83 do_test collate9-2.1 { |
|
84 execsql { |
|
85 SELECT x, x < 'seven' FROM xy ORDER BY x |
|
86 } |
|
87 } {two 1 three 1 one 0} |
|
88 do_test collate9-2.2 { |
|
89 execsql { |
|
90 SELECT y, y < 'seven' FROM xy ORDER BY x |
|
91 } |
|
92 } {two 0 three 0 one 1} |
|
93 do_test collate9-2.3 { |
|
94 execsql { |
|
95 SELECT y, y COLLATE "reverse sort" < 'seven' FROM xy ORDER BY x |
|
96 } |
|
97 } {two 1 three 1 one 0} |
|
98 do_test collate9-2.4 { |
|
99 execsql { |
|
100 SELECT y FROM xy ORDER BY y |
|
101 } |
|
102 } {one three two} |
|
103 do_test collate9-2.5 { |
|
104 execsql { |
|
105 SELECT y FROM xy ORDER BY y COLLATE "reverse sort" |
|
106 } |
|
107 } {two three one} |
|
108 do_test collate9-2.6 { |
|
109 execsql { |
|
110 SELECT y COLLATE "reverse sort" AS aaa FROM xy ORDER BY aaa |
|
111 } |
|
112 } {two three one} |
|
113 |
|
114 do_test collate9-3.1 { |
|
115 execsql { |
|
116 CREATE INDEX xy_i2 ON xy(y COLLATE "reverse sort"); |
|
117 } |
|
118 } {} |
|
119 do_test collate9-3.2 { |
|
120 cksort { |
|
121 SELECT y FROM xy ORDER BY y |
|
122 } |
|
123 } {one three two sort} |
|
124 do_test collate9-3.3 { |
|
125 cksort { |
|
126 SELECT y FROM xy ORDER BY y COLLATE "reverse sort" |
|
127 } |
|
128 } {two three one nosort} |
|
129 do_test collate9-3.4 { |
|
130 cksort { |
|
131 SELECT y AS aaa FROM xy ORDER BY aaa |
|
132 } |
|
133 } {one three two sort} |
|
134 do_test collate9-3.5 { |
|
135 cksort { |
|
136 SELECT y COLLATE "reverse sort" AS aaa FROM xy ORDER BY aaa |
|
137 } |
|
138 } {two three one nosort} |
|
139 |
|
140 ifcapable reindex { |
|
141 do_test collate9-4.1 { |
|
142 execsql { |
|
143 REINDEX "reverse sort" |
|
144 } |
|
145 } {} |
|
146 |
|
147 # Modify the "reverse sort" collation so that it now sorts in the same |
|
148 # order as binary. |
|
149 proc reverse_sort {lhs rhs} { |
|
150 return [string compare $lhs $rhs] |
|
151 } |
|
152 |
|
153 # The integrity check should now fail because the indexes created using |
|
154 # "reverse sort" are no longer in sync with the collation sequence |
|
155 # implementation. |
|
156 do_test collate9-4.2 { |
|
157 expr {"ok" eq [execsql { PRAGMA integrity_check }]} |
|
158 } {0} |
|
159 |
|
160 do_test collate9-4.3 { |
|
161 execsql { |
|
162 REINDEX "reverse sort" |
|
163 } |
|
164 } {} |
|
165 |
|
166 # Integrity check should now pass. |
|
167 do_test collate9-4.4 { |
|
168 expr {"ok" eq [execsql { PRAGMA integrity_check }]} |
|
169 } {1} |
|
170 |
|
171 do_test collate9-4.5 { |
|
172 cksort { |
|
173 SELECT x FROM xy ORDER BY x COLLATE "reverse sort" |
|
174 } |
|
175 } {one three two nosort} |
|
176 } |
|
177 |
|
178 finish_test |