| 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 # $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 resu
     lt 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 resu
     lt 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 resu
     lt 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 res
     ult 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 res
     ult 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 res
     ult 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 resu
     lt 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 resu
     lt 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 resu
     lt columns}} |  | 
|  805  |  | 
|  806 } ;# ifcapable compound |  | 
|  807  |  | 
|  808 finish_test |  | 
| OLD | NEW |