1b19a2bc6Sdrh# 2001 September 15 292dba24bSdrh# 3b19a2bc6Sdrh# The author disclaims copyright to this source code. In place of 4b19a2bc6Sdrh# a legal notice, here is a blessing: 592dba24bSdrh# 6b19a2bc6Sdrh# May you do good and not evil. 7b19a2bc6Sdrh# May you find forgiveness for yourself and forgive others. 8b19a2bc6Sdrh# May you share freely, never taking more than you give. 992dba24bSdrh# 1092dba24bSdrh#*********************************************************************** 1192dba24bSdrh# This file implements regression tests for SQLite library. The 1292dba24bSdrh# focus of this file is testing UNION, INTERSECT and EXCEPT operators 1392dba24bSdrh# in SELECT statements. 1492dba24bSdrh# 1592dba24bSdrh 1692dba24bSdrhset testdir [file dirname $argv0] 1792dba24bSdrhsource $testdir/tester.tcl 1892dba24bSdrh 1927c77438Sdanielk1977# Most tests in this file depend on compound-select. But there are a couple 2027c77438Sdanielk1977# right at the end that test DISTINCT, so we cannot omit the entire file. 2127c77438Sdanielk1977# 2227c77438Sdanielk1977ifcapable compound { 2327c77438Sdanielk1977 2492dba24bSdrh# Build some test data 2592dba24bSdrh# 2692dba24bSdrhexecsql { 2792dba24bSdrh CREATE TABLE t1(n int, log int); 285f3b4ab5Sdrh BEGIN; 2992dba24bSdrh} 305f3b4ab5Sdrhfor {set i 1} {$i<32} {incr i} { 3124acd8f9Sdanielk1977 for {set j 0} {(1<<$j)<$i} {incr j} {} 325f3b4ab5Sdrh execsql "INSERT INTO t1 VALUES($i,$j)" 335f3b4ab5Sdrh} 345f3b4ab5Sdrhexecsql { 355f3b4ab5Sdrh COMMIT; 365f3b4ab5Sdrh} 3792cd52f5Sdrh 3892cd52f5Sdrhdo_test select4-1.0 { 3992dba24bSdrh execsql {SELECT DISTINCT log FROM t1 ORDER BY log} 4092dba24bSdrh} {0 1 2 3 4 5} 4192dba24bSdrh 4292dba24bSdrh# Union All operator 4392dba24bSdrh# 4492dba24bSdrhdo_test select4-1.1a { 4592dba24bSdrh lsort [execsql {SELECT DISTINCT log FROM t1}] 4692dba24bSdrh} {0 1 2 3 4 5} 4792dba24bSdrhdo_test select4-1.1b { 4892dba24bSdrh lsort [execsql {SELECT n FROM t1 WHERE log=3}] 4992dba24bSdrh} {5 6 7 8} 5092dba24bSdrhdo_test select4-1.1c { 5192dba24bSdrh execsql { 5292dba24bSdrh SELECT DISTINCT log FROM t1 5392dba24bSdrh UNION ALL 5492dba24bSdrh SELECT n FROM t1 WHERE log=3 5592dba24bSdrh ORDER BY log; 5692dba24bSdrh } 5792dba24bSdrh} {0 1 2 3 4 5 5 6 7 8} 58c926afbcSdrhdo_test select4-1.1d { 59c926afbcSdrh execsql { 60c926afbcSdrh CREATE TABLE t2 AS 61c926afbcSdrh SELECT DISTINCT log FROM t1 62c926afbcSdrh UNION ALL 63c926afbcSdrh SELECT n FROM t1 WHERE log=3 64c926afbcSdrh ORDER BY log; 65c926afbcSdrh SELECT * FROM t2; 66c926afbcSdrh } 67c926afbcSdrh} {0 1 2 3 4 5 5 6 7 8} 68c926afbcSdrhexecsql {DROP TABLE t2} 69c926afbcSdrhdo_test select4-1.1e { 70c926afbcSdrh execsql { 71c926afbcSdrh CREATE TABLE t2 AS 72c926afbcSdrh SELECT DISTINCT log FROM t1 73c926afbcSdrh UNION ALL 74c926afbcSdrh SELECT n FROM t1 WHERE log=3 75c926afbcSdrh ORDER BY log DESC; 76c926afbcSdrh SELECT * FROM t2; 77c926afbcSdrh } 78c926afbcSdrh} {8 7 6 5 5 4 3 2 1 0} 79c926afbcSdrhexecsql {DROP TABLE t2} 80f46f905aSdrhdo_test select4-1.1f { 81f46f905aSdrh execsql { 82f46f905aSdrh SELECT DISTINCT log FROM t1 83f46f905aSdrh UNION ALL 84f46f905aSdrh SELECT n FROM t1 WHERE log=2 85f46f905aSdrh } 86f46f905aSdrh} {0 1 2 3 4 5 3 4} 87f46f905aSdrhdo_test select4-1.1g { 88f46f905aSdrh execsql { 89f46f905aSdrh CREATE TABLE t2 AS 90f46f905aSdrh SELECT DISTINCT log FROM t1 91f46f905aSdrh UNION ALL 92f46f905aSdrh SELECT n FROM t1 WHERE log=2; 93f46f905aSdrh SELECT * FROM t2; 94f46f905aSdrh } 95f46f905aSdrh} {0 1 2 3 4 5 3 4} 96f46f905aSdrhexecsql {DROP TABLE t2} 97e61b9f4fSdanielk1977ifcapable subquery { 9892dba24bSdrh do_test select4-1.2 { 9992dba24bSdrh execsql { 10092dba24bSdrh SELECT log FROM t1 WHERE n IN 10192dba24bSdrh (SELECT DISTINCT log FROM t1 UNION ALL 10292dba24bSdrh SELECT n FROM t1 WHERE log=3) 10392dba24bSdrh ORDER BY log; 10492dba24bSdrh } 10592dba24bSdrh } {0 1 2 2 3 3 3 3} 106e61b9f4fSdanielk1977} 1072af878ecSdrh 1082af878ecSdrh# EVIDENCE-OF: R-02644-22131 In a compound SELECT statement, only the 1092af878ecSdrh# last or right-most simple SELECT may have an ORDER BY clause. 1102af878ecSdrh# 11192cd52f5Sdrhdo_test select4-1.3 { 11292cd52f5Sdrh set v [catch {execsql { 11392cd52f5Sdrh SELECT DISTINCT log FROM t1 ORDER BY log 11492cd52f5Sdrh UNION ALL 11592cd52f5Sdrh SELECT n FROM t1 WHERE log=3 11692cd52f5Sdrh ORDER BY log; 11792cd52f5Sdrh }} msg] 11892cd52f5Sdrh lappend v $msg 11992cd52f5Sdrh} {1 {ORDER BY clause should come after UNION ALL not before}} 120a276e3fdSdrhdo_catchsql_test select4-1.4 { 1217b4da150Sdrh SELECT (VALUES(0) INTERSECT SELECT(0) UNION SELECT(0) ORDER BY 1 UNION 122a276e3fdSdrh SELECT 0 UNION SELECT 0 ORDER BY 1); 123a276e3fdSdrh} {1 {ORDER BY clause should come after UNION not before}} 12492dba24bSdrh 12592dba24bSdrh# Union operator 12692dba24bSdrh# 12792dba24bSdrhdo_test select4-2.1 { 12892dba24bSdrh execsql { 12992dba24bSdrh SELECT DISTINCT log FROM t1 13092dba24bSdrh UNION 13192dba24bSdrh SELECT n FROM t1 WHERE log=3 13292dba24bSdrh ORDER BY log; 13392dba24bSdrh } 13492dba24bSdrh} {0 1 2 3 4 5 6 7 8} 135e61b9f4fSdanielk1977ifcapable subquery { 13692dba24bSdrh do_test select4-2.2 { 13792dba24bSdrh execsql { 13892dba24bSdrh SELECT log FROM t1 WHERE n IN 13992dba24bSdrh (SELECT DISTINCT log FROM t1 UNION 14092dba24bSdrh SELECT n FROM t1 WHERE log=3) 14192dba24bSdrh ORDER BY log; 14292dba24bSdrh } 14392dba24bSdrh } {0 1 2 2 3 3 3 3} 144e61b9f4fSdanielk1977} 14592cd52f5Sdrhdo_test select4-2.3 { 14692cd52f5Sdrh set v [catch {execsql { 14792cd52f5Sdrh SELECT DISTINCT log FROM t1 ORDER BY log 14892cd52f5Sdrh UNION 14992cd52f5Sdrh SELECT n FROM t1 WHERE log=3 15092cd52f5Sdrh ORDER BY log; 15192cd52f5Sdrh }} msg] 15292cd52f5Sdrh lappend v $msg 15392cd52f5Sdrh} {1 {ORDER BY clause should come after UNION not before}} 1547b4da150Sdrhdo_test select4-2.4 { 1557b4da150Sdrh set v [catch {execsql { 1567b4da150Sdrh SELECT 0 ORDER BY (SELECT 0) UNION SELECT 0; 1577b4da150Sdrh }} msg] 1587b4da150Sdrh lappend v $msg 1597b4da150Sdrh} {1 {ORDER BY clause should come after UNION not before}} 1609b40e474Sdrhdo_execsql_test select4-2.5 { 1619b40e474Sdrh SELECT 123 AS x ORDER BY (SELECT x ORDER BY 1); 1629b40e474Sdrh} {123} 16392dba24bSdrh 16492dba24bSdrh# Except operator 16592dba24bSdrh# 166c926afbcSdrhdo_test select4-3.1.1 { 16792dba24bSdrh execsql { 16892dba24bSdrh SELECT DISTINCT log FROM t1 16992dba24bSdrh EXCEPT 17092dba24bSdrh SELECT n FROM t1 WHERE log=3 17192dba24bSdrh ORDER BY log; 17292dba24bSdrh } 17392dba24bSdrh} {0 1 2 3 4} 174c926afbcSdrhdo_test select4-3.1.2 { 175c926afbcSdrh execsql { 176c926afbcSdrh CREATE TABLE t2 AS 177c926afbcSdrh SELECT DISTINCT log FROM t1 178c926afbcSdrh EXCEPT 179c926afbcSdrh SELECT n FROM t1 WHERE log=3 180c926afbcSdrh ORDER BY log; 181c926afbcSdrh SELECT * FROM t2; 182c926afbcSdrh } 183c926afbcSdrh} {0 1 2 3 4} 184c926afbcSdrhexecsql {DROP TABLE t2} 185c926afbcSdrhdo_test select4-3.1.3 { 186c926afbcSdrh execsql { 187c926afbcSdrh CREATE TABLE t2 AS 188c926afbcSdrh SELECT DISTINCT log FROM t1 189c926afbcSdrh EXCEPT 190c926afbcSdrh SELECT n FROM t1 WHERE log=3 191c926afbcSdrh ORDER BY log DESC; 192c926afbcSdrh SELECT * FROM t2; 193c926afbcSdrh } 194c926afbcSdrh} {4 3 2 1 0} 195c926afbcSdrhexecsql {DROP TABLE t2} 196e61b9f4fSdanielk1977ifcapable subquery { 19792dba24bSdrh do_test select4-3.2 { 19892dba24bSdrh execsql { 19992dba24bSdrh SELECT log FROM t1 WHERE n IN 20092dba24bSdrh (SELECT DISTINCT log FROM t1 EXCEPT 20192dba24bSdrh SELECT n FROM t1 WHERE log=3) 20292dba24bSdrh ORDER BY log; 20392dba24bSdrh } 20492dba24bSdrh } {0 1 2 2} 205e61b9f4fSdanielk1977} 20692cd52f5Sdrhdo_test select4-3.3 { 20792cd52f5Sdrh set v [catch {execsql { 20892cd52f5Sdrh SELECT DISTINCT log FROM t1 ORDER BY log 20992cd52f5Sdrh EXCEPT 21092cd52f5Sdrh SELECT n FROM t1 WHERE log=3 21192cd52f5Sdrh ORDER BY log; 21292cd52f5Sdrh }} msg] 21392cd52f5Sdrh lappend v $msg 21492cd52f5Sdrh} {1 {ORDER BY clause should come after EXCEPT not before}} 21592dba24bSdrh 21692dba24bSdrh# Intersect operator 21792dba24bSdrh# 218c926afbcSdrhdo_test select4-4.1.1 { 21992dba24bSdrh execsql { 22092dba24bSdrh SELECT DISTINCT log FROM t1 22192dba24bSdrh INTERSECT 22292dba24bSdrh SELECT n FROM t1 WHERE log=3 22392dba24bSdrh ORDER BY log; 22492dba24bSdrh } 22592dba24bSdrh} {5} 226452c989fSdanielk1977 227c926afbcSdrhdo_test select4-4.1.2 { 228c926afbcSdrh execsql { 2291e281291Sdrh SELECT DISTINCT log FROM t1 2301e281291Sdrh UNION ALL 2311e281291Sdrh SELECT 6 232c926afbcSdrh INTERSECT 233c926afbcSdrh SELECT n FROM t1 WHERE log=3 2341e281291Sdrh ORDER BY t1.log; 235c926afbcSdrh } 236c926afbcSdrh} {5 6} 2371e281291Sdrh 238c926afbcSdrhdo_test select4-4.1.3 { 239c926afbcSdrh execsql { 240c926afbcSdrh CREATE TABLE t2 AS 2413d1bfeaaSdanielk1977 SELECT DISTINCT log FROM t1 UNION ALL SELECT 6 242c926afbcSdrh INTERSECT 243c926afbcSdrh SELECT n FROM t1 WHERE log=3 244c926afbcSdrh ORDER BY log; 245c926afbcSdrh SELECT * FROM t2; 246c926afbcSdrh } 247c926afbcSdrh} {5 6} 248c926afbcSdrhexecsql {DROP TABLE t2} 249c926afbcSdrhdo_test select4-4.1.4 { 250c926afbcSdrh execsql { 251c926afbcSdrh CREATE TABLE t2 AS 2523d1bfeaaSdanielk1977 SELECT DISTINCT log FROM t1 UNION ALL SELECT 6 253c926afbcSdrh INTERSECT 254c926afbcSdrh SELECT n FROM t1 WHERE log=3 255c926afbcSdrh ORDER BY log DESC; 256c926afbcSdrh SELECT * FROM t2; 257c926afbcSdrh } 258c926afbcSdrh} {6 5} 259c926afbcSdrhexecsql {DROP TABLE t2} 260e61b9f4fSdanielk1977ifcapable subquery { 26192dba24bSdrh do_test select4-4.2 { 26292dba24bSdrh execsql { 26392dba24bSdrh SELECT log FROM t1 WHERE n IN 26492dba24bSdrh (SELECT DISTINCT log FROM t1 INTERSECT 26592dba24bSdrh SELECT n FROM t1 WHERE log=3) 26692dba24bSdrh ORDER BY log; 26792dba24bSdrh } 26892dba24bSdrh } {3} 269e61b9f4fSdanielk1977} 27092cd52f5Sdrhdo_test select4-4.3 { 27192cd52f5Sdrh set v [catch {execsql { 27292cd52f5Sdrh SELECT DISTINCT log FROM t1 ORDER BY log 27392cd52f5Sdrh INTERSECT 27492cd52f5Sdrh SELECT n FROM t1 WHERE log=3 27592cd52f5Sdrh ORDER BY log; 27692cd52f5Sdrh }} msg] 27792cd52f5Sdrh lappend v $msg 27892cd52f5Sdrh} {1 {ORDER BY clause should come after INTERSECT not before}} 2799af8646dSdrhdo_catchsql_test select4-4.4 { 2809af8646dSdrh SELECT 3 IN ( 2819af8646dSdrh SELECT 0 ORDER BY 1 2829af8646dSdrh INTERSECT 2839af8646dSdrh SELECT 1 2849af8646dSdrh INTERSECT 2859af8646dSdrh SELECT 2 2869af8646dSdrh ORDER BY 1 2879af8646dSdrh ); 2889af8646dSdrh} {1 {ORDER BY clause should come after INTERSECT not before}} 28992cd52f5Sdrh 29092cd52f5Sdrh# Various error messages while processing UNION or INTERSECT 29192cd52f5Sdrh# 29292cd52f5Sdrhdo_test select4-5.1 { 29392cd52f5Sdrh set v [catch {execsql { 29492cd52f5Sdrh SELECT DISTINCT log FROM t2 29592cd52f5Sdrh UNION ALL 29692cd52f5Sdrh SELECT n FROM t1 WHERE log=3 29792cd52f5Sdrh ORDER BY log; 29892cd52f5Sdrh }} msg] 29992cd52f5Sdrh lappend v $msg 30092cd52f5Sdrh} {1 {no such table: t2}} 30192cd52f5Sdrhdo_test select4-5.2 { 30292cd52f5Sdrh set v [catch {execsql { 30392cd52f5Sdrh SELECT DISTINCT log AS "xyzzy" FROM t1 30492cd52f5Sdrh UNION ALL 30592cd52f5Sdrh SELECT n FROM t1 WHERE log=3 30692cd52f5Sdrh ORDER BY xyzzy; 30792cd52f5Sdrh }} msg] 30892cd52f5Sdrh lappend v $msg 30992cd52f5Sdrh} {0 {0 1 2 3 4 5 5 6 7 8}} 31092cd52f5Sdrhdo_test select4-5.2b { 31192cd52f5Sdrh set v [catch {execsql { 31201f3f253Sdrh SELECT DISTINCT log AS xyzzy FROM t1 31392cd52f5Sdrh UNION ALL 31492cd52f5Sdrh SELECT n FROM t1 WHERE log=3 3154c774314Sdrh ORDER BY "xyzzy"; 31692cd52f5Sdrh }} msg] 31792cd52f5Sdrh lappend v $msg 31892cd52f5Sdrh} {0 {0 1 2 3 4 5 5 6 7 8}} 31992cd52f5Sdrhdo_test select4-5.2c { 32092cd52f5Sdrh set v [catch {execsql { 32192cd52f5Sdrh SELECT DISTINCT log FROM t1 32292cd52f5Sdrh UNION ALL 32392cd52f5Sdrh SELECT n FROM t1 WHERE log=3 3244c774314Sdrh ORDER BY "xyzzy"; 32592cd52f5Sdrh }} msg] 32692cd52f5Sdrh lappend v $msg 32701874bfcSdanielk1977} {1 {1st ORDER BY term does not match any column in the result set}} 32892cd52f5Sdrhdo_test select4-5.2d { 32992cd52f5Sdrh set v [catch {execsql { 33092cd52f5Sdrh SELECT DISTINCT log FROM t1 33192cd52f5Sdrh INTERSECT 33292cd52f5Sdrh SELECT n FROM t1 WHERE log=3 3334c774314Sdrh ORDER BY "xyzzy"; 33492cd52f5Sdrh }} msg] 33592cd52f5Sdrh lappend v $msg 33601874bfcSdanielk1977} {1 {1st ORDER BY term does not match any column in the result set}} 33792cd52f5Sdrhdo_test select4-5.2e { 33892cd52f5Sdrh set v [catch {execsql { 33992cd52f5Sdrh SELECT DISTINCT log FROM t1 34092cd52f5Sdrh UNION ALL 34192cd52f5Sdrh SELECT n FROM t1 WHERE log=3 34292cd52f5Sdrh ORDER BY n; 34392cd52f5Sdrh }} msg] 34492cd52f5Sdrh lappend v $msg 34592cd52f5Sdrh} {0 {0 1 2 3 4 5 5 6 7 8}} 346e4de1febSdrhdo_test select4-5.2f { 347e4de1febSdrh catchsql { 348e4de1febSdrh SELECT DISTINCT log FROM t1 349e4de1febSdrh UNION ALL 350e4de1febSdrh SELECT n FROM t1 WHERE log=3 351e4de1febSdrh ORDER BY log; 352e4de1febSdrh } 353e4de1febSdrh} {0 {0 1 2 3 4 5 5 6 7 8}} 354e4de1febSdrhdo_test select4-5.2g { 355e4de1febSdrh catchsql { 356e4de1febSdrh SELECT DISTINCT log FROM t1 357e4de1febSdrh UNION ALL 358e4de1febSdrh SELECT n FROM t1 WHERE log=3 359e4de1febSdrh ORDER BY 1; 360e4de1febSdrh } 361e4de1febSdrh} {0 {0 1 2 3 4 5 5 6 7 8}} 362e4de1febSdrhdo_test select4-5.2h { 363e4de1febSdrh catchsql { 364e4de1febSdrh SELECT DISTINCT log FROM t1 365e4de1febSdrh UNION ALL 366e4de1febSdrh SELECT n FROM t1 WHERE log=3 367e4de1febSdrh ORDER BY 2; 368e4de1febSdrh } 36901874bfcSdanielk1977} {1 {1st ORDER BY term out of range - should be between 1 and 1}} 370e4de1febSdrhdo_test select4-5.2i { 371e4de1febSdrh catchsql { 372e4de1febSdrh SELECT DISTINCT 1, log FROM t1 373e4de1febSdrh UNION ALL 374e4de1febSdrh SELECT 2, n FROM t1 WHERE log=3 375e4de1febSdrh ORDER BY 2, 1; 376e4de1febSdrh } 377e4de1febSdrh} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}} 378e4de1febSdrhdo_test select4-5.2j { 379e4de1febSdrh catchsql { 380e4de1febSdrh SELECT DISTINCT 1, log FROM t1 381e4de1febSdrh UNION ALL 382e4de1febSdrh SELECT 2, n FROM t1 WHERE log=3 383e4de1febSdrh ORDER BY 1, 2 DESC; 384e4de1febSdrh } 385e4de1febSdrh} {0 {1 5 1 4 1 3 1 2 1 1 1 0 2 8 2 7 2 6 2 5}} 386e4de1febSdrhdo_test select4-5.2k { 387e4de1febSdrh catchsql { 388e4de1febSdrh SELECT DISTINCT 1, log FROM t1 389e4de1febSdrh UNION ALL 390e4de1febSdrh SELECT 2, n FROM t1 WHERE log=3 391e4de1febSdrh ORDER BY n, 1; 392e4de1febSdrh } 393e4de1febSdrh} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}} 39492cd52f5Sdrhdo_test select4-5.3 { 39592cd52f5Sdrh set v [catch {execsql { 39692cd52f5Sdrh SELECT DISTINCT log, n FROM t1 39792cd52f5Sdrh UNION ALL 39892cd52f5Sdrh SELECT n FROM t1 WHERE log=3 39992cd52f5Sdrh ORDER BY log; 40092cd52f5Sdrh }} msg] 40192cd52f5Sdrh lappend v $msg 40292cd52f5Sdrh} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}} 40310c081adSdrhdo_test select4-5.3-3807-1 { 40410c081adSdrh catchsql { 40510c081adSdrh SELECT 1 UNION SELECT 2, 3 UNION SELECT 4, 5 ORDER BY 1; 40610c081adSdrh } 40710c081adSdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}} 40892cd52f5Sdrhdo_test select4-5.4 { 40992cd52f5Sdrh set v [catch {execsql { 41092cd52f5Sdrh SELECT log FROM t1 WHERE n=2 41192cd52f5Sdrh UNION ALL 41292cd52f5Sdrh SELECT log FROM t1 WHERE n=3 41392cd52f5Sdrh UNION ALL 41492cd52f5Sdrh SELECT log FROM t1 WHERE n=4 41592cd52f5Sdrh UNION ALL 41692cd52f5Sdrh SELECT log FROM t1 WHERE n=5 41792cd52f5Sdrh ORDER BY log; 41892cd52f5Sdrh }} msg] 41992cd52f5Sdrh lappend v $msg 42092cd52f5Sdrh} {0 {1 2 2 3}} 42192dba24bSdrh 4224cfa7934Sdrhdo_test select4-6.1 { 4234cfa7934Sdrh execsql { 4244cfa7934Sdrh SELECT log, count(*) as cnt FROM t1 GROUP BY log 4254cfa7934Sdrh UNION 4264cfa7934Sdrh SELECT log, n FROM t1 WHERE n=7 4274cfa7934Sdrh ORDER BY cnt, log; 4284cfa7934Sdrh } 4294cfa7934Sdrh} {0 1 1 1 2 2 3 4 3 7 4 8 5 15} 4304cfa7934Sdrhdo_test select4-6.2 { 4314cfa7934Sdrh execsql { 4324cfa7934Sdrh SELECT log, count(*) FROM t1 GROUP BY log 4334cfa7934Sdrh UNION 4344cfa7934Sdrh SELECT log, n FROM t1 WHERE n=7 4354cfa7934Sdrh ORDER BY count(*), log; 4364cfa7934Sdrh } 4374cfa7934Sdrh} {0 1 1 1 2 2 3 4 3 7 4 8 5 15} 4384cfa7934Sdrh 439f570f011Sdrh# NULLs are indistinct for the UNION operator. 440f570f011Sdrh# Make sure the UNION operator recognizes this 441f5905aa7Sdrh# 442f5905aa7Sdrhdo_test select4-6.3 { 443f5905aa7Sdrh execsql { 444f5905aa7Sdrh SELECT NULL UNION SELECT NULL UNION 445f5905aa7Sdrh SELECT 1 UNION SELECT 2 AS 'x' 446f5905aa7Sdrh ORDER BY x; 447f5905aa7Sdrh } 448f570f011Sdrh} {{} 1 2} 449f570f011Sdrhdo_test select4-6.3.1 { 450f5905aa7Sdrh execsql { 451f5905aa7Sdrh SELECT NULL UNION ALL SELECT NULL UNION ALL 452f5905aa7Sdrh SELECT 1 UNION ALL SELECT 2 AS 'x' 453f5905aa7Sdrh ORDER BY x; 454f5905aa7Sdrh } 455f5905aa7Sdrh} {{} {} 1 2} 456f5905aa7Sdrh 457f570f011Sdrh# Make sure the DISTINCT keyword treats NULLs as indistinct. 458f5905aa7Sdrh# 459e61b9f4fSdanielk1977ifcapable subquery { 460f5905aa7Sdrh do_test select4-6.4 { 461f5905aa7Sdrh execsql { 462f5905aa7Sdrh SELECT * FROM ( 463f5905aa7Sdrh SELECT NULL, 1 UNION ALL SELECT NULL, 1 464f5905aa7Sdrh ); 465f5905aa7Sdrh } 466f5905aa7Sdrh } {{} 1 {} 1} 467f5905aa7Sdrh do_test select4-6.5 { 468f5905aa7Sdrh execsql { 469f5905aa7Sdrh SELECT DISTINCT * FROM ( 470f5905aa7Sdrh SELECT NULL, 1 UNION ALL SELECT NULL, 1 471f5905aa7Sdrh ); 472f5905aa7Sdrh } 473f570f011Sdrh } {{} 1} 474f5905aa7Sdrh do_test select4-6.6 { 475f5905aa7Sdrh execsql { 476f5905aa7Sdrh SELECT DISTINCT * FROM ( 477f5905aa7Sdrh SELECT 1,2 UNION ALL SELECT 1,2 478f5905aa7Sdrh ); 479f5905aa7Sdrh } 480f5905aa7Sdrh } {1 2} 481e61b9f4fSdanielk1977} 482f5905aa7Sdrh 483bb113518Sdrh# Test distinctness of NULL in other ways. 484bb113518Sdrh# 485bb113518Sdrhdo_test select4-6.7 { 486bb113518Sdrh execsql { 487bb113518Sdrh SELECT NULL EXCEPT SELECT NULL 488bb113518Sdrh } 489f570f011Sdrh} {} 490bb113518Sdrh 491f5905aa7Sdrh 49241202ccaSdrh# Make sure column names are correct when a compound select appears as 49341202ccaSdrh# an expression in the WHERE clause. 49441202ccaSdrh# 49541202ccaSdrhdo_test select4-7.1 { 49641202ccaSdrh execsql { 49741202ccaSdrh CREATE TABLE t2 AS SELECT log AS 'x', count(*) AS 'y' FROM t1 GROUP BY log; 49841202ccaSdrh SELECT * FROM t2 ORDER BY x; 49941202ccaSdrh } 50041202ccaSdrh} {0 1 1 1 2 2 3 4 4 8 5 15} 501e61b9f4fSdanielk1977ifcapable subquery { 50241202ccaSdrh do_test select4-7.2 { 50341202ccaSdrh execsql2 { 50441202ccaSdrh SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 INTERSECT SELECT x FROM t2) 50541202ccaSdrh ORDER BY n 50641202ccaSdrh } 50741202ccaSdrh } {n 1 log 0 n 2 log 1 n 3 log 2 n 4 log 2 n 5 log 3} 50841202ccaSdrh do_test select4-7.3 { 50941202ccaSdrh execsql2 { 51041202ccaSdrh SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 EXCEPT SELECT x FROM t2) 51141202ccaSdrh ORDER BY n LIMIT 2 51241202ccaSdrh } 51341202ccaSdrh } {n 6 log 3 n 7 log 3} 51441202ccaSdrh do_test select4-7.4 { 51541202ccaSdrh execsql2 { 51641202ccaSdrh SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 UNION SELECT x FROM t2) 51741202ccaSdrh ORDER BY n LIMIT 2 51841202ccaSdrh } 51941202ccaSdrh } {n 1 log 0 n 2 log 1} 520e61b9f4fSdanielk1977} ;# ifcapable subquery 52141202ccaSdrh 52227c77438Sdanielk1977} ;# ifcapable compound 52327c77438Sdanielk1977 524bb999ef6Sdrh# Make sure DISTINCT works appropriately on TEXT and NUMERIC columns. 525bb999ef6Sdrhdo_test select4-8.1 { 526bb999ef6Sdrh execsql { 527bb999ef6Sdrh BEGIN; 528bb999ef6Sdrh CREATE TABLE t3(a text, b float, c text); 5293d1bfeaaSdanielk1977 INSERT INTO t3 VALUES(1, 1.1, '1.1'); 5303d1bfeaaSdanielk1977 INSERT INTO t3 VALUES(2, 1.10, '1.10'); 5313d1bfeaaSdanielk1977 INSERT INTO t3 VALUES(3, 1.10, '1.1'); 5323d1bfeaaSdanielk1977 INSERT INTO t3 VALUES(4, 1.1, '1.10'); 5333d1bfeaaSdanielk1977 INSERT INTO t3 VALUES(5, 1.2, '1.2'); 5343d1bfeaaSdanielk1977 INSERT INTO t3 VALUES(6, 1.3, '1.3'); 535bb999ef6Sdrh COMMIT; 536bb999ef6Sdrh } 537bb999ef6Sdrh execsql { 538bb999ef6Sdrh SELECT DISTINCT b FROM t3 ORDER BY c; 539bb999ef6Sdrh } 540bb999ef6Sdrh} {1.1 1.2 1.3} 541bb999ef6Sdrhdo_test select4-8.2 { 542bb999ef6Sdrh execsql { 543bb999ef6Sdrh SELECT DISTINCT c FROM t3 ORDER BY c; 544bb999ef6Sdrh } 545bb999ef6Sdrh} {1.1 1.10 1.2 1.3} 546bb999ef6Sdrh 54792378253Sdrh# Make sure the names of columns are taken from the right-most subquery 54892378253Sdrh# right in a compound query. Ticket #1721 54992378253Sdrh# 5504b2688abSdanielk1977ifcapable compound { 5514b2688abSdanielk1977 55292378253Sdrhdo_test select4-9.1 { 55392378253Sdrh execsql2 { 55492378253Sdrh SELECT x, y FROM t2 UNION SELECT a, b FROM t3 ORDER BY x LIMIT 1 55592378253Sdrh } 55692378253Sdrh} {x 0 y 1} 55792378253Sdrhdo_test select4-9.2 { 55892378253Sdrh execsql2 { 55992378253Sdrh SELECT x, y FROM t2 UNION ALL SELECT a, b FROM t3 ORDER BY x LIMIT 1 56092378253Sdrh } 56192378253Sdrh} {x 0 y 1} 56292378253Sdrhdo_test select4-9.3 { 56392378253Sdrh execsql2 { 56492378253Sdrh SELECT x, y FROM t2 EXCEPT SELECT a, b FROM t3 ORDER BY x LIMIT 1 56592378253Sdrh } 56692378253Sdrh} {x 0 y 1} 56792378253Sdrhdo_test select4-9.4 { 56892378253Sdrh execsql2 { 56992378253Sdrh SELECT x, y FROM t2 INTERSECT SELECT 0 AS a, 1 AS b; 57092378253Sdrh } 57192378253Sdrh} {x 0 y 1} 57292378253Sdrhdo_test select4-9.5 { 57392378253Sdrh execsql2 { 57492378253Sdrh SELECT 0 AS x, 1 AS y 57592378253Sdrh UNION 57692378253Sdrh SELECT 2 AS p, 3 AS q 57792378253Sdrh UNION 57892378253Sdrh SELECT 4 AS a, 5 AS b 57992378253Sdrh ORDER BY x LIMIT 1 58092378253Sdrh } 58192378253Sdrh} {x 0 y 1} 5824b2688abSdanielk1977 5834b2688abSdanielk1977ifcapable subquery { 58492378253Sdrhdo_test select4-9.6 { 58592378253Sdrh execsql2 { 58692378253Sdrh SELECT * FROM ( 58792378253Sdrh SELECT 0 AS x, 1 AS y 58892378253Sdrh UNION 58992378253Sdrh SELECT 2 AS p, 3 AS q 59092378253Sdrh UNION 59192378253Sdrh SELECT 4 AS a, 5 AS b 59292378253Sdrh ) ORDER BY 1 LIMIT 1; 59392378253Sdrh } 59492378253Sdrh} {x 0 y 1} 59592378253Sdrhdo_test select4-9.7 { 59692378253Sdrh execsql2 { 59792378253Sdrh SELECT * FROM ( 59892378253Sdrh SELECT 0 AS x, 1 AS y 59992378253Sdrh UNION 60092378253Sdrh SELECT 2 AS p, 3 AS q 60192378253Sdrh UNION 60292378253Sdrh SELECT 4 AS a, 5 AS b 60392378253Sdrh ) ORDER BY x LIMIT 1; 60492378253Sdrh } 60592378253Sdrh} {x 0 y 1} 6064b2688abSdanielk1977} ;# ifcapable subquery 6074b2688abSdanielk1977 60892378253Sdrhdo_test select4-9.8 { 60901874bfcSdanielk1977 execsql { 61092378253Sdrh SELECT 0 AS x, 1 AS y 61192378253Sdrh UNION 61292378253Sdrh SELECT 2 AS y, -3 AS x 61392378253Sdrh ORDER BY x LIMIT 1; 61492378253Sdrh } 61501874bfcSdanielk1977} {0 1} 61670517ab9Sdanielk1977 6174b2688abSdanielk1977do_test select4-9.9.1 { 61892378253Sdrh execsql2 { 61992378253Sdrh SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a 62092378253Sdrh } 62192378253Sdrh} {a 1 b 2 a 3 b 4} 6224b2688abSdanielk1977 6234b2688abSdanielk1977ifcapable subquery { 6244b2688abSdanielk1977do_test select4-9.9.2 { 62592378253Sdrh execsql2 { 62692378253Sdrh SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a) 62792378253Sdrh WHERE b=3 62892378253Sdrh } 62992378253Sdrh} {} 63092378253Sdrhdo_test select4-9.10 { 63192378253Sdrh execsql2 { 63292378253Sdrh SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a) 63392378253Sdrh WHERE b=2 63492378253Sdrh } 63592378253Sdrh} {a 1 b 2} 63692378253Sdrhdo_test select4-9.11 { 63792378253Sdrh execsql2 { 63892378253Sdrh SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b) 63992378253Sdrh WHERE b=2 64092378253Sdrh } 64192378253Sdrh} {a 1 b 2} 64292378253Sdrhdo_test select4-9.12 { 64392378253Sdrh execsql2 { 64492378253Sdrh SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b) 64592378253Sdrh WHERE b>0 64692378253Sdrh } 64792378253Sdrh} {a 1 b 2 a 3 b 4} 6484b2688abSdanielk1977} ;# ifcapable subquery 6494b2688abSdanielk1977 650b7654111Sdrh# Try combining DISTINCT, LIMIT, and OFFSET. Make sure they all work 651b7654111Sdrh# together. 652b7654111Sdrh# 653b7654111Sdrhdo_test select4-10.1 { 654b7654111Sdrh execsql { 655b7654111Sdrh SELECT DISTINCT log FROM t1 ORDER BY log 656b7654111Sdrh } 657b7654111Sdrh} {0 1 2 3 4 5} 658b7654111Sdrhdo_test select4-10.2 { 659b7654111Sdrh execsql { 660b7654111Sdrh SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 4 661b7654111Sdrh } 662b7654111Sdrh} {0 1 2 3} 663b7654111Sdrhdo_test select4-10.3 { 664b7654111Sdrh execsql { 665b7654111Sdrh SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0 666b7654111Sdrh } 667b7654111Sdrh} {} 668b7654111Sdrhdo_test select4-10.4 { 669b7654111Sdrh execsql { 670b7654111Sdrh SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1 671b7654111Sdrh } 672b7654111Sdrh} {0 1 2 3 4 5} 673b7654111Sdrhdo_test select4-10.5 { 674b7654111Sdrh execsql { 675b7654111Sdrh SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1 OFFSET 2 676b7654111Sdrh } 677b7654111Sdrh} {2 3 4 5} 678b7654111Sdrhdo_test select4-10.6 { 679b7654111Sdrh execsql { 680b7654111Sdrh SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 3 OFFSET 2 681b7654111Sdrh } 682b7654111Sdrh} {2 3 4} 683b7654111Sdrhdo_test select4-10.7 { 684b7654111Sdrh execsql { 685b7654111Sdrh SELECT DISTINCT log FROM t1 ORDER BY +log LIMIT 3 OFFSET 20 686b7654111Sdrh } 687b7654111Sdrh} {} 688b7654111Sdrhdo_test select4-10.8 { 689b7654111Sdrh execsql { 690b7654111Sdrh SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0 OFFSET 3 691b7654111Sdrh } 692b7654111Sdrh} {} 693b7654111Sdrhdo_test select4-10.9 { 694b7654111Sdrh execsql { 695b7654111Sdrh SELECT DISTINCT max(n), log FROM t1 ORDER BY +log; -- LIMIT 2 OFFSET 1 696b7654111Sdrh } 697b7654111Sdrh} {31 5} 698b7654111Sdrh 699ad27e761Sdrh# Make sure compound SELECTs with wildly different numbers of columns 700ad27e761Sdrh# do not cause assertion faults due to register allocation issues. 701ad27e761Sdrh# 702ad27e761Sdrhdo_test select4-11.1 { 703ad27e761Sdrh catchsql { 704ad27e761Sdrh 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 705ad27e761Sdrh UNION 706ad27e761Sdrh SELECT x FROM t2 707ad27e761Sdrh } 708ad27e761Sdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}} 709ad27e761Sdrhdo_test select4-11.2 { 710ad27e761Sdrh catchsql { 711ad27e761Sdrh SELECT x FROM t2 712ad27e761Sdrh UNION 713ad27e761Sdrh 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 714ad27e761Sdrh } 715ad27e761Sdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}} 716ad27e761Sdrhdo_test select4-11.3 { 717ad27e761Sdrh catchsql { 718ad27e761Sdrh 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 719ad27e761Sdrh UNION ALL 720ad27e761Sdrh SELECT x FROM t2 721ad27e761Sdrh } 722ad27e761Sdrh} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}} 723ad27e761Sdrhdo_test select4-11.4 { 724ad27e761Sdrh catchsql { 725ad27e761Sdrh SELECT x FROM t2 726ad27e761Sdrh UNION ALL 727ad27e761Sdrh 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 728ad27e761Sdrh } 729ad27e761Sdrh} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}} 730ad27e761Sdrhdo_test select4-11.5 { 731ad27e761Sdrh catchsql { 732ad27e761Sdrh 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 733ad27e761Sdrh EXCEPT 734ad27e761Sdrh SELECT x FROM t2 735ad27e761Sdrh } 736ad27e761Sdrh} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}} 737ad27e761Sdrhdo_test select4-11.6 { 738ad27e761Sdrh catchsql { 739ad27e761Sdrh SELECT x FROM t2 740ad27e761Sdrh EXCEPT 741ad27e761Sdrh 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 742ad27e761Sdrh } 743ad27e761Sdrh} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}} 744ad27e761Sdrhdo_test select4-11.7 { 745ad27e761Sdrh catchsql { 746ad27e761Sdrh 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 747ad27e761Sdrh INTERSECT 748ad27e761Sdrh SELECT x FROM t2 749ad27e761Sdrh } 750ad27e761Sdrh} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}} 751ad27e761Sdrhdo_test select4-11.8 { 752ad27e761Sdrh catchsql { 753ad27e761Sdrh SELECT x FROM t2 754ad27e761Sdrh INTERSECT 755ad27e761Sdrh 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 756ad27e761Sdrh } 757ad27e761Sdrh} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}} 758ad27e761Sdrh 759ad27e761Sdrhdo_test select4-11.11 { 760ad27e761Sdrh catchsql { 761ad27e761Sdrh SELECT x FROM t2 762ad27e761Sdrh UNION 763ad27e761Sdrh SELECT x FROM t2 764ad27e761Sdrh UNION ALL 765ad27e761Sdrh SELECT x FROM t2 766ad27e761Sdrh EXCEPT 767ad27e761Sdrh SELECT x FROM t2 768ad27e761Sdrh INTERSECT 769ad27e761Sdrh 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 770ad27e761Sdrh } 771ad27e761Sdrh} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}} 772ad27e761Sdrhdo_test select4-11.12 { 773ad27e761Sdrh catchsql { 774ad27e761Sdrh SELECT x FROM t2 775ad27e761Sdrh UNION 776ad27e761Sdrh SELECT x FROM t2 777ad27e761Sdrh UNION ALL 778ad27e761Sdrh SELECT x FROM t2 779ad27e761Sdrh EXCEPT 780ad27e761Sdrh 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 781ad27e761Sdrh EXCEPT 782ad27e761Sdrh SELECT x FROM t2 783ad27e761Sdrh } 784ad27e761Sdrh} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}} 785ad27e761Sdrhdo_test select4-11.13 { 786ad27e761Sdrh catchsql { 787ad27e761Sdrh SELECT x FROM t2 788ad27e761Sdrh UNION 789ad27e761Sdrh SELECT x FROM t2 790ad27e761Sdrh UNION ALL 791ad27e761Sdrh 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 792ad27e761Sdrh UNION ALL 793ad27e761Sdrh SELECT x FROM t2 794ad27e761Sdrh EXCEPT 795ad27e761Sdrh SELECT x FROM t2 796ad27e761Sdrh } 797ad27e761Sdrh} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}} 798ad27e761Sdrhdo_test select4-11.14 { 799ad27e761Sdrh catchsql { 800ad27e761Sdrh SELECT x FROM t2 801ad27e761Sdrh UNION 802ad27e761Sdrh 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 803ad27e761Sdrh UNION 804ad27e761Sdrh SELECT x FROM t2 805ad27e761Sdrh UNION ALL 806ad27e761Sdrh SELECT x FROM t2 807ad27e761Sdrh EXCEPT 808ad27e761Sdrh SELECT x FROM t2 809ad27e761Sdrh } 810ad27e761Sdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}} 811ad27e761Sdrhdo_test select4-11.15 { 812ad27e761Sdrh catchsql { 813ad27e761Sdrh 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 814ad27e761Sdrh UNION 815ad27e761Sdrh SELECT x FROM t2 816ad27e761Sdrh INTERSECT 817ad27e761Sdrh SELECT x FROM t2 818ad27e761Sdrh UNION ALL 819ad27e761Sdrh SELECT x FROM t2 820ad27e761Sdrh EXCEPT 821ad27e761Sdrh SELECT x FROM t2 822ad27e761Sdrh } 823ad27e761Sdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}} 8243dc4cc66Sdrhdo_test select4-11.16 { 8253dc4cc66Sdrh catchsql { 8263dc4cc66Sdrh INSERT INTO t2(rowid) VALUES(2) UNION SELECT 3,4 UNION SELECT 5,6 ORDER BY 1; 8273dc4cc66Sdrh } 8283dc4cc66Sdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}} 829b7654111Sdrh 83010c081adSdrhdo_test select4-12.1 { 83110c081adSdrh sqlite3 db2 :memory: 83210c081adSdrh catchsql { 83310c081adSdrh SELECT 1 UNION SELECT 2,3 UNION SELECT 4,5 ORDER BY 1; 83410c081adSdrh } db2 83510c081adSdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}} 83610c081adSdrh 837de3e41e3Sdanielk1977} ;# ifcapable compound 838de3e41e3Sdanielk1977 839c724008bSdrh 840c724008bSdrh# Ticket [3557ad65a076c] - Incorrect DISTINCT processing with an 841c724008bSdrh# indexed query using IN. 842c724008bSdrh# 843c724008bSdrhdo_test select4-13.1 { 844c724008bSdrh sqlite3 db test.db 845c724008bSdrh db eval { 846c724008bSdrh CREATE TABLE t13(a,b); 847c724008bSdrh INSERT INTO t13 VALUES(1,1); 848c724008bSdrh INSERT INTO t13 VALUES(2,1); 849c724008bSdrh INSERT INTO t13 VALUES(3,1); 850c724008bSdrh INSERT INTO t13 VALUES(2,2); 851c724008bSdrh INSERT INTO t13 VALUES(3,2); 852c724008bSdrh INSERT INTO t13 VALUES(4,2); 853c724008bSdrh CREATE INDEX t13ab ON t13(a,b); 854c724008bSdrh SELECT DISTINCT b from t13 WHERE a IN (1,2,3); 855c724008bSdrh } 856c724008bSdrh} {1 2} 857c724008bSdrh 858c0bf493eSdrh# 2014-02-18: Make sure compound SELECTs work with VALUES clauses 859c0bf493eSdrh# 860c0bf493eSdrhdo_execsql_test select4-14.1 { 861c0bf493eSdrh CREATE TABLE t14(a,b,c); 862c0bf493eSdrh INSERT INTO t14 VALUES(1,2,3),(4,5,6); 863c0bf493eSdrh SELECT * FROM t14 INTERSECT VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3); 864c0bf493eSdrh} {1 2 3} 865c0bf493eSdrhdo_execsql_test select4-14.2 { 866c0bf493eSdrh SELECT * FROM t14 INTERSECT VALUES(1,2,3); 867c0bf493eSdrh} {1 2 3} 868c0bf493eSdrhdo_execsql_test select4-14.3 { 869c0bf493eSdrh SELECT * FROM t14 870c0bf493eSdrh UNION VALUES(3,2,1),(2,3,1),(1,2,3),(7,8,9),(4,5,6) 871c0bf493eSdrh UNION SELECT * FROM t14 ORDER BY 1, 2, 3 872c0bf493eSdrh} {1 2 3 2 3 1 3 2 1 4 5 6 7 8 9} 873c0bf493eSdrhdo_execsql_test select4-14.4 { 874c0bf493eSdrh SELECT * FROM t14 875c0bf493eSdrh UNION VALUES(3,2,1) 876c0bf493eSdrh UNION SELECT * FROM t14 ORDER BY 1, 2, 3 877c0bf493eSdrh} {1 2 3 3 2 1 4 5 6} 878c0bf493eSdrhdo_execsql_test select4-14.5 { 879c0bf493eSdrh SELECT * FROM t14 EXCEPT VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3); 880c0bf493eSdrh} {4 5 6} 881c0bf493eSdrhdo_execsql_test select4-14.6 { 882c0bf493eSdrh SELECT * FROM t14 EXCEPT VALUES(1,2,3) 883c0bf493eSdrh} {4 5 6} 884c0bf493eSdrhdo_execsql_test select4-14.7 { 885c0bf493eSdrh SELECT * FROM t14 EXCEPT VALUES(1,2,3) EXCEPT VALUES(4,5,6) 886c0bf493eSdrh} {} 887c0bf493eSdrhdo_execsql_test select4-14.8 { 888c0bf493eSdrh SELECT * FROM t14 EXCEPT VALUES('a','b','c') EXCEPT VALUES(4,5,6) 889c0bf493eSdrh} {1 2 3} 890c0bf493eSdrhdo_execsql_test select4-14.9 { 891c0bf493eSdrh SELECT * FROM t14 UNION ALL VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3); 892c0bf493eSdrh} {1 2 3 4 5 6 3 2 1 2 3 1 1 2 3 2 1 3} 8931978d171Sdrhdo_execsql_test select4-14.10 { 8941978d171Sdrh SELECT (VALUES(1),(2),(3),(4)) 8951978d171Sdrh} {1} 8961978d171Sdrhdo_execsql_test select4-14.11 { 8971978d171Sdrh SELECT (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) 8981978d171Sdrh} {1} 899772460fdSdrhdo_execsql_test select4-14.12 { 900772460fdSdrh VALUES(1) UNION VALUES(2); 901772460fdSdrh} {1 2} 902772460fdSdrhdo_execsql_test select4-14.13 { 903772460fdSdrh VALUES(1),(2),(3) EXCEPT VALUES(2); 904772460fdSdrh} {1 3} 905772460fdSdrhdo_execsql_test select4-14.14 { 906772460fdSdrh VALUES(1),(2),(3) EXCEPT VALUES(1),(3); 907772460fdSdrh} {2} 90860f4e091Sdrhdo_execsql_test select4-14.15 { 90960f4e091Sdrh SELECT * FROM (SELECT 123), (SELECT 456) ON likely(0 OR 1) OR 0; 91060f4e091Sdrh} {123 456} 91100d5ab74Sdrhdo_execsql_test select4-14.16 { 91200d5ab74Sdrh VALUES(1),(2),(3),(4) UNION ALL SELECT 5 LIMIT 99; 91300d5ab74Sdrh} {1 2 3 4 5} 91400d5ab74Sdrhdo_execsql_test select4-14.17 { 91500d5ab74Sdrh VALUES(1),(2),(3),(4) UNION ALL SELECT 5 LIMIT 3; 91600d5ab74Sdrh} {1 2 3} 917c0bf493eSdrh 9182fade2f7Sdrh# Ticket https://www.sqlite.org/src/info/d06a25c84454a372 9192fade2f7Sdrh# Incorrect answer due to two co-routines using the same registers and expecting 9202fade2f7Sdrh# those register values to be preserved across a Yield. 9212fade2f7Sdrh# 9222fade2f7Sdrhdo_execsql_test select4-15.1 { 9232fade2f7Sdrh DROP TABLE IF EXISTS tx; 9242fade2f7Sdrh CREATE TABLE tx(id INTEGER PRIMARY KEY, a, b); 9252fade2f7Sdrh INSERT INTO tx(a,b) VALUES(33,456); 9262fade2f7Sdrh INSERT INTO tx(a,b) VALUES(33,789); 9272fade2f7Sdrh 9282fade2f7Sdrh SELECT DISTINCT t0.id, t0.a, t0.b 9292fade2f7Sdrh FROM tx AS t0, tx AS t1 9302fade2f7Sdrh WHERE t0.a=t1.a AND t1.a=33 AND t0.b=456 9312fade2f7Sdrh UNION 9322fade2f7Sdrh SELECT DISTINCT t0.id, t0.a, t0.b 9332fade2f7Sdrh FROM tx AS t0, tx AS t1 9342fade2f7Sdrh WHERE t0.a=t1.a AND t1.a=33 AND t0.b=789 9352fade2f7Sdrh ORDER BY 1; 9362fade2f7Sdrh} {1 33 456 2 33 789} 9372fade2f7Sdrh 9380ff47e9eSdrh# Enhancement (2016-03-15): Use a co-routine for subqueries if the 9390ff47e9eSdrh# subquery is guaranteed to be the outer-most query 9400ff47e9eSdrh# 9410ff47e9eSdrhdo_execsql_test select4-16.1 { 9420ff47e9eSdrh DROP TABLE IF EXISTS t1; 9430ff47e9eSdrh 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, 9440ff47e9eSdrh PRIMARY KEY(a,b DESC)) WITHOUT ROWID; 9450ff47e9eSdrh 9460ff47e9eSdrh WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) 9470ff47e9eSdrh INSERT INTO t1(a,b,c,d) 9480ff47e9eSdrh SELECT x%10, x/10, x, printf('xyz%dabc',x) FROM c; 9490ff47e9eSdrh 9500ff47e9eSdrh SELECT t3.c FROM 9510ff47e9eSdrh (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2 9520ff47e9eSdrh JOIN t1 AS t3 9530ff47e9eSdrh WHERE t2.a=t3.a AND t2.m=t3.b 9540ff47e9eSdrh ORDER BY t3.a; 9550ff47e9eSdrh} {95 96 97 98 99} 9560ff47e9eSdrhdo_execsql_test select4-16.2 { 9570ff47e9eSdrh SELECT t3.c FROM 9580ff47e9eSdrh (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2 9590ff47e9eSdrh CROSS JOIN t1 AS t3 9600ff47e9eSdrh WHERE t2.a=t3.a AND t2.m=t3.b 9610ff47e9eSdrh ORDER BY t3.a; 9620ff47e9eSdrh} {95 96 97 98 99} 9630ff47e9eSdrhdo_execsql_test select4-16.3 { 9640ff47e9eSdrh SELECT t3.c FROM 9650ff47e9eSdrh (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2 9660ff47e9eSdrh LEFT JOIN t1 AS t3 9670ff47e9eSdrh WHERE t2.a=t3.a AND t2.m=t3.b 9680ff47e9eSdrh ORDER BY t3.a; 9690ff47e9eSdrh} {95 96 97 98 99} 9700ff47e9eSdrh 971b1ec87afSdrh# Ticket https://www.sqlite.org/src/tktview/f7f8c97e975978d45 on 2016-04-25 972b1ec87afSdrh# 973b1ec87afSdrh# The where push-down optimization from 2015-06-02 is suppose to disable 974b1ec87afSdrh# on aggregate subqueries. But if the subquery is a compound where the 975b1ec87afSdrh# last SELECT is non-aggregate but some other SELECT is an aggregate, the 976b1ec87afSdrh# test is incomplete and the optimization is not properly disabled. 977b1ec87afSdrh# 978b1ec87afSdrh# The following test cases verify that the fix works. 979b1ec87afSdrh# 980b1ec87afSdrhdo_execsql_test select4-17.1 { 981b1ec87afSdrh DROP TABLE IF EXISTS t1; 982b1ec87afSdrh CREATE TABLE t1(a int, b int); 983b1ec87afSdrh INSERT INTO t1 VALUES(1,2),(1,18),(2,19); 984b1ec87afSdrh SELECT x, y FROM ( 985b1ec87afSdrh SELECT 98 AS x, 99 AS y 986b1ec87afSdrh UNION 987b1ec87afSdrh SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a 988b1ec87afSdrh ) AS w WHERE y>=20 989b1ec87afSdrh ORDER BY +x; 990b1ec87afSdrh} {1 20 98 99} 991b1ec87afSdrhdo_execsql_test select4-17.2 { 992b1ec87afSdrh SELECT x, y FROM ( 993b1ec87afSdrh SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a 994b1ec87afSdrh UNION 995b1ec87afSdrh SELECT 98 AS x, 99 AS y 996b1ec87afSdrh ) AS w WHERE y>=20 997b1ec87afSdrh ORDER BY +x; 998b1ec87afSdrh} {1 20 98 99} 999b1ec87afSdrhdo_catchsql_test select4-17.3 { 1000b1ec87afSdrh SELECT x, y FROM ( 1001b1ec87afSdrh SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a LIMIT 3 1002b1ec87afSdrh UNION 1003b1ec87afSdrh SELECT 98 AS x, 99 AS y 1004b1ec87afSdrh ) AS w WHERE y>=20 1005b1ec87afSdrh ORDER BY +x; 1006b1ec87afSdrh} {1 {LIMIT clause should come after UNION not before}} 10070ff47e9eSdrh 10082e52a9c6Sdrh# 2020-04-03 ticket 51166be0159fd2ce from Yong Heng. 10092e52a9c6Sdrh# Adverse interaction between the constant propagation and push-down 10102e52a9c6Sdrh# optimizations. 10112e52a9c6Sdrh# 10122e52a9c6Sdrhreset_db 10132e52a9c6Sdrhdo_execsql_test select4-18.1 { 10142e52a9c6Sdrh CREATE VIEW v0(v0) AS WITH v0 AS(SELECT 0 v0) SELECT(SELECT min(v0) OVER()) FROM v0 GROUP BY v0; 10152e52a9c6Sdrh SELECT *FROM v0 v1 JOIN v0 USING(v0) WHERE datetime(v0) = (v0.v0)AND v0 = 10; 10162e52a9c6Sdrh} {} 10172e52a9c6Sdrhdo_execsql_test select4-18.2 { 10182e52a9c6Sdrh CREATE VIEW t1(aa) AS 10192e52a9c6Sdrh WITH t2(bb) AS (SELECT 123) 10202e52a9c6Sdrh SELECT (SELECT min(bb) OVER()) FROM t2 GROUP BY bb; 10212e52a9c6Sdrh SELECT * FROM t1; 10222e52a9c6Sdrh} {123} 10232e52a9c6Sdrhdo_execsql_test select4-18.3 { 10242e52a9c6Sdrh SELECT * FROM t1 AS z1 JOIN t1 AS z2 USING(aa) 10252e52a9c6Sdrh WHERE abs(z1.aa)=z2.aa AND z1.aa=123; 10262e52a9c6Sdrh} {123} 10270ff47e9eSdrh 1028*b3ad4e61Sdrh# 2021-03-31 Fix an assert() problem in the logic at the end of sqlite3Select() 1029*b3ad4e61Sdrh# that validates AggInfo. The checks to ensure that AggInfo.aCol[].pCExpr 1030*b3ad4e61Sdrh# references a valid expression was looking at an expression that had been 1031*b3ad4e61Sdrh# deleted by the truth optimization in sqlite3ExprAnd() which was invoked by 1032*b3ad4e61Sdrh# the push-down optimization. This is harmless in delivery builds, as that code 1033*b3ad4e61Sdrh# only runs with SQLITE_DEBUG. But it should still be fixed. The problem 1034*b3ad4e61Sdrh# was discovered by dbsqlfuzz (crash-dece7b67a3552ed7e571a7bda903afd1f7bd9b21) 1035*b3ad4e61Sdrh# 1036*b3ad4e61Sdrhreset_db 1037*b3ad4e61Sdrhdo_execsql_test select4-19.1 { 1038*b3ad4e61Sdrh CREATE TABLE t1(x); 1039*b3ad4e61Sdrh INSERT INTO t1 VALUES(99); 1040*b3ad4e61Sdrh SELECT sum((SELECT 1 FROM (SELECT 2 WHERE x IS NULL) WHERE 0)) FROM t1; 1041*b3ad4e61Sdrh} {{}} 10420ff47e9eSdrh 104392dba24bSdrhfinish_test 1044