aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/sqlite/unix/sqlite-3.5.1/test/collate3.test
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/sqlite/unix/sqlite-3.5.1/test/collate3.test')
-rw-r--r--libraries/sqlite/unix/sqlite-3.5.1/test/collate3.test429
1 files changed, 429 insertions, 0 deletions
diff --git a/libraries/sqlite/unix/sqlite-3.5.1/test/collate3.test b/libraries/sqlite/unix/sqlite-3.5.1/test/collate3.test
new file mode 100644
index 0000000..ad52782
--- /dev/null
+++ b/libraries/sqlite/unix/sqlite-3.5.1/test/collate3.test
@@ -0,0 +1,429 @@
1# 2001 September 15
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
12# focus of this script is page cache subsystem.
13#
14# $Id: collate3.test,v 1.11 2005/09/08 01:58:43 drh Exp $
15
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
19#
20# Tests are organised as follows:
21#
22# collate3.1.* - Errors related to unknown collation sequences.
23# collate3.2.* - Errors related to undefined collation sequences.
24# collate3.3.* - Writing to a table that has an index with an undefined c.s.
25# collate3.4.* - Misc errors.
26# collate3.5.* - Collation factory.
27#
28
29#
30# These tests ensure that when a user executes a statement with an
31# unknown collation sequence an error is returned.
32#
33do_test collate3-1.0 {
34 execsql {
35 CREATE TABLE collate3t1(c1);
36 }
37} {}
38do_test collate3-1.1 {
39 catchsql {
40 SELECT * FROM collate3t1 ORDER BY 1 collate garbage;
41 }
42} {1 {no such collation sequence: garbage}}
43do_test collate3-1.2 {
44 catchsql {
45 CREATE TABLE collate3t2(c1 collate garbage);
46 }
47} {1 {no such collation sequence: garbage}}
48do_test collate3-1.3 {
49 catchsql {
50 CREATE INDEX collate3i1 ON collate3t1(c1 COLLATE garbage);
51 }
52} {1 {no such collation sequence: garbage}}
53
54execsql {
55 DROP TABLE collate3t1;
56}
57
58#
59# Create a table with a default collation sequence, then close
60# and re-open the database without re-registering the collation
61# sequence. Then make sure the library stops us from using
62# the collation sequence in:
63# * an explicitly collated ORDER BY
64# * an ORDER BY that uses the default collation sequence
65# * an expression (=)
66# * a CREATE TABLE statement
67# * a CREATE INDEX statement that uses a default collation sequence
68# * a GROUP BY that uses the default collation sequence
69# * a SELECT DISTINCT that uses the default collation sequence
70# * Compound SELECTs that uses the default collation sequence
71# * An ORDER BY on a compound SELECT with an explicit ORDER BY.
72#
73do_test collate3-2.0 {
74 db collate string_compare {string compare}
75 execsql {
76 CREATE TABLE collate3t1(c1 COLLATE string_compare, c2);
77 }
78 db close
79 sqlite3 db test.db
80 expr 0
81} 0
82do_test collate3-2.1 {
83 catchsql {
84 SELECT * FROM collate3t1 ORDER BY 1 COLLATE string_compare;
85 }
86} {1 {no such collation sequence: string_compare}}
87do_test collate3-2.2 {
88 catchsql {
89 SELECT * FROM collate3t1 ORDER BY c1;
90 }
91} {1 {no such collation sequence: string_compare}}
92do_test collate3-2.3 {
93 catchsql {
94 SELECT * FROM collate3t1 WHERE c1 = 'xxx';
95 }
96} {1 {no such collation sequence: string_compare}}
97do_test collate3-2.4 {
98 catchsql {
99 CREATE TABLE collate3t2(c1 COLLATE string_compare);
100 }
101} {1 {no such collation sequence: string_compare}}
102do_test collate3-2.5 {
103 catchsql {
104 CREATE INDEX collate3t1_i1 ON collate3t1(c1);
105 }
106} {1 {no such collation sequence: string_compare}}
107do_test collate3-2.6 {
108 catchsql {
109 SELECT * FROM collate3t1;
110 }
111} {0 {}}
112do_test collate3-2.7.1 {
113 catchsql {
114 SELECT count(*) FROM collate3t1 GROUP BY c1;
115 }
116} {1 {no such collation sequence: string_compare}}
117# do_test collate3-2.7.2 {
118# catchsql {
119# SELECT * FROM collate3t1 GROUP BY c1;
120# }
121# } {1 {GROUP BY may only be used on aggregate queries}}
122do_test collate3-2.7.2 {
123 catchsql {
124 SELECT * FROM collate3t1 GROUP BY c1;
125 }
126} {1 {no such collation sequence: string_compare}}
127do_test collate3-2.8 {
128 catchsql {
129 SELECT DISTINCT c1 FROM collate3t1;
130 }
131} {1 {no such collation sequence: string_compare}}
132
133ifcapable compound {
134 do_test collate3-2.9 {
135 catchsql {
136 SELECT c1 FROM collate3t1 UNION SELECT c1 FROM collate3t1;
137 }
138 } {1 {no such collation sequence: string_compare}}
139 do_test collate3-2.10 {
140 catchsql {
141 SELECT c1 FROM collate3t1 EXCEPT SELECT c1 FROM collate3t1;
142 }
143 } {1 {no such collation sequence: string_compare}}
144 do_test collate3-2.11 {
145 catchsql {
146 SELECT c1 FROM collate3t1 INTERSECT SELECT c1 FROM collate3t1;
147 }
148 } {1 {no such collation sequence: string_compare}}
149 do_test collate3-2.12 {
150 catchsql {
151 SELECT c1 FROM collate3t1 UNION ALL SELECT c1 FROM collate3t1;
152 }
153 } {0 {}}
154 do_test collate3-2.13 {
155btree_breakpoint
156 catchsql {
157 SELECT 10 UNION ALL SELECT 20 ORDER BY 1 COLLATE string_compare;
158 }
159 } {1 {no such collation sequence: string_compare}}
160 do_test collate3-2.14 {
161 catchsql {
162 SELECT 10 INTERSECT SELECT 20 ORDER BY 1 COLLATE string_compare;
163 }
164 } {1 {no such collation sequence: string_compare}}
165 do_test collate3-2.15 {
166 catchsql {
167 SELECT 10 EXCEPT SELECT 20 ORDER BY 1 COLLATE string_compare;
168 }
169 } {1 {no such collation sequence: string_compare}}
170 do_test collate3-2.16 {
171 catchsql {
172 SELECT 10 UNION SELECT 20 ORDER BY 1 COLLATE string_compare;
173 }
174 } {1 {no such collation sequence: string_compare}}
175 do_test collate3-2.17 {
176 catchsql {
177 SELECT c1 FROM collate3t1 UNION ALL SELECT c1 FROM collate3t1 ORDER BY 1;
178 }
179 } {1 {no such collation sequence: string_compare}}
180} ;# ifcapable compound
181
182#
183# Create an index that uses a collation sequence then close and
184# re-open the database without re-registering the collation
185# sequence. Then check that for the table with the index
186# * An INSERT fails,
187# * An UPDATE on the column with the index fails,
188# * An UPDATE on a different column succeeds.
189# * A DELETE with a WHERE clause fails
190# * A DELETE without a WHERE clause succeeds
191#
192# Also, ensure that the restrictions tested by collate3-2.* still
193# apply after the index has been created.
194#
195do_test collate3-3.0 {
196 db collate string_compare {string compare}
197 execsql {
198 CREATE INDEX collate3t1_i1 ON collate3t1(c1);
199 INSERT INTO collate3t1 VALUES('xxx', 'yyy');
200 }
201 db close
202 sqlite3 db test.db
203 expr 0
204} 0
205db eval {select * from collate3t1}
206do_test collate3-3.1 {
207 catchsql {
208 INSERT INTO collate3t1 VALUES('xxx', 0);
209 }
210} {1 {no such collation sequence: string_compare}}
211do_test collate3-3.2 {
212 catchsql {
213 UPDATE collate3t1 SET c1 = 'xxx';
214 }
215} {1 {no such collation sequence: string_compare}}
216do_test collate3-3.3 {
217 catchsql {
218 UPDATE collate3t1 SET c2 = 'xxx';
219 }
220} {0 {}}
221do_test collate3-3.4 {
222 catchsql {
223 DELETE FROM collate3t1 WHERE 1;
224 }
225} {1 {no such collation sequence: string_compare}}
226do_test collate3-3.5 {
227 catchsql {
228 SELECT * FROM collate3t1;
229 }
230} {0 {xxx xxx}}
231do_test collate3-3.6 {
232 catchsql {
233 DELETE FROM collate3t1;
234 }
235} {0 {}}
236ifcapable {integrityck} {
237 do_test collate3-3.8 {
238 catchsql {
239 PRAGMA integrity_check
240 }
241 } {1 {no such collation sequence: string_compare}}
242}
243do_test collate3-3.9 {
244 catchsql {
245 SELECT * FROM collate3t1;
246 }
247} {0 {}}
248do_test collate3-3.10 {
249 catchsql {
250 SELECT * FROM collate3t1 ORDER BY 1 COLLATE string_compare;
251 }
252} {1 {no such collation sequence: string_compare}}
253do_test collate3-3.11 {
254 catchsql {
255 SELECT * FROM collate3t1 ORDER BY c1;
256 }
257} {1 {no such collation sequence: string_compare}}
258do_test collate3-3.12 {
259 catchsql {
260 SELECT * FROM collate3t1 WHERE c1 = 'xxx';
261 }
262} {1 {no such collation sequence: string_compare}}
263do_test collate3-3.13 {
264 catchsql {
265 CREATE TABLE collate3t2(c1 COLLATE string_compare);
266 }
267} {1 {no such collation sequence: string_compare}}
268do_test collate3-3.14 {
269 catchsql {
270 CREATE INDEX collate3t1_i2 ON collate3t1(c1);
271 }
272} {1 {no such collation sequence: string_compare}}
273do_test collate3-3.15 {
274 execsql {
275 DROP TABLE collate3t1;
276 }
277} {}
278
279# Check we can create an index that uses an explicit collation
280# sequence and then close and re-open the database.
281do_test collate3-4.6 {
282 db collate user_defined "string compare"
283 execsql {
284 CREATE TABLE collate3t1(a, b);
285 INSERT INTO collate3t1 VALUES('hello', NULL);
286 CREATE INDEX collate3i1 ON collate3t1(a COLLATE user_defined);
287 }
288} {}
289do_test collate3-4.7 {
290 db close
291 sqlite3 db test.db
292 catchsql {
293 SELECT * FROM collate3t1 ORDER BY a COLLATE user_defined;
294 }
295} {1 {no such collation sequence: user_defined}}
296do_test collate3-4.8 {
297 db collate user_defined "string compare"
298 catchsql {
299 SELECT * FROM collate3t1 ORDER BY a COLLATE user_defined;
300 }
301} {0 {hello {}}}
302do_test collate3-4.8 {
303 db close
304 lindex [catch {
305 sqlite3 db test.db
306 }] 0
307} {0}
308do_test collate3-4.8 {
309 execsql {
310 DROP TABLE collate3t1;
311 }
312} {}
313
314# Compare strings as numbers.
315proc numeric_compare {lhs rhs} {
316 if {$rhs > $lhs} {
317 set res -1
318 } else {
319 set res [expr ($lhs > $rhs)?1:0]
320 }
321 return $res
322}
323
324# Check we can create a view that uses an explicit collation
325# sequence and then close and re-open the database.
326ifcapable view {
327do_test collate3-4.9 {
328 db collate user_defined numeric_compare
329 execsql {
330 CREATE TABLE collate3t1(a, b);
331 INSERT INTO collate3t1 VALUES('2', NULL);
332 INSERT INTO collate3t1 VALUES('101', NULL);
333 INSERT INTO collate3t1 VALUES('12', NULL);
334 CREATE VIEW collate3v1 AS SELECT * FROM collate3t1
335 ORDER BY 1 COLLATE user_defined;
336 SELECT * FROM collate3v1;
337 }
338} {2 {} 12 {} 101 {}}
339do_test collate3-4.10 {
340 db close
341 sqlite3 db test.db
342 catchsql {
343 SELECT * FROM collate3v1;
344 }
345} {1 {no such collation sequence: user_defined}}
346do_test collate3-4.11 {
347 db collate user_defined numeric_compare
348 catchsql {
349 SELECT * FROM collate3v1;
350 }
351} {0 {2 {} 12 {} 101 {}}}
352do_test collate3-4.12 {
353 execsql {
354 DROP TABLE collate3t1;
355 }
356} {}
357} ;# ifcapable view
358
359#
360# Test the collation factory. In the code, the "no such collation sequence"
361# message is only generated in two places. So these tests just test that
362# the collation factory can be called once from each of those points.
363#
364do_test collate3-5.0 {
365 catchsql {
366 CREATE TABLE collate3t1(a);
367 INSERT INTO collate3t1 VALUES(10);
368 SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
369 }
370} {1 {no such collation sequence: unk}}
371do_test collate3-5.1 {
372 set ::cfact_cnt 0
373 proc cfact {nm} {
374 db collate $nm {string compare}
375 incr ::cfact_cnt
376 }
377 db collation_needed cfact
378} {}
379do_test collate3-5.2 {
380 catchsql {
381 SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
382 }
383} {0 10}
384do_test collate3-5.3 {
385 set ::cfact_cnt
386} {1}
387do_test collate3-5.4 {
388 catchsql {
389 SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
390 }
391} {0 10}
392do_test collate3-5.5 {
393 set ::cfact_cnt
394} {1}
395do_test collate3-5.6 {
396 catchsql {
397 SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
398 }
399} {0 10}
400do_test collate3-5.7 {
401 execsql {
402 DROP TABLE collate3t1;
403 CREATE TABLE collate3t1(a COLLATE unk);
404 }
405 db close
406 sqlite3 db test.db
407 catchsql {
408 SELECT a FROM collate3t1 ORDER BY 1;
409 }
410} {1 {no such collation sequence: unk}}
411do_test collate3-5.8 {
412 set ::cfact_cnt 0
413 proc cfact {nm} {
414 db collate $nm {string compare}
415 incr ::cfact_cnt
416 }
417 db collation_needed cfact
418 catchsql {
419 SELECT a FROM collate3t1 ORDER BY 1;
420 }
421} {0 {}}
422
423do_test collate3-5.9 {
424 execsql {
425 DROP TABLE collate3t1;
426 }
427} {}
428
429finish_test