github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/select4.test (about)

     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 result 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 result 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 result 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 result 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 result 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 result 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 result 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 result 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 result 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 result 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  # 2020-04-03 ticket 51166be0159fd2ce from Yong Heng.
  1009  # Adverse interaction between the constant propagation and push-down
  1010  # optimizations.
  1011  #
  1012  reset_db
  1013  do_execsql_test select4-18.1 {
  1014    CREATE VIEW v0(v0) AS WITH v0 AS(SELECT 0 v0) SELECT(SELECT min(v0) OVER()) FROM v0 GROUP BY v0;
  1015    SELECT *FROM v0 v1 JOIN v0 USING(v0) WHERE datetime(v0) = (v0.v0)AND v0 = 10;
  1016  } {}
  1017  do_execsql_test select4-18.2 {
  1018    CREATE VIEW t1(aa) AS
  1019       WITH t2(bb) AS (SELECT 123)
  1020       SELECT (SELECT min(bb) OVER()) FROM t2 GROUP BY bb;
  1021    SELECT * FROM t1;
  1022  } {123}
  1023  do_execsql_test select4-18.3 {
  1024    SELECT * FROM t1 AS z1 JOIN t1 AS z2 USING(aa)
  1025     WHERE abs(z1.aa)=z2.aa AND z1.aa=123;
  1026  } {123}
  1027  
  1028  # 2021-03-31 Fix an assert() problem in the logic at the end of sqlite3Select()
  1029  # that validates AggInfo.  The checks to ensure that AggInfo.aCol[].pCExpr
  1030  # references a valid expression was looking at an expression that had been
  1031  # deleted by the truth optimization in sqlite3ExprAnd() which was invoked by
  1032  # the push-down optimization.  This is harmless in delivery builds, as that code
  1033  # only runs with SQLITE_DEBUG.  But it should still be fixed.  The problem
  1034  # was discovered by dbsqlfuzz (crash-dece7b67a3552ed7e571a7bda903afd1f7bd9b21)
  1035  #
  1036  reset_db
  1037  do_execsql_test select4-19.1 {
  1038    CREATE TABLE t1(x);
  1039    INSERT INTO t1 VALUES(99);
  1040    SELECT sum((SELECT 1 FROM (SELECT 2 WHERE x IS NULL) WHERE 0)) FROM t1;
  1041  } {{}}
  1042  
  1043  finish_test