Annotation of embedaddon/sqlite3/test/select4.test, revision 1.1
1.1 ! misho 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: # $Id: select4.test,v 1.30 2009/04/16 00:24:24 drh Exp $
! 16:
! 17: set testdir [file dirname $argv0]
! 18: source $testdir/tester.tcl
! 19:
! 20: # Most tests in this file depend on compound-select. But there are a couple
! 21: # right at the end that test DISTINCT, so we cannot omit the entire file.
! 22: #
! 23: ifcapable compound {
! 24:
! 25: # Build some test data
! 26: #
! 27: execsql {
! 28: CREATE TABLE t1(n int, log int);
! 29: BEGIN;
! 30: }
! 31: for {set i 1} {$i<32} {incr i} {
! 32: for {set j 0} {(1<<$j)<$i} {incr j} {}
! 33: execsql "INSERT INTO t1 VALUES($i,$j)"
! 34: }
! 35: execsql {
! 36: COMMIT;
! 37: }
! 38:
! 39: do_test select4-1.0 {
! 40: execsql {SELECT DISTINCT log FROM t1 ORDER BY log}
! 41: } {0 1 2 3 4 5}
! 42:
! 43: # Union All operator
! 44: #
! 45: do_test select4-1.1a {
! 46: lsort [execsql {SELECT DISTINCT log FROM t1}]
! 47: } {0 1 2 3 4 5}
! 48: do_test select4-1.1b {
! 49: lsort [execsql {SELECT n FROM t1 WHERE log=3}]
! 50: } {5 6 7 8}
! 51: do_test select4-1.1c {
! 52: execsql {
! 53: SELECT DISTINCT log FROM t1
! 54: UNION ALL
! 55: SELECT n FROM t1 WHERE log=3
! 56: ORDER BY log;
! 57: }
! 58: } {0 1 2 3 4 5 5 6 7 8}
! 59: do_test select4-1.1d {
! 60: execsql {
! 61: CREATE TABLE t2 AS
! 62: SELECT DISTINCT log FROM t1
! 63: UNION ALL
! 64: SELECT n FROM t1 WHERE log=3
! 65: ORDER BY log;
! 66: SELECT * FROM t2;
! 67: }
! 68: } {0 1 2 3 4 5 5 6 7 8}
! 69: execsql {DROP TABLE t2}
! 70: do_test select4-1.1e {
! 71: execsql {
! 72: CREATE TABLE t2 AS
! 73: SELECT DISTINCT log FROM t1
! 74: UNION ALL
! 75: SELECT n FROM t1 WHERE log=3
! 76: ORDER BY log DESC;
! 77: SELECT * FROM t2;
! 78: }
! 79: } {8 7 6 5 5 4 3 2 1 0}
! 80: execsql {DROP TABLE t2}
! 81: do_test select4-1.1f {
! 82: execsql {
! 83: SELECT DISTINCT log FROM t1
! 84: UNION ALL
! 85: SELECT n FROM t1 WHERE log=2
! 86: }
! 87: } {0 1 2 3 4 5 3 4}
! 88: do_test select4-1.1g {
! 89: execsql {
! 90: CREATE TABLE t2 AS
! 91: SELECT DISTINCT log FROM t1
! 92: UNION ALL
! 93: SELECT n FROM t1 WHERE log=2;
! 94: SELECT * FROM t2;
! 95: }
! 96: } {0 1 2 3 4 5 3 4}
! 97: execsql {DROP TABLE t2}
! 98: ifcapable subquery {
! 99: do_test select4-1.2 {
! 100: execsql {
! 101: SELECT log FROM t1 WHERE n IN
! 102: (SELECT DISTINCT log FROM t1 UNION ALL
! 103: SELECT n FROM t1 WHERE log=3)
! 104: ORDER BY log;
! 105: }
! 106: } {0 1 2 2 3 3 3 3}
! 107: }
! 108: do_test select4-1.3 {
! 109: set v [catch {execsql {
! 110: SELECT DISTINCT log FROM t1 ORDER BY log
! 111: UNION ALL
! 112: SELECT n FROM t1 WHERE log=3
! 113: ORDER BY log;
! 114: }} msg]
! 115: lappend v $msg
! 116: } {1 {ORDER BY clause should come after UNION ALL not before}}
! 117:
! 118: # Union operator
! 119: #
! 120: do_test select4-2.1 {
! 121: execsql {
! 122: SELECT DISTINCT log FROM t1
! 123: UNION
! 124: SELECT n FROM t1 WHERE log=3
! 125: ORDER BY log;
! 126: }
! 127: } {0 1 2 3 4 5 6 7 8}
! 128: ifcapable subquery {
! 129: do_test select4-2.2 {
! 130: execsql {
! 131: SELECT log FROM t1 WHERE n IN
! 132: (SELECT DISTINCT log FROM t1 UNION
! 133: SELECT n FROM t1 WHERE log=3)
! 134: ORDER BY log;
! 135: }
! 136: } {0 1 2 2 3 3 3 3}
! 137: }
! 138: do_test select4-2.3 {
! 139: set v [catch {execsql {
! 140: SELECT DISTINCT log FROM t1 ORDER BY log
! 141: UNION
! 142: SELECT n FROM t1 WHERE log=3
! 143: ORDER BY log;
! 144: }} msg]
! 145: lappend v $msg
! 146: } {1 {ORDER BY clause should come after UNION not before}}
! 147:
! 148: # Except operator
! 149: #
! 150: do_test select4-3.1.1 {
! 151: execsql {
! 152: SELECT DISTINCT log FROM t1
! 153: EXCEPT
! 154: SELECT n FROM t1 WHERE log=3
! 155: ORDER BY log;
! 156: }
! 157: } {0 1 2 3 4}
! 158: do_test select4-3.1.2 {
! 159: execsql {
! 160: CREATE TABLE t2 AS
! 161: SELECT DISTINCT log FROM t1
! 162: EXCEPT
! 163: SELECT n FROM t1 WHERE log=3
! 164: ORDER BY log;
! 165: SELECT * FROM t2;
! 166: }
! 167: } {0 1 2 3 4}
! 168: execsql {DROP TABLE t2}
! 169: do_test select4-3.1.3 {
! 170: execsql {
! 171: CREATE TABLE t2 AS
! 172: SELECT DISTINCT log FROM t1
! 173: EXCEPT
! 174: SELECT n FROM t1 WHERE log=3
! 175: ORDER BY log DESC;
! 176: SELECT * FROM t2;
! 177: }
! 178: } {4 3 2 1 0}
! 179: execsql {DROP TABLE t2}
! 180: ifcapable subquery {
! 181: do_test select4-3.2 {
! 182: execsql {
! 183: SELECT log FROM t1 WHERE n IN
! 184: (SELECT DISTINCT log FROM t1 EXCEPT
! 185: SELECT n FROM t1 WHERE log=3)
! 186: ORDER BY log;
! 187: }
! 188: } {0 1 2 2}
! 189: }
! 190: do_test select4-3.3 {
! 191: set v [catch {execsql {
! 192: SELECT DISTINCT log FROM t1 ORDER BY log
! 193: EXCEPT
! 194: SELECT n FROM t1 WHERE log=3
! 195: ORDER BY log;
! 196: }} msg]
! 197: lappend v $msg
! 198: } {1 {ORDER BY clause should come after EXCEPT not before}}
! 199:
! 200: # Intersect operator
! 201: #
! 202: do_test select4-4.1.1 {
! 203: execsql {
! 204: SELECT DISTINCT log FROM t1
! 205: INTERSECT
! 206: SELECT n FROM t1 WHERE log=3
! 207: ORDER BY log;
! 208: }
! 209: } {5}
! 210:
! 211: do_test select4-4.1.2 {
! 212: execsql {
! 213: SELECT DISTINCT log FROM t1
! 214: UNION ALL
! 215: SELECT 6
! 216: INTERSECT
! 217: SELECT n FROM t1 WHERE log=3
! 218: ORDER BY t1.log;
! 219: }
! 220: } {5 6}
! 221:
! 222: do_test select4-4.1.3 {
! 223: execsql {
! 224: CREATE TABLE t2 AS
! 225: SELECT DISTINCT log FROM t1 UNION ALL SELECT 6
! 226: INTERSECT
! 227: SELECT n FROM t1 WHERE log=3
! 228: ORDER BY log;
! 229: SELECT * FROM t2;
! 230: }
! 231: } {5 6}
! 232: execsql {DROP TABLE t2}
! 233: do_test select4-4.1.4 {
! 234: execsql {
! 235: CREATE TABLE t2 AS
! 236: SELECT DISTINCT log FROM t1 UNION ALL SELECT 6
! 237: INTERSECT
! 238: SELECT n FROM t1 WHERE log=3
! 239: ORDER BY log DESC;
! 240: SELECT * FROM t2;
! 241: }
! 242: } {6 5}
! 243: execsql {DROP TABLE t2}
! 244: ifcapable subquery {
! 245: do_test select4-4.2 {
! 246: execsql {
! 247: SELECT log FROM t1 WHERE n IN
! 248: (SELECT DISTINCT log FROM t1 INTERSECT
! 249: SELECT n FROM t1 WHERE log=3)
! 250: ORDER BY log;
! 251: }
! 252: } {3}
! 253: }
! 254: do_test select4-4.3 {
! 255: set v [catch {execsql {
! 256: SELECT DISTINCT log FROM t1 ORDER BY log
! 257: INTERSECT
! 258: SELECT n FROM t1 WHERE log=3
! 259: ORDER BY log;
! 260: }} msg]
! 261: lappend v $msg
! 262: } {1 {ORDER BY clause should come after INTERSECT not before}}
! 263:
! 264: # Various error messages while processing UNION or INTERSECT
! 265: #
! 266: do_test select4-5.1 {
! 267: set v [catch {execsql {
! 268: SELECT DISTINCT log FROM t2
! 269: UNION ALL
! 270: SELECT n FROM t1 WHERE log=3
! 271: ORDER BY log;
! 272: }} msg]
! 273: lappend v $msg
! 274: } {1 {no such table: t2}}
! 275: do_test select4-5.2 {
! 276: set v [catch {execsql {
! 277: SELECT DISTINCT log AS "xyzzy" FROM t1
! 278: UNION ALL
! 279: SELECT n FROM t1 WHERE log=3
! 280: ORDER BY xyzzy;
! 281: }} msg]
! 282: lappend v $msg
! 283: } {0 {0 1 2 3 4 5 5 6 7 8}}
! 284: do_test select4-5.2b {
! 285: set v [catch {execsql {
! 286: SELECT DISTINCT log AS xyzzy FROM t1
! 287: UNION ALL
! 288: SELECT n FROM t1 WHERE log=3
! 289: ORDER BY "xyzzy";
! 290: }} msg]
! 291: lappend v $msg
! 292: } {0 {0 1 2 3 4 5 5 6 7 8}}
! 293: do_test select4-5.2c {
! 294: set v [catch {execsql {
! 295: SELECT DISTINCT log FROM t1
! 296: UNION ALL
! 297: SELECT n FROM t1 WHERE log=3
! 298: ORDER BY "xyzzy";
! 299: }} msg]
! 300: lappend v $msg
! 301: } {1 {1st ORDER BY term does not match any column in the result set}}
! 302: do_test select4-5.2d {
! 303: set v [catch {execsql {
! 304: SELECT DISTINCT log FROM t1
! 305: INTERSECT
! 306: SELECT n FROM t1 WHERE log=3
! 307: ORDER BY "xyzzy";
! 308: }} msg]
! 309: lappend v $msg
! 310: } {1 {1st ORDER BY term does not match any column in the result set}}
! 311: do_test select4-5.2e {
! 312: set v [catch {execsql {
! 313: SELECT DISTINCT log FROM t1
! 314: UNION ALL
! 315: SELECT n FROM t1 WHERE log=3
! 316: ORDER BY n;
! 317: }} msg]
! 318: lappend v $msg
! 319: } {0 {0 1 2 3 4 5 5 6 7 8}}
! 320: do_test select4-5.2f {
! 321: catchsql {
! 322: SELECT DISTINCT log FROM t1
! 323: UNION ALL
! 324: SELECT n FROM t1 WHERE log=3
! 325: ORDER BY log;
! 326: }
! 327: } {0 {0 1 2 3 4 5 5 6 7 8}}
! 328: do_test select4-5.2g {
! 329: catchsql {
! 330: SELECT DISTINCT log FROM t1
! 331: UNION ALL
! 332: SELECT n FROM t1 WHERE log=3
! 333: ORDER BY 1;
! 334: }
! 335: } {0 {0 1 2 3 4 5 5 6 7 8}}
! 336: do_test select4-5.2h {
! 337: catchsql {
! 338: SELECT DISTINCT log FROM t1
! 339: UNION ALL
! 340: SELECT n FROM t1 WHERE log=3
! 341: ORDER BY 2;
! 342: }
! 343: } {1 {1st ORDER BY term out of range - should be between 1 and 1}}
! 344: do_test select4-5.2i {
! 345: catchsql {
! 346: SELECT DISTINCT 1, log FROM t1
! 347: UNION ALL
! 348: SELECT 2, n FROM t1 WHERE log=3
! 349: ORDER BY 2, 1;
! 350: }
! 351: } {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}}
! 352: do_test select4-5.2j {
! 353: catchsql {
! 354: SELECT DISTINCT 1, log FROM t1
! 355: UNION ALL
! 356: SELECT 2, n FROM t1 WHERE log=3
! 357: ORDER BY 1, 2 DESC;
! 358: }
! 359: } {0 {1 5 1 4 1 3 1 2 1 1 1 0 2 8 2 7 2 6 2 5}}
! 360: do_test select4-5.2k {
! 361: catchsql {
! 362: SELECT DISTINCT 1, log FROM t1
! 363: UNION ALL
! 364: SELECT 2, n FROM t1 WHERE log=3
! 365: ORDER BY n, 1;
! 366: }
! 367: } {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}}
! 368: do_test select4-5.3 {
! 369: set v [catch {execsql {
! 370: SELECT DISTINCT log, n FROM t1
! 371: UNION ALL
! 372: SELECT n FROM t1 WHERE log=3
! 373: ORDER BY log;
! 374: }} msg]
! 375: lappend v $msg
! 376: } {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
! 377: do_test select4-5.3-3807-1 {
! 378: catchsql {
! 379: SELECT 1 UNION SELECT 2, 3 UNION SELECT 4, 5 ORDER BY 1;
! 380: }
! 381: } {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
! 382: do_test select4-5.4 {
! 383: set v [catch {execsql {
! 384: SELECT log FROM t1 WHERE n=2
! 385: UNION ALL
! 386: SELECT log FROM t1 WHERE n=3
! 387: UNION ALL
! 388: SELECT log FROM t1 WHERE n=4
! 389: UNION ALL
! 390: SELECT log FROM t1 WHERE n=5
! 391: ORDER BY log;
! 392: }} msg]
! 393: lappend v $msg
! 394: } {0 {1 2 2 3}}
! 395:
! 396: do_test select4-6.1 {
! 397: execsql {
! 398: SELECT log, count(*) as cnt FROM t1 GROUP BY log
! 399: UNION
! 400: SELECT log, n FROM t1 WHERE n=7
! 401: ORDER BY cnt, log;
! 402: }
! 403: } {0 1 1 1 2 2 3 4 3 7 4 8 5 15}
! 404: do_test select4-6.2 {
! 405: execsql {
! 406: SELECT log, count(*) FROM t1 GROUP BY log
! 407: UNION
! 408: SELECT log, n FROM t1 WHERE n=7
! 409: ORDER BY count(*), log;
! 410: }
! 411: } {0 1 1 1 2 2 3 4 3 7 4 8 5 15}
! 412:
! 413: # NULLs are indistinct for the UNION operator.
! 414: # Make sure the UNION operator recognizes this
! 415: #
! 416: do_test select4-6.3 {
! 417: execsql {
! 418: SELECT NULL UNION SELECT NULL UNION
! 419: SELECT 1 UNION SELECT 2 AS 'x'
! 420: ORDER BY x;
! 421: }
! 422: } {{} 1 2}
! 423: do_test select4-6.3.1 {
! 424: execsql {
! 425: SELECT NULL UNION ALL SELECT NULL UNION ALL
! 426: SELECT 1 UNION ALL SELECT 2 AS 'x'
! 427: ORDER BY x;
! 428: }
! 429: } {{} {} 1 2}
! 430:
! 431: # Make sure the DISTINCT keyword treats NULLs as indistinct.
! 432: #
! 433: ifcapable subquery {
! 434: do_test select4-6.4 {
! 435: execsql {
! 436: SELECT * FROM (
! 437: SELECT NULL, 1 UNION ALL SELECT NULL, 1
! 438: );
! 439: }
! 440: } {{} 1 {} 1}
! 441: do_test select4-6.5 {
! 442: execsql {
! 443: SELECT DISTINCT * FROM (
! 444: SELECT NULL, 1 UNION ALL SELECT NULL, 1
! 445: );
! 446: }
! 447: } {{} 1}
! 448: do_test select4-6.6 {
! 449: execsql {
! 450: SELECT DISTINCT * FROM (
! 451: SELECT 1,2 UNION ALL SELECT 1,2
! 452: );
! 453: }
! 454: } {1 2}
! 455: }
! 456:
! 457: # Test distinctness of NULL in other ways.
! 458: #
! 459: do_test select4-6.7 {
! 460: execsql {
! 461: SELECT NULL EXCEPT SELECT NULL
! 462: }
! 463: } {}
! 464:
! 465:
! 466: # Make sure column names are correct when a compound select appears as
! 467: # an expression in the WHERE clause.
! 468: #
! 469: do_test select4-7.1 {
! 470: execsql {
! 471: CREATE TABLE t2 AS SELECT log AS 'x', count(*) AS 'y' FROM t1 GROUP BY log;
! 472: SELECT * FROM t2 ORDER BY x;
! 473: }
! 474: } {0 1 1 1 2 2 3 4 4 8 5 15}
! 475: ifcapable subquery {
! 476: do_test select4-7.2 {
! 477: execsql2 {
! 478: SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 INTERSECT SELECT x FROM t2)
! 479: ORDER BY n
! 480: }
! 481: } {n 1 log 0 n 2 log 1 n 3 log 2 n 4 log 2 n 5 log 3}
! 482: do_test select4-7.3 {
! 483: execsql2 {
! 484: SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 EXCEPT SELECT x FROM t2)
! 485: ORDER BY n LIMIT 2
! 486: }
! 487: } {n 6 log 3 n 7 log 3}
! 488: do_test select4-7.4 {
! 489: execsql2 {
! 490: SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 UNION SELECT x FROM t2)
! 491: ORDER BY n LIMIT 2
! 492: }
! 493: } {n 1 log 0 n 2 log 1}
! 494: } ;# ifcapable subquery
! 495:
! 496: } ;# ifcapable compound
! 497:
! 498: # Make sure DISTINCT works appropriately on TEXT and NUMERIC columns.
! 499: do_test select4-8.1 {
! 500: execsql {
! 501: BEGIN;
! 502: CREATE TABLE t3(a text, b float, c text);
! 503: INSERT INTO t3 VALUES(1, 1.1, '1.1');
! 504: INSERT INTO t3 VALUES(2, 1.10, '1.10');
! 505: INSERT INTO t3 VALUES(3, 1.10, '1.1');
! 506: INSERT INTO t3 VALUES(4, 1.1, '1.10');
! 507: INSERT INTO t3 VALUES(5, 1.2, '1.2');
! 508: INSERT INTO t3 VALUES(6, 1.3, '1.3');
! 509: COMMIT;
! 510: }
! 511: execsql {
! 512: SELECT DISTINCT b FROM t3 ORDER BY c;
! 513: }
! 514: } {1.1 1.2 1.3}
! 515: do_test select4-8.2 {
! 516: execsql {
! 517: SELECT DISTINCT c FROM t3 ORDER BY c;
! 518: }
! 519: } {1.1 1.10 1.2 1.3}
! 520:
! 521: # Make sure the names of columns are taken from the right-most subquery
! 522: # right in a compound query. Ticket #1721
! 523: #
! 524: ifcapable compound {
! 525:
! 526: do_test select4-9.1 {
! 527: execsql2 {
! 528: SELECT x, y FROM t2 UNION SELECT a, b FROM t3 ORDER BY x LIMIT 1
! 529: }
! 530: } {x 0 y 1}
! 531: do_test select4-9.2 {
! 532: execsql2 {
! 533: SELECT x, y FROM t2 UNION ALL SELECT a, b FROM t3 ORDER BY x LIMIT 1
! 534: }
! 535: } {x 0 y 1}
! 536: do_test select4-9.3 {
! 537: execsql2 {
! 538: SELECT x, y FROM t2 EXCEPT SELECT a, b FROM t3 ORDER BY x LIMIT 1
! 539: }
! 540: } {x 0 y 1}
! 541: do_test select4-9.4 {
! 542: execsql2 {
! 543: SELECT x, y FROM t2 INTERSECT SELECT 0 AS a, 1 AS b;
! 544: }
! 545: } {x 0 y 1}
! 546: do_test select4-9.5 {
! 547: execsql2 {
! 548: SELECT 0 AS x, 1 AS y
! 549: UNION
! 550: SELECT 2 AS p, 3 AS q
! 551: UNION
! 552: SELECT 4 AS a, 5 AS b
! 553: ORDER BY x LIMIT 1
! 554: }
! 555: } {x 0 y 1}
! 556:
! 557: ifcapable subquery {
! 558: do_test select4-9.6 {
! 559: execsql2 {
! 560: SELECT * FROM (
! 561: SELECT 0 AS x, 1 AS y
! 562: UNION
! 563: SELECT 2 AS p, 3 AS q
! 564: UNION
! 565: SELECT 4 AS a, 5 AS b
! 566: ) ORDER BY 1 LIMIT 1;
! 567: }
! 568: } {x 0 y 1}
! 569: do_test select4-9.7 {
! 570: execsql2 {
! 571: SELECT * FROM (
! 572: SELECT 0 AS x, 1 AS y
! 573: UNION
! 574: SELECT 2 AS p, 3 AS q
! 575: UNION
! 576: SELECT 4 AS a, 5 AS b
! 577: ) ORDER BY x LIMIT 1;
! 578: }
! 579: } {x 0 y 1}
! 580: } ;# ifcapable subquery
! 581:
! 582: do_test select4-9.8 {
! 583: execsql {
! 584: SELECT 0 AS x, 1 AS y
! 585: UNION
! 586: SELECT 2 AS y, -3 AS x
! 587: ORDER BY x LIMIT 1;
! 588: }
! 589: } {0 1}
! 590:
! 591: do_test select4-9.9.1 {
! 592: execsql2 {
! 593: SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a
! 594: }
! 595: } {a 1 b 2 a 3 b 4}
! 596:
! 597: ifcapable subquery {
! 598: do_test select4-9.9.2 {
! 599: execsql2 {
! 600: SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a)
! 601: WHERE b=3
! 602: }
! 603: } {}
! 604: do_test select4-9.10 {
! 605: execsql2 {
! 606: SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a)
! 607: WHERE b=2
! 608: }
! 609: } {a 1 b 2}
! 610: do_test select4-9.11 {
! 611: execsql2 {
! 612: SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b)
! 613: WHERE b=2
! 614: }
! 615: } {a 1 b 2}
! 616: do_test select4-9.12 {
! 617: execsql2 {
! 618: SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b)
! 619: WHERE b>0
! 620: }
! 621: } {a 1 b 2 a 3 b 4}
! 622: } ;# ifcapable subquery
! 623:
! 624: # Try combining DISTINCT, LIMIT, and OFFSET. Make sure they all work
! 625: # together.
! 626: #
! 627: do_test select4-10.1 {
! 628: execsql {
! 629: SELECT DISTINCT log FROM t1 ORDER BY log
! 630: }
! 631: } {0 1 2 3 4 5}
! 632: do_test select4-10.2 {
! 633: execsql {
! 634: SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 4
! 635: }
! 636: } {0 1 2 3}
! 637: do_test select4-10.3 {
! 638: execsql {
! 639: SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0
! 640: }
! 641: } {}
! 642: do_test select4-10.4 {
! 643: execsql {
! 644: SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1
! 645: }
! 646: } {0 1 2 3 4 5}
! 647: do_test select4-10.5 {
! 648: execsql {
! 649: SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1 OFFSET 2
! 650: }
! 651: } {2 3 4 5}
! 652: do_test select4-10.6 {
! 653: execsql {
! 654: SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 3 OFFSET 2
! 655: }
! 656: } {2 3 4}
! 657: do_test select4-10.7 {
! 658: execsql {
! 659: SELECT DISTINCT log FROM t1 ORDER BY +log LIMIT 3 OFFSET 20
! 660: }
! 661: } {}
! 662: do_test select4-10.8 {
! 663: execsql {
! 664: SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0 OFFSET 3
! 665: }
! 666: } {}
! 667: do_test select4-10.9 {
! 668: execsql {
! 669: SELECT DISTINCT max(n), log FROM t1 ORDER BY +log; -- LIMIT 2 OFFSET 1
! 670: }
! 671: } {31 5}
! 672:
! 673: # Make sure compound SELECTs with wildly different numbers of columns
! 674: # do not cause assertion faults due to register allocation issues.
! 675: #
! 676: do_test select4-11.1 {
! 677: catchsql {
! 678: 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
! 679: UNION
! 680: SELECT x FROM t2
! 681: }
! 682: } {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
! 683: do_test select4-11.2 {
! 684: catchsql {
! 685: SELECT x FROM t2
! 686: UNION
! 687: 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
! 688: }
! 689: } {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
! 690: do_test select4-11.3 {
! 691: catchsql {
! 692: 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
! 693: UNION ALL
! 694: SELECT x FROM t2
! 695: }
! 696: } {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
! 697: do_test select4-11.4 {
! 698: catchsql {
! 699: SELECT x FROM t2
! 700: UNION ALL
! 701: 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
! 702: }
! 703: } {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
! 704: do_test select4-11.5 {
! 705: catchsql {
! 706: 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
! 707: EXCEPT
! 708: SELECT x FROM t2
! 709: }
! 710: } {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
! 711: do_test select4-11.6 {
! 712: catchsql {
! 713: SELECT x FROM t2
! 714: EXCEPT
! 715: 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
! 716: }
! 717: } {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
! 718: do_test select4-11.7 {
! 719: catchsql {
! 720: 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
! 721: INTERSECT
! 722: SELECT x FROM t2
! 723: }
! 724: } {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
! 725: do_test select4-11.8 {
! 726: catchsql {
! 727: SELECT x FROM t2
! 728: INTERSECT
! 729: 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
! 730: }
! 731: } {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
! 732:
! 733: do_test select4-11.11 {
! 734: catchsql {
! 735: SELECT x FROM t2
! 736: UNION
! 737: SELECT x FROM t2
! 738: UNION ALL
! 739: SELECT x FROM t2
! 740: EXCEPT
! 741: SELECT x FROM t2
! 742: INTERSECT
! 743: 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
! 744: }
! 745: } {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
! 746: do_test select4-11.12 {
! 747: catchsql {
! 748: SELECT x FROM t2
! 749: UNION
! 750: SELECT x FROM t2
! 751: UNION ALL
! 752: SELECT x FROM t2
! 753: EXCEPT
! 754: 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
! 755: EXCEPT
! 756: SELECT x FROM t2
! 757: }
! 758: } {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
! 759: do_test select4-11.13 {
! 760: catchsql {
! 761: SELECT x FROM t2
! 762: UNION
! 763: SELECT x FROM t2
! 764: UNION ALL
! 765: 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
! 766: UNION ALL
! 767: SELECT x FROM t2
! 768: EXCEPT
! 769: SELECT x FROM t2
! 770: }
! 771: } {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
! 772: do_test select4-11.14 {
! 773: catchsql {
! 774: SELECT x FROM t2
! 775: UNION
! 776: 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
! 777: UNION
! 778: SELECT x FROM t2
! 779: UNION ALL
! 780: SELECT x FROM t2
! 781: EXCEPT
! 782: SELECT x FROM t2
! 783: }
! 784: } {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
! 785: do_test select4-11.15 {
! 786: catchsql {
! 787: 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
! 788: UNION
! 789: SELECT x FROM t2
! 790: INTERSECT
! 791: SELECT 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 do not have the same number of result columns}}
! 798:
! 799: do_test select4-12.1 {
! 800: sqlite3 db2 :memory:
! 801: catchsql {
! 802: SELECT 1 UNION SELECT 2,3 UNION SELECT 4,5 ORDER BY 1;
! 803: } db2
! 804: } {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
! 805:
! 806: } ;# ifcapable compound
! 807:
! 808: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>