Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(292)

Side by Side Diff: third_party/sqlite/test/select9.test

Issue 3108030: Move bundled copy of sqlite one level deeper to better separate it... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « third_party/sqlite/test/select8.test ('k') | third_party/sqlite/test/selectA.test » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 # 2008 June 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.
12 #
13 # $Id: select9.test,v 1.4 2008/07/01 14:39:35 danielk1977 Exp $
14
15 # The tests in this file are focused on test compound SELECT statements
16 # that have any or all of an ORDER BY, LIMIT or OFFSET clauses. As of
17 # version 3.6.0, SQLite contains code to use SQL indexes where possible
18 # to optimize such statements.
19 #
20
21 # TODO Points:
22 #
23 # * Are there any "column affinity" issues to consider?
24
25 set testdir [file dirname $argv0]
26 source $testdir/tester.tcl
27
28 #set ISQUICK 1
29
30 #-------------------------------------------------------------------------
31 # test_compound_select TESTNAME SELECT RESULT
32 #
33 # This command is used to run multiple LIMIT/OFFSET test cases based on
34 # the single SELECT statement passed as the second argument. The SELECT
35 # statement may not contain a LIMIT or OFFSET clause. This proc tests
36 # many statements of the form:
37 #
38 # "$SELECT limit $X offset $Y"
39 #
40 # for various values of $X and $Y.
41 #
42 # The third argument, $RESULT, should contain the expected result of
43 # the command [execsql $SELECT].
44 #
45 # The first argument, $TESTNAME, is used as the base test case name to
46 # pass to [do_test] for each individual LIMIT OFFSET test case.
47 #
48 proc test_compound_select {testname sql result} {
49
50 set nCol 1
51 db eval $sql A {
52 set nCol [llength $A(*)]
53 break
54 }
55 set nRow [expr {[llength $result] / $nCol}]
56
57 set ::compound_sql $sql
58 do_test $testname {
59 execsql $::compound_sql
60 } $result
61 #return
62
63 set iLimitIncr 1
64 set iOffsetIncr 1
65 if {[info exists ::ISQUICK] && $::ISQUICK && $nRow>=5} {
66 set iOffsetIncr [expr $nRow / 5]
67 set iLimitIncr [expr $nRow / 5]
68 }
69
70 set iLimitEnd [expr $nRow+$iLimitIncr]
71 set iOffsetEnd [expr $nRow+$iOffsetIncr]
72
73 for {set iOffset 0} {$iOffset < $iOffsetEnd} {incr iOffset $iOffsetIncr} {
74 for {set iLimit 0} {$iLimit < $iLimitEnd} {incr iLimit} {
75
76 set ::compound_sql "$sql LIMIT $iLimit"
77 if {$iOffset != 0} {
78 append ::compound_sql " OFFSET $iOffset"
79 }
80
81 set iStart [expr {$iOffset*$nCol}]
82 set iEnd [expr {($iOffset*$nCol) + ($iLimit*$nCol) -1}]
83
84 do_test $testname.limit=$iLimit.offset=$iOffset {
85 execsql $::compound_sql
86 } [lrange $result $iStart $iEnd]
87 }
88 }
89 }
90
91 #-------------------------------------------------------------------------
92 # test_compound_select_flippable TESTNAME SELECT RESULT
93 #
94 # This command is for testing statements of the form:
95 #
96 # <simple select 1> <compound op> <simple select 2> ORDER BY <order by>
97 #
98 # where each <simple select> is a simple (non-compound) select statement
99 # and <compound op> is one of "INTERSECT", "UNION ALL" or "UNION".
100 #
101 # This proc calls [test_compound_select] twice, once with the select
102 # statement as it is passed to this command, and once with the positions
103 # of <select statement 1> and <select statement 2> exchanged.
104 #
105 proc test_compound_select_flippable {testname sql result} {
106 test_compound_select $testname $sql $result
107
108 set select [string trim $sql]
109 set RE {(.*)(UNION ALL|INTERSECT|UNION)(.*)(ORDER BY.*)}
110 set rc [regexp $RE $select -> s1 op s2 order_by]
111 if {!$rc} {error "Statement is unflippable: $select"}
112
113 set flipsql "$s2 $op $s1 $order_by"
114 test_compound_select $testname.flipped $flipsql $result
115 }
116
117 #############################################################################
118 # Begin tests.
119 #
120
121 # Create and populate a sample database.
122 #
123 do_test select9-1.0 {
124 execsql {
125 CREATE TABLE t1(a, b, c);
126 CREATE TABLE t2(d, e, f);
127 BEGIN;
128 INSERT INTO t1 VALUES(1, 'one', 'I');
129 INSERT INTO t1 VALUES(3, NULL, NULL);
130 INSERT INTO t1 VALUES(5, 'five', 'V');
131 INSERT INTO t1 VALUES(7, 'seven', 'VII');
132 INSERT INTO t1 VALUES(9, NULL, NULL);
133 INSERT INTO t1 VALUES(2, 'two', 'II');
134 INSERT INTO t1 VALUES(4, 'four', 'IV');
135 INSERT INTO t1 VALUES(6, NULL, NULL);
136 INSERT INTO t1 VALUES(8, 'eight', 'VIII');
137 INSERT INTO t1 VALUES(10, 'ten', 'X');
138
139 INSERT INTO t2 VALUES(1, 'two', 'IV');
140 INSERT INTO t2 VALUES(2, 'four', 'VIII');
141 INSERT INTO t2 VALUES(3, NULL, NULL);
142 INSERT INTO t2 VALUES(4, 'eight', 'XVI');
143 INSERT INTO t2 VALUES(5, 'ten', 'XX');
144 INSERT INTO t2 VALUES(6, NULL, NULL);
145 INSERT INTO t2 VALUES(7, 'fourteen', 'XXVIII');
146 INSERT INTO t2 VALUES(8, 'sixteen', 'XXXII');
147 INSERT INTO t2 VALUES(9, NULL, NULL);
148 INSERT INTO t2 VALUES(10, 'twenty', 'XL');
149
150 COMMIT;
151 }
152 } {}
153
154 # Each iteration of this loop runs the same tests with a different set
155 # of indexes present within the database schema. The data returned by
156 # the compound SELECT statements in the test cases should be the same
157 # in each case.
158 #
159 set iOuterLoop 1
160 foreach indexes [list {
161 /* Do not create any indexes. */
162 } {
163 CREATE INDEX i1 ON t1(a)
164 } {
165 CREATE INDEX i2 ON t1(b)
166 } {
167 CREATE INDEX i3 ON t2(d)
168 } {
169 CREATE INDEX i4 ON t2(e)
170 }] {
171
172 do_test select9-1.$iOuterLoop.1 {
173 execsql $indexes
174 } {}
175
176 # Test some 2-way UNION ALL queries. No WHERE clauses.
177 #
178 test_compound_select select9-1.$iOuterLoop.2 {
179 SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2
180 } {1 one 3 {} 5 five 7 seven 9 {} 2 two 4 four 6 {} 8 eight 10 ten 1 two 2 fou r 3 {} 4 eight 5 ten 6 {} 7 fourteen 8 sixteen 9 {} 10 twenty}
181 test_compound_select select9-1.$iOuterLoop.3 {
182 SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY 1
183 } {1 one 1 two 2 two 2 four 3 {} 3 {} 4 four 4 eight 5 five 5 ten 6 {} 6 {} 7 seven 7 fourteen 8 eight 8 sixteen 9 {} 9 {} 10 ten 10 twenty}
184 test_compound_select select9-1.$iOuterLoop.4 {
185 SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY 2
186 } {3 {} 9 {} 6 {} 3 {} 6 {} 9 {} 8 eight 4 eight 5 five 4 four 2 four 7 fourte en 1 one 7 seven 8 sixteen 10 ten 5 ten 10 twenty 2 two 1 two}
187 test_compound_select_flippable select9-1.$iOuterLoop.5 {
188 SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY 1, 2
189 } {1 one 1 two 2 four 2 two 3 {} 3 {} 4 eight 4 four 5 five 5 ten 6 {} 6 {} 7 fourteen 7 seven 8 eight 8 sixteen 9 {} 9 {} 10 ten 10 twenty}
190 test_compound_select_flippable select9-1.$iOuterLoop.6 {
191 SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY 2, 1
192 } {3 {} 3 {} 6 {} 6 {} 9 {} 9 {} 4 eight 8 eight 5 five 2 four 4 four 7 fourte en 1 one 7 seven 8 sixteen 5 ten 10 ten 10 twenty 1 two 2 two}
193
194 # Test some 2-way UNION queries.
195 #
196 test_compound_select select9-1.$iOuterLoop.7 {
197 SELECT a, b FROM t1 UNION SELECT d, e FROM t2
198 } {1 one 1 two 2 four 2 two 3 {} 4 eight 4 four 5 five 5 ten 6 {} 7 fourteen 7 seven 8 eight 8 sixteen 9 {} 10 ten 10 twenty}
199
200 test_compound_select select9-1.$iOuterLoop.8 {
201 SELECT a, b FROM t1 UNION SELECT d, e FROM t2 ORDER BY 1
202 } {1 one 1 two 2 four 2 two 3 {} 4 eight 4 four 5 five 5 ten 6 {} 7 fourteen 7 seven 8 eight 8 sixteen 9 {} 10 ten 10 twenty}
203
204 test_compound_select select9-1.$iOuterLoop.9 {
205 SELECT a, b FROM t1 UNION SELECT d, e FROM t2 ORDER BY 2
206 } {3 {} 6 {} 9 {} 4 eight 8 eight 5 five 2 four 4 four 7 fourteen 1 one 7 seve n 8 sixteen 5 ten 10 ten 10 twenty 1 two 2 two}
207
208 test_compound_select_flippable select9-1.$iOuterLoop.10 {
209 SELECT a, b FROM t1 UNION SELECT d, e FROM t2 ORDER BY 1, 2
210 } {1 one 1 two 2 four 2 two 3 {} 4 eight 4 four 5 five 5 ten 6 {} 7 fourteen 7 seven 8 eight 8 sixteen 9 {} 10 ten 10 twenty}
211
212 test_compound_select_flippable select9-1.$iOuterLoop.11 {
213 SELECT a, b FROM t1 UNION SELECT d, e FROM t2 ORDER BY 2, 1
214 } {3 {} 6 {} 9 {} 4 eight 8 eight 5 five 2 four 4 four 7 fourteen 1 one 7 seve n 8 sixteen 5 ten 10 ten 10 twenty 1 two 2 two}
215
216 # Test some 2-way INTERSECT queries.
217 #
218 test_compound_select select9-1.$iOuterLoop.11 {
219 SELECT a, b FROM t1 INTERSECT SELECT d, e FROM t2
220 } {3 {} 6 {} 9 {}}
221 test_compound_select_flippable select9-1.$iOuterLoop.12 {
222 SELECT a, b FROM t1 INTERSECT SELECT d, e FROM t2 ORDER BY 1
223 } {3 {} 6 {} 9 {}}
224 test_compound_select select9-1.$iOuterLoop.13 {
225 SELECT a, b FROM t1 INTERSECT SELECT d, e FROM t2 ORDER BY 2
226 } {3 {} 6 {} 9 {}}
227 test_compound_select_flippable select9-1.$iOuterLoop.14 {
228 SELECT a, b FROM t1 INTERSECT SELECT d, e FROM t2 ORDER BY 2, 1
229 } {3 {} 6 {} 9 {}}
230 test_compound_select_flippable select9-1.$iOuterLoop.15 {
231 SELECT a, b FROM t1 INTERSECT SELECT d, e FROM t2 ORDER BY 1, 2
232 } {3 {} 6 {} 9 {}}
233
234 # Test some 2-way EXCEPT queries.
235 #
236 test_compound_select select9-1.$iOuterLoop.16 {
237 SELECT a, b FROM t1 EXCEPT SELECT d, e FROM t2
238 } {1 one 2 two 4 four 5 five 7 seven 8 eight 10 ten}
239
240 test_compound_select select9-1.$iOuterLoop.17 {
241 SELECT a, b FROM t1 EXCEPT SELECT d, e FROM t2 ORDER BY 1
242 } {1 one 2 two 4 four 5 five 7 seven 8 eight 10 ten}
243
244 test_compound_select select9-1.$iOuterLoop.18 {
245 SELECT a, b FROM t1 EXCEPT SELECT d, e FROM t2 ORDER BY 2
246 } {8 eight 5 five 4 four 1 one 7 seven 10 ten 2 two}
247
248 test_compound_select select9-1.$iOuterLoop.19 {
249 SELECT a, b FROM t1 EXCEPT SELECT d, e FROM t2 ORDER BY 1, 2
250 } {1 one 2 two 4 four 5 five 7 seven 8 eight 10 ten}
251
252 test_compound_select select9-1.$iOuterLoop.20 {
253 SELECT a, b FROM t1 EXCEPT SELECT d, e FROM t2 ORDER BY 2, 1
254 } {8 eight 5 five 4 four 1 one 7 seven 10 ten 2 two}
255
256 incr iOuterLoop
257 }
258
259 do_test select9-2.0 {
260 execsql {
261 DROP INDEX i1;
262 DROP INDEX i2;
263 DROP INDEX i3;
264 DROP INDEX i4;
265 }
266 } {}
267
268 proc reverse {lhs rhs} {
269 return [string compare $rhs $lhs]
270 }
271 db collate reverse reverse
272
273 # This loop is similar to the previous one (test cases select9-1.*)
274 # except that the simple select statements have WHERE clauses attached
275 # to them. Sometimes the WHERE clause may be satisfied using the same
276 # index used for ORDER BY, sometimes not.
277 #
278 set iOuterLoop 1
279 foreach indexes [list {
280 /* Do not create any indexes. */
281 } {
282 CREATE INDEX i1 ON t1(a)
283 } {
284 DROP INDEX i1;
285 CREATE INDEX i1 ON t1(b, a)
286 } {
287 CREATE INDEX i2 ON t2(d DESC, e COLLATE REVERSE ASC);
288 } {
289 CREATE INDEX i3 ON t1(a DESC);
290 }] {
291 do_test select9-2.$iOuterLoop.1 {
292 execsql $indexes
293 } {}
294
295 test_compound_select_flippable select9-2.$iOuterLoop.2 {
296 SELECT * FROM t1 WHERE a<5 UNION SELECT * FROM t2 WHERE d>=5 ORDER BY 1
297 } {1 one I 2 two II 3 {} {} 4 four IV 5 ten XX 6 {} {} 7 fourteen XXVIII 8 six teen XXXII 9 {} {} 10 twenty XL}
298
299 test_compound_select_flippable select9-2.$iOuterLoop.2 {
300 SELECT * FROM t1 WHERE a<5 UNION SELECT * FROM t2 WHERE d>=5 ORDER BY 2, 1
301 } {3 {} {} 6 {} {} 9 {} {} 4 four IV 7 fourteen XXVIII 1 one I 8 sixteen XXXII 5 ten XX 10 twenty XL 2 two II}
302
303 test_compound_select_flippable select9-2.$iOuterLoop.3 {
304 SELECT * FROM t1 WHERE a<5 UNION SELECT * FROM t2 WHERE d>=5
305 ORDER BY 2 COLLATE reverse, 1
306 } {3 {} {} 6 {} {} 9 {} {} 2 two II 10 twenty XL 5 ten XX 8 sixteen XXXII 1 on e I 7 fourteen XXVIII 4 four IV}
307
308 test_compound_select_flippable select9-2.$iOuterLoop.4 {
309 SELECT * FROM t1 WHERE a<5 UNION ALL SELECT * FROM t2 WHERE d>=5 ORDER BY 1
310 } {1 one I 2 two II 3 {} {} 4 four IV 5 ten XX 6 {} {} 7 fourteen XXVIII 8 six teen XXXII 9 {} {} 10 twenty XL}
311
312 test_compound_select_flippable select9-2.$iOuterLoop.5 {
313 SELECT * FROM t1 WHERE a<5 UNION ALL SELECT * FROM t2 WHERE d>=5 ORDER BY 2, 1
314 } {3 {} {} 6 {} {} 9 {} {} 4 four IV 7 fourteen XXVIII 1 one I 8 sixteen XXXII 5 ten XX 10 twenty XL 2 two II}
315
316 test_compound_select_flippable select9-2.$iOuterLoop.6 {
317 SELECT * FROM t1 WHERE a<5 UNION ALL SELECT * FROM t2 WHERE d>=5
318 ORDER BY 2 COLLATE reverse, 1
319 } {3 {} {} 6 {} {} 9 {} {} 2 two II 10 twenty XL 5 ten XX 8 sixteen XXXII 1 on e I 7 fourteen XXVIII 4 four IV}
320
321 test_compound_select select9-2.$iOuterLoop.4 {
322 SELECT a FROM t1 WHERE a<8 EXCEPT SELECT d FROM t2 WHERE d<=3 ORDER BY 1
323 } {4 5 6 7}
324
325 test_compound_select select9-2.$iOuterLoop.4 {
326 SELECT a FROM t1 WHERE a<8 INTERSECT SELECT d FROM t2 WHERE d<=3 ORDER BY 1
327 } {1 2 3}
328
329 }
330
331 do_test select9-2.X {
332 execsql {
333 DROP INDEX i1;
334 DROP INDEX i2;
335 DROP INDEX i3;
336 }
337 } {}
338
339 # This procedure executes the SQL. Then it checks the generated program
340 # for the SQL and appends a "nosort" to the result if the program contains the
341 # SortCallback opcode. If the program does not contain the SortCallback
342 # opcode it appends "sort"
343 #
344 proc cksort {sql} {
345 set ::sqlite_sort_count 0
346 set data [execsql $sql]
347 if {$::sqlite_sort_count} {set x sort} {set x nosort}
348 lappend data $x
349 return $data
350 }
351
352 # If the right indexes exist, the following query:
353 #
354 # SELECT t1.a FROM t1 UNION ALL SELECT t2.d FROM t2 ORDER BY 1
355 #
356 # can use indexes to run without doing a in-memory sort operation.
357 # This block of tests (select9-3.*) is used to check if the same
358 # is possible with:
359 #
360 # CREATE VIEW v1 AS SELECT a FROM t1 UNION ALL SELECT d FROM t2
361 # SELECT a FROM v1 ORDER BY 1
362 #
363 # It turns out that it is.
364 #
365 do_test select9-3.1 {
366 cksort { SELECT a FROM t1 ORDER BY 1 }
367 } {1 2 3 4 5 6 7 8 9 10 sort}
368 do_test select9-3.2 {
369 execsql { CREATE INDEX i1 ON t1(a) }
370 cksort { SELECT a FROM t1 ORDER BY 1 }
371 } {1 2 3 4 5 6 7 8 9 10 nosort}
372 do_test select9-3.3 {
373 cksort { SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 5 }
374 } {1 1 2 2 3 sort}
375 do_test select9-3.4 {
376 execsql { CREATE INDEX i2 ON t2(d) }
377 cksort { SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 5 }
378 } {1 1 2 2 3 nosort}
379 do_test select9-3.5 {
380 execsql { CREATE VIEW v1 AS SELECT a FROM t1 UNION ALL SELECT d FROM t2 }
381 cksort { SELECT a FROM v1 ORDER BY 1 LIMIT 5 }
382 } {1 1 2 2 3 nosort}
383 do_test select9-3.X {
384 execsql {
385 DROP INDEX i1;
386 DROP INDEX i2;
387 DROP VIEW v1;
388 }
389 } {}
390
391 # This block of tests is the same as the preceding one, except that
392 # "UNION" is tested instead of "UNION ALL".
393 #
394 do_test select9-4.1 {
395 cksort { SELECT a FROM t1 ORDER BY 1 }
396 } {1 2 3 4 5 6 7 8 9 10 sort}
397 do_test select9-4.2 {
398 execsql { CREATE INDEX i1 ON t1(a) }
399 cksort { SELECT a FROM t1 ORDER BY 1 }
400 } {1 2 3 4 5 6 7 8 9 10 nosort}
401 do_test select9-4.3 {
402 cksort { SELECT a FROM t1 UNION SELECT d FROM t2 ORDER BY 1 LIMIT 5 }
403 } {1 2 3 4 5 sort}
404 do_test select9-4.4 {
405 execsql { CREATE INDEX i2 ON t2(d) }
406 cksort { SELECT a FROM t1 UNION SELECT d FROM t2 ORDER BY 1 LIMIT 5 }
407 } {1 2 3 4 5 nosort}
408 do_test select9-4.5 {
409 execsql { CREATE VIEW v1 AS SELECT a FROM t1 UNION SELECT d FROM t2 }
410 cksort { SELECT a FROM v1 ORDER BY 1 LIMIT 5 }
411 } {1 2 3 4 5 sort}
412 do_test select9-4.X {
413 execsql {
414 DROP INDEX i1;
415 DROP INDEX i2;
416 DROP VIEW v1;
417 }
418 } {}
419
420
421 finish_test
OLDNEW
« no previous file with comments | « third_party/sqlite/test/select8.test ('k') | third_party/sqlite/test/selectA.test » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698