Home | History | Annotate | Download | only in test
      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
    809