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

Side by Side Diff: third_party/sqlite/src/test/analyze3.test

Issue 901033002: Import SQLite 3.8.7.4. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Chromium changes to support SQLite 3.8.7.4. Created 5 years, 10 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
OLDNEW
1 # 2009 August 06 1 # 2009 August 06
2 # 2 #
3 # The author disclaims copyright to this source code. In place of 3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing: 4 # a legal notice, here is a blessing:
5 # 5 #
6 # May you do good and not evil. 6 # May you do good and not evil.
7 # May you find forgiveness for yourself and forgive others. 7 # May you find forgiveness for yourself and forgive others.
8 # May you share freely, never taking more than you give. 8 # May you share freely, never taking more than you give.
9 # 9 #
10 #*********************************************************************** 10 #***********************************************************************
11 # 11 #
12 # This file implements regression tests for SQLite library. This file 12 # This file implements regression tests for SQLite library. This file
13 # implements tests for range and LIKE constraints that use bound variables 13 # implements tests for range and LIKE constraints that use bound variables
14 # instead of literal constant arguments. 14 # instead of literal constant arguments.
15 # 15 #
16 16
17 set testdir [file dirname $argv0] 17 set testdir [file dirname $argv0]
18 source $testdir/tester.tcl 18 source $testdir/tester.tcl
19 19
20 ifcapable !stat2 { 20 ifcapable !stat4&&!stat3 {
21 finish_test 21 finish_test
22 return 22 return
23 } 23 }
24 24
25 #---------------------------------------------------------------------- 25 #----------------------------------------------------------------------
26 # Test Organization: 26 # Test Organization:
27 # 27 #
28 # analyze3-1.*: Test that the values of bound parameters are considered 28 # analyze3-1.*: Test that the values of bound parameters are considered
29 # in the same way as constants when planning queries that 29 # in the same way as constants when planning queries that
30 # use range constraints. 30 # use range constraints.
31 # 31 #
32 # analyze3-2.*: Test that the values of bound parameters are considered 32 # analyze3-2.*: Test that the values of bound parameters are considered
33 # in the same way as constants when planning queries that 33 # in the same way as constants when planning queries that
34 # use LIKE expressions in the WHERE clause. 34 # use LIKE expressions in the WHERE clause.
35 # 35 #
36 # analyze3-3.*: Test that binding to a variable does not invalidate the 36 # analyze3-3.*: Test that binding to a variable does not invalidate the
37 # query plan when there is no way in which replanning the 37 # query plan when there is no way in which replanning the
38 # query may produce a superior outcome. 38 # query may produce a superior outcome.
39 # 39 #
40 # analyze3-4.*: Test that SQL or authorization callback errors occuring 40 # analyze3-4.*: Test that SQL or authorization callback errors occuring
41 # within sqlite3Reprepare() are handled correctly. 41 # within sqlite3Reprepare() are handled correctly.
42 # 42 #
43 # analyze3-5.*: Check that the query plans of applicable statements are 43 # analyze3-5.*: Check that the query plans of applicable statements are
44 # invalidated if the values of SQL parameter are modified 44 # invalidated if the values of SQL parameter are modified
45 # using the clear_bindings() or transfer_bindings() APIs. 45 # using the clear_bindings() or transfer_bindings() APIs.
46 #
47 # analyze3-6.*: Test that the problem fixed by commit [127a5b776d] is fixed.
46 # 48 #
47 49
48 proc getvar {varname} { uplevel #0 set $varname } 50 proc getvar {varname} { uplevel #0 set $varname }
49 db function var getvar 51 db function var getvar
50 52
51 proc eqp {sql {db db}} { 53 proc eqp {sql {db db}} {
52 uplevel execsql [list "EXPLAIN QUERY PLAN $sql"] $db 54 uplevel execsql [list "EXPLAIN QUERY PLAN $sql"] $db
53 } 55 }
54 56
55 proc sf_execsql {sql {db db}} { 57 proc sf_execsql {sql {db db}} {
56 set ::sqlite_search_count 0 58 set ::sqlite_search_count 0
57 set r [uplevel [list execsql $sql $db]] 59 set r [uplevel [list execsql $sql $db]]
58 60
59 concat $::sqlite_search_count [$db status step] $r 61 concat $::sqlite_search_count [$db status step] $r
60 } 62 }
61 63
62 #------------------------------------------------------------------------- 64 #-------------------------------------------------------------------------
63 # 65 #
64 # analyze3-1.1.1: 66 # analyze3-1.1.1:
65 # Create a table with two columns. Populate the first column (affinity 67 # Create a table with two columns. Populate the first column (affinity
66 # INTEGER) with integer values from 100 to 1100. Create an index on this 68 # INTEGER) with integer values from 100 to 1100. Create an index on this
67 # column. ANALYZE the table. 69 # column. ANALYZE the table.
68 # 70 #
69 # analyze3-1.1.2 - 3.1.3 71 # analyze3-1.1.2 - 3.1.3
70 # Show that there are two possible plans for querying the table with 72 # Show that there are two possible plans for querying the table with
71 # a range constraint on the indexed column - "full table scan" or "use 73 # a range constraint on the indexed column - "full table scan" or "use
72 # the index". When the range is specified using literal values, SQLite 74 # the index". When the range is specified using literal values, SQLite
73 # is able to pick the best plan based on the samples in sqlite_stat2. 75 # is able to pick the best plan based on the samples in sqlite_stat3.
74 # 76 #
75 # analyze3-1.1.4 - 3.1.9 77 # analyze3-1.1.4 - 3.1.9
76 # Show that using SQL variables produces the same results as using 78 # Show that using SQL variables produces the same results as using
77 # literal values to constrain the range scan. 79 # literal values to constrain the range scan.
78 # 80 #
79 # These tests also check that the compiler code considers column 81 # These tests also check that the compiler code considers column
80 # affinities when estimating the number of rows scanned by the "use 82 # affinities when estimating the number of rows scanned by the "use
81 # index strategy". 83 # index strategy".
82 # 84 #
83 do_test analyze3-1.1.1 { 85 do_test analyze3-1.1.1 {
84 execsql { 86 execsql {
85 BEGIN; 87 BEGIN;
86 CREATE TABLE t1(x INTEGER, y); 88 CREATE TABLE t1(x INTEGER, y);
87 CREATE INDEX i1 ON t1(x); 89 CREATE INDEX i1 ON t1(x);
88 } 90 }
89 for {set i 0} {$i < 1000} {incr i} { 91 for {set i 0} {$i < 1000} {incr i} {
90 execsql { INSERT INTO t1 VALUES($i+100, $i) } 92 execsql { INSERT INTO t1 VALUES($i+100, $i) }
91 } 93 }
92 execsql { 94 execsql {
93 COMMIT; 95 COMMIT;
94 ANALYZE; 96 ANALYZE;
95 } 97 }
96 } {}
97 98
99 ifcapable stat4 {
100 execsql { SELECT count(*)>0 FROM sqlite_stat4; }
101 } else {
102 execsql { SELECT count(*)>0 FROM sqlite_stat3; }
103 }
104 } {1}
105
106 do_execsql_test analyze3-1.1.x {
107 SELECT count(*) FROM t1 WHERE x>200 AND x<300;
108 SELECT count(*) FROM t1 WHERE x>0 AND x<1100;
109 } {99 1000}
110
111 # The first of the following two SELECT statements visits 99 rows. So
112 # it is better to use the index. But the second visits every row in
113 # the table (1000 in total) so it is better to do a full-table scan.
114 #
98 do_eqp_test analyze3-1.1.2 { 115 do_eqp_test analyze3-1.1.2 {
99 SELECT sum(y) FROM t1 WHERE x>200 AND x<300 116 SELECT sum(y) FROM t1 WHERE x>200 AND x<300
100 } {0 0 0 {SEARCH TABLE t1 USING INDEX i1 (x>? AND x<?) (~100 rows)}} 117 } {0 0 0 {SEARCH TABLE t1 USING INDEX i1 (x>? AND x<?)}}
101 do_eqp_test analyze3-1.1.3 { 118 do_eqp_test analyze3-1.1.3 {
102 SELECT sum(y) FROM t1 WHERE x>0 AND x<1100 119 SELECT sum(y) FROM t1 WHERE x>0 AND x<1100
103 } {0 0 0 {SCAN TABLE t1 (~111 rows)}} 120 } {0 0 0 {SCAN TABLE t1}}
104 121
105 do_test analyze3-1.1.4 { 122 do_test analyze3-1.1.4 {
106 sf_execsql { SELECT sum(y) FROM t1 WHERE x>200 AND x<300 } 123 sf_execsql { SELECT sum(y) FROM t1 WHERE x>200 AND x<300 }
107 } {199 0 14850} 124 } {199 0 14850}
108 do_test analyze3-1.1.5 { 125 do_test analyze3-1.1.5 {
109 set l [string range "200" 0 end] 126 set l [string range "200" 0 end]
110 set u [string range "300" 0 end] 127 set u [string range "300" 0 end]
111 sf_execsql { SELECT sum(y) FROM t1 WHERE x>$l AND x<$u } 128 sf_execsql { SELECT sum(y) FROM t1 WHERE x>$l AND x<$u }
112 } {199 0 14850} 129 } {199 0 14850}
113 do_test analyze3-1.1.6 { 130 do_test analyze3-1.1.6 {
(...skipping 23 matching lines...) Expand all
137 do_test analyze3-1.2.1 { 154 do_test analyze3-1.2.1 {
138 execsql { 155 execsql {
139 BEGIN; 156 BEGIN;
140 CREATE TABLE t2(x TEXT, y); 157 CREATE TABLE t2(x TEXT, y);
141 INSERT INTO t2 SELECT * FROM t1; 158 INSERT INTO t2 SELECT * FROM t1;
142 CREATE INDEX i2 ON t2(x); 159 CREATE INDEX i2 ON t2(x);
143 COMMIT; 160 COMMIT;
144 ANALYZE; 161 ANALYZE;
145 } 162 }
146 } {} 163 } {}
164 do_execsql_test analyze3-2.1.x {
165 SELECT count(*) FROM t2 WHERE x>1 AND x<2;
166 SELECT count(*) FROM t2 WHERE x>0 AND x<99;
167 } {200 990}
147 do_eqp_test analyze3-1.2.2 { 168 do_eqp_test analyze3-1.2.2 {
148 SELECT sum(y) FROM t2 WHERE x>1 AND x<2 169 SELECT sum(y) FROM t2 WHERE x>1 AND x<2
149 } {0 0 0 {SEARCH TABLE t2 USING INDEX i2 (x>? AND x<?) (~200 rows)}} 170 } {0 0 0 {SEARCH TABLE t2 USING INDEX i2 (x>? AND x<?)}}
150 do_eqp_test analyze3-1.2.3 { 171 do_eqp_test analyze3-1.2.3 {
151 SELECT sum(y) FROM t2 WHERE x>0 AND x<99 172 SELECT sum(y) FROM t2 WHERE x>0 AND x<99
152 } {0 0 0 {SCAN TABLE t2 (~111 rows)}} 173 } {0 0 0 {SCAN TABLE t2}}
174
153 do_test analyze3-1.2.4 { 175 do_test analyze3-1.2.4 {
154 sf_execsql { SELECT sum(y) FROM t2 WHERE x>12 AND x<20 } 176 sf_execsql { SELECT sum(y) FROM t2 WHERE x>12 AND x<20 }
155 } {161 0 4760} 177 } {161 0 4760}
156 do_test analyze3-1.2.5 { 178 do_test analyze3-1.2.5 {
157 set l [string range "12" 0 end] 179 set l [string range "12" 0 end]
158 set u [string range "20" 0 end] 180 set u [string range "20" 0 end]
159 sf_execsql {SELECT typeof($l), typeof($u), sum(y) FROM t2 WHERE x>$l AND x<$u} 181 sf_execsql {SELECT typeof($l), typeof($u), sum(y) FROM t2 WHERE x>$l AND x<$u}
160 } {161 0 text text 4760} 182 } {161 0 text text 4760}
161 do_test analyze3-1.2.6 { 183 do_test analyze3-1.2.6 {
162 set l [expr int(12)] 184 set l [expr int(12)]
(...skipping 21 matching lines...) Expand all
184 do_test analyze3-1.3.1 { 206 do_test analyze3-1.3.1 {
185 execsql { 207 execsql {
186 BEGIN; 208 BEGIN;
187 CREATE TABLE t3(y TEXT, x INTEGER); 209 CREATE TABLE t3(y TEXT, x INTEGER);
188 INSERT INTO t3 SELECT y, x FROM t1; 210 INSERT INTO t3 SELECT y, x FROM t1;
189 CREATE INDEX i3 ON t3(x); 211 CREATE INDEX i3 ON t3(x);
190 COMMIT; 212 COMMIT;
191 ANALYZE; 213 ANALYZE;
192 } 214 }
193 } {} 215 } {}
216 do_execsql_test analyze3-1.3.x {
217 SELECT count(*) FROM t3 WHERE x>200 AND x<300;
218 SELECT count(*) FROM t3 WHERE x>0 AND x<1100
219 } {99 1000}
194 do_eqp_test analyze3-1.3.2 { 220 do_eqp_test analyze3-1.3.2 {
195 SELECT sum(y) FROM t3 WHERE x>200 AND x<300 221 SELECT sum(y) FROM t3 WHERE x>200 AND x<300
196 } {0 0 0 {SEARCH TABLE t3 USING INDEX i3 (x>? AND x<?) (~100 rows)}} 222 } {0 0 0 {SEARCH TABLE t3 USING INDEX i3 (x>? AND x<?)}}
197 do_eqp_test analyze3-1.3.3 { 223 do_eqp_test analyze3-1.3.3 {
198 SELECT sum(y) FROM t3 WHERE x>0 AND x<1100 224 SELECT sum(y) FROM t3 WHERE x>0 AND x<1100
199 } {0 0 0 {SCAN TABLE t3 (~111 rows)}} 225 } {0 0 0 {SCAN TABLE t3}}
200 226
201 do_test analyze3-1.3.4 { 227 do_test analyze3-1.3.4 {
202 sf_execsql { SELECT sum(y) FROM t3 WHERE x>200 AND x<300 } 228 sf_execsql { SELECT sum(y) FROM t3 WHERE x>200 AND x<300 }
203 } {199 0 14850} 229 } {199 0 14850}
204 do_test analyze3-1.3.5 { 230 do_test analyze3-1.3.5 {
205 set l [string range "200" 0 end] 231 set l [string range "200" 0 end]
206 set u [string range "300" 0 end] 232 set u [string range "300" 0 end]
207 sf_execsql { SELECT sum(y) FROM t3 WHERE x>$l AND x<$u } 233 sf_execsql { SELECT sum(y) FROM t3 WHERE x>$l AND x<$u }
208 } {199 0 14850} 234 } {199 0 14850}
209 do_test analyze3-1.3.6 { 235 do_test analyze3-1.3.6 {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 set t "" 267 set t ""
242 append t [lindex {a b c d e f g h i j} [expr $i/100]] 268 append t [lindex {a b c d e f g h i j} [expr $i/100]]
243 append t [lindex {a b c d e f g h i j} [expr ($i/10)%10]] 269 append t [lindex {a b c d e f g h i j} [expr ($i/10)%10]]
244 append t [lindex {a b c d e f g h i j} [expr ($i%10)]] 270 append t [lindex {a b c d e f g h i j} [expr ($i%10)]]
245 execsql { INSERT INTO t1 VALUES($i, $t) } 271 execsql { INSERT INTO t1 VALUES($i, $t) }
246 } 272 }
247 execsql COMMIT 273 execsql COMMIT
248 } {} 274 } {}
249 do_eqp_test analyze3-2.2 { 275 do_eqp_test analyze3-2.2 {
250 SELECT count(a) FROM t1 WHERE b LIKE 'a%' 276 SELECT count(a) FROM t1 WHERE b LIKE 'a%'
251 } {0 0 0 {SEARCH TABLE t1 USING INDEX i1 (b>? AND b<?) (~30000 rows)}} 277 } {0 0 0 {SEARCH TABLE t1 USING INDEX i1 (b>? AND b<?)}}
252 do_eqp_test analyze3-2.3 { 278 do_eqp_test analyze3-2.3 {
253 SELECT count(a) FROM t1 WHERE b LIKE '%a' 279 SELECT count(a) FROM t1 WHERE b LIKE '%a'
254 } {0 0 0 {SCAN TABLE t1 (~500000 rows)}} 280 } {0 0 0 {SCAN TABLE t1}}
255 281
256 do_test analyze3-2.4 { 282 do_test analyze3-2.4 {
257 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE 'a%' } 283 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE 'a%' }
258 } {101 0 100} 284 } {101 0 100}
259 do_test analyze3-2.5 { 285 do_test analyze3-2.5 {
260 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE '%a' } 286 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE '%a' }
261 } {999 999 100} 287 } {999 999 100}
262 288
263 do_test analyze3-2.4 { 289 do_test analyze3-2.4 {
264 set like "a%" 290 set like "a%"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 BEGIN; 329 BEGIN;
304 CREATE TABLE t1(a, b, c); 330 CREATE TABLE t1(a, b, c);
305 CREATE INDEX i1 ON t1(b); 331 CREATE INDEX i1 ON t1(b);
306 } 332 }
307 for {set i 0} {$i < 100} {incr i} { 333 for {set i 0} {$i < 100} {incr i} {
308 execsql { INSERT INTO t1 VALUES($i, $i, $i) } 334 execsql { INSERT INTO t1 VALUES($i, $i, $i) }
309 } 335 }
310 execsql COMMIT 336 execsql COMMIT
311 execsql ANALYZE 337 execsql ANALYZE
312 } {} 338 } {}
313
314 do_test analyze3-3.2.1 { 339 do_test analyze3-3.2.1 {
315 set S [sqlite3_prepare_v2 db "SELECT * FROM t1 WHERE b>?" -1 dummy] 340 set S [sqlite3_prepare_v2 db "SELECT * FROM t1 WHERE b>?" -1 dummy]
316 sqlite3_expired $S 341 sqlite3_expired $S
317 } {0} 342 } {0}
318 do_test analyze3-3.2.2 { 343 do_test analyze3-3.2.2 {
319 sqlite3_bind_text $S 1 "abc" 3 344 sqlite3_bind_text $S 1 "abc" 3
320 sqlite3_expired $S 345 sqlite3_expired $S
321 } {1} 346 } {1}
322 do_test analyze3-3.2.4 { 347 do_test analyze3-3.2.4 {
323 sqlite3_finalize $S 348 sqlite3_finalize $S
324 } {SQLITE_OK} 349 } {SQLITE_OK}
325 350
326 do_test analyze3-3.2.5 { 351 do_test analyze3-3.2.5 {
327 set S [sqlite3_prepare_v2 db "SELECT * FROM t1 WHERE b=?" -1 dummy] 352 set S [sqlite3_prepare_v2 db "SELECT * FROM t1 WHERE b=?" -1 dummy]
328 sqlite3_expired $S 353 sqlite3_expired $S
329 } {0} 354 } {0}
330 do_test analyze3-3.2.6 { 355 do_test analyze3-3.2.6 {
331 sqlite3_bind_text $S 1 "abc" 3 356 sqlite3_bind_text $S 1 "abc" 3
332 sqlite3_expired $S 357 sqlite3_expired $S
333 } {0} 358 } {1}
334 do_test analyze3-3.2.7 { 359 do_test analyze3-3.2.7 {
335 sqlite3_finalize $S 360 sqlite3_finalize $S
336 } {SQLITE_OK} 361 } {SQLITE_OK}
337 362
338 do_test analyze3-3.4.1 { 363 do_test analyze3-3.4.1 {
339 set S [sqlite3_prepare_v2 db "SELECT * FROM t1 WHERE a=? AND b>?" -1 dummy] 364 set S [sqlite3_prepare_v2 db "SELECT * FROM t1 WHERE a=? AND b>?" -1 dummy]
340 sqlite3_expired $S 365 sqlite3_expired $S
341 } {0} 366 } {0}
342 do_test analyze3-3.4.2 { 367 do_test analyze3-3.4.2 {
343 sqlite3_bind_text $S 1 "abc" 3 368 sqlite3_bind_text $S 1 "abc" 3
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 while { "SQLITE_ROW" == [sqlite3_step $S1] } { 630 while { "SQLITE_ROW" == [sqlite3_step $S1] } {
606 lappend R [sqlite3_column_text $S1 0] 631 lappend R [sqlite3_column_text $S1 0]
607 } 632 }
608 concat [sqlite3_reset $S1] $R 633 concat [sqlite3_reset $S1] $R
609 } {SQLITE_OK aaa abb acc} 634 } {SQLITE_OK aaa abb acc}
610 do_test analyze3-5.1.3 { 635 do_test analyze3-5.1.3 {
611 sqlite3_finalize $S2 636 sqlite3_finalize $S2
612 sqlite3_finalize $S1 637 sqlite3_finalize $S1
613 } {SQLITE_OK} 638 } {SQLITE_OK}
614 639
640 #-------------------------------------------------------------------------
641
642 do_test analyze3-6.1 {
643 execsql { DROP TABLE IF EXISTS t1 }
644 execsql BEGIN
645 execsql { CREATE TABLE t1(a, b, c) }
646 for {set i 0} {$i < 1000} {incr i} {
647 execsql "INSERT INTO t1 VALUES([expr $i/100], 'x', [expr $i/10])"
648 }
649 execsql {
650 CREATE INDEX i1 ON t1(a, b);
651 CREATE INDEX i2 ON t1(c);
652 }
653 execsql COMMIT
654 execsql ANALYZE
655 } {}
656
657 do_eqp_test analyze3-6-3 {
658 SELECT * FROM t1 WHERE a = 5 AND c = 13;
659 } {0 0 0 {SEARCH TABLE t1 USING INDEX i2 (c=?)}}
660
661 do_eqp_test analyze3-6-2 {
662 SELECT * FROM t1 WHERE a = 5 AND b > 'w' AND c = 13;
663 } {0 0 0 {SEARCH TABLE t1 USING INDEX i2 (c=?)}}
664
615 finish_test 665 finish_test
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698