OLD | NEW |
| (Empty) |
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 # | |
12 # This file implements regression tests for SQLite library. The | |
13 # focus of this file is testing the sorter (code in vdbesort.c). | |
14 # | |
15 | |
16 set testdir [file dirname $argv0] | |
17 source $testdir/tester.tcl | |
18 set testprefix sort | |
19 db close | |
20 sqlite3_shutdown | |
21 sqlite3_config_pmasz 10 | |
22 sqlite3_initialize | |
23 sqlite3 db test.db | |
24 | |
25 # Create a bunch of data to sort against | |
26 # | |
27 do_test sort-1.0 { | |
28 execsql { | |
29 CREATE TABLE t1( | |
30 n int, | |
31 v varchar(10), | |
32 log int, | |
33 roman varchar(10), | |
34 flt real | |
35 ); | |
36 INSERT INTO t1 VALUES(1,'one',0,'I',3.141592653); | |
37 INSERT INTO t1 VALUES(2,'two',1,'II',2.15); | |
38 INSERT INTO t1 VALUES(3,'three',1,'III',4221.0); | |
39 INSERT INTO t1 VALUES(4,'four',2,'IV',-0.0013442); | |
40 INSERT INTO t1 VALUES(5,'five',2,'V',-11); | |
41 INSERT INTO t1 VALUES(6,'six',2,'VI',0.123); | |
42 INSERT INTO t1 VALUES(7,'seven',2,'VII',123.0); | |
43 INSERT INTO t1 VALUES(8,'eight',3,'VIII',-1.6); | |
44 } | |
45 execsql {SELECT count(*) FROM t1} | |
46 } {8} | |
47 | |
48 do_test sort-1.1 { | |
49 execsql {SELECT n FROM t1 ORDER BY n} | |
50 } {1 2 3 4 5 6 7 8} | |
51 do_test sort-1.1.1 { | |
52 execsql {SELECT n FROM t1 ORDER BY n ASC} | |
53 } {1 2 3 4 5 6 7 8} | |
54 do_test sort-1.1.1 { | |
55 execsql {SELECT ALL n FROM t1 ORDER BY n ASC} | |
56 } {1 2 3 4 5 6 7 8} | |
57 do_test sort-1.2 { | |
58 execsql {SELECT n FROM t1 ORDER BY n DESC} | |
59 } {8 7 6 5 4 3 2 1} | |
60 do_test sort-1.3a { | |
61 execsql {SELECT v FROM t1 ORDER BY v} | |
62 } {eight five four one seven six three two} | |
63 do_test sort-1.3b { | |
64 execsql {SELECT n FROM t1 ORDER BY v} | |
65 } {8 5 4 1 7 6 3 2} | |
66 do_test sort-1.4 { | |
67 execsql {SELECT n FROM t1 ORDER BY v DESC} | |
68 } {2 3 6 7 1 4 5 8} | |
69 do_test sort-1.5 { | |
70 execsql {SELECT flt FROM t1 ORDER BY flt} | |
71 } {-11.0 -1.6 -0.0013442 0.123 2.15 3.141592653 123.0 4221.0} | |
72 do_test sort-1.6 { | |
73 execsql {SELECT flt FROM t1 ORDER BY flt DESC} | |
74 } {4221.0 123.0 3.141592653 2.15 0.123 -0.0013442 -1.6 -11.0} | |
75 do_test sort-1.7 { | |
76 execsql {SELECT roman FROM t1 ORDER BY roman} | |
77 } {I II III IV V VI VII VIII} | |
78 do_test sort-1.8 { | |
79 execsql {SELECT n FROM t1 ORDER BY log, flt} | |
80 } {1 2 3 5 4 6 7 8} | |
81 do_test sort-1.8.1 { | |
82 execsql {SELECT n FROM t1 ORDER BY log asc, flt} | |
83 } {1 2 3 5 4 6 7 8} | |
84 do_test sort-1.8.2 { | |
85 execsql {SELECT n FROM t1 ORDER BY log, flt ASC} | |
86 } {1 2 3 5 4 6 7 8} | |
87 do_test sort-1.8.3 { | |
88 execsql {SELECT n FROM t1 ORDER BY log ASC, flt asc} | |
89 } {1 2 3 5 4 6 7 8} | |
90 do_test sort-1.9 { | |
91 execsql {SELECT n FROM t1 ORDER BY log, flt DESC} | |
92 } {1 3 2 7 6 4 5 8} | |
93 do_test sort-1.9.1 { | |
94 execsql {SELECT n FROM t1 ORDER BY log ASC, flt DESC} | |
95 } {1 3 2 7 6 4 5 8} | |
96 do_test sort-1.10 { | |
97 execsql {SELECT n FROM t1 ORDER BY log DESC, flt} | |
98 } {8 5 4 6 7 2 3 1} | |
99 do_test sort-1.11 { | |
100 execsql {SELECT n FROM t1 ORDER BY log DESC, flt DESC} | |
101 } {8 7 6 4 5 3 2 1} | |
102 | |
103 # These tests are designed to reach some hard-to-reach places | |
104 # inside the string comparison routines. | |
105 # | |
106 # (Later) The sorting behavior changed in 2.7.0. But we will | |
107 # keep these tests. You can never have too many test cases! | |
108 # | |
109 do_test sort-2.1.1 { | |
110 execsql { | |
111 UPDATE t1 SET v='x' || -flt; | |
112 UPDATE t1 SET v='x-2b' where v=='x-0.123'; | |
113 SELECT v FROM t1 ORDER BY v; | |
114 } | |
115 } {x-123.0 x-2.15 x-2b x-3.141592653 x-4221.0 x0.0013442 x1.6 x11.0} | |
116 do_test sort-2.1.2 { | |
117 execsql { | |
118 SELECT v FROM t1 ORDER BY substr(v,2,999); | |
119 } | |
120 } {x-123.0 x-2.15 x-2b x-3.141592653 x-4221.0 x0.0013442 x1.6 x11.0} | |
121 do_test sort-2.1.3 { | |
122 execsql { | |
123 SELECT v FROM t1 ORDER BY substr(v,2,999)+0.0; | |
124 } | |
125 } {x-4221.0 x-123.0 x-3.141592653 x-2.15 x-2b x0.0013442 x1.6 x11.0} | |
126 do_test sort-2.1.4 { | |
127 execsql { | |
128 SELECT v FROM t1 ORDER BY substr(v,2,999) DESC; | |
129 } | |
130 } {x11.0 x1.6 x0.0013442 x-4221.0 x-3.141592653 x-2b x-2.15 x-123.0} | |
131 do_test sort-2.1.5 { | |
132 execsql { | |
133 SELECT v FROM t1 ORDER BY substr(v,2,999)+0.0 DESC; | |
134 } | |
135 } {x11.0 x1.6 x0.0013442 x-2b x-2.15 x-3.141592653 x-123.0 x-4221.0} | |
136 | |
137 # This is a bug fix for 2.2.4. | |
138 # Strings are normally mapped to upper-case for a caseless comparison. | |
139 # But this can cause problems for characters in between 'Z' and 'a'. | |
140 # | |
141 do_test sort-3.1 { | |
142 execsql { | |
143 CREATE TABLE t2(a,b); | |
144 INSERT INTO t2 VALUES('AGLIENTU',1); | |
145 INSERT INTO t2 VALUES('AGLIE`',2); | |
146 INSERT INTO t2 VALUES('AGNA',3); | |
147 SELECT a, b FROM t2 ORDER BY a; | |
148 } | |
149 } {AGLIENTU 1 AGLIE` 2 AGNA 3} | |
150 do_test sort-3.2 { | |
151 execsql { | |
152 SELECT a, b FROM t2 ORDER BY a DESC; | |
153 } | |
154 } {AGNA 3 AGLIE` 2 AGLIENTU 1} | |
155 do_test sort-3.3 { | |
156 execsql { | |
157 DELETE FROM t2; | |
158 INSERT INTO t2 VALUES('aglientu',1); | |
159 INSERT INTO t2 VALUES('aglie`',2); | |
160 INSERT INTO t2 VALUES('agna',3); | |
161 SELECT a, b FROM t2 ORDER BY a; | |
162 } | |
163 } {aglie` 2 aglientu 1 agna 3} | |
164 do_test sort-3.4 { | |
165 execsql { | |
166 SELECT a, b FROM t2 ORDER BY a DESC; | |
167 } | |
168 } {agna 3 aglientu 1 aglie` 2} | |
169 | |
170 # Version 2.7.0 testing. | |
171 # | |
172 do_test sort-4.1 { | |
173 execsql { | |
174 INSERT INTO t1 VALUES(9,'x2.7',3,'IX',4.0e5); | |
175 INSERT INTO t1 VALUES(10,'x5.0e10',3,'X',-4.0e5); | |
176 INSERT INTO t1 VALUES(11,'x-4.0e9',3,'XI',4.1e4); | |
177 INSERT INTO t1 VALUES(12,'x01234567890123456789',3,'XII',-4.2e3); | |
178 SELECT n FROM t1 ORDER BY n; | |
179 } | |
180 } {1 2 3 4 5 6 7 8 9 10 11 12} | |
181 do_test sort-4.2 { | |
182 execsql { | |
183 SELECT n||'' FROM t1 ORDER BY 1; | |
184 } | |
185 } {1 10 11 12 2 3 4 5 6 7 8 9} | |
186 do_test sort-4.3 { | |
187 execsql { | |
188 SELECT n+0 FROM t1 ORDER BY 1; | |
189 } | |
190 } {1 2 3 4 5 6 7 8 9 10 11 12} | |
191 do_test sort-4.4 { | |
192 execsql { | |
193 SELECT n||'' FROM t1 ORDER BY 1 DESC; | |
194 } | |
195 } {9 8 7 6 5 4 3 2 12 11 10 1} | |
196 do_test sort-4.5 { | |
197 execsql { | |
198 SELECT n+0 FROM t1 ORDER BY 1 DESC; | |
199 } | |
200 } {12 11 10 9 8 7 6 5 4 3 2 1} | |
201 do_test sort-4.6 { | |
202 execsql { | |
203 SELECT v FROM t1 ORDER BY 1; | |
204 } | |
205 } {x-123.0 x-2.15 x-2b x-3.141592653 x-4.0e9 x-4221.0 x0.0013442 x01234567890123
456789 x1.6 x11.0 x2.7 x5.0e10} | |
206 do_test sort-4.7 { | |
207 execsql { | |
208 SELECT v FROM t1 ORDER BY 1 DESC; | |
209 } | |
210 } {x5.0e10 x2.7 x11.0 x1.6 x01234567890123456789 x0.0013442 x-4221.0 x-4.0e9 x-3
.141592653 x-2b x-2.15 x-123.0} | |
211 do_test sort-4.8 { | |
212 execsql { | |
213 SELECT substr(v,2,99) FROM t1 ORDER BY 1; | |
214 } | |
215 } {-123.0 -2.15 -2b -3.141592653 -4.0e9 -4221.0 0.0013442 01234567890123456789 1
.6 11.0 2.7 5.0e10} | |
216 #do_test sort-4.9 { | |
217 # execsql { | |
218 # SELECT substr(v,2,99)+0.0 FROM t1 ORDER BY 1; | |
219 # } | |
220 #} {-4000000000 -4221 -123 -3.141592653 -2.15 -2 0.0013442 1.6 2.7 11 5000000000
0 1.23456789012346e+18} | |
221 | |
222 do_test sort-5.1 { | |
223 execsql { | |
224 create table t3(a,b); | |
225 insert into t3 values(5,NULL); | |
226 insert into t3 values(6,NULL); | |
227 insert into t3 values(3,NULL); | |
228 insert into t3 values(4,'cd'); | |
229 insert into t3 values(1,'ab'); | |
230 insert into t3 values(2,NULL); | |
231 select a from t3 order by b, a; | |
232 } | |
233 } {2 3 5 6 1 4} | |
234 do_test sort-5.2 { | |
235 execsql { | |
236 select a from t3 order by b, a desc; | |
237 } | |
238 } {6 5 3 2 1 4} | |
239 do_test sort-5.3 { | |
240 execsql { | |
241 select a from t3 order by b desc, a; | |
242 } | |
243 } {4 1 2 3 5 6} | |
244 do_test sort-5.4 { | |
245 execsql { | |
246 select a from t3 order by b desc, a desc; | |
247 } | |
248 } {4 1 6 5 3 2} | |
249 | |
250 do_test sort-6.1 { | |
251 execsql { | |
252 create index i3 on t3(b,a); | |
253 select a from t3 order by b, a; | |
254 } | |
255 } {2 3 5 6 1 4} | |
256 do_test sort-6.2 { | |
257 execsql { | |
258 select a from t3 order by b, a desc; | |
259 } | |
260 } {6 5 3 2 1 4} | |
261 do_test sort-6.3 { | |
262 execsql { | |
263 select a from t3 order by b desc, a; | |
264 } | |
265 } {4 1 2 3 5 6} | |
266 do_test sort-6.4 { | |
267 execsql { | |
268 select a from t3 order by b desc, a desc; | |
269 } | |
270 } {4 1 6 5 3 2} | |
271 | |
272 do_test sort-7.1 { | |
273 execsql { | |
274 CREATE TABLE t4( | |
275 a INTEGER, | |
276 b VARCHAR(30) | |
277 ); | |
278 INSERT INTO t4 VALUES(1,1); | |
279 INSERT INTO t4 VALUES(2,2); | |
280 INSERT INTO t4 VALUES(11,11); | |
281 INSERT INTO t4 VALUES(12,12); | |
282 SELECT a FROM t4 ORDER BY 1; | |
283 } | |
284 } {1 2 11 12} | |
285 do_test sort-7.2 { | |
286 execsql { | |
287 SELECT b FROM t4 ORDER BY 1 | |
288 } | |
289 } {1 11 12 2} | |
290 | |
291 # Omit tests sort-7.3 to sort-7.8 if view support was disabled at | |
292 # compilatation time. | |
293 ifcapable view { | |
294 do_test sort-7.3 { | |
295 execsql { | |
296 CREATE VIEW v4 AS SELECT * FROM t4; | |
297 SELECT a FROM v4 ORDER BY 1; | |
298 } | |
299 } {1 2 11 12} | |
300 do_test sort-7.4 { | |
301 execsql { | |
302 SELECT b FROM v4 ORDER BY 1; | |
303 } | |
304 } {1 11 12 2} | |
305 | |
306 ifcapable compound { | |
307 do_test sort-7.5 { | |
308 execsql { | |
309 SELECT a FROM t4 UNION SELECT a FROM v4 ORDER BY 1; | |
310 } | |
311 } {1 2 11 12} | |
312 do_test sort-7.6 { | |
313 execsql { | |
314 SELECT b FROM t4 UNION SELECT a FROM v4 ORDER BY 1; | |
315 } | |
316 } {1 2 11 12 1 11 12 2} ;# text from t4.b and numeric from v4.a | |
317 do_test sort-7.7 { | |
318 execsql { | |
319 SELECT a FROM t4 UNION SELECT b FROM v4 ORDER BY 1; | |
320 } | |
321 } {1 2 11 12 1 11 12 2} ;# numeric from t4.a and text from v4.b | |
322 do_test sort-7.8 { | |
323 execsql { | |
324 SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1; | |
325 } | |
326 } {1 11 12 2} | |
327 } ;# ifcapable compound | |
328 } ;# ifcapable view | |
329 | |
330 #### Version 3 works differently here: | |
331 #do_test sort-7.9 { | |
332 # execsql { | |
333 # SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1 COLLATE numeric; | |
334 # } | |
335 #} {1 2 11 12} | |
336 #do_test sort-7.10 { | |
337 # execsql { | |
338 # SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1 COLLATE integer; | |
339 # } | |
340 #} {1 2 11 12} | |
341 #do_test sort-7.11 { | |
342 # execsql { | |
343 # SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1 COLLATE text; | |
344 # } | |
345 #} {1 11 12 2} | |
346 #do_test sort-7.12 { | |
347 # execsql { | |
348 # SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1 COLLATE blob; | |
349 # } | |
350 #} {1 11 12 2} | |
351 #do_test sort-7.13 { | |
352 # execsql { | |
353 # SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1 COLLATE clob; | |
354 # } | |
355 #} {1 11 12 2} | |
356 #do_test sort-7.14 { | |
357 # execsql { | |
358 # SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1 COLLATE varchar; | |
359 # } | |
360 #} {1 11 12 2} | |
361 | |
362 # Ticket #297 | |
363 # | |
364 do_test sort-8.1 { | |
365 execsql { | |
366 CREATE TABLE t5(a real, b text); | |
367 INSERT INTO t5 VALUES(100,'A1'); | |
368 INSERT INTO t5 VALUES(100.0,'A2'); | |
369 SELECT * FROM t5 ORDER BY a, b; | |
370 } | |
371 } {100.0 A1 100.0 A2} | |
372 | |
373 | |
374 ifcapable {bloblit} { | |
375 # BLOBs should sort after TEXT | |
376 # | |
377 do_test sort-9.1 { | |
378 execsql { | |
379 CREATE TABLE t6(x, y); | |
380 INSERT INTO t6 VALUES(1,1); | |
381 INSERT INTO t6 VALUES(2,'1'); | |
382 INSERT INTO t6 VALUES(3,x'31'); | |
383 INSERT INTO t6 VALUES(4,NULL); | |
384 SELECT x FROM t6 ORDER BY y; | |
385 } | |
386 } {4 1 2 3} | |
387 do_test sort-9.2 { | |
388 execsql { | |
389 SELECT x FROM t6 ORDER BY y DESC; | |
390 } | |
391 } {3 2 1 4} | |
392 do_test sort-9.3 { | |
393 execsql { | |
394 SELECT x FROM t6 WHERE y<1 | |
395 } | |
396 } {} | |
397 do_test sort-9.4 { | |
398 execsql { | |
399 SELECT x FROM t6 WHERE y<'1' | |
400 } | |
401 } {1} | |
402 do_test sort-9.5 { | |
403 execsql { | |
404 SELECT x FROM t6 WHERE y<x'31' | |
405 } | |
406 } {1 2} | |
407 do_test sort-9.6 { | |
408 execsql { | |
409 SELECT x FROM t6 WHERE y>1 | |
410 } | |
411 } {2 3} | |
412 do_test sort-9.7 { | |
413 execsql { | |
414 SELECT x FROM t6 WHERE y>'1' | |
415 } | |
416 } {3} | |
417 } ;# endif bloblit | |
418 | |
419 # Ticket #1092 - ORDER BY on rowid fields. | |
420 do_test sort-10.1 { | |
421 execsql { | |
422 CREATE TABLE t7(c INTEGER PRIMARY KEY); | |
423 INSERT INTO t7 VALUES(1); | |
424 INSERT INTO t7 VALUES(2); | |
425 INSERT INTO t7 VALUES(3); | |
426 INSERT INTO t7 VALUES(4); | |
427 } | |
428 } {} | |
429 do_test sort-10.2 { | |
430 execsql { | |
431 SELECT c FROM t7 WHERE c<=3 ORDER BY c DESC; | |
432 } | |
433 } {3 2 1} | |
434 do_test sort-10.3 { | |
435 execsql { | |
436 SELECT c FROM t7 WHERE c<3 ORDER BY c DESC; | |
437 } | |
438 } {2 1} | |
439 | |
440 # ticket #1358. Just because one table in a join gives a unique | |
441 # result does not mean they all do. We cannot disable sorting unless | |
442 # all tables in the join give unique results. | |
443 # | |
444 do_test sort-11.1 { | |
445 execsql { | |
446 create table t8(a unique, b, c); | |
447 insert into t8 values(1,2,3); | |
448 insert into t8 values(2,3,4); | |
449 create table t9(x,y); | |
450 insert into t9 values(2,4); | |
451 insert into t9 values(2,3); | |
452 select y from t8, t9 where a=1 order by a, y; | |
453 } | |
454 } {3 4} | |
455 | |
456 # Trouble reported on the mailing list. Check for overly aggressive | |
457 # (which is to say, incorrect) optimization of order-by with a rowid | |
458 # in a join. | |
459 # | |
460 do_test sort-12.1 { | |
461 execsql { | |
462 create table a (id integer primary key); | |
463 create table b (id integer primary key, aId integer, text); | |
464 insert into a values (1); | |
465 insert into b values (2, 1, 'xxx'); | |
466 insert into b values (1, 1, 'zzz'); | |
467 insert into b values (3, 1, 'yyy'); | |
468 select a.id, b.id, b.text from a join b on (a.id = b.aId) | |
469 order by a.id, b.text; | |
470 } | |
471 } {1 2 xxx 1 3 yyy 1 1 zzz} | |
472 | |
473 #------------------------------------------------------------------------- | |
474 # Check that the sorter in vdbesort.c sorts in a stable fashion. | |
475 # | |
476 do_execsql_test sort-13.0 { | |
477 CREATE TABLE t10(a, b); | |
478 } | |
479 do_test sort-13.1 { | |
480 db transaction { | |
481 for {set i 0} {$i < 100000} {incr i} { | |
482 execsql { INSERT INTO t10 VALUES( $i/10, $i%10 ) } | |
483 } | |
484 } | |
485 } {} | |
486 do_execsql_test sort-13.2 { | |
487 SELECT a, b FROM t10 ORDER BY a; | |
488 } [db eval {SELECT a, b FROM t10 ORDER BY a, b}] | |
489 do_execsql_test sort-13.3 { | |
490 PRAGMA cache_size = 5; | |
491 SELECT a, b FROM t10 ORDER BY a; | |
492 } [db eval {SELECT a, b FROM t10 ORDER BY a, b}] | |
493 | |
494 #------------------------------------------------------------------------- | |
495 # Sort some large ( > 4KiB) records. | |
496 # | |
497 proc cksum {x} { | |
498 set i1 1 | |
499 set i2 2 | |
500 binary scan $x c* L | |
501 foreach {a b} $L { | |
502 set i1 [expr (($i2<<3) + $a) & 0x7FFFFFFF] | |
503 set i2 [expr (($i1<<3) + $b) & 0x7FFFFFFF] | |
504 } | |
505 list $i1 $i2 | |
506 } | |
507 db func cksum cksum | |
508 | |
509 do_execsql_test sort-14.0 { | |
510 PRAGMA cache_size = 5; | |
511 CREATE TABLE t11(a, b); | |
512 INSERT INTO t11 VALUES(randomblob(5000), NULL); | |
513 INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --2 | |
514 INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --3 | |
515 INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --4 | |
516 INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --5 | |
517 INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --6 | |
518 INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --7 | |
519 INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --8 | |
520 INSERT INTO t11 SELECT randomblob(5000), NULL FROM t11; --9 | |
521 UPDATE t11 SET b = cksum(a); | |
522 } | |
523 | |
524 foreach {tn mmap_limit} { | |
525 1 0 | |
526 2 1000000 | |
527 } { | |
528 do_test sort-14.$tn { | |
529 sqlite3_test_control SQLITE_TESTCTRL_SORTER_MMAP db $mmap_limit | |
530 set prev "" | |
531 db eval { SELECT * FROM t11 ORDER BY b } { | |
532 if {$b != [cksum $a]} {error "checksum failed"} | |
533 if {[string compare $b $prev] < 0} {error "sort failed"} | |
534 set prev $b | |
535 } | |
536 set {} {} | |
537 } {} | |
538 } | |
539 | |
540 #------------------------------------------------------------------------- | |
541 # | |
542 foreach {tn mmap_limit nWorker tmpstore coremutex fakeheap softheaplimit} { | |
543 1 0 3 file true false 0 | |
544 2 0 3 file true true 0 | |
545 3 0 0 file true false 0 | |
546 4 1000000 3 file true false 0 | |
547 5 0 0 memory false true 0 | |
548 6 0 0 file false true 1000000 | |
549 7 0 0 file false true 10000 | |
550 } { | |
551 db close | |
552 sqlite3_shutdown | |
553 if {$coremutex} { | |
554 sqlite3_config multithread | |
555 } else { | |
556 sqlite3_config singlethread | |
557 } | |
558 sqlite3_initialize | |
559 sorter_test_fakeheap $fakeheap | |
560 sqlite3_soft_heap_limit $softheaplimit | |
561 | |
562 reset_db | |
563 sqlite3_test_control SQLITE_TESTCTRL_SORTER_MMAP db $mmap_limit | |
564 execsql "PRAGMA temp_store = $tmpstore; PRAGMA threads = $nWorker" | |
565 | |
566 | |
567 set ten [string repeat X 10300] | |
568 set one [string repeat y 200] | |
569 | |
570 if {$softheaplimit} { | |
571 execsql { PRAGMA cache_size = 20 }; | |
572 } else { | |
573 execsql { PRAGMA cache_size = 5 }; | |
574 } | |
575 | |
576 do_execsql_test 15.$tn.1 { | |
577 WITH rr AS ( | |
578 SELECT 4, $ten UNION ALL | |
579 SELECT 2, $one UNION ALL | |
580 SELECT 1, $ten UNION ALL | |
581 SELECT 3, $one | |
582 ) | |
583 SELECT * FROM rr ORDER BY 1; | |
584 } [list 1 $ten 2 $one 3 $one 4 $ten] | |
585 | |
586 do_execsql_test 15.$tn.2 { | |
587 CREATE TABLE t1(a); | |
588 INSERT INTO t1 VALUES(4); | |
589 INSERT INTO t1 VALUES(5); | |
590 INSERT INTO t1 VALUES(3); | |
591 INSERT INTO t1 VALUES(2); | |
592 INSERT INTO t1 VALUES(6); | |
593 INSERT INTO t1 VALUES(1); | |
594 CREATE INDEX i1 ON t1(a); | |
595 SELECT * FROM t1 ORDER BY a; | |
596 } {1 2 3 4 5 6} | |
597 | |
598 do_execsql_test 15.$tn.3 { | |
599 WITH rr AS ( | |
600 SELECT 4, $ten UNION ALL | |
601 SELECT 2, $one | |
602 ) | |
603 SELECT * FROM rr ORDER BY 1; | |
604 } [list 2 $one 4 $ten] | |
605 | |
606 sorter_test_fakeheap 0 | |
607 } | |
608 | |
609 db close | |
610 sqlite3_shutdown | |
611 set t(0) singlethread | |
612 set t(1) multithread | |
613 set t(2) serialized | |
614 sqlite3_config $t($sqlite_options(threadsafe)) | |
615 sqlite3_initialize | |
616 sqlite3_soft_heap_limit 0 | |
617 | |
618 reset_db | |
619 do_catchsql_test 16.1 { | |
620 CREATE TABLE t1(a, b, c); | |
621 INSERT INTO t1 VALUES(1, 2, 3); | |
622 INSERT INTO t1 VALUES(1, NULL, 3); | |
623 INSERT INTO t1 VALUES(NULL, 2, 3); | |
624 INSERT INTO t1 VALUES(1, 2, NULL); | |
625 INSERT INTO t1 VALUES(4, 5, 6); | |
626 CREATE UNIQUE INDEX i1 ON t1(b, a, c); | |
627 } {0 {}} | |
628 reset_db | |
629 do_catchsql_test 16.2 { | |
630 CREATE TABLE t1(a, b, c); | |
631 INSERT INTO t1 VALUES(1, 2, 3); | |
632 INSERT INTO t1 VALUES(1, NULL, 3); | |
633 INSERT INTO t1 VALUES(1, 2, 3); | |
634 INSERT INTO t1 VALUES(1, 2, NULL); | |
635 INSERT INTO t1 VALUES(4, 5, 6); | |
636 CREATE UNIQUE INDEX i1 ON t1(b, a, c); | |
637 } {1 {UNIQUE constraint failed: t1.b, t1.a, t1.c}} | |
638 | |
639 reset_db | |
640 do_execsql_test 17.1 { | |
641 SELECT * FROM sqlite_master ORDER BY sql; | |
642 } {} | |
643 | |
644 finish_test | |
OLD | NEW |