OLD | NEW |
| (Empty) |
1 # 2014-10-21 | |
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 tests of the "skip-scan" query strategy. In | |
13 # particular, this file verifies that use of all columns of an index | |
14 # is always preferred over the use of a skip-scan on some columns of | |
15 # the same index. Because of difficulties in scoring a skip-scan, | |
16 # the skip-scan can sometimes come out with a lower raw score when | |
17 # using STAT4. But the query planner should detect this and use the | |
18 # full index rather than the skip-scan. | |
19 # | |
20 | |
21 set testdir [file dirname $argv0] | |
22 source $testdir/tester.tcl | |
23 set testprefix skipscan6 | |
24 | |
25 ifcapable !stat4 { | |
26 finish_test | |
27 return | |
28 } | |
29 | |
30 do_execsql_test 1.1 { | |
31 CREATE TABLE t1( | |
32 aa int, | |
33 bb int, | |
34 cc int, | |
35 dd int, | |
36 ee int | |
37 ); | |
38 CREATE INDEX ix on t1(aa, bb, cc, dd DESC); | |
39 ANALYZE sqlite_master; | |
40 INSERT INTO sqlite_stat1 VALUES('t1','ix','2695116 1347558 264 18 2'); | |
41 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 196859 196859 32 1','0 1504
3 15043 92468 92499','0 19 286 81846 92499',X'0609010804031552977BD725BD28'); | |
42 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 14687 161 1 1','0 289067 29
9306 299457 299457','0 199 6772 273984 299457',X'060902020403013406314D67456415B
819'); | |
43 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 19313 19308 22 1','0 325815
325815 343725 343746','0 261 9545 315009 343746',X'060902080403018A49B0A3AD1ED9
31'); | |
44 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 25047 9051 15 1','0 350443
350443 356590 356604','0 266 9795 325519 356604',X'06090208040301914C2DD2E91F93C
F'); | |
45 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 42327 9906 7 1','0 376381 3
76381 380291 380297','0 268 10100 344232 380297',X'06090208040301934BF672511F7ED
3'); | |
46 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 24513 2237 1 1','0 455150 4
67779 470015 470015','0 286 10880 425401 470015',X'06090202040301A703464A28F2611
EF1EE'); | |
47 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 18730 18724 15 1','0 479663
479663 498271 498285','0 287 10998 450793 498285',X'06090208040301A8494AF3A41EC
50C'); | |
48 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 119603 47125 1 1','0 572425
572425 598915 598915','0 404 14230 546497 598915',X'06090208040302474FD1929A031
94F'); | |
49 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 1454 1454 1 1','0 898346 89
8346 898373 898373','0 952 31165 827562 898373',X'06090208040304FD53F6A2A2097F64
'); | |
50 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 57138 7069 1 1','0 1122389
1122389 1129457 1129457','0 1967 46801 1045943 1129457',X'06090208040309884BC4C5
2F1F6EB7'); | |
51 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 285 11 1 1','0 1197683 1197
824 1197831 1197831','0 2033 50990 1112280 1197831',X'06090202040309D80346503FE2
A9038E4F'); | |
52 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 25365 9773 1 1','0 1301013
1301013 1310785 1310785','0 2561 58806 1217877 1310785',X'0609020804030C5F4C8F88
AB0AF2A2'); | |
53 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 45180 7222 1 1','0 1326378
1326378 1333599 1333599','0 2562 59921 1240187 1333599',X'0609020804030C604CAB75
490B0351'); | |
54 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 8537 41 1 1','0 1496959 149
7288 1497289 1497289','0 3050 68246 1394126 1497289',X'0609020204030EA0057F52745
9B0257C4B'); | |
55 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 26139 26131 17 1','0 150797
7 1507977 1520578 1520594','0 3074 69188 1416111 1520594',X'0609020804030EB95169
453423D4EA'); | |
56 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 102894 29678 1 1','0 153742
1 1550467 1564894 1564894','0 3109 69669 1459820 1564894',X'0609020204030EE31836
52A6ED3006EBCB'); | |
57 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 319 3 1 1','0 1796728 17967
46 1796747 1796747','0 3650 86468 1682243 1796747',X'0609020204031163033550D0C41
018C28D'); | |
58 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 127 127 1 1','0 2096194 209
6194 2096205 2096205','0 5145 106437 1951535 2096205',X'060902080403180F53BB1AF7
27EE50'); | |
59 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 66574 5252 1 1','0 2230524
2265961 2271212 2271212','0 5899 114976 2085829 2271212',X'0609020204031B8A05195
009976D223B90'); | |
60 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 19440 19440 1 1','0 2391680
2391680 2395663 2395663','0 6718 123714 2184781 2395663',X'0609020804031F7452E0
0A7B07431A'); | |
61 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 18321 2177 1 1','0 2522928
2523231 2525407 2525407','0 7838 139084 2299958 2525407',X'06090201040324A747523
1103B1AA7B8'); | |
62 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 22384 1361 1 1','0 2541249
2544834 2546194 2546194','0 7839 139428 2308416 2546194',X'06090202040324A801165
2323D4B1AA9EB'); | |
63 INSERT INTO sqlite_stat4 VALUES('t1','ix','2677151 18699 855 1 1','0 2563633 2
578178 2579032 2579032','0 7840 139947 2321671 2579032',X'06090202040324A9077452
323D7D1052C5'); | |
64 INSERT INTO sqlite_stat4 VALUES('t1','ix','17965 1579 1579 1 1','2677151 26906
66 2690666 2692244 2692244','1 9870 153959 2418294 2692244',X'060102080403021B8A
4FE1AB84032B35'); | |
65 ANALYZE sqlite_master; | |
66 } {} | |
67 do_execsql_test 1.2 { | |
68 EXPLAIN QUERY PLAN | |
69 SELECT COUNT(*) | |
70 FROM t1 | |
71 WHERE bb=21 | |
72 AND aa=1 | |
73 AND dd BETWEEN 1413833728 and 1413837331; | |
74 } {/INDEX ix .aa=. AND bb=../} | |
75 | |
76 do_execsql_test 2.1 { | |
77 DROP INDEX ix; | |
78 CREATE INDEX good on t1(bb, aa, dd DESC); | |
79 CREATE INDEX bad on t1(aa, bb, cc, dd DESC); | |
80 DELETE FROM sqlite_stat1; | |
81 DELETE FROM sqlite_stat4; | |
82 INSERT INTO sqlite_stat1 VALUES('t1','good','2695116 299 264 2'); | |
83 INSERT INTO sqlite_stat1 VALUES('t1','bad','2695116 1347558 264 18 2'); | |
84 INSERT INTO sqlite_stat4 VALUES('t1','good','197030 196859 32 1','15086 15086
92511 92536','19 25 81644 92536',X'05010904031552977BD725BD22'); | |
85 INSERT INTO sqlite_stat4 VALUES('t1','good','14972 14687 1 1','289878 289878 2
99457 299457','199 244 267460 299457',X'050209040301344F7E569402C419'); | |
86 INSERT INTO sqlite_stat4 VALUES('t1','good','19600 19313 22 1','327127 327127
346222 346243','261 319 306884 346243',X'0502090403018A49503BC01EC577'); | |
87 INSERT INTO sqlite_stat4 VALUES('t1','good','25666 25047 15 1','352087 352087
372692 372706','266 327 325601 372706',X'050209040301914C2DD2E91F93CF'); | |
88 INSERT INTO sqlite_stat4 VALUES('t1','good','42392 42327 26 1','378657 378657
382547 382572','268 331 333529 382572',X'05020904030193533B2FE326ED48'); | |
89 INSERT INTO sqlite_stat4 VALUES('t1','good','24619 24513 11 1','457872 457872
461748 461758','286 358 399322 461758',X'050209040301A752B1557825EA7C'); | |
90 INSERT INTO sqlite_stat4 VALUES('t1','good','18969 18730 15 1','482491 482491
501105 501119','287 360 433605 501119',X'050209040301A8494AF3A41EC50C'); | |
91 INSERT INTO sqlite_stat4 VALUES('t1','good','119710 119603 1 1','576500 576500
598915 598915','404 505 519877 598915',X'05020904030247539A7A7912F617'); | |
92 INSERT INTO sqlite_stat4 VALUES('t1','good','11955 11946 1 1','889796 889796 8
98373 898373','938 1123 794694 898373',X'050209040304EF4DF9C4150BBB28'); | |
93 INSERT INTO sqlite_stat4 VALUES('t1','good','57197 57138 24 1','1129865 112986
5 1151492 1151515','1967 2273 1027048 1151515',X'05020904030988533510BC26E20A'); | |
94 INSERT INTO sqlite_stat4 VALUES('t1','good','3609 3543 1 1','1196265 1196265 1
197831 1197831','2002 2313 1070108 1197831',X'050209040309B050E95CD718D94D'); | |
95 INSERT INTO sqlite_stat4 VALUES('t1','good','25391 25365 13 1','1309378 130937
8 1315567 1315579','2561 2936 1178358 1315579',X'05020904030C5F53DF9E13283570'); | |
96 INSERT INTO sqlite_stat4 VALUES('t1','good','45232 45180 17 1','1334769 133476
9 1337946 1337962','2562 2938 1198998 1337962',X'05020904030C60541CACEE28BCAC'); | |
97 INSERT INTO sqlite_stat4 VALUES('t1','good','5496 5493 1 1','1495882 1495882 1
497289 1497289','3043 3479 1348695 1497289',X'05020904030E99515C62AD0F0B34'); | |
98 INSERT INTO sqlite_stat4 VALUES('t1','good','26348 26139 17 1','1517381 151738
1 1529990 1530006','3074 3519 1378320 1530006',X'05020904030EB95169453423D4EA'); | |
99 INSERT INTO sqlite_stat4 VALUES('t1','good','102927 102894 10 1','1547088 1547
088 1649950 1649959','3109 3559 1494260 1649959',X'05020904030EE34D309F671FFA47'
); | |
100 INSERT INTO sqlite_stat4 VALUES('t1','good','3602 3576 1 1','1793873 1793873 1
796747 1796747','3601 4128 1630783 1796747',X'050209040311294FE88B432219B9'); | |
101 INSERT INTO sqlite_stat4 VALUES('t1','good','154 154 1 1','2096059 2096059 209
6205 2096205','5037 5779 1893039 2096205',X'050209040317994EFF05A016DCED'); | |
102 INSERT INTO sqlite_stat4 VALUES('t1','good','68153 66574 60 1','2244039 224403
9 2268892 2268951','5899 6749 2027553 2268951',X'05020904031B8A532DBC5A26D2BA'); | |
103 INSERT INTO sqlite_stat4 VALUES('t1','good','321 321 1 1','2395618 2395618 239
5663 2395663','6609 7528 2118435 2395663',X'05020904031EFA54078EEE1E2D65'); | |
104 INSERT INTO sqlite_stat4 VALUES('t1','good','19449 19440 22 1','2407769 240776
9 2426049 2426070','6718 7651 2146904 2426070',X'05020904031F7450E6118C2336BD'); | |
105 INSERT INTO sqlite_stat4 VALUES('t1','good','18383 18321 56 1','2539949 253994
9 2551080 2551135','7838 8897 2245459 2551135',X'050209040324A752EA2E1E2642B2'); | |
106 INSERT INTO sqlite_stat4 VALUES('t1','good','22479 22384 60 1','2558332 255833
2 2565233 2565292','7839 8899 2251202 2565292',X'050209040324A853926538279A5F'); | |
107 INSERT INTO sqlite_stat4 VALUES('t1','good','18771 18699 63 1','2580811 258081
1 2596914 2596976','7840 8901 2263572 2596976',X'050209040324A9526C1DE9256E72'); | |
108 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 196859 196859 32 1','0 150
43 15043 92468 92499','0 19 286 81846 92499',X'0609010804031552977BD725BD28'); | |
109 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 14687 161 1 1','0 289067 2
99306 299457 299457','0 199 6772 273984 299457',X'060902020403013406314D67456415
B819'); | |
110 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 19313 19308 22 1','0 32581
5 325815 343725 343746','0 261 9545 315009 343746',X'060902080403018A49B0A3AD1ED
931'); | |
111 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 25047 9051 15 1','0 350443
350443 356590 356604','0 266 9795 325519 356604',X'06090208040301914C2DD2E91F93
CF'); | |
112 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 42327 9906 7 1','0 376381
376381 380291 380297','0 268 10100 344232 380297',X'06090208040301934BF672511F7E
D3'); | |
113 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 24513 2237 1 1','0 455150
467779 470015 470015','0 286 10880 425401 470015',X'06090202040301A703464A28F261
1EF1EE'); | |
114 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 18730 18724 15 1','0 47966
3 479663 498271 498285','0 287 10998 450793 498285',X'06090208040301A8494AF3A41E
C50C'); | |
115 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 119603 47125 1 1','0 57242
5 572425 598915 598915','0 404 14230 546497 598915',X'06090208040302474FD1929A03
194F'); | |
116 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 1454 1454 1 1','0 898346 8
98346 898373 898373','0 952 31165 827562 898373',X'06090208040304FD53F6A2A2097F6
4'); | |
117 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 57138 7069 1 1','0 1122389
1122389 1129457 1129457','0 1967 46801 1045943 1129457',X'06090208040309884BC4C
52F1F6EB7'); | |
118 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 285 11 1 1','0 1197683 119
7824 1197831 1197831','0 2033 50990 1112280 1197831',X'06090202040309D80346503FE
2A9038E4F'); | |
119 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 25365 9773 1 1','0 1301013
1301013 1310785 1310785','0 2561 58806 1217877 1310785',X'0609020804030C5F4C8F8
8AB0AF2A2'); | |
120 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 45180 7222 1 1','0 1326378
1326378 1333599 1333599','0 2562 59921 1240187 1333599',X'0609020804030C604CAB7
5490B0351'); | |
121 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 8537 41 1 1','0 1496959 14
97288 1497289 1497289','0 3050 68246 1394126 1497289',X'0609020204030EA0057F5274
59B0257C4B'); | |
122 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 26139 26131 17 1','0 15079
77 1507977 1520578 1520594','0 3074 69188 1416111 1520594',X'0609020804030EB9516
9453423D4EA'); | |
123 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 102894 29678 1 1','0 15374
21 1550467 1564894 1564894','0 3109 69669 1459820 1564894',X'0609020204030EE3183
652A6ED3006EBCB'); | |
124 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 319 3 1 1','0 1796728 1796
746 1796747 1796747','0 3650 86468 1682243 1796747',X'0609020204031163033550D0C4
1018C28D'); | |
125 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 127 127 1 1','0 2096194 20
96194 2096205 2096205','0 5145 106437 1951535 2096205',X'060902080403180F53BB1AF
727EE50'); | |
126 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 66574 5252 1 1','0 2230524
2265961 2271212 2271212','0 5899 114976 2085829 2271212',X'0609020204031B8A0519
5009976D223B90'); | |
127 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 19440 19440 1 1','0 239168
0 2391680 2395663 2395663','0 6718 123714 2184781 2395663',X'0609020804031F7452E
00A7B07431A'); | |
128 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 18321 2177 1 1','0 2522928
2523231 2525407 2525407','0 7838 139084 2299958 2525407',X'06090201040324A74752
31103B1AA7B8'); | |
129 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 22384 1361 1 1','0 2541249
2544834 2546194 2546194','0 7839 139428 2308416 2546194',X'06090202040324A80116
52323D4B1AA9EB'); | |
130 INSERT INTO sqlite_stat4 VALUES('t1','bad','2677151 18699 855 1 1','0 2563633
2578178 2579032 2579032','0 7840 139947 2321671 2579032',X'06090202040324A907745
2323D7D1052C5'); | |
131 INSERT INTO sqlite_stat4 VALUES('t1','bad','17965 1579 1579 1 1','2677151 2690
666 2690666 2692244 2692244','1 9870 153959 2418294 2692244',X'060102080403021B8
A4FE1AB84032B35'); | |
132 ANALYZE sqlite_master; | |
133 } {} | |
134 do_execsql_test 2.2 { | |
135 EXPLAIN QUERY PLAN | |
136 SELECT COUNT(*) | |
137 FROM t1 | |
138 WHERE bb=21 | |
139 AND aa=1 | |
140 AND dd BETWEEN 1413833728 and 1413837331; | |
141 } {/INDEX good .bb=. AND aa=. AND dd>. AND dd<../} | |
142 | |
143 | |
144 # Create a table containing 100 rows. Column "a" contains a copy of the | |
145 # rowid value - sequentially increasing integers from 1 to 100. Column | |
146 # "b" contains the value of (a % 5). Columns "c" and "d" both contain | |
147 # constant values (i.e. the same for every row). | |
148 # | |
149 # Then create a second table t2. t2 is the same as t3 except for the | |
150 # order in which the indexes are created. | |
151 # | |
152 do_execsql_test 3.0 { | |
153 CREATE TABLE t3(a, b, c, d); | |
154 CREATE INDEX t3_ba ON t3(b, a, c); | |
155 CREATE INDEX t3_a ON t3(a); | |
156 | |
157 WITH d(a, b) AS ( | |
158 SELECT 1, 1 | |
159 UNION ALL | |
160 SELECT a+1, (a+1) % 5 FROM d WHERE a<100 | |
161 ) | |
162 INSERT INTO t3 SELECT a, b, 'c', 'd' FROM d; | |
163 | |
164 CREATE TABLE t2(a, b, c, d); | |
165 CREATE INDEX t2_a ON t2(a); | |
166 CREATE INDEX t2_ba ON t2(b, a, c); | |
167 INSERT INTO t2 SELECT * FROM t3; | |
168 | |
169 ANALYZE; | |
170 SELECT * FROM sqlite_stat1; | |
171 } { | |
172 t2 t2_ba {100 20 1 1} | |
173 t2 t2_a {100 1} | |
174 t3 t3_a {100 1} | |
175 t3 t3_ba {100 20 1 1} | |
176 } | |
177 | |
178 # Use index "t3_a", as (a=?) is expected to match only a single row. | |
179 # | |
180 do_eqp_test 3.1 { | |
181 SELECT * FROM t3 WHERE a = ? AND c = ? | |
182 } { | |
183 0 0 0 {SEARCH TABLE t3 USING INDEX t3_a (a=?)} | |
184 } | |
185 | |
186 # The same query on table t2. This should use index "t2_a", for the | |
187 # same reason. At one point though, it was mistakenly using a skip-scan. | |
188 # | |
189 do_eqp_test 3.2 { | |
190 SELECT * FROM t2 WHERE a = ? AND c = ? | |
191 } { | |
192 0 0 0 {SEARCH TABLE t2 USING INDEX t2_a (a=?)} | |
193 } | |
194 | |
195 finish_test | |
196 | |
197 | |
198 | |
199 | |
200 finish_test | |
OLD | NEW |