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: selectB.test,v 1.10 2009/04/02 16:59:47 drh Exp $ 14 15 set testdir [file dirname $argv0] 16 source $testdir/tester.tcl 17 18 ifcapable !compound { 19 finish_test 20 return 21 } 22 23 proc test_transform {testname sql1 sql2 results} { 24 set ::vdbe1 [list] 25 set ::vdbe2 [list] 26 db eval "explain $sql1" { lappend ::vdbe1 $opcode } 27 db eval "explain $sql2" { lappend ::vdbe2 $opcode } 28 29 do_test $testname.transform { 30 set ::vdbe1 31 } $::vdbe2 32 33 set ::sql1 $sql1 34 do_test $testname.sql1 { 35 execsql $::sql1 36 } $results 37 38 set ::sql2 $sql2 39 do_test $testname.sql2 { 40 execsql $::sql2 41 } $results 42 } 43 44 do_test selectB-1.1 { 45 execsql { 46 CREATE TABLE t1(a, b, c); 47 CREATE TABLE t2(d, e, f); 48 49 INSERT INTO t1 VALUES( 2, 4, 6); 50 INSERT INTO t1 VALUES( 8, 10, 12); 51 INSERT INTO t1 VALUES(14, 16, 18); 52 53 INSERT INTO t2 VALUES(3, 6, 9); 54 INSERT INTO t2 VALUES(12, 15, 18); 55 INSERT INTO t2 VALUES(21, 24, 27); 56 } 57 } {} 58 59 for {set ii 1} {$ii <= 2} {incr ii} { 60 61 if {$ii == 2} { 62 do_test selectB-2.1 { 63 execsql { 64 CREATE INDEX i1 ON t1(a); 65 CREATE INDEX i2 ON t2(d); 66 } 67 } {} 68 } 69 70 test_transform selectB-$ii.2 { 71 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) 72 } { 73 SELECT a FROM t1 UNION ALL SELECT d FROM t2 74 } {2 8 14 3 12 21} 75 76 test_transform selectB-$ii.3 { 77 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1 78 } { 79 SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 80 } {2 3 8 12 14 21} 81 82 test_transform selectB-$ii.4 { 83 SELECT * FROM 84 (SELECT a FROM t1 UNION ALL SELECT d FROM t2) 85 WHERE a>10 ORDER BY 1 86 } { 87 SELECT a FROM t1 WHERE a>10 UNION ALL SELECT d FROM t2 WHERE d>10 ORDER BY 1 88 } {12 14 21} 89 90 test_transform selectB-$ii.5 { 91 SELECT * FROM 92 (SELECT a FROM t1 UNION ALL SELECT d FROM t2) 93 WHERE a>10 ORDER BY a 94 } { 95 SELECT a FROM t1 WHERE a>10 96 UNION ALL 97 SELECT d FROM t2 WHERE d>10 98 ORDER BY a 99 } {12 14 21} 100 101 test_transform selectB-$ii.6 { 102 SELECT * FROM 103 (SELECT a FROM t1 UNION ALL SELECT d FROM t2 WHERE d > 12) 104 WHERE a>10 ORDER BY a 105 } { 106 SELECT a FROM t1 WHERE a>10 107 UNION ALL 108 SELECT d FROM t2 WHERE d>12 AND d>10 109 ORDER BY a 110 } {14 21} 111 112 test_transform selectB-$ii.7 { 113 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1 114 LIMIT 2 115 } { 116 SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2 117 } {2 3} 118 119 test_transform selectB-$ii.8 { 120 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1 121 LIMIT 2 OFFSET 3 122 } { 123 SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2 OFFSET 3 124 } {12 14} 125 126 test_transform selectB-$ii.9 { 127 SELECT * FROM ( 128 SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1 129 ) 130 } { 131 SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1 132 } {2 8 14 3 12 21 6 12 18} 133 134 test_transform selectB-$ii.10 { 135 SELECT * FROM ( 136 SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1 137 ) ORDER BY 1 138 } { 139 SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1 140 ORDER BY 1 141 } {2 3 6 8 12 12 14 18 21} 142 143 test_transform selectB-$ii.11 { 144 SELECT * FROM ( 145 SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1 146 ) WHERE a>=10 ORDER BY 1 LIMIT 3 147 } { 148 SELECT a FROM t1 WHERE a>=10 UNION ALL SELECT d FROM t2 WHERE d>=10 149 UNION ALL SELECT c FROM t1 WHERE c>=10 150 ORDER BY 1 LIMIT 3 151 } {12 12 14} 152 153 test_transform selectB-$ii.12 { 154 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 2) 155 } { 156 SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 2 157 } {2 8} 158 159 # An ORDER BY in a compound subqueries defeats flattening. Ticket #3773 160 # test_transform selectB-$ii.13 { 161 # SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a ASC) 162 # } { 163 # SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 ASC 164 # } {2 3 8 12 14 21} 165 # 166 # test_transform selectB-$ii.14 { 167 # SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a DESC) 168 # } { 169 # SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 DESC 170 # } {21 14 12 8 3 2} 171 # 172 # test_transform selectB-$ii.14 { 173 # SELECT * FROM ( 174 # SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a DESC 175 # ) LIMIT 2 OFFSET 2 176 # } { 177 # SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 DESC 178 # LIMIT 2 OFFSET 2 179 # } {12 8} 180 # 181 # test_transform selectB-$ii.15 { 182 # SELECT * FROM ( 183 # SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY a ASC, e DESC 184 # ) 185 # } { 186 # SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY a ASC, e DESC 187 # } {2 4 3 6 8 10 12 15 14 16 21 24} 188 } 189 190 do_test selectB-3.0 { 191 execsql { 192 DROP INDEX i1; 193 DROP INDEX i2; 194 } 195 } {} 196 197 for {set ii 3} {$ii <= 4} {incr ii} { 198 199 if {$ii == 4} { 200 do_test selectB-4.0 { 201 execsql { 202 CREATE INDEX i1 ON t1(a); 203 CREATE INDEX i2 ON t1(b); 204 CREATE INDEX i3 ON t1(c); 205 CREATE INDEX i4 ON t2(d); 206 CREATE INDEX i5 ON t2(e); 207 CREATE INDEX i6 ON t2(f); 208 } 209 } {} 210 } 211 212 do_test selectB-$ii.1 { 213 execsql { 214 SELECT DISTINCT * FROM 215 (SELECT c FROM t1 UNION ALL SELECT e FROM t2) 216 ORDER BY 1; 217 } 218 } {6 12 15 18 24} 219 220 do_test selectB-$ii.2 { 221 execsql { 222 SELECT c, count(*) FROM 223 (SELECT c FROM t1 UNION ALL SELECT e FROM t2) 224 GROUP BY c ORDER BY 1; 225 } 226 } {6 2 12 1 15 1 18 1 24 1} 227 do_test selectB-$ii.3 { 228 execsql { 229 SELECT c, count(*) FROM 230 (SELECT c FROM t1 UNION ALL SELECT e FROM t2) 231 GROUP BY c HAVING count(*)>1; 232 } 233 } {6 2} 234 do_test selectB-$ii.4 { 235 execsql { 236 SELECT t4.c, t3.a FROM 237 (SELECT c FROM t1 UNION ALL SELECT e FROM t2) AS t4, t1 AS t3 238 WHERE t3.a=14 239 ORDER BY 1 240 } 241 } {6 14 6 14 12 14 15 14 18 14 24 14} 242 243 do_test selectB-$ii.5 { 244 execsql { 245 SELECT d FROM t2 246 EXCEPT 247 SELECT a FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) 248 } 249 } {} 250 do_test selectB-$ii.6 { 251 execsql { 252 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) 253 EXCEPT 254 SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) 255 } 256 } {} 257 do_test selectB-$ii.7 { 258 execsql { 259 SELECT c FROM t1 260 EXCEPT 261 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) 262 } 263 } {12} 264 do_test selectB-$ii.8 { 265 execsql { 266 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) 267 EXCEPT 268 SELECT c FROM t1 269 } 270 } {9 15 24 27} 271 do_test selectB-$ii.9 { 272 execsql { 273 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) 274 EXCEPT 275 SELECT c FROM t1 276 ORDER BY c DESC 277 } 278 } {27 24 15 9} 279 280 do_test selectB-$ii.10 { 281 execsql { 282 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) 283 UNION 284 SELECT c FROM t1 285 ORDER BY c DESC 286 } 287 } {27 24 18 15 12 9 6} 288 do_test selectB-$ii.11 { 289 execsql { 290 SELECT c FROM t1 291 UNION 292 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) 293 ORDER BY c 294 } 295 } {6 9 12 15 18 24 27} 296 do_test selectB-$ii.12 { 297 execsql { 298 SELECT c FROM t1 UNION SELECT e FROM t2 UNION ALL SELECT f FROM t2 299 ORDER BY c 300 } 301 } {6 9 12 15 18 18 24 27} 302 do_test selectB-$ii.13 { 303 execsql { 304 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) 305 UNION 306 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) 307 ORDER BY 1 308 } 309 } {6 9 15 18 24 27} 310 311 do_test selectB-$ii.14 { 312 execsql { 313 SELECT c FROM t1 314 INTERSECT 315 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) 316 ORDER BY 1 317 } 318 } {6 18} 319 do_test selectB-$ii.15 { 320 execsql { 321 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) 322 INTERSECT 323 SELECT c FROM t1 324 ORDER BY 1 325 } 326 } {6 18} 327 do_test selectB-$ii.16 { 328 execsql { 329 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) 330 INTERSECT 331 SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2) 332 ORDER BY 1 333 } 334 } {6 9 15 18 24 27} 335 336 do_test selectB-$ii.17 { 337 execsql { 338 SELECT * FROM ( 339 SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 4 340 ) LIMIT 2 341 } 342 } {2 8} 343 344 do_test selectB-$ii.18 { 345 execsql { 346 SELECT * FROM ( 347 SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 4 OFFSET 2 348 ) LIMIT 2 349 } 350 } {14 3} 351 352 do_test selectB-$ii.19 { 353 execsql { 354 SELECT * FROM ( 355 SELECT DISTINCT (a/10) FROM t1 UNION ALL SELECT DISTINCT(d%2) FROM t2 356 ) 357 } 358 } {0 1 0 1} 359 360 do_test selectB-$ii.20 { 361 execsql { 362 SELECT DISTINCT * FROM ( 363 SELECT DISTINCT (a/10) FROM t1 UNION ALL SELECT DISTINCT(d%2) FROM t2 364 ) 365 } 366 } {0 1} 367 368 do_test selectB-$ii.21 { 369 execsql { 370 SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t2) ORDER BY a+b 371 } 372 } {2 4 6 3 6 9 8 10 12 12 15 18 14 16 18 21 24 27} 373 374 do_test selectB-$ii.21 { 375 execsql { 376 SELECT * FROM (SELECT 345 UNION ALL SELECT d FROM t2) ORDER BY 1; 377 } 378 } {3 12 21 345} 379 } 380 381 finish_test 382