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