OLD | NEW |
(Empty) | |
| 1 # 2001 September 15 |
| 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. The |
| 12 # focus of this file is testing UNION, INTERSECT and EXCEPT operators |
| 13 # in SELECT statements. |
| 14 # |
| 15 |
| 16 set testdir [file dirname $argv0] |
| 17 source $testdir/tester.tcl |
| 18 |
| 19 # Most tests in this file depend on compound-select. But there are a couple |
| 20 # right at the end that test DISTINCT, so we cannot omit the entire file. |
| 21 # |
| 22 ifcapable compound { |
| 23 |
| 24 # Build some test data |
| 25 # |
| 26 execsql { |
| 27 CREATE TABLE t1(n int, log int); |
| 28 BEGIN; |
| 29 } |
| 30 for {set i 1} {$i<32} {incr i} { |
| 31 for {set j 0} {(1<<$j)<$i} {incr j} {} |
| 32 execsql "INSERT INTO t1 VALUES($i,$j)" |
| 33 } |
| 34 execsql { |
| 35 COMMIT; |
| 36 } |
| 37 |
| 38 do_test select4-1.0 { |
| 39 execsql {SELECT DISTINCT log FROM t1 ORDER BY log} |
| 40 } {0 1 2 3 4 5} |
| 41 |
| 42 # Union All operator |
| 43 # |
| 44 do_test select4-1.1a { |
| 45 lsort [execsql {SELECT DISTINCT log FROM t1}] |
| 46 } {0 1 2 3 4 5} |
| 47 do_test select4-1.1b { |
| 48 lsort [execsql {SELECT n FROM t1 WHERE log=3}] |
| 49 } {5 6 7 8} |
| 50 do_test select4-1.1c { |
| 51 execsql { |
| 52 SELECT DISTINCT log FROM t1 |
| 53 UNION ALL |
| 54 SELECT n FROM t1 WHERE log=3 |
| 55 ORDER BY log; |
| 56 } |
| 57 } {0 1 2 3 4 5 5 6 7 8} |
| 58 do_test select4-1.1d { |
| 59 execsql { |
| 60 CREATE TABLE t2 AS |
| 61 SELECT DISTINCT log FROM t1 |
| 62 UNION ALL |
| 63 SELECT n FROM t1 WHERE log=3 |
| 64 ORDER BY log; |
| 65 SELECT * FROM t2; |
| 66 } |
| 67 } {0 1 2 3 4 5 5 6 7 8} |
| 68 execsql {DROP TABLE t2} |
| 69 do_test select4-1.1e { |
| 70 execsql { |
| 71 CREATE TABLE t2 AS |
| 72 SELECT DISTINCT log FROM t1 |
| 73 UNION ALL |
| 74 SELECT n FROM t1 WHERE log=3 |
| 75 ORDER BY log DESC; |
| 76 SELECT * FROM t2; |
| 77 } |
| 78 } {8 7 6 5 5 4 3 2 1 0} |
| 79 execsql {DROP TABLE t2} |
| 80 do_test select4-1.1f { |
| 81 execsql { |
| 82 SELECT DISTINCT log FROM t1 |
| 83 UNION ALL |
| 84 SELECT n FROM t1 WHERE log=2 |
| 85 } |
| 86 } {0 1 2 3 4 5 3 4} |
| 87 do_test select4-1.1g { |
| 88 execsql { |
| 89 CREATE TABLE t2 AS |
| 90 SELECT DISTINCT log FROM t1 |
| 91 UNION ALL |
| 92 SELECT n FROM t1 WHERE log=2; |
| 93 SELECT * FROM t2; |
| 94 } |
| 95 } {0 1 2 3 4 5 3 4} |
| 96 execsql {DROP TABLE t2} |
| 97 ifcapable subquery { |
| 98 do_test select4-1.2 { |
| 99 execsql { |
| 100 SELECT log FROM t1 WHERE n IN |
| 101 (SELECT DISTINCT log FROM t1 UNION ALL |
| 102 SELECT n FROM t1 WHERE log=3) |
| 103 ORDER BY log; |
| 104 } |
| 105 } {0 1 2 2 3 3 3 3} |
| 106 } |
| 107 |
| 108 # EVIDENCE-OF: R-02644-22131 In a compound SELECT statement, only the |
| 109 # last or right-most simple SELECT may have an ORDER BY clause. |
| 110 # |
| 111 do_test select4-1.3 { |
| 112 set v [catch {execsql { |
| 113 SELECT DISTINCT log FROM t1 ORDER BY log |
| 114 UNION ALL |
| 115 SELECT n FROM t1 WHERE log=3 |
| 116 ORDER BY log; |
| 117 }} msg] |
| 118 lappend v $msg |
| 119 } {1 {ORDER BY clause should come after UNION ALL not before}} |
| 120 do_catchsql_test select4-1.4 { |
| 121 SELECT (VALUES(0) INTERSECT SELECT(0) UNION SELECT(0) ORDER BY 1 UNION |
| 122 SELECT 0 UNION SELECT 0 ORDER BY 1); |
| 123 } {1 {ORDER BY clause should come after UNION not before}} |
| 124 |
| 125 # Union operator |
| 126 # |
| 127 do_test select4-2.1 { |
| 128 execsql { |
| 129 SELECT DISTINCT log FROM t1 |
| 130 UNION |
| 131 SELECT n FROM t1 WHERE log=3 |
| 132 ORDER BY log; |
| 133 } |
| 134 } {0 1 2 3 4 5 6 7 8} |
| 135 ifcapable subquery { |
| 136 do_test select4-2.2 { |
| 137 execsql { |
| 138 SELECT log FROM t1 WHERE n IN |
| 139 (SELECT DISTINCT log FROM t1 UNION |
| 140 SELECT n FROM t1 WHERE log=3) |
| 141 ORDER BY log; |
| 142 } |
| 143 } {0 1 2 2 3 3 3 3} |
| 144 } |
| 145 do_test select4-2.3 { |
| 146 set v [catch {execsql { |
| 147 SELECT DISTINCT log FROM t1 ORDER BY log |
| 148 UNION |
| 149 SELECT n FROM t1 WHERE log=3 |
| 150 ORDER BY log; |
| 151 }} msg] |
| 152 lappend v $msg |
| 153 } {1 {ORDER BY clause should come after UNION not before}} |
| 154 do_test select4-2.4 { |
| 155 set v [catch {execsql { |
| 156 SELECT 0 ORDER BY (SELECT 0) UNION SELECT 0; |
| 157 }} msg] |
| 158 lappend v $msg |
| 159 } {1 {ORDER BY clause should come after UNION not before}} |
| 160 do_execsql_test select4-2.5 { |
| 161 SELECT 123 AS x ORDER BY (SELECT x ORDER BY 1); |
| 162 } {123} |
| 163 |
| 164 # Except operator |
| 165 # |
| 166 do_test select4-3.1.1 { |
| 167 execsql { |
| 168 SELECT DISTINCT log FROM t1 |
| 169 EXCEPT |
| 170 SELECT n FROM t1 WHERE log=3 |
| 171 ORDER BY log; |
| 172 } |
| 173 } {0 1 2 3 4} |
| 174 do_test select4-3.1.2 { |
| 175 execsql { |
| 176 CREATE TABLE t2 AS |
| 177 SELECT DISTINCT log FROM t1 |
| 178 EXCEPT |
| 179 SELECT n FROM t1 WHERE log=3 |
| 180 ORDER BY log; |
| 181 SELECT * FROM t2; |
| 182 } |
| 183 } {0 1 2 3 4} |
| 184 execsql {DROP TABLE t2} |
| 185 do_test select4-3.1.3 { |
| 186 execsql { |
| 187 CREATE TABLE t2 AS |
| 188 SELECT DISTINCT log FROM t1 |
| 189 EXCEPT |
| 190 SELECT n FROM t1 WHERE log=3 |
| 191 ORDER BY log DESC; |
| 192 SELECT * FROM t2; |
| 193 } |
| 194 } {4 3 2 1 0} |
| 195 execsql {DROP TABLE t2} |
| 196 ifcapable subquery { |
| 197 do_test select4-3.2 { |
| 198 execsql { |
| 199 SELECT log FROM t1 WHERE n IN |
| 200 (SELECT DISTINCT log FROM t1 EXCEPT |
| 201 SELECT n FROM t1 WHERE log=3) |
| 202 ORDER BY log; |
| 203 } |
| 204 } {0 1 2 2} |
| 205 } |
| 206 do_test select4-3.3 { |
| 207 set v [catch {execsql { |
| 208 SELECT DISTINCT log FROM t1 ORDER BY log |
| 209 EXCEPT |
| 210 SELECT n FROM t1 WHERE log=3 |
| 211 ORDER BY log; |
| 212 }} msg] |
| 213 lappend v $msg |
| 214 } {1 {ORDER BY clause should come after EXCEPT not before}} |
| 215 |
| 216 # Intersect operator |
| 217 # |
| 218 do_test select4-4.1.1 { |
| 219 execsql { |
| 220 SELECT DISTINCT log FROM t1 |
| 221 INTERSECT |
| 222 SELECT n FROM t1 WHERE log=3 |
| 223 ORDER BY log; |
| 224 } |
| 225 } {5} |
| 226 |
| 227 do_test select4-4.1.2 { |
| 228 execsql { |
| 229 SELECT DISTINCT log FROM t1 |
| 230 UNION ALL |
| 231 SELECT 6 |
| 232 INTERSECT |
| 233 SELECT n FROM t1 WHERE log=3 |
| 234 ORDER BY t1.log; |
| 235 } |
| 236 } {5 6} |
| 237 |
| 238 do_test select4-4.1.3 { |
| 239 execsql { |
| 240 CREATE TABLE t2 AS |
| 241 SELECT DISTINCT log FROM t1 UNION ALL SELECT 6 |
| 242 INTERSECT |
| 243 SELECT n FROM t1 WHERE log=3 |
| 244 ORDER BY log; |
| 245 SELECT * FROM t2; |
| 246 } |
| 247 } {5 6} |
| 248 execsql {DROP TABLE t2} |
| 249 do_test select4-4.1.4 { |
| 250 execsql { |
| 251 CREATE TABLE t2 AS |
| 252 SELECT DISTINCT log FROM t1 UNION ALL SELECT 6 |
| 253 INTERSECT |
| 254 SELECT n FROM t1 WHERE log=3 |
| 255 ORDER BY log DESC; |
| 256 SELECT * FROM t2; |
| 257 } |
| 258 } {6 5} |
| 259 execsql {DROP TABLE t2} |
| 260 ifcapable subquery { |
| 261 do_test select4-4.2 { |
| 262 execsql { |
| 263 SELECT log FROM t1 WHERE n IN |
| 264 (SELECT DISTINCT log FROM t1 INTERSECT |
| 265 SELECT n FROM t1 WHERE log=3) |
| 266 ORDER BY log; |
| 267 } |
| 268 } {3} |
| 269 } |
| 270 do_test select4-4.3 { |
| 271 set v [catch {execsql { |
| 272 SELECT DISTINCT log FROM t1 ORDER BY log |
| 273 INTERSECT |
| 274 SELECT n FROM t1 WHERE log=3 |
| 275 ORDER BY log; |
| 276 }} msg] |
| 277 lappend v $msg |
| 278 } {1 {ORDER BY clause should come after INTERSECT not before}} |
| 279 do_catchsql_test select4-4.4 { |
| 280 SELECT 3 IN ( |
| 281 SELECT 0 ORDER BY 1 |
| 282 INTERSECT |
| 283 SELECT 1 |
| 284 INTERSECT |
| 285 SELECT 2 |
| 286 ORDER BY 1 |
| 287 ); |
| 288 } {1 {ORDER BY clause should come after INTERSECT not before}} |
| 289 |
| 290 # Various error messages while processing UNION or INTERSECT |
| 291 # |
| 292 do_test select4-5.1 { |
| 293 set v [catch {execsql { |
| 294 SELECT DISTINCT log FROM t2 |
| 295 UNION ALL |
| 296 SELECT n FROM t1 WHERE log=3 |
| 297 ORDER BY log; |
| 298 }} msg] |
| 299 lappend v $msg |
| 300 } {1 {no such table: t2}} |
| 301 do_test select4-5.2 { |
| 302 set v [catch {execsql { |
| 303 SELECT DISTINCT log AS "xyzzy" FROM t1 |
| 304 UNION ALL |
| 305 SELECT n FROM t1 WHERE log=3 |
| 306 ORDER BY xyzzy; |
| 307 }} msg] |
| 308 lappend v $msg |
| 309 } {0 {0 1 2 3 4 5 5 6 7 8}} |
| 310 do_test select4-5.2b { |
| 311 set v [catch {execsql { |
| 312 SELECT DISTINCT log AS xyzzy FROM t1 |
| 313 UNION ALL |
| 314 SELECT n FROM t1 WHERE log=3 |
| 315 ORDER BY "xyzzy"; |
| 316 }} msg] |
| 317 lappend v $msg |
| 318 } {0 {0 1 2 3 4 5 5 6 7 8}} |
| 319 do_test select4-5.2c { |
| 320 set v [catch {execsql { |
| 321 SELECT DISTINCT log FROM t1 |
| 322 UNION ALL |
| 323 SELECT n FROM t1 WHERE log=3 |
| 324 ORDER BY "xyzzy"; |
| 325 }} msg] |
| 326 lappend v $msg |
| 327 } {1 {1st ORDER BY term does not match any column in the result set}} |
| 328 do_test select4-5.2d { |
| 329 set v [catch {execsql { |
| 330 SELECT DISTINCT log FROM t1 |
| 331 INTERSECT |
| 332 SELECT n FROM t1 WHERE log=3 |
| 333 ORDER BY "xyzzy"; |
| 334 }} msg] |
| 335 lappend v $msg |
| 336 } {1 {1st ORDER BY term does not match any column in the result set}} |
| 337 do_test select4-5.2e { |
| 338 set v [catch {execsql { |
| 339 SELECT DISTINCT log FROM t1 |
| 340 UNION ALL |
| 341 SELECT n FROM t1 WHERE log=3 |
| 342 ORDER BY n; |
| 343 }} msg] |
| 344 lappend v $msg |
| 345 } {0 {0 1 2 3 4 5 5 6 7 8}} |
| 346 do_test select4-5.2f { |
| 347 catchsql { |
| 348 SELECT DISTINCT log FROM t1 |
| 349 UNION ALL |
| 350 SELECT n FROM t1 WHERE log=3 |
| 351 ORDER BY log; |
| 352 } |
| 353 } {0 {0 1 2 3 4 5 5 6 7 8}} |
| 354 do_test select4-5.2g { |
| 355 catchsql { |
| 356 SELECT DISTINCT log FROM t1 |
| 357 UNION ALL |
| 358 SELECT n FROM t1 WHERE log=3 |
| 359 ORDER BY 1; |
| 360 } |
| 361 } {0 {0 1 2 3 4 5 5 6 7 8}} |
| 362 do_test select4-5.2h { |
| 363 catchsql { |
| 364 SELECT DISTINCT log FROM t1 |
| 365 UNION ALL |
| 366 SELECT n FROM t1 WHERE log=3 |
| 367 ORDER BY 2; |
| 368 } |
| 369 } {1 {1st ORDER BY term out of range - should be between 1 and 1}} |
| 370 do_test select4-5.2i { |
| 371 catchsql { |
| 372 SELECT DISTINCT 1, log FROM t1 |
| 373 UNION ALL |
| 374 SELECT 2, n FROM t1 WHERE log=3 |
| 375 ORDER BY 2, 1; |
| 376 } |
| 377 } {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}} |
| 378 do_test select4-5.2j { |
| 379 catchsql { |
| 380 SELECT DISTINCT 1, log FROM t1 |
| 381 UNION ALL |
| 382 SELECT 2, n FROM t1 WHERE log=3 |
| 383 ORDER BY 1, 2 DESC; |
| 384 } |
| 385 } {0 {1 5 1 4 1 3 1 2 1 1 1 0 2 8 2 7 2 6 2 5}} |
| 386 do_test select4-5.2k { |
| 387 catchsql { |
| 388 SELECT DISTINCT 1, log FROM t1 |
| 389 UNION ALL |
| 390 SELECT 2, n FROM t1 WHERE log=3 |
| 391 ORDER BY n, 1; |
| 392 } |
| 393 } {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}} |
| 394 do_test select4-5.3 { |
| 395 set v [catch {execsql { |
| 396 SELECT DISTINCT log, n FROM t1 |
| 397 UNION ALL |
| 398 SELECT n FROM t1 WHERE log=3 |
| 399 ORDER BY log; |
| 400 }} msg] |
| 401 lappend v $msg |
| 402 } {1 {SELECTs to the left and right of UNION ALL do not have the same number of
result columns}} |
| 403 do_test select4-5.3-3807-1 { |
| 404 catchsql { |
| 405 SELECT 1 UNION SELECT 2, 3 UNION SELECT 4, 5 ORDER BY 1; |
| 406 } |
| 407 } {1 {SELECTs to the left and right of UNION do not have the same number of resu
lt columns}} |
| 408 do_test select4-5.4 { |
| 409 set v [catch {execsql { |
| 410 SELECT log FROM t1 WHERE n=2 |
| 411 UNION ALL |
| 412 SELECT log FROM t1 WHERE n=3 |
| 413 UNION ALL |
| 414 SELECT log FROM t1 WHERE n=4 |
| 415 UNION ALL |
| 416 SELECT log FROM t1 WHERE n=5 |
| 417 ORDER BY log; |
| 418 }} msg] |
| 419 lappend v $msg |
| 420 } {0 {1 2 2 3}} |
| 421 |
| 422 do_test select4-6.1 { |
| 423 execsql { |
| 424 SELECT log, count(*) as cnt FROM t1 GROUP BY log |
| 425 UNION |
| 426 SELECT log, n FROM t1 WHERE n=7 |
| 427 ORDER BY cnt, log; |
| 428 } |
| 429 } {0 1 1 1 2 2 3 4 3 7 4 8 5 15} |
| 430 do_test select4-6.2 { |
| 431 execsql { |
| 432 SELECT log, count(*) FROM t1 GROUP BY log |
| 433 UNION |
| 434 SELECT log, n FROM t1 WHERE n=7 |
| 435 ORDER BY count(*), log; |
| 436 } |
| 437 } {0 1 1 1 2 2 3 4 3 7 4 8 5 15} |
| 438 |
| 439 # NULLs are indistinct for the UNION operator. |
| 440 # Make sure the UNION operator recognizes this |
| 441 # |
| 442 do_test select4-6.3 { |
| 443 execsql { |
| 444 SELECT NULL UNION SELECT NULL UNION |
| 445 SELECT 1 UNION SELECT 2 AS 'x' |
| 446 ORDER BY x; |
| 447 } |
| 448 } {{} 1 2} |
| 449 do_test select4-6.3.1 { |
| 450 execsql { |
| 451 SELECT NULL UNION ALL SELECT NULL UNION ALL |
| 452 SELECT 1 UNION ALL SELECT 2 AS 'x' |
| 453 ORDER BY x; |
| 454 } |
| 455 } {{} {} 1 2} |
| 456 |
| 457 # Make sure the DISTINCT keyword treats NULLs as indistinct. |
| 458 # |
| 459 ifcapable subquery { |
| 460 do_test select4-6.4 { |
| 461 execsql { |
| 462 SELECT * FROM ( |
| 463 SELECT NULL, 1 UNION ALL SELECT NULL, 1 |
| 464 ); |
| 465 } |
| 466 } {{} 1 {} 1} |
| 467 do_test select4-6.5 { |
| 468 execsql { |
| 469 SELECT DISTINCT * FROM ( |
| 470 SELECT NULL, 1 UNION ALL SELECT NULL, 1 |
| 471 ); |
| 472 } |
| 473 } {{} 1} |
| 474 do_test select4-6.6 { |
| 475 execsql { |
| 476 SELECT DISTINCT * FROM ( |
| 477 SELECT 1,2 UNION ALL SELECT 1,2 |
| 478 ); |
| 479 } |
| 480 } {1 2} |
| 481 } |
| 482 |
| 483 # Test distinctness of NULL in other ways. |
| 484 # |
| 485 do_test select4-6.7 { |
| 486 execsql { |
| 487 SELECT NULL EXCEPT SELECT NULL |
| 488 } |
| 489 } {} |
| 490 |
| 491 |
| 492 # Make sure column names are correct when a compound select appears as |
| 493 # an expression in the WHERE clause. |
| 494 # |
| 495 do_test select4-7.1 { |
| 496 execsql { |
| 497 CREATE TABLE t2 AS SELECT log AS 'x', count(*) AS 'y' FROM t1 GROUP BY log; |
| 498 SELECT * FROM t2 ORDER BY x; |
| 499 } |
| 500 } {0 1 1 1 2 2 3 4 4 8 5 15} |
| 501 ifcapable subquery { |
| 502 do_test select4-7.2 { |
| 503 execsql2 { |
| 504 SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 INTERSECT SELECT x FROM t2) |
| 505 ORDER BY n |
| 506 } |
| 507 } {n 1 log 0 n 2 log 1 n 3 log 2 n 4 log 2 n 5 log 3} |
| 508 do_test select4-7.3 { |
| 509 execsql2 { |
| 510 SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 EXCEPT SELECT x FROM t2) |
| 511 ORDER BY n LIMIT 2 |
| 512 } |
| 513 } {n 6 log 3 n 7 log 3} |
| 514 do_test select4-7.4 { |
| 515 execsql2 { |
| 516 SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 UNION SELECT x FROM t2) |
| 517 ORDER BY n LIMIT 2 |
| 518 } |
| 519 } {n 1 log 0 n 2 log 1} |
| 520 } ;# ifcapable subquery |
| 521 |
| 522 } ;# ifcapable compound |
| 523 |
| 524 # Make sure DISTINCT works appropriately on TEXT and NUMERIC columns. |
| 525 do_test select4-8.1 { |
| 526 execsql { |
| 527 BEGIN; |
| 528 CREATE TABLE t3(a text, b float, c text); |
| 529 INSERT INTO t3 VALUES(1, 1.1, '1.1'); |
| 530 INSERT INTO t3 VALUES(2, 1.10, '1.10'); |
| 531 INSERT INTO t3 VALUES(3, 1.10, '1.1'); |
| 532 INSERT INTO t3 VALUES(4, 1.1, '1.10'); |
| 533 INSERT INTO t3 VALUES(5, 1.2, '1.2'); |
| 534 INSERT INTO t3 VALUES(6, 1.3, '1.3'); |
| 535 COMMIT; |
| 536 } |
| 537 execsql { |
| 538 SELECT DISTINCT b FROM t3 ORDER BY c; |
| 539 } |
| 540 } {1.1 1.2 1.3} |
| 541 do_test select4-8.2 { |
| 542 execsql { |
| 543 SELECT DISTINCT c FROM t3 ORDER BY c; |
| 544 } |
| 545 } {1.1 1.10 1.2 1.3} |
| 546 |
| 547 # Make sure the names of columns are taken from the right-most subquery |
| 548 # right in a compound query. Ticket #1721 |
| 549 # |
| 550 ifcapable compound { |
| 551 |
| 552 do_test select4-9.1 { |
| 553 execsql2 { |
| 554 SELECT x, y FROM t2 UNION SELECT a, b FROM t3 ORDER BY x LIMIT 1 |
| 555 } |
| 556 } {x 0 y 1} |
| 557 do_test select4-9.2 { |
| 558 execsql2 { |
| 559 SELECT x, y FROM t2 UNION ALL SELECT a, b FROM t3 ORDER BY x LIMIT 1 |
| 560 } |
| 561 } {x 0 y 1} |
| 562 do_test select4-9.3 { |
| 563 execsql2 { |
| 564 SELECT x, y FROM t2 EXCEPT SELECT a, b FROM t3 ORDER BY x LIMIT 1 |
| 565 } |
| 566 } {x 0 y 1} |
| 567 do_test select4-9.4 { |
| 568 execsql2 { |
| 569 SELECT x, y FROM t2 INTERSECT SELECT 0 AS a, 1 AS b; |
| 570 } |
| 571 } {x 0 y 1} |
| 572 do_test select4-9.5 { |
| 573 execsql2 { |
| 574 SELECT 0 AS x, 1 AS y |
| 575 UNION |
| 576 SELECT 2 AS p, 3 AS q |
| 577 UNION |
| 578 SELECT 4 AS a, 5 AS b |
| 579 ORDER BY x LIMIT 1 |
| 580 } |
| 581 } {x 0 y 1} |
| 582 |
| 583 ifcapable subquery { |
| 584 do_test select4-9.6 { |
| 585 execsql2 { |
| 586 SELECT * FROM ( |
| 587 SELECT 0 AS x, 1 AS y |
| 588 UNION |
| 589 SELECT 2 AS p, 3 AS q |
| 590 UNION |
| 591 SELECT 4 AS a, 5 AS b |
| 592 ) ORDER BY 1 LIMIT 1; |
| 593 } |
| 594 } {x 0 y 1} |
| 595 do_test select4-9.7 { |
| 596 execsql2 { |
| 597 SELECT * FROM ( |
| 598 SELECT 0 AS x, 1 AS y |
| 599 UNION |
| 600 SELECT 2 AS p, 3 AS q |
| 601 UNION |
| 602 SELECT 4 AS a, 5 AS b |
| 603 ) ORDER BY x LIMIT 1; |
| 604 } |
| 605 } {x 0 y 1} |
| 606 } ;# ifcapable subquery |
| 607 |
| 608 do_test select4-9.8 { |
| 609 execsql { |
| 610 SELECT 0 AS x, 1 AS y |
| 611 UNION |
| 612 SELECT 2 AS y, -3 AS x |
| 613 ORDER BY x LIMIT 1; |
| 614 } |
| 615 } {0 1} |
| 616 |
| 617 do_test select4-9.9.1 { |
| 618 execsql2 { |
| 619 SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a |
| 620 } |
| 621 } {a 1 b 2 a 3 b 4} |
| 622 |
| 623 ifcapable subquery { |
| 624 do_test select4-9.9.2 { |
| 625 execsql2 { |
| 626 SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a) |
| 627 WHERE b=3 |
| 628 } |
| 629 } {} |
| 630 do_test select4-9.10 { |
| 631 execsql2 { |
| 632 SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a) |
| 633 WHERE b=2 |
| 634 } |
| 635 } {a 1 b 2} |
| 636 do_test select4-9.11 { |
| 637 execsql2 { |
| 638 SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b) |
| 639 WHERE b=2 |
| 640 } |
| 641 } {a 1 b 2} |
| 642 do_test select4-9.12 { |
| 643 execsql2 { |
| 644 SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b) |
| 645 WHERE b>0 |
| 646 } |
| 647 } {a 1 b 2 a 3 b 4} |
| 648 } ;# ifcapable subquery |
| 649 |
| 650 # Try combining DISTINCT, LIMIT, and OFFSET. Make sure they all work |
| 651 # together. |
| 652 # |
| 653 do_test select4-10.1 { |
| 654 execsql { |
| 655 SELECT DISTINCT log FROM t1 ORDER BY log |
| 656 } |
| 657 } {0 1 2 3 4 5} |
| 658 do_test select4-10.2 { |
| 659 execsql { |
| 660 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 4 |
| 661 } |
| 662 } {0 1 2 3} |
| 663 do_test select4-10.3 { |
| 664 execsql { |
| 665 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0 |
| 666 } |
| 667 } {} |
| 668 do_test select4-10.4 { |
| 669 execsql { |
| 670 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1 |
| 671 } |
| 672 } {0 1 2 3 4 5} |
| 673 do_test select4-10.5 { |
| 674 execsql { |
| 675 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1 OFFSET 2 |
| 676 } |
| 677 } {2 3 4 5} |
| 678 do_test select4-10.6 { |
| 679 execsql { |
| 680 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 3 OFFSET 2 |
| 681 } |
| 682 } {2 3 4} |
| 683 do_test select4-10.7 { |
| 684 execsql { |
| 685 SELECT DISTINCT log FROM t1 ORDER BY +log LIMIT 3 OFFSET 20 |
| 686 } |
| 687 } {} |
| 688 do_test select4-10.8 { |
| 689 execsql { |
| 690 SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0 OFFSET 3 |
| 691 } |
| 692 } {} |
| 693 do_test select4-10.9 { |
| 694 execsql { |
| 695 SELECT DISTINCT max(n), log FROM t1 ORDER BY +log; -- LIMIT 2 OFFSET 1 |
| 696 } |
| 697 } {31 5} |
| 698 |
| 699 # Make sure compound SELECTs with wildly different numbers of columns |
| 700 # do not cause assertion faults due to register allocation issues. |
| 701 # |
| 702 do_test select4-11.1 { |
| 703 catchsql { |
| 704 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2 |
| 705 UNION |
| 706 SELECT x FROM t2 |
| 707 } |
| 708 } {1 {SELECTs to the left and right of UNION do not have the same number of resu
lt columns}} |
| 709 do_test select4-11.2 { |
| 710 catchsql { |
| 711 SELECT x FROM t2 |
| 712 UNION |
| 713 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2 |
| 714 } |
| 715 } {1 {SELECTs to the left and right of UNION do not have the same number of resu
lt columns}} |
| 716 do_test select4-11.3 { |
| 717 catchsql { |
| 718 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2 |
| 719 UNION ALL |
| 720 SELECT x FROM t2 |
| 721 } |
| 722 } {1 {SELECTs to the left and right of UNION ALL do not have the same number of
result columns}} |
| 723 do_test select4-11.4 { |
| 724 catchsql { |
| 725 SELECT x FROM t2 |
| 726 UNION ALL |
| 727 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2 |
| 728 } |
| 729 } {1 {SELECTs to the left and right of UNION ALL do not have the same number of
result columns}} |
| 730 do_test select4-11.5 { |
| 731 catchsql { |
| 732 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2 |
| 733 EXCEPT |
| 734 SELECT x FROM t2 |
| 735 } |
| 736 } {1 {SELECTs to the left and right of EXCEPT do not have the same number of res
ult columns}} |
| 737 do_test select4-11.6 { |
| 738 catchsql { |
| 739 SELECT x FROM t2 |
| 740 EXCEPT |
| 741 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2 |
| 742 } |
| 743 } {1 {SELECTs to the left and right of EXCEPT do not have the same number of res
ult columns}} |
| 744 do_test select4-11.7 { |
| 745 catchsql { |
| 746 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2 |
| 747 INTERSECT |
| 748 SELECT x FROM t2 |
| 749 } |
| 750 } {1 {SELECTs to the left and right of INTERSECT do not have the same number of
result columns}} |
| 751 do_test select4-11.8 { |
| 752 catchsql { |
| 753 SELECT x FROM t2 |
| 754 INTERSECT |
| 755 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2 |
| 756 } |
| 757 } {1 {SELECTs to the left and right of INTERSECT do not have the same number of
result columns}} |
| 758 |
| 759 do_test select4-11.11 { |
| 760 catchsql { |
| 761 SELECT x FROM t2 |
| 762 UNION |
| 763 SELECT x FROM t2 |
| 764 UNION ALL |
| 765 SELECT x FROM t2 |
| 766 EXCEPT |
| 767 SELECT x FROM t2 |
| 768 INTERSECT |
| 769 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2 |
| 770 } |
| 771 } {1 {SELECTs to the left and right of INTERSECT do not have the same number of
result columns}} |
| 772 do_test select4-11.12 { |
| 773 catchsql { |
| 774 SELECT x FROM t2 |
| 775 UNION |
| 776 SELECT x FROM t2 |
| 777 UNION ALL |
| 778 SELECT x FROM t2 |
| 779 EXCEPT |
| 780 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2 |
| 781 EXCEPT |
| 782 SELECT x FROM t2 |
| 783 } |
| 784 } {1 {SELECTs to the left and right of EXCEPT do not have the same number of res
ult columns}} |
| 785 do_test select4-11.13 { |
| 786 catchsql { |
| 787 SELECT x FROM t2 |
| 788 UNION |
| 789 SELECT x FROM t2 |
| 790 UNION ALL |
| 791 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2 |
| 792 UNION ALL |
| 793 SELECT x FROM t2 |
| 794 EXCEPT |
| 795 SELECT x FROM t2 |
| 796 } |
| 797 } {1 {SELECTs to the left and right of UNION ALL do not have the same number of
result columns}} |
| 798 do_test select4-11.14 { |
| 799 catchsql { |
| 800 SELECT x FROM t2 |
| 801 UNION |
| 802 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2 |
| 803 UNION |
| 804 SELECT x FROM t2 |
| 805 UNION ALL |
| 806 SELECT x FROM t2 |
| 807 EXCEPT |
| 808 SELECT x FROM t2 |
| 809 } |
| 810 } {1 {SELECTs to the left and right of UNION do not have the same number of resu
lt columns}} |
| 811 do_test select4-11.15 { |
| 812 catchsql { |
| 813 SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2 |
| 814 UNION |
| 815 SELECT x FROM t2 |
| 816 INTERSECT |
| 817 SELECT x FROM t2 |
| 818 UNION ALL |
| 819 SELECT x FROM t2 |
| 820 EXCEPT |
| 821 SELECT x FROM t2 |
| 822 } |
| 823 } {1 {SELECTs to the left and right of UNION do not have the same number of resu
lt columns}} |
| 824 do_test select4-11.16 { |
| 825 catchsql { |
| 826 INSERT INTO t2(rowid) VALUES(2) UNION SELECT 3,4 UNION SELECT 5,6 ORDER BY 1
; |
| 827 } |
| 828 } {1 {SELECTs to the left and right of UNION do not have the same number of resu
lt columns}} |
| 829 |
| 830 do_test select4-12.1 { |
| 831 sqlite3 db2 :memory: |
| 832 catchsql { |
| 833 SELECT 1 UNION SELECT 2,3 UNION SELECT 4,5 ORDER BY 1; |
| 834 } db2 |
| 835 } {1 {SELECTs to the left and right of UNION do not have the same number of resu
lt columns}} |
| 836 |
| 837 } ;# ifcapable compound |
| 838 |
| 839 |
| 840 # Ticket [3557ad65a076c] - Incorrect DISTINCT processing with an |
| 841 # indexed query using IN. |
| 842 # |
| 843 do_test select4-13.1 { |
| 844 sqlite3 db test.db |
| 845 db eval { |
| 846 CREATE TABLE t13(a,b); |
| 847 INSERT INTO t13 VALUES(1,1); |
| 848 INSERT INTO t13 VALUES(2,1); |
| 849 INSERT INTO t13 VALUES(3,1); |
| 850 INSERT INTO t13 VALUES(2,2); |
| 851 INSERT INTO t13 VALUES(3,2); |
| 852 INSERT INTO t13 VALUES(4,2); |
| 853 CREATE INDEX t13ab ON t13(a,b); |
| 854 SELECT DISTINCT b from t13 WHERE a IN (1,2,3); |
| 855 } |
| 856 } {1 2} |
| 857 |
| 858 # 2014-02-18: Make sure compound SELECTs work with VALUES clauses |
| 859 # |
| 860 do_execsql_test select4-14.1 { |
| 861 CREATE TABLE t14(a,b,c); |
| 862 INSERT INTO t14 VALUES(1,2,3),(4,5,6); |
| 863 SELECT * FROM t14 INTERSECT VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3); |
| 864 } {1 2 3} |
| 865 do_execsql_test select4-14.2 { |
| 866 SELECT * FROM t14 INTERSECT VALUES(1,2,3); |
| 867 } {1 2 3} |
| 868 do_execsql_test select4-14.3 { |
| 869 SELECT * FROM t14 |
| 870 UNION VALUES(3,2,1),(2,3,1),(1,2,3),(7,8,9),(4,5,6) |
| 871 UNION SELECT * FROM t14 ORDER BY 1, 2, 3 |
| 872 } {1 2 3 2 3 1 3 2 1 4 5 6 7 8 9} |
| 873 do_execsql_test select4-14.4 { |
| 874 SELECT * FROM t14 |
| 875 UNION VALUES(3,2,1) |
| 876 UNION SELECT * FROM t14 ORDER BY 1, 2, 3 |
| 877 } {1 2 3 3 2 1 4 5 6} |
| 878 do_execsql_test select4-14.5 { |
| 879 SELECT * FROM t14 EXCEPT VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3); |
| 880 } {4 5 6} |
| 881 do_execsql_test select4-14.6 { |
| 882 SELECT * FROM t14 EXCEPT VALUES(1,2,3) |
| 883 } {4 5 6} |
| 884 do_execsql_test select4-14.7 { |
| 885 SELECT * FROM t14 EXCEPT VALUES(1,2,3) EXCEPT VALUES(4,5,6) |
| 886 } {} |
| 887 do_execsql_test select4-14.8 { |
| 888 SELECT * FROM t14 EXCEPT VALUES('a','b','c') EXCEPT VALUES(4,5,6) |
| 889 } {1 2 3} |
| 890 do_execsql_test select4-14.9 { |
| 891 SELECT * FROM t14 UNION ALL VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3); |
| 892 } {1 2 3 4 5 6 3 2 1 2 3 1 1 2 3 2 1 3} |
| 893 do_execsql_test select4-14.10 { |
| 894 SELECT (VALUES(1),(2),(3),(4)) |
| 895 } {1} |
| 896 do_execsql_test select4-14.11 { |
| 897 SELECT (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) |
| 898 } {1} |
| 899 do_execsql_test select4-14.12 { |
| 900 VALUES(1) UNION VALUES(2); |
| 901 } {1 2} |
| 902 do_execsql_test select4-14.13 { |
| 903 VALUES(1),(2),(3) EXCEPT VALUES(2); |
| 904 } {1 3} |
| 905 do_execsql_test select4-14.14 { |
| 906 VALUES(1),(2),(3) EXCEPT VALUES(1),(3); |
| 907 } {2} |
| 908 do_execsql_test select4-14.15 { |
| 909 SELECT * FROM (SELECT 123), (SELECT 456) ON likely(0 OR 1) OR 0; |
| 910 } {123 456} |
| 911 do_execsql_test select4-14.16 { |
| 912 VALUES(1),(2),(3),(4) UNION ALL SELECT 5 LIMIT 99; |
| 913 } {1 2 3 4 5} |
| 914 do_execsql_test select4-14.17 { |
| 915 VALUES(1),(2),(3),(4) UNION ALL SELECT 5 LIMIT 3; |
| 916 } {1 2 3} |
| 917 |
| 918 # Ticket https://www.sqlite.org/src/info/d06a25c84454a372 |
| 919 # Incorrect answer due to two co-routines using the same registers and expecting |
| 920 # those register values to be preserved across a Yield. |
| 921 # |
| 922 do_execsql_test select4-15.1 { |
| 923 DROP TABLE IF EXISTS tx; |
| 924 CREATE TABLE tx(id INTEGER PRIMARY KEY, a, b); |
| 925 INSERT INTO tx(a,b) VALUES(33,456); |
| 926 INSERT INTO tx(a,b) VALUES(33,789); |
| 927 |
| 928 SELECT DISTINCT t0.id, t0.a, t0.b |
| 929 FROM tx AS t0, tx AS t1 |
| 930 WHERE t0.a=t1.a AND t1.a=33 AND t0.b=456 |
| 931 UNION |
| 932 SELECT DISTINCT t0.id, t0.a, t0.b |
| 933 FROM tx AS t0, tx AS t1 |
| 934 WHERE t0.a=t1.a AND t1.a=33 AND t0.b=789 |
| 935 ORDER BY 1; |
| 936 } {1 33 456 2 33 789} |
| 937 |
| 938 # Enhancement (2016-03-15): Use a co-routine for subqueries if the |
| 939 # subquery is guaranteed to be the outer-most query |
| 940 # |
| 941 do_execsql_test select4-16.1 { |
| 942 DROP TABLE IF EXISTS t1; |
| 943 CREATE TABLE t1(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z, |
| 944 PRIMARY KEY(a,b DESC)) WITHOUT ROWID; |
| 945 |
| 946 WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) |
| 947 INSERT INTO t1(a,b,c,d) |
| 948 SELECT x%10, x/10, x, printf('xyz%dabc',x) FROM c; |
| 949 |
| 950 SELECT t3.c FROM |
| 951 (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2 |
| 952 JOIN t1 AS t3 |
| 953 WHERE t2.a=t3.a AND t2.m=t3.b |
| 954 ORDER BY t3.a; |
| 955 } {95 96 97 98 99} |
| 956 do_execsql_test select4-16.2 { |
| 957 SELECT t3.c FROM |
| 958 (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2 |
| 959 CROSS JOIN t1 AS t3 |
| 960 WHERE t2.a=t3.a AND t2.m=t3.b |
| 961 ORDER BY t3.a; |
| 962 } {95 96 97 98 99} |
| 963 do_execsql_test select4-16.3 { |
| 964 SELECT t3.c FROM |
| 965 (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2 |
| 966 LEFT JOIN t1 AS t3 |
| 967 WHERE t2.a=t3.a AND t2.m=t3.b |
| 968 ORDER BY t3.a; |
| 969 } {95 96 97 98 99} |
| 970 |
| 971 # Ticket https://www.sqlite.org/src/tktview/f7f8c97e975978d45 on 2016-04-25 |
| 972 # |
| 973 # The where push-down optimization from 2015-06-02 is suppose to disable |
| 974 # on aggregate subqueries. But if the subquery is a compound where the |
| 975 # last SELECT is non-aggregate but some other SELECT is an aggregate, the |
| 976 # test is incomplete and the optimization is not properly disabled. |
| 977 # |
| 978 # The following test cases verify that the fix works. |
| 979 # |
| 980 do_execsql_test select4-17.1 { |
| 981 DROP TABLE IF EXISTS t1; |
| 982 CREATE TABLE t1(a int, b int); |
| 983 INSERT INTO t1 VALUES(1,2),(1,18),(2,19); |
| 984 SELECT x, y FROM ( |
| 985 SELECT 98 AS x, 99 AS y |
| 986 UNION |
| 987 SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a |
| 988 ) AS w WHERE y>=20 |
| 989 ORDER BY +x; |
| 990 } {1 20 98 99} |
| 991 do_execsql_test select4-17.2 { |
| 992 SELECT x, y FROM ( |
| 993 SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a |
| 994 UNION |
| 995 SELECT 98 AS x, 99 AS y |
| 996 ) AS w WHERE y>=20 |
| 997 ORDER BY +x; |
| 998 } {1 20 98 99} |
| 999 do_catchsql_test select4-17.3 { |
| 1000 SELECT x, y FROM ( |
| 1001 SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a LIMIT 3 |
| 1002 UNION |
| 1003 SELECT 98 AS x, 99 AS y |
| 1004 ) AS w WHERE y>=20 |
| 1005 ORDER BY +x; |
| 1006 } {1 {LIMIT clause should come after UNION not before}} |
| 1007 |
| 1008 |
| 1009 |
| 1010 finish_test |
OLD | NEW |