| OLD | NEW |
| 1 # 2010 November 6 | 1 # 2010 November 6 |
| 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 | 12 |
| 13 set testdir [file dirname $argv0] | 13 set testdir [file dirname $argv0] |
| 14 source $testdir/tester.tcl | 14 source $testdir/tester.tcl |
| 15 | 15 |
| 16 ifcapable !compound { |
| 17 finish_test |
| 18 return |
| 19 } |
| 20 |
| 16 set testprefix eqp | 21 set testprefix eqp |
| 17 | 22 |
| 18 #------------------------------------------------------------------------- | 23 #------------------------------------------------------------------------- |
| 19 # | 24 # |
| 20 # eqp-1.*: Assorted tests. | 25 # eqp-1.*: Assorted tests. |
| 21 # eqp-2.*: Tests for single select statements. | 26 # eqp-2.*: Tests for single select statements. |
| 22 # eqp-3.*: Select statements that execute sub-selects. | 27 # eqp-3.*: Select statements that execute sub-selects. |
| 23 # eqp-4.*: Compound select statements. | 28 # eqp-4.*: Compound select statements. |
| 24 # ... | 29 # ... |
| 25 # eqp-7.*: "SELECT count(*) FROM tbl" statements (VDBE code OP_Count). | 30 # eqp-7.*: "SELECT count(*) FROM tbl" statements (VDBE code OP_Count). |
| 26 # | 31 # |
| 27 | 32 |
| 28 proc det {args} { uplevel do_eqp_test $args } | 33 proc det {args} { uplevel do_eqp_test $args } |
| 29 | 34 |
| 30 do_execsql_test 1.1 { | 35 do_execsql_test 1.1 { |
| 31 CREATE TABLE t1(a, b); | 36 CREATE TABLE t1(a INT, b INT, ex TEXT); |
| 32 CREATE INDEX i1 ON t1(a); | 37 CREATE INDEX i1 ON t1(a); |
| 33 CREATE INDEX i2 ON t1(b); | 38 CREATE INDEX i2 ON t1(b); |
| 34 CREATE TABLE t2(a, b); | 39 CREATE TABLE t2(a INT, b INT, ex TEXT); |
| 35 CREATE TABLE t3(a, b); | 40 CREATE TABLE t3(a INT, b INT, ex TEXT); |
| 36 } | 41 } |
| 37 | 42 |
| 38 do_eqp_test 1.2 { | 43 do_eqp_test 1.2 { |
| 39 SELECT * FROM t2, t1 WHERE t1.a=1 OR t1.b=2; | 44 SELECT * FROM t2, t1 WHERE t1.a=1 OR t1.b=2; |
| 40 } { | 45 } { |
| 41 0 0 1 {SEARCH TABLE t1 USING INDEX i1 (a=?) (~10 rows)} | 46 0 0 1 {SEARCH TABLE t1 USING INDEX i1 (a=?)} |
| 42 0 0 1 {SEARCH TABLE t1 USING INDEX i2 (b=?) (~10 rows)} | 47 0 0 1 {SEARCH TABLE t1 USING INDEX i2 (b=?)} |
| 43 0 1 0 {SCAN TABLE t2 (~1000000 rows)} | 48 0 1 0 {SCAN TABLE t2} |
| 44 } | 49 } |
| 45 do_eqp_test 1.3 { | 50 do_eqp_test 1.3 { |
| 46 SELECT * FROM t2 CROSS JOIN t1 WHERE t1.a=1 OR t1.b=2; | 51 SELECT * FROM t2 CROSS JOIN t1 WHERE t1.a=1 OR t1.b=2; |
| 47 } { | 52 } { |
| 48 0 0 0 {SCAN TABLE t2 (~1000000 rows)} | 53 0 0 0 {SCAN TABLE t2} |
| 49 0 1 1 {SEARCH TABLE t1 USING INDEX i1 (a=?) (~10 rows)} | 54 0 1 1 {SEARCH TABLE t1 USING INDEX i1 (a=?)} |
| 50 0 1 1 {SEARCH TABLE t1 USING INDEX i2 (b=?) (~10 rows)} | 55 0 1 1 {SEARCH TABLE t1 USING INDEX i2 (b=?)} |
| 51 } | 56 } |
| 52 do_eqp_test 1.3 { | 57 do_eqp_test 1.3 { |
| 53 SELECT a FROM t1 ORDER BY a | 58 SELECT a FROM t1 ORDER BY a |
| 54 } { | 59 } { |
| 55 0 0 0 {SCAN TABLE t1 USING COVERING INDEX i1 (~1000000 rows)} | 60 0 0 0 {SCAN TABLE t1 USING COVERING INDEX i1} |
| 56 } | 61 } |
| 57 do_eqp_test 1.4 { | 62 do_eqp_test 1.4 { |
| 58 SELECT a FROM t1 ORDER BY +a | 63 SELECT a FROM t1 ORDER BY +a |
| 59 } { | 64 } { |
| 60 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 65 0 0 0 {SCAN TABLE t1 USING COVERING INDEX i1} |
| 61 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 66 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 62 } | 67 } |
| 63 do_eqp_test 1.5 { | 68 do_eqp_test 1.5 { |
| 64 SELECT a FROM t1 WHERE a=4 | 69 SELECT a FROM t1 WHERE a=4 |
| 65 } { | 70 } { |
| 66 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i1 (a=?) (~10 rows)} | 71 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i1 (a=?)} |
| 67 } | 72 } |
| 68 do_eqp_test 1.6 { | 73 do_eqp_test 1.6 { |
| 69 SELECT DISTINCT count(*) FROM t3 GROUP BY a; | 74 SELECT DISTINCT count(*) FROM t3 GROUP BY a; |
| 70 } { | 75 } { |
| 71 0 0 0 {SCAN TABLE t3 (~1000000 rows)} | 76 0 0 0 {SCAN TABLE t3} |
| 72 0 0 0 {USE TEMP B-TREE FOR GROUP BY} | 77 0 0 0 {USE TEMP B-TREE FOR GROUP BY} |
| 73 0 0 0 {USE TEMP B-TREE FOR DISTINCT} | 78 0 0 0 {USE TEMP B-TREE FOR DISTINCT} |
| 74 } | 79 } |
| 75 | 80 |
| 76 do_eqp_test 1.7 { | 81 do_eqp_test 1.7 { |
| 77 SELECT * FROM t3 JOIN (SELECT 1) | 82 SELECT * FROM t3 JOIN (SELECT 1) |
| 78 } { | 83 } { |
| 79 0 0 1 {SCAN SUBQUERY 1 (~1 rows)} | 84 0 0 1 {SCAN SUBQUERY 1} |
| 80 0 1 0 {SCAN TABLE t3 (~1000000 rows)} | 85 0 1 0 {SCAN TABLE t3} |
| 81 } | 86 } |
| 82 do_eqp_test 1.8 { | 87 do_eqp_test 1.8 { |
| 83 SELECT * FROM t3 JOIN (SELECT 1 UNION SELECT 2) | 88 SELECT * FROM t3 JOIN (SELECT 1 UNION SELECT 2) |
| 84 } { | 89 } { |
| 85 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (UNION)} | 90 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (UNION)} |
| 86 0 0 1 {SCAN SUBQUERY 1 (~2 rows)} | 91 0 0 1 {SCAN SUBQUERY 1} |
| 87 0 1 0 {SCAN TABLE t3 (~1000000 rows)} | 92 0 1 0 {SCAN TABLE t3} |
| 88 } | 93 } |
| 89 do_eqp_test 1.9 { | 94 do_eqp_test 1.9 { |
| 90 SELECT * FROM t3 JOIN (SELECT 1 EXCEPT SELECT a FROM t3 LIMIT 17) | 95 SELECT * FROM t3 JOIN (SELECT 1 EXCEPT SELECT a FROM t3 LIMIT 17) |
| 91 } { | 96 } { |
| 92 3 0 0 {SCAN TABLE t3 (~1000000 rows)} | 97 3 0 0 {SCAN TABLE t3} |
| 93 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (EXCEPT)} | 98 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (EXCEPT)} |
| 94 0 0 1 {SCAN SUBQUERY 1 (~17 rows)} | 99 0 0 1 {SCAN SUBQUERY 1} |
| 95 0 1 0 {SCAN TABLE t3 (~1000000 rows)} | 100 0 1 0 {SCAN TABLE t3} |
| 96 } | 101 } |
| 97 do_eqp_test 1.10 { | 102 do_eqp_test 1.10 { |
| 98 SELECT * FROM t3 JOIN (SELECT 1 INTERSECT SELECT a FROM t3 LIMIT 17) | 103 SELECT * FROM t3 JOIN (SELECT 1 INTERSECT SELECT a FROM t3 LIMIT 17) |
| 99 } { | 104 } { |
| 100 3 0 0 {SCAN TABLE t3 (~1000000 rows)} | 105 3 0 0 {SCAN TABLE t3} |
| 101 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (INTERSECT)} | 106 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (INTERSECT)} |
| 102 0 0 1 {SCAN SUBQUERY 1 (~1 rows)} | 107 0 0 1 {SCAN SUBQUERY 1} |
| 103 0 1 0 {SCAN TABLE t3 (~1000000 rows)} | 108 0 1 0 {SCAN TABLE t3} |
| 104 } | 109 } |
| 105 | 110 |
| 106 do_eqp_test 1.11 { | 111 do_eqp_test 1.11 { |
| 107 SELECT * FROM t3 JOIN (SELECT 1 UNION ALL SELECT a FROM t3 LIMIT 17) | 112 SELECT * FROM t3 JOIN (SELECT 1 UNION ALL SELECT a FROM t3 LIMIT 17) |
| 108 } { | 113 } { |
| 109 3 0 0 {SCAN TABLE t3 (~1000000 rows)} | 114 3 0 0 {SCAN TABLE t3} |
| 110 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 (UNION ALL)} | 115 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 (UNION ALL)} |
| 111 0 0 1 {SCAN SUBQUERY 1 (~17 rows)} | 116 0 0 1 {SCAN SUBQUERY 1} |
| 112 0 1 0 {SCAN TABLE t3 (~1000000 rows)} | 117 0 1 0 {SCAN TABLE t3} |
| 113 } | 118 } |
| 114 | 119 |
| 115 #------------------------------------------------------------------------- | 120 #------------------------------------------------------------------------- |
| 116 # Test cases eqp-2.* - tests for single select statements. | 121 # Test cases eqp-2.* - tests for single select statements. |
| 117 # | 122 # |
| 118 drop_all_tables | 123 drop_all_tables |
| 119 do_execsql_test 2.1 { | 124 do_execsql_test 2.1 { |
| 120 CREATE TABLE t1(x, y); | 125 CREATE TABLE t1(x INT, y INT, ex TEXT); |
| 121 | 126 |
| 122 CREATE TABLE t2(x, y); | 127 CREATE TABLE t2(x INT, y INT, ex TEXT); |
| 123 CREATE INDEX t2i1 ON t2(x); | 128 CREATE INDEX t2i1 ON t2(x); |
| 124 } | 129 } |
| 125 | 130 |
| 126 det 2.2.1 "SELECT DISTINCT min(x), max(x) FROM t1 GROUP BY x ORDER BY 1" { | 131 det 2.2.1 "SELECT DISTINCT min(x), max(x) FROM t1 GROUP BY x ORDER BY 1" { |
| 127 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 132 0 0 0 {SCAN TABLE t1} |
| 128 0 0 0 {USE TEMP B-TREE FOR GROUP BY} | 133 0 0 0 {USE TEMP B-TREE FOR GROUP BY} |
| 129 0 0 0 {USE TEMP B-TREE FOR DISTINCT} | 134 0 0 0 {USE TEMP B-TREE FOR DISTINCT} |
| 130 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 135 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 131 } | 136 } |
| 132 det 2.2.2 "SELECT DISTINCT min(x), max(x) FROM t2 GROUP BY x ORDER BY 1" { | 137 det 2.2.2 "SELECT DISTINCT min(x), max(x) FROM t2 GROUP BY x ORDER BY 1" { |
| 133 0 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1 (~1000000 rows)} | 138 0 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
| 134 0 0 0 {USE TEMP B-TREE FOR DISTINCT} | 139 0 0 0 {USE TEMP B-TREE FOR DISTINCT} |
| 135 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 140 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 136 } | 141 } |
| 137 det 2.2.3 "SELECT DISTINCT * FROM t1" { | 142 det 2.2.3 "SELECT DISTINCT * FROM t1" { |
| 138 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 143 0 0 0 {SCAN TABLE t1} |
| 139 0 0 0 {USE TEMP B-TREE FOR DISTINCT} | 144 0 0 0 {USE TEMP B-TREE FOR DISTINCT} |
| 140 } | 145 } |
| 141 det 2.2.4 "SELECT DISTINCT * FROM t1, t2" { | 146 det 2.2.4 "SELECT DISTINCT * FROM t1, t2" { |
| 142 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 147 0 0 0 {SCAN TABLE t1} |
| 143 0 1 1 {SCAN TABLE t2 (~1000000 rows)} | 148 0 1 1 {SCAN TABLE t2} |
| 144 0 0 0 {USE TEMP B-TREE FOR DISTINCT} | 149 0 0 0 {USE TEMP B-TREE FOR DISTINCT} |
| 145 } | 150 } |
| 146 det 2.2.5 "SELECT DISTINCT * FROM t1, t2 ORDER BY t1.x" { | 151 det 2.2.5 "SELECT DISTINCT * FROM t1, t2 ORDER BY t1.x" { |
| 147 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 152 0 0 0 {SCAN TABLE t1} |
| 148 0 1 1 {SCAN TABLE t2 (~1000000 rows)} | 153 0 1 1 {SCAN TABLE t2} |
| 149 0 0 0 {USE TEMP B-TREE FOR DISTINCT} | 154 0 0 0 {USE TEMP B-TREE FOR DISTINCT} |
| 150 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 155 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 151 } | 156 } |
| 152 det 2.2.6 "SELECT DISTINCT t2.x FROM t1, t2 ORDER BY t2.x" { | 157 det 2.2.6 "SELECT DISTINCT t2.x FROM t1, t2 ORDER BY t2.x" { |
| 153 0 0 1 {SCAN TABLE t2 USING COVERING INDEX t2i1 (~1000000 rows)} | 158 0 0 1 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
| 154 0 1 0 {SCAN TABLE t1 (~1000000 rows)} | 159 0 1 0 {SCAN TABLE t1} |
| 155 } | 160 } |
| 156 | 161 |
| 157 det 2.3.1 "SELECT max(x) FROM t2" { | 162 det 2.3.1 "SELECT max(x) FROM t2" { |
| 158 0 0 0 {SEARCH TABLE t2 USING COVERING INDEX t2i1 (~1 rows)} | 163 0 0 0 {SEARCH TABLE t2 USING COVERING INDEX t2i1} |
| 159 } | 164 } |
| 160 det 2.3.2 "SELECT min(x) FROM t2" { | 165 det 2.3.2 "SELECT min(x) FROM t2" { |
| 161 0 0 0 {SEARCH TABLE t2 USING COVERING INDEX t2i1 (~1 rows)} | 166 0 0 0 {SEARCH TABLE t2 USING COVERING INDEX t2i1} |
| 162 } | 167 } |
| 163 det 2.3.3 "SELECT min(x), max(x) FROM t2" { | 168 det 2.3.3 "SELECT min(x), max(x) FROM t2" { |
| 164 0 0 0 {SCAN TABLE t2 (~1000000 rows)} | 169 0 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
| 165 } | 170 } |
| 166 | 171 |
| 167 det 2.4.1 "SELECT * FROM t1 WHERE rowid=?" { | 172 det 2.4.1 "SELECT * FROM t1 WHERE rowid=?" { |
| 168 0 0 0 {SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)} | 173 0 0 0 {SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?)} |
| 169 } | 174 } |
| 170 | 175 |
| 171 | 176 |
| 172 | 177 |
| 173 #------------------------------------------------------------------------- | 178 #------------------------------------------------------------------------- |
| 174 # Test cases eqp-3.* - tests for select statements that use sub-selects. | 179 # Test cases eqp-3.* - tests for select statements that use sub-selects. |
| 175 # | 180 # |
| 176 do_eqp_test 3.1.1 { | 181 do_eqp_test 3.1.1 { |
| 177 SELECT (SELECT x FROM t1 AS sub) FROM t1; | 182 SELECT (SELECT x FROM t1 AS sub) FROM t1; |
| 178 } { | 183 } { |
| 179 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 184 0 0 0 {SCAN TABLE t1} |
| 180 0 0 0 {EXECUTE SCALAR SUBQUERY 1} | 185 0 0 0 {EXECUTE SCALAR SUBQUERY 1} |
| 181 1 0 0 {SCAN TABLE t1 AS sub (~1000000 rows)} | 186 1 0 0 {SCAN TABLE t1 AS sub} |
| 182 } | 187 } |
| 183 do_eqp_test 3.1.2 { | 188 do_eqp_test 3.1.2 { |
| 184 SELECT * FROM t1 WHERE (SELECT x FROM t1 AS sub); | 189 SELECT * FROM t1 WHERE (SELECT x FROM t1 AS sub); |
| 185 } { | 190 } { |
| 186 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 191 0 0 0 {SCAN TABLE t1} |
| 187 0 0 0 {EXECUTE SCALAR SUBQUERY 1} | 192 0 0 0 {EXECUTE SCALAR SUBQUERY 1} |
| 188 1 0 0 {SCAN TABLE t1 AS sub (~1000000 rows)} | 193 1 0 0 {SCAN TABLE t1 AS sub} |
| 189 } | 194 } |
| 190 do_eqp_test 3.1.3 { | 195 do_eqp_test 3.1.3 { |
| 191 SELECT * FROM t1 WHERE (SELECT x FROM t1 AS sub ORDER BY y); | 196 SELECT * FROM t1 WHERE (SELECT x FROM t1 AS sub ORDER BY y); |
| 192 } { | 197 } { |
| 193 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 198 0 0 0 {SCAN TABLE t1} |
| 194 0 0 0 {EXECUTE SCALAR SUBQUERY 1} | 199 0 0 0 {EXECUTE SCALAR SUBQUERY 1} |
| 195 1 0 0 {SCAN TABLE t1 AS sub (~1000000 rows)} | 200 1 0 0 {SCAN TABLE t1 AS sub} |
| 196 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 201 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 197 } | 202 } |
| 198 do_eqp_test 3.1.4 { | 203 do_eqp_test 3.1.4 { |
| 199 SELECT * FROM t1 WHERE (SELECT x FROM t2 ORDER BY x); | 204 SELECT * FROM t1 WHERE (SELECT x FROM t2 ORDER BY x); |
| 200 } { | 205 } { |
| 201 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 206 0 0 0 {SCAN TABLE t1} |
| 202 0 0 0 {EXECUTE SCALAR SUBQUERY 1} | 207 0 0 0 {EXECUTE SCALAR SUBQUERY 1} |
| 203 1 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1 (~1000000 rows)} | 208 1 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
| 204 } | 209 } |
| 205 | 210 |
| 206 det 3.2.1 { | 211 det 3.2.1 { |
| 207 SELECT * FROM (SELECT * FROM t1 ORDER BY x LIMIT 10) ORDER BY y LIMIT 5 | 212 SELECT * FROM (SELECT * FROM t1 ORDER BY x LIMIT 10) ORDER BY y LIMIT 5 |
| 208 } { | 213 } { |
| 209 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 214 1 0 0 {SCAN TABLE t1} |
| 210 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 215 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 211 0 0 0 {SCAN SUBQUERY 1 (~10 rows)} | 216 0 0 0 {SCAN SUBQUERY 1} |
| 212 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 217 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 213 } | 218 } |
| 214 det 3.2.2 { | 219 det 3.2.2 { |
| 215 SELECT * FROM | 220 SELECT * FROM |
| 216 (SELECT * FROM t1 ORDER BY x LIMIT 10) AS x1, | 221 (SELECT * FROM t1 ORDER BY x LIMIT 10) AS x1, |
| 217 (SELECT * FROM t2 ORDER BY x LIMIT 10) AS x2 | 222 (SELECT * FROM t2 ORDER BY x LIMIT 10) AS x2 |
| 218 ORDER BY x2.y LIMIT 5 | 223 ORDER BY x2.y LIMIT 5 |
| 219 } { | 224 } { |
| 220 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 225 1 0 0 {SCAN TABLE t1} |
| 221 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 226 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 222 2 0 0 {SCAN TABLE t2 USING INDEX t2i1 (~1000000 rows)} | 227 2 0 0 {SCAN TABLE t2 USING INDEX t2i1} |
| 223 0 0 0 {SCAN SUBQUERY 1 AS x1 (~10 rows)} | 228 0 0 0 {SCAN SUBQUERY 1 AS x1} |
| 224 0 1 1 {SCAN SUBQUERY 2 AS x2 (~10 rows)} | 229 0 1 1 {SCAN SUBQUERY 2 AS x2} |
| 225 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 230 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 226 } | 231 } |
| 227 | 232 |
| 228 det 3.3.1 { | 233 det 3.3.1 { |
| 229 SELECT * FROM t1 WHERE y IN (SELECT y FROM t2) | 234 SELECT * FROM t1 WHERE y IN (SELECT y FROM t2) |
| 230 } { | 235 } { |
| 231 0 0 0 {SCAN TABLE t1 (~100000 rows)} | 236 0 0 0 {SCAN TABLE t1} |
| 232 0 0 0 {EXECUTE LIST SUBQUERY 1} | 237 0 0 0 {EXECUTE LIST SUBQUERY 1} |
| 233 1 0 0 {SCAN TABLE t2 (~1000000 rows)} | 238 1 0 0 {SCAN TABLE t2} |
| 234 } | 239 } |
| 235 det 3.3.2 { | 240 det 3.3.2 { |
| 236 SELECT * FROM t1 WHERE y IN (SELECT y FROM t2 WHERE t1.x!=t2.x) | 241 SELECT * FROM t1 WHERE y IN (SELECT y FROM t2 WHERE t1.x!=t2.x) |
| 237 } { | 242 } { |
| 238 0 0 0 {SCAN TABLE t1 (~500000 rows)} | 243 0 0 0 {SCAN TABLE t1} |
| 239 0 0 0 {EXECUTE CORRELATED LIST SUBQUERY 1} | 244 0 0 0 {EXECUTE CORRELATED LIST SUBQUERY 1} |
| 240 1 0 0 {SCAN TABLE t2 (~500000 rows)} | 245 1 0 0 {SCAN TABLE t2} |
| 241 } | 246 } |
| 242 det 3.3.3 { | 247 det 3.3.3 { |
| 243 SELECT * FROM t1 WHERE EXISTS (SELECT y FROM t2 WHERE t1.x!=t2.x) | 248 SELECT * FROM t1 WHERE EXISTS (SELECT y FROM t2 WHERE t1.x!=t2.x) |
| 244 } { | 249 } { |
| 245 0 0 0 {SCAN TABLE t1 (~500000 rows)} | 250 0 0 0 {SCAN TABLE t1} |
| 246 0 0 0 {EXECUTE CORRELATED SCALAR SUBQUERY 1} | 251 0 0 0 {EXECUTE CORRELATED SCALAR SUBQUERY 1} |
| 247 1 0 0 {SCAN TABLE t2 (~500000 rows)} | 252 1 0 0 {SCAN TABLE t2} |
| 248 } | 253 } |
| 249 | 254 |
| 250 #------------------------------------------------------------------------- | 255 #------------------------------------------------------------------------- |
| 251 # Test cases eqp-4.* - tests for composite select statements. | 256 # Test cases eqp-4.* - tests for composite select statements. |
| 252 # | 257 # |
| 253 do_eqp_test 4.1.1 { | 258 do_eqp_test 4.1.1 { |
| 254 SELECT * FROM t1 UNION ALL SELECT * FROM t2 | 259 SELECT * FROM t1 UNION ALL SELECT * FROM t2 |
| 255 } { | 260 } { |
| 256 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 261 1 0 0 {SCAN TABLE t1} |
| 257 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 262 2 0 0 {SCAN TABLE t2} |
| 258 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)} | 263 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)} |
| 259 } | 264 } |
| 260 do_eqp_test 4.1.2 { | 265 do_eqp_test 4.1.2 { |
| 261 SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY 2 | 266 SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY 2 |
| 262 } { | 267 } { |
| 263 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 268 1 0 0 {SCAN TABLE t1} |
| 264 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 269 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 265 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 270 2 0 0 {SCAN TABLE t2} |
| 266 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 271 2 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 267 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)} | 272 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)} |
| 268 } | 273 } |
| 269 do_eqp_test 4.1.3 { | 274 do_eqp_test 4.1.3 { |
| 270 SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY 2 | 275 SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY 2 |
| 271 } { | 276 } { |
| 272 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 277 1 0 0 {SCAN TABLE t1} |
| 273 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 278 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 274 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 279 2 0 0 {SCAN TABLE t2} |
| 275 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 280 2 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 276 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION)} | 281 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION)} |
| 277 } | 282 } |
| 278 do_eqp_test 4.1.4 { | 283 do_eqp_test 4.1.4 { |
| 279 SELECT * FROM t1 INTERSECT SELECT * FROM t2 ORDER BY 2 | 284 SELECT * FROM t1 INTERSECT SELECT * FROM t2 ORDER BY 2 |
| 280 } { | 285 } { |
| 281 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 286 1 0 0 {SCAN TABLE t1} |
| 282 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 287 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 283 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 288 2 0 0 {SCAN TABLE t2} |
| 284 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 289 2 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 285 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (INTERSECT)} | 290 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (INTERSECT)} |
| 286 } | 291 } |
| 287 do_eqp_test 4.1.5 { | 292 do_eqp_test 4.1.5 { |
| 288 SELECT * FROM t1 EXCEPT SELECT * FROM t2 ORDER BY 2 | 293 SELECT * FROM t1 EXCEPT SELECT * FROM t2 ORDER BY 2 |
| 289 } { | 294 } { |
| 290 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 295 1 0 0 {SCAN TABLE t1} |
| 291 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 296 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 292 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 297 2 0 0 {SCAN TABLE t2} |
| 293 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 298 2 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 294 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (EXCEPT)} | 299 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (EXCEPT)} |
| 295 } | 300 } |
| 296 | 301 |
| 297 do_eqp_test 4.2.2 { | 302 do_eqp_test 4.2.2 { |
| 298 SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY 1 | 303 SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY 1 |
| 299 } { | 304 } { |
| 300 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 305 1 0 0 {SCAN TABLE t1} |
| 301 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 306 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 302 2 0 0 {SCAN TABLE t2 USING INDEX t2i1 (~1000000 rows)} | 307 2 0 0 {SCAN TABLE t2 USING INDEX t2i1} |
| 303 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)} | 308 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)} |
| 304 } | 309 } |
| 305 do_eqp_test 4.2.3 { | 310 do_eqp_test 4.2.3 { |
| 306 SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY 1 | 311 SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY 1 |
| 307 } { | 312 } { |
| 308 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 313 1 0 0 {SCAN TABLE t1} |
| 309 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 314 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 310 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 315 2 0 0 {SCAN TABLE t2 USING INDEX t2i1} |
| 311 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 316 2 0 0 {USE TEMP B-TREE FOR RIGHT PART OF ORDER BY} |
| 312 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION)} | 317 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION)} |
| 313 } | 318 } |
| 314 do_eqp_test 4.2.4 { | 319 do_eqp_test 4.2.4 { |
| 315 SELECT * FROM t1 INTERSECT SELECT * FROM t2 ORDER BY 1 | 320 SELECT * FROM t1 INTERSECT SELECT * FROM t2 ORDER BY 1 |
| 316 } { | 321 } { |
| 317 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 322 1 0 0 {SCAN TABLE t1} |
| 318 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 323 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 319 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 324 2 0 0 {SCAN TABLE t2 USING INDEX t2i1} |
| 320 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 325 2 0 0 {USE TEMP B-TREE FOR RIGHT PART OF ORDER BY} |
| 321 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (INTERSECT)} | 326 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (INTERSECT)} |
| 322 } | 327 } |
| 323 do_eqp_test 4.2.5 { | 328 do_eqp_test 4.2.5 { |
| 324 SELECT * FROM t1 EXCEPT SELECT * FROM t2 ORDER BY 1 | 329 SELECT * FROM t1 EXCEPT SELECT * FROM t2 ORDER BY 1 |
| 325 } { | 330 } { |
| 326 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 331 1 0 0 {SCAN TABLE t1} |
| 327 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 332 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 328 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 333 2 0 0 {SCAN TABLE t2 USING INDEX t2i1} |
| 329 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 334 2 0 0 {USE TEMP B-TREE FOR RIGHT PART OF ORDER BY} |
| 330 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (EXCEPT)} | 335 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (EXCEPT)} |
| 331 } | 336 } |
| 332 | 337 |
| 333 do_eqp_test 4.3.1 { | 338 do_eqp_test 4.3.1 { |
| 334 SELECT x FROM t1 UNION SELECT x FROM t2 | 339 SELECT x FROM t1 UNION SELECT x FROM t2 |
| 335 } { | 340 } { |
| 336 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 341 1 0 0 {SCAN TABLE t1} |
| 337 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 342 2 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
| 338 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 USING TEMP B-TREE (UNION)} | 343 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 USING TEMP B-TREE (UNION)} |
| 339 } | 344 } |
| 340 | 345 |
| 341 do_eqp_test 4.3.2 { | 346 do_eqp_test 4.3.2 { |
| 342 SELECT x FROM t1 UNION SELECT x FROM t2 UNION SELECT x FROM t1 | 347 SELECT x FROM t1 UNION SELECT x FROM t2 UNION SELECT x FROM t1 |
| 343 } { | 348 } { |
| 344 2 0 0 {SCAN TABLE t1 (~1000000 rows)} | 349 2 0 0 {SCAN TABLE t1} |
| 345 3 0 0 {SCAN TABLE t2 (~1000000 rows)} | 350 3 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
| 346 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (UNION)} | 351 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (UNION)} |
| 347 4 0 0 {SCAN TABLE t1 (~1000000 rows)} | 352 4 0 0 {SCAN TABLE t1} |
| 348 0 0 0 {COMPOUND SUBQUERIES 1 AND 4 USING TEMP B-TREE (UNION)} | 353 0 0 0 {COMPOUND SUBQUERIES 1 AND 4 USING TEMP B-TREE (UNION)} |
| 349 } | 354 } |
| 350 do_eqp_test 4.3.3 { | 355 do_eqp_test 4.3.3 { |
| 351 SELECT x FROM t1 UNION SELECT x FROM t2 UNION SELECT x FROM t1 ORDER BY 1 | 356 SELECT x FROM t1 UNION SELECT x FROM t2 UNION SELECT x FROM t1 ORDER BY 1 |
| 352 } { | 357 } { |
| 353 2 0 0 {SCAN TABLE t1 (~1000000 rows)} | 358 2 0 0 {SCAN TABLE t1} |
| 354 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 359 2 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 355 3 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1 (~1000000 rows)} | 360 3 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
| 356 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 (UNION)} | 361 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 (UNION)} |
| 357 4 0 0 {SCAN TABLE t1 (~1000000 rows)} | 362 4 0 0 {SCAN TABLE t1} |
| 358 4 0 0 {USE TEMP B-TREE FOR ORDER BY} | 363 4 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 359 0 0 0 {COMPOUND SUBQUERIES 1 AND 4 (UNION)} | 364 0 0 0 {COMPOUND SUBQUERIES 1 AND 4 (UNION)} |
| 360 } | 365 } |
| 361 | 366 |
| 362 #------------------------------------------------------------------------- | 367 #------------------------------------------------------------------------- |
| 363 # This next block of tests verifies that the examples on the | 368 # This next block of tests verifies that the examples on the |
| 364 # lang_explain.html page are correct. | 369 # lang_explain.html page are correct. |
| 365 # | 370 # |
| 366 drop_all_tables | 371 drop_all_tables |
| 367 | 372 |
| 368 # EVIDENCE-OF: R-64208-08323 sqlite> EXPLAIN QUERY PLAN SELECT a, b | 373 # EVIDENCE-OF: R-47779-47605 sqlite> EXPLAIN QUERY PLAN SELECT a, b |
| 369 # FROM t1 WHERE a=1; 0|0|0|SCAN TABLE t1 (~100000 rows) | 374 # FROM t1 WHERE a=1; |
| 370 do_execsql_test 5.1.0 { CREATE TABLE t1(a, b) } | 375 # 0|0|0|SCAN TABLE t1 |
| 376 # |
| 377 do_execsql_test 5.1.0 { CREATE TABLE t1(a INT, b INT, ex TEXT) } |
| 371 det 5.1.1 "SELECT a, b FROM t1 WHERE a=1" { | 378 det 5.1.1 "SELECT a, b FROM t1 WHERE a=1" { |
| 372 0 0 0 {SCAN TABLE t1 (~100000 rows)} | 379 0 0 0 {SCAN TABLE t1} |
| 373 } | 380 } |
| 374 | 381 |
| 375 # EVIDENCE-OF: R-09022-44606 sqlite> CREATE INDEX i1 ON t1(a); | 382 # EVIDENCE-OF: R-55852-17599 sqlite> CREATE INDEX i1 ON t1(a); |
| 376 # sqlite> EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1; | 383 # sqlite> EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1; |
| 377 # 0|0|0|SEARCH TABLE t1 USING INDEX i1 (a=?) (~10 rows) | 384 # 0|0|0|SEARCH TABLE t1 USING INDEX i1 |
| 385 # |
| 378 do_execsql_test 5.2.0 { CREATE INDEX i1 ON t1(a) } | 386 do_execsql_test 5.2.0 { CREATE INDEX i1 ON t1(a) } |
| 379 det 5.2.1 "SELECT a, b FROM t1 WHERE a=1" { | 387 det 5.2.1 "SELECT a, b FROM t1 WHERE a=1" { |
| 380 0 0 0 {SEARCH TABLE t1 USING INDEX i1 (a=?) (~10 rows)} | 388 0 0 0 {SEARCH TABLE t1 USING INDEX i1 (a=?)} |
| 381 } | 389 } |
| 382 | 390 |
| 383 # EVIDENCE-OF: R-62228-34103 sqlite> CREATE INDEX i2 ON t1(a, b); | 391 # EVIDENCE-OF: R-21179-11011 sqlite> CREATE INDEX i2 ON t1(a, b); |
| 384 # sqlite> EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1; | 392 # sqlite> EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1; |
| 385 # 0|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) (~10 rows) | 393 # 0|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) |
| 394 # |
| 386 do_execsql_test 5.3.0 { CREATE INDEX i2 ON t1(a, b) } | 395 do_execsql_test 5.3.0 { CREATE INDEX i2 ON t1(a, b) } |
| 387 det 5.3.1 "SELECT a, b FROM t1 WHERE a=1" { | 396 det 5.3.1 "SELECT a, b FROM t1 WHERE a=1" { |
| 388 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) (~10 rows)} | 397 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=?)} |
| 389 } | 398 } |
| 390 | 399 |
| 391 # EVIDENCE-OF: R-22253-05302 sqlite> EXPLAIN QUERY PLAN SELECT t1.*, | 400 # EVIDENCE-OF: R-09991-48941 sqlite> EXPLAIN QUERY PLAN |
| 392 # t2.* FROM t1, t2 WHERE t1.a=1 AND t1.b>2; 0|0|0|SEARCH TABLE t1 | 401 # SELECT t1.*, t2.* FROM t1, t2 WHERE t1.a=1 AND t1.b>2; |
| 393 # USING COVERING INDEX i2 (a=? AND b>?) (~3 rows) 0|1|1|SCAN TABLE t2 | 402 # 0|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=? AND b>?) |
| 394 # (~1000000 rows) | 403 # 0|1|1|SCAN TABLE t2 |
| 395 do_execsql_test 5.4.0 {CREATE TABLE t2(c, d)} | 404 # |
| 396 det 5.4.1 "SELECT t1.*, t2.* FROM t1, t2 WHERE t1.a=1 AND t1.b>2" { | 405 do_execsql_test 5.4.0 {CREATE TABLE t2(c INT, d INT, ex TEXT)} |
| 397 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=? AND b>?) (~2 rows)} | 406 det 5.4.1 "SELECT t1.a, t2.c FROM t1, t2 WHERE t1.a=1 AND t1.b>2" { |
| 398 0 1 1 {SCAN TABLE t2 (~1000000 rows)} | 407 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=? AND b>?)} |
| 408 0 1 1 {SCAN TABLE t2} |
| 399 } | 409 } |
| 400 | 410 |
| 401 # EVIDENCE-OF: R-21040-07025 sqlite> EXPLAIN QUERY PLAN SELECT t1.*, | 411 # EVIDENCE-OF: R-33626-61085 sqlite> EXPLAIN QUERY PLAN |
| 402 # t2.* FROM t2, t1 WHERE t1.a=1 AND t1.b>2; 0|0|1|SEARCH TABLE t1 | 412 # SELECT t1.*, t2.* FROM t2, t1 WHERE t1.a=1 AND t1.b>2; |
| 403 # USING COVERING INDEX i2 (a=? AND b>?) (~3 rows) 0|1|0|SCAN TABLE t2 | 413 # 0|0|1|SEARCH TABLE t1 USING COVERING INDEX i2 (a=? AND b>?) |
| 404 # (~1000000 rows) | 414 # 0|1|0|SCAN TABLE t2 |
| 405 det 5.5 "SELECT t1.*, t2.* FROM t2, t1 WHERE t1.a=1 AND t1.b>2" { | 415 # |
| 406 0 0 1 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=? AND b>?) (~2 rows)} | 416 det 5.5 "SELECT t1.a, t2.c FROM t2, t1 WHERE t1.a=1 AND t1.b>2" { |
| 407 0 1 0 {SCAN TABLE t2 (~1000000 rows)} | 417 0 0 1 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=? AND b>?)} |
| 418 0 1 0 {SCAN TABLE t2} |
| 408 } | 419 } |
| 409 | 420 |
| 410 # EVIDENCE-OF: R-39007-61103 sqlite> CREATE INDEX i3 ON t1(b); | 421 # EVIDENCE-OF: R-04002-25654 sqlite> CREATE INDEX i3 ON t1(b); |
| 411 # sqlite> EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=1 OR b=2; | 422 # sqlite> EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=1 OR b=2; |
| 412 # 0|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) (~10 rows) | 423 # 0|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) |
| 413 # 0|0|0|SEARCH TABLE t1 USING INDEX i3 (b=?) (~10 rows) | 424 # 0|0|0|SEARCH TABLE t1 USING INDEX i3 (b=?) |
| 425 # |
| 414 do_execsql_test 5.5.0 {CREATE INDEX i3 ON t1(b)} | 426 do_execsql_test 5.5.0 {CREATE INDEX i3 ON t1(b)} |
| 415 det 5.6.1 "SELECT * FROM t1 WHERE a=1 OR b=2" { | 427 det 5.6.1 "SELECT a, b FROM t1 WHERE a=1 OR b=2" { |
| 416 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) (~10 rows)} | 428 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=?)} |
| 417 0 0 0 {SEARCH TABLE t1 USING INDEX i3 (b=?) (~10 rows)} | 429 0 0 0 {SEARCH TABLE t1 USING INDEX i3 (b=?)} |
| 418 } | 430 } |
| 419 | 431 |
| 420 # EVIDENCE-OF: R-33025-54904 sqlite> EXPLAIN QUERY PLAN SELECT c, d | 432 # EVIDENCE-OF: R-24577-38891 sqlite> EXPLAIN QUERY PLAN |
| 421 # FROM t2 ORDER BY c; 0|0|0|SCAN TABLE t2 (~1000000 rows) 0|0|0|USE TEMP | 433 # SELECT c, d FROM t2 ORDER BY c; |
| 422 # B-TREE FOR ORDER BY | 434 # 0|0|0|SCAN TABLE t2 |
| 435 # 0|0|0|USE TEMP B-TREE FOR ORDER BY |
| 436 # |
| 423 det 5.7 "SELECT c, d FROM t2 ORDER BY c" { | 437 det 5.7 "SELECT c, d FROM t2 ORDER BY c" { |
| 424 0 0 0 {SCAN TABLE t2 (~1000000 rows)} | 438 0 0 0 {SCAN TABLE t2} |
| 425 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 439 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 426 } | 440 } |
| 427 | 441 |
| 428 # EVIDENCE-OF: R-38854-22809 sqlite> CREATE INDEX i4 ON t2(c); | 442 # EVIDENCE-OF: R-58157-12355 sqlite> CREATE INDEX i4 ON t2(c); |
| 429 # sqlite> EXPLAIN QUERY PLAN SELECT c, d FROM t2 ORDER BY c; | 443 # sqlite> EXPLAIN QUERY PLAN SELECT c, d FROM t2 ORDER BY c; |
| 430 # 0|0|0|SCAN TABLE t2 USING INDEX i4 (~1000000 rows) | 444 # 0|0|0|SCAN TABLE t2 USING INDEX i4 |
| 445 # |
| 431 do_execsql_test 5.8.0 {CREATE INDEX i4 ON t2(c)} | 446 do_execsql_test 5.8.0 {CREATE INDEX i4 ON t2(c)} |
| 432 det 5.8.1 "SELECT c, d FROM t2 ORDER BY c" { | 447 det 5.8.1 "SELECT c, d FROM t2 ORDER BY c" { |
| 433 0 0 0 {SCAN TABLE t2 USING INDEX i4 (~1000000 rows)} | 448 0 0 0 {SCAN TABLE t2 USING INDEX i4} |
| 434 } | 449 } |
| 435 | 450 |
| 436 # EVIDENCE-OF: R-29884-43993 sqlite> EXPLAIN QUERY PLAN SELECT | 451 # EVIDENCE-OF: R-13931-10421 sqlite> EXPLAIN QUERY PLAN SELECT |
| 437 # (SELECT b FROM t1 WHERE a=0), (SELECT a FROM t1 WHERE b=t2.c) FROM t2; | 452 # (SELECT b FROM t1 WHERE a=0), (SELECT a FROM t1 WHERE b=t2.c) FROM t2; |
| 438 # 0|0|0|SCAN TABLE t2 (~1000000 rows) 0|0|0|EXECUTE SCALAR SUBQUERY 1 | 453 # 0|0|0|SCAN TABLE t2 |
| 439 # 1|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) (~10 rows) | 454 # 0|0|0|EXECUTE SCALAR SUBQUERY 1 |
| 440 # 0|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 2 2|0|0|SEARCH TABLE t1 USING | 455 # 1|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) |
| 441 # INDEX i3 (b=?) (~10 rows) | 456 # 0|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 2 |
| 457 # 2|0|0|SEARCH TABLE t1 USING INDEX i3 (b=?) |
| 458 # |
| 442 det 5.9 { | 459 det 5.9 { |
| 443 SELECT (SELECT b FROM t1 WHERE a=0), (SELECT a FROM t1 WHERE b=t2.c) FROM t2 | 460 SELECT (SELECT b FROM t1 WHERE a=0), (SELECT a FROM t1 WHERE b=t2.c) FROM t2 |
| 444 } { | 461 } { |
| 445 0 0 0 {SCAN TABLE t2 (~1000000 rows)} | 462 0 0 0 {SCAN TABLE t2 USING COVERING INDEX i4} |
| 446 0 0 0 {EXECUTE SCALAR SUBQUERY 1} | 463 0 0 0 {EXECUTE SCALAR SUBQUERY 1} |
| 447 1 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) (~10 rows)} | 464 1 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=?)} |
| 448 0 0 0 {EXECUTE CORRELATED SCALAR SUBQUERY 2} | 465 0 0 0 {EXECUTE CORRELATED SCALAR SUBQUERY 2} |
| 449 2 0 0 {SEARCH TABLE t1 USING INDEX i3 (b=?) (~10 rows)} | 466 2 0 0 {SEARCH TABLE t1 USING INDEX i3 (b=?)} |
| 450 } | 467 } |
| 451 | 468 |
| 452 # EVIDENCE-OF: R-17911-16445 sqlite> EXPLAIN QUERY PLAN SELECT | 469 # EVIDENCE-OF: R-50892-45943 sqlite> EXPLAIN QUERY PLAN |
| 453 # count(*) FROM (SELECT max(b) AS x FROM t1 GROUP BY a) GROUP BY x; | 470 # SELECT count(*) FROM (SELECT max(b) AS x FROM t1 GROUP BY a) GROUP BY x; |
| 454 # 1|0|0|SCAN TABLE t1 USING COVERING INDEX i2 (~1000000 rows) 0|0|0|SCAN | 471 # 1|0|0|SCAN TABLE t1 USING COVERING INDEX i2 |
| 455 # SUBQUERY 1 (~1000000 rows) 0|0|0|USE TEMP B-TREE FOR GROUP BY | 472 # 0|0|0|SCAN SUBQUERY 1 |
| 473 # 0|0|0|USE TEMP B-TREE FOR GROUP BY |
| 474 # |
| 456 det 5.10 { | 475 det 5.10 { |
| 457 SELECT count(*) FROM (SELECT max(b) AS x FROM t1 GROUP BY a) GROUP BY x | 476 SELECT count(*) FROM (SELECT max(b) AS x FROM t1 GROUP BY a) GROUP BY x |
| 458 } { | 477 } { |
| 459 1 0 0 {SCAN TABLE t1 USING COVERING INDEX i2 (~1000000 rows)} | 478 1 0 0 {SCAN TABLE t1 USING COVERING INDEX i2} |
| 460 0 0 0 {SCAN SUBQUERY 1 (~100 rows)} | 479 0 0 0 {SCAN SUBQUERY 1} |
| 461 0 0 0 {USE TEMP B-TREE FOR GROUP BY} | 480 0 0 0 {USE TEMP B-TREE FOR GROUP BY} |
| 462 } | 481 } |
| 463 | 482 |
| 464 # EVIDENCE-OF: R-18544-33103 sqlite> EXPLAIN QUERY PLAN SELECT * FROM | 483 # EVIDENCE-OF: R-46219-33846 sqlite> EXPLAIN QUERY PLAN |
| 465 # (SELECT * FROM t2 WHERE c=1), t1; 0|0|0|SEARCH TABLE t2 USING INDEX i4 | 484 # SELECT * FROM (SELECT * FROM t2 WHERE c=1), t1; |
| 466 # (c=?) (~10 rows) 0|1|1|SCAN TABLE t1 (~1000000 rows) | 485 # 0|0|0|SEARCH TABLE t2 USING INDEX i4 (c=?) |
| 467 det 5.11 "SELECT * FROM (SELECT * FROM t2 WHERE c=1), t1" { | 486 # 0|1|1|SCAN TABLE t1 |
| 468 0 0 0 {SEARCH TABLE t2 USING INDEX i4 (c=?) (~10 rows)} | 487 # |
| 469 0 1 1 {SCAN TABLE t1 (~1000000 rows)} | 488 det 5.11 "SELECT a, b FROM (SELECT * FROM t2 WHERE c=1), t1" { |
| 489 0 0 0 {SEARCH TABLE t2 USING INDEX i4 (c=?)} |
| 490 0 1 1 {SCAN TABLE t1 USING COVERING INDEX i2} |
| 470 } | 491 } |
| 471 | 492 |
| 472 # EVIDENCE-OF: R-40701-42164 sqlite> EXPLAIN QUERY PLAN SELECT a FROM | 493 # EVIDENCE-OF: R-37879-39987 sqlite> EXPLAIN QUERY PLAN |
| 473 # t1 UNION SELECT c FROM t2; 1|0|0|SCAN TABLE t1 (~1000000 rows) | 494 # SELECT a FROM t1 UNION SELECT c FROM t2; |
| 474 # 2|0|0|SCAN TABLE t2 (~1000000 rows) 0|0|0|COMPOUND SUBQUERIES 1 AND 2 | 495 # 1|0|0|SCAN TABLE t1 |
| 475 # USING TEMP B-TREE (UNION) | 496 # 2|0|0|SCAN TABLE t2 |
| 476 det 5.12 "SELECT a FROM t1 UNION SELECT c FROM t2" { | 497 # 0|0|0|COMPOUND SUBQUERIES 1 AND 2 USING TEMP B-TREE (UNION) |
| 477 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 498 # |
| 478 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 499 det 5.12 "SELECT a,b FROM t1 UNION SELECT c, 99 FROM t2" { |
| 500 1 0 0 {SCAN TABLE t1 USING COVERING INDEX i2} |
| 501 2 0 0 {SCAN TABLE t2 USING COVERING INDEX i4} |
| 479 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 USING TEMP B-TREE (UNION)} | 502 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 USING TEMP B-TREE (UNION)} |
| 480 } | 503 } |
| 481 | 504 |
| 482 # EVIDENCE-OF: R-61538-24748 sqlite> EXPLAIN QUERY PLAN SELECT a FROM | 505 # EVIDENCE-OF: R-44864-63011 sqlite> EXPLAIN QUERY PLAN |
| 483 # t1 EXCEPT SELECT d FROM t2 ORDER BY 1; 1|0|0|SCAN TABLE t1 USING | 506 # SELECT a FROM t1 EXCEPT SELECT d FROM t2 ORDER BY 1; |
| 484 # COVERING INDEX i2 (~1000000 rows) 2|0|0|SCAN TABLE t2 (~1000000 rows) | 507 # 1|0|0|SCAN TABLE t1 USING COVERING INDEX i2 |
| 485 # 2|0|0|USE TEMP B-TREE FOR ORDER BY 0|0|0|COMPOUND SUBQUERIES 1 AND 2 | 508 # 2|0|0|SCAN TABLE t2 2|0|0|USE TEMP B-TREE FOR ORDER BY |
| 486 # (EXCEPT) | 509 # 0|0|0|COMPOUND SUBQUERIES 1 AND 2 (EXCEPT) |
| 510 # |
| 487 det 5.13 "SELECT a FROM t1 EXCEPT SELECT d FROM t2 ORDER BY 1" { | 511 det 5.13 "SELECT a FROM t1 EXCEPT SELECT d FROM t2 ORDER BY 1" { |
| 488 1 0 0 {SCAN TABLE t1 USING COVERING INDEX i2 (~1000000 rows)} | 512 1 0 0 {SCAN TABLE t1 USING COVERING INDEX i1} |
| 489 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 513 2 0 0 {SCAN TABLE t2} |
| 490 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 514 2 0 0 {USE TEMP B-TREE FOR ORDER BY} |
| 491 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (EXCEPT)} | 515 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (EXCEPT)} |
| 492 } | 516 } |
| 493 | 517 |
| 494 | 518 |
| 495 #------------------------------------------------------------------------- | 519 #------------------------------------------------------------------------- |
| 496 # The following tests - eqp-6.* - test that the example C code on | 520 # The following tests - eqp-6.* - test that the example C code on |
| 497 # documentation page eqp.html works. The C code is duplicated in test1.c | 521 # documentation page eqp.html works. The C code is duplicated in test1.c |
| 498 # and wrapped in Tcl command [print_explain_query_plan] | 522 # and wrapped in Tcl command [print_explain_query_plan] |
| 499 # | 523 # |
| (...skipping 17 matching lines...) Expand all Loading... |
| 517 | 541 |
| 518 uplevel do_test $tn [list { | 542 uplevel do_test $tn [list { |
| 519 set fd [open "|[info nameofexec] script.tcl"] | 543 set fd [open "|[info nameofexec] script.tcl"] |
| 520 set data [read $fd] | 544 set data [read $fd] |
| 521 close $fd | 545 close $fd |
| 522 set data | 546 set data |
| 523 }] [list $res] | 547 }] [list $res] |
| 524 } | 548 } |
| 525 | 549 |
| 526 do_peqp_test 6.1 { | 550 do_peqp_test 6.1 { |
| 527 SELECT a FROM t1 EXCEPT SELECT d FROM t2 ORDER BY 1 | 551 SELECT a, b FROM t1 EXCEPT SELECT d, 99 FROM t2 ORDER BY 1 |
| 528 } [string trimleft { | 552 } [string trimleft { |
| 529 1 0 0 SCAN TABLE t1 USING COVERING INDEX i2 (~1000000 rows) | 553 1 0 0 SCAN TABLE t1 USING COVERING INDEX i2 |
| 530 2 0 0 SCAN TABLE t2 (~1000000 rows) | 554 2 0 0 SCAN TABLE t2 |
| 531 2 0 0 USE TEMP B-TREE FOR ORDER BY | 555 2 0 0 USE TEMP B-TREE FOR ORDER BY |
| 532 0 0 0 COMPOUND SUBQUERIES 1 AND 2 (EXCEPT) | 556 0 0 0 COMPOUND SUBQUERIES 1 AND 2 (EXCEPT) |
| 533 }] | 557 }] |
| 534 | 558 |
| 535 #------------------------------------------------------------------------- | 559 #------------------------------------------------------------------------- |
| 536 # The following tests - eqp-7.* - test that queries that use the OP_Count | 560 # The following tests - eqp-7.* - test that queries that use the OP_Count |
| 537 # optimization return something sensible with EQP. | 561 # optimization return something sensible with EQP. |
| 538 # | 562 # |
| 539 drop_all_tables | 563 drop_all_tables |
| 540 | 564 |
| 541 do_execsql_test 7.0 { | 565 do_execsql_test 7.0 { |
| 542 CREATE TABLE t1(a, b); | 566 CREATE TABLE t1(a INT, b INT, ex CHAR(100)); |
| 543 CREATE TABLE t2(a, b); | 567 CREATE TABLE t2(a INT, b INT, ex CHAR(100)); |
| 544 CREATE INDEX i1 ON t2(a); | 568 CREATE INDEX i1 ON t2(a); |
| 545 } | 569 } |
| 546 | 570 |
| 547 det 7.1 "SELECT count(*) FROM t1" { | 571 det 7.1 "SELECT count(*) FROM t1" { |
| 548 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 572 0 0 0 {SCAN TABLE t1} |
| 549 } | 573 } |
| 550 | 574 |
| 551 det 7.2 "SELECT count(*) FROM t2" { | 575 det 7.2 "SELECT count(*) FROM t2" { |
| 552 0 0 0 {SCAN TABLE t2 USING COVERING INDEX i1(~1000000 rows)} | 576 0 0 0 {SCAN TABLE t2 USING COVERING INDEX i1} |
| 553 } | 577 } |
| 554 | 578 |
| 555 do_execsql_test 7.3 { | 579 do_execsql_test 7.3 { |
| 556 INSERT INTO t1 VALUES(1, 2); | 580 INSERT INTO t1(a,b) VALUES(1, 2); |
| 557 INSERT INTO t1 VALUES(3, 4); | 581 INSERT INTO t1(a,b) VALUES(3, 4); |
| 558 | 582 |
| 559 INSERT INTO t2 VALUES(1, 2); | 583 INSERT INTO t2(a,b) VALUES(1, 2); |
| 560 INSERT INTO t2 VALUES(3, 4); | 584 INSERT INTO t2(a,b) VALUES(3, 4); |
| 561 INSERT INTO t2 VALUES(5, 6); | 585 INSERT INTO t2(a,b) VALUES(5, 6); |
| 562 | 586 |
| 563 ANALYZE; | 587 ANALYZE; |
| 564 } | 588 } |
| 565 | 589 |
| 566 db close | 590 db close |
| 567 sqlite3 db test.db | 591 sqlite3 db test.db |
| 568 | 592 |
| 569 det 7.4 "SELECT count(*) FROM t1" { | 593 det 7.4 "SELECT count(*) FROM t1" { |
| 570 0 0 0 {SCAN TABLE t1 (~2 rows)} | 594 0 0 0 {SCAN TABLE t1} |
| 571 } | 595 } |
| 572 | 596 |
| 573 det 7.5 "SELECT count(*) FROM t2" { | 597 det 7.5 "SELECT count(*) FROM t2" { |
| 574 0 0 0 {SCAN TABLE t2 USING COVERING INDEX i1(~3 rows)} | 598 0 0 0 {SCAN TABLE t2 USING COVERING INDEX i1} |
| 599 } |
| 600 |
| 601 #------------------------------------------------------------------------- |
| 602 # The following tests - eqp-8.* - test that queries that use the OP_Count |
| 603 # optimization return something sensible with EQP. |
| 604 # |
| 605 drop_all_tables |
| 606 |
| 607 do_execsql_test 8.0 { |
| 608 CREATE TABLE t1(a, b, c, PRIMARY KEY(b, c)) WITHOUT ROWID; |
| 609 CREATE TABLE t2(a, b, c); |
| 610 } |
| 611 |
| 612 det 8.1.1 "SELECT * FROM t2" { |
| 613 0 0 0 {SCAN TABLE t2} |
| 614 } |
| 615 |
| 616 det 8.1.2 "SELECT * FROM t2 WHERE rowid=?" { |
| 617 0 0 0 {SEARCH TABLE t2 USING INTEGER PRIMARY KEY (rowid=?)} |
| 618 } |
| 619 |
| 620 det 8.1.3 "SELECT count(*) FROM t2" { |
| 621 0 0 0 {SCAN TABLE t2} |
| 622 } |
| 623 |
| 624 det 8.2.1 "SELECT * FROM t1" { |
| 625 0 0 0 {SCAN TABLE t1} |
| 626 } |
| 627 |
| 628 det 8.2.2 "SELECT * FROM t1 WHERE b=?" { |
| 629 0 0 0 {SEARCH TABLE t1 USING PRIMARY KEY (b=?)} |
| 630 } |
| 631 |
| 632 det 8.2.3 "SELECT * FROM t1 WHERE b=? AND c=?" { |
| 633 0 0 0 {SEARCH TABLE t1 USING PRIMARY KEY (b=? AND c=?)} |
| 634 } |
| 635 |
| 636 det 8.2.4 "SELECT count(*) FROM t1" { |
| 637 0 0 0 {SCAN TABLE t1} |
| 575 } | 638 } |
| 576 | 639 |
| 577 | 640 |
| 641 |
| 642 |
| 643 |
| 644 |
| 645 |
| 578 finish_test | 646 finish_test |
| OLD | NEW |