1*1da57d55SToomas Soome# 2c5c4113dSnw141292# 2001 September 15 3c5c4113dSnw141292# 4c5c4113dSnw141292# The author disclaims copyright to this source code. In place of 5c5c4113dSnw141292# a legal notice, here is a blessing: 6c5c4113dSnw141292# 7c5c4113dSnw141292# May you do good and not evil. 8c5c4113dSnw141292# May you find forgiveness for yourself and forgive others. 9c5c4113dSnw141292# May you share freely, never taking more than you give. 10c5c4113dSnw141292# 11c5c4113dSnw141292#*********************************************************************** 12c5c4113dSnw141292# This file implements regression tests for SQLite library. The 13c5c4113dSnw141292# focus of this file is testing UNION, INTERSECT and EXCEPT operators 14c5c4113dSnw141292# in SELECT statements. 15c5c4113dSnw141292# 16c5c4113dSnw141292# $Id: select4.test,v 1.13 2003/02/02 12:41:27 drh Exp $ 17c5c4113dSnw141292 18c5c4113dSnw141292set testdir [file dirname $argv0] 19c5c4113dSnw141292source $testdir/tester.tcl 20c5c4113dSnw141292 21c5c4113dSnw141292# Build some test data 22c5c4113dSnw141292# 23c5c4113dSnw141292set fd [open data1.txt w] 24c5c4113dSnw141292for {set i 1} {$i<32} {incr i} { 25c5c4113dSnw141292 for {set j 0} {pow(2,$j)<$i} {incr j} {} 26c5c4113dSnw141292 puts $fd "$i\t$j" 27c5c4113dSnw141292} 28c5c4113dSnw141292close $fd 29c5c4113dSnw141292execsql { 30c5c4113dSnw141292 CREATE TABLE t1(n int, log int); 31c5c4113dSnw141292 COPY t1 FROM 'data1.txt' 32c5c4113dSnw141292} 33c5c4113dSnw141292file delete data1.txt 34c5c4113dSnw141292 35c5c4113dSnw141292do_test select4-1.0 { 36c5c4113dSnw141292 execsql {SELECT DISTINCT log FROM t1 ORDER BY log} 37c5c4113dSnw141292} {0 1 2 3 4 5} 38c5c4113dSnw141292 39c5c4113dSnw141292# Union All operator 40c5c4113dSnw141292# 41c5c4113dSnw141292do_test select4-1.1a { 42c5c4113dSnw141292 lsort [execsql {SELECT DISTINCT log FROM t1}] 43c5c4113dSnw141292} {0 1 2 3 4 5} 44c5c4113dSnw141292do_test select4-1.1b { 45c5c4113dSnw141292 lsort [execsql {SELECT n FROM t1 WHERE log=3}] 46c5c4113dSnw141292} {5 6 7 8} 47c5c4113dSnw141292do_test select4-1.1c { 48c5c4113dSnw141292 execsql { 49c5c4113dSnw141292 SELECT DISTINCT log FROM t1 50c5c4113dSnw141292 UNION ALL 51c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 52c5c4113dSnw141292 ORDER BY log; 53c5c4113dSnw141292 } 54c5c4113dSnw141292} {0 1 2 3 4 5 5 6 7 8} 55c5c4113dSnw141292do_test select4-1.1d { 56c5c4113dSnw141292 execsql { 57c5c4113dSnw141292 CREATE TABLE t2 AS 58c5c4113dSnw141292 SELECT DISTINCT log FROM t1 59c5c4113dSnw141292 UNION ALL 60c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 61c5c4113dSnw141292 ORDER BY log; 62c5c4113dSnw141292 SELECT * FROM t2; 63c5c4113dSnw141292 } 64c5c4113dSnw141292} {0 1 2 3 4 5 5 6 7 8} 65c5c4113dSnw141292execsql {DROP TABLE t2} 66c5c4113dSnw141292do_test select4-1.1e { 67c5c4113dSnw141292 execsql { 68c5c4113dSnw141292 CREATE TABLE t2 AS 69c5c4113dSnw141292 SELECT DISTINCT log FROM t1 70c5c4113dSnw141292 UNION ALL 71c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 72c5c4113dSnw141292 ORDER BY log DESC; 73c5c4113dSnw141292 SELECT * FROM t2; 74c5c4113dSnw141292 } 75c5c4113dSnw141292} {8 7 6 5 5 4 3 2 1 0} 76c5c4113dSnw141292execsql {DROP TABLE t2} 77c5c4113dSnw141292do_test select4-1.1f { 78c5c4113dSnw141292 execsql { 79c5c4113dSnw141292 SELECT DISTINCT log FROM t1 80c5c4113dSnw141292 UNION ALL 81c5c4113dSnw141292 SELECT n FROM t1 WHERE log=2 82c5c4113dSnw141292 } 83c5c4113dSnw141292} {0 1 2 3 4 5 3 4} 84c5c4113dSnw141292do_test select4-1.1g { 85c5c4113dSnw141292 execsql { 86c5c4113dSnw141292 CREATE TABLE t2 AS 87c5c4113dSnw141292 SELECT DISTINCT log FROM t1 88c5c4113dSnw141292 UNION ALL 89c5c4113dSnw141292 SELECT n FROM t1 WHERE log=2; 90c5c4113dSnw141292 SELECT * FROM t2; 91c5c4113dSnw141292 } 92c5c4113dSnw141292} {0 1 2 3 4 5 3 4} 93c5c4113dSnw141292execsql {DROP TABLE t2} 94c5c4113dSnw141292do_test select4-1.2 { 95c5c4113dSnw141292 execsql { 96c5c4113dSnw141292 SELECT log FROM t1 WHERE n IN 97c5c4113dSnw141292 (SELECT DISTINCT log FROM t1 UNION ALL 98c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3) 99c5c4113dSnw141292 ORDER BY log; 100c5c4113dSnw141292 } 101c5c4113dSnw141292} {0 1 2 2 3 3 3 3} 102c5c4113dSnw141292do_test select4-1.3 { 103c5c4113dSnw141292 set v [catch {execsql { 104c5c4113dSnw141292 SELECT DISTINCT log FROM t1 ORDER BY log 105c5c4113dSnw141292 UNION ALL 106c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 107c5c4113dSnw141292 ORDER BY log; 108c5c4113dSnw141292 }} msg] 109c5c4113dSnw141292 lappend v $msg 110c5c4113dSnw141292} {1 {ORDER BY clause should come after UNION ALL not before}} 111c5c4113dSnw141292 112c5c4113dSnw141292# Union operator 113c5c4113dSnw141292# 114c5c4113dSnw141292do_test select4-2.1 { 115c5c4113dSnw141292 execsql { 116c5c4113dSnw141292 SELECT DISTINCT log FROM t1 117c5c4113dSnw141292 UNION 118c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 119c5c4113dSnw141292 ORDER BY log; 120c5c4113dSnw141292 } 121c5c4113dSnw141292} {0 1 2 3 4 5 6 7 8} 122c5c4113dSnw141292do_test select4-2.2 { 123c5c4113dSnw141292 execsql { 124c5c4113dSnw141292 SELECT log FROM t1 WHERE n IN 125c5c4113dSnw141292 (SELECT DISTINCT log FROM t1 UNION 126c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3) 127c5c4113dSnw141292 ORDER BY log; 128c5c4113dSnw141292 } 129c5c4113dSnw141292} {0 1 2 2 3 3 3 3} 130c5c4113dSnw141292do_test select4-2.3 { 131c5c4113dSnw141292 set v [catch {execsql { 132c5c4113dSnw141292 SELECT DISTINCT log FROM t1 ORDER BY log 133c5c4113dSnw141292 UNION 134c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 135c5c4113dSnw141292 ORDER BY log; 136c5c4113dSnw141292 }} msg] 137c5c4113dSnw141292 lappend v $msg 138c5c4113dSnw141292} {1 {ORDER BY clause should come after UNION not before}} 139c5c4113dSnw141292 140c5c4113dSnw141292# Except operator 141c5c4113dSnw141292# 142c5c4113dSnw141292do_test select4-3.1.1 { 143c5c4113dSnw141292 execsql { 144c5c4113dSnw141292 SELECT DISTINCT log FROM t1 145c5c4113dSnw141292 EXCEPT 146c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 147c5c4113dSnw141292 ORDER BY log; 148c5c4113dSnw141292 } 149c5c4113dSnw141292} {0 1 2 3 4} 150c5c4113dSnw141292do_test select4-3.1.2 { 151c5c4113dSnw141292 execsql { 152c5c4113dSnw141292 CREATE TABLE t2 AS 153c5c4113dSnw141292 SELECT DISTINCT log FROM t1 154c5c4113dSnw141292 EXCEPT 155c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 156c5c4113dSnw141292 ORDER BY log; 157c5c4113dSnw141292 SELECT * FROM t2; 158c5c4113dSnw141292 } 159c5c4113dSnw141292} {0 1 2 3 4} 160c5c4113dSnw141292execsql {DROP TABLE t2} 161c5c4113dSnw141292do_test select4-3.1.3 { 162c5c4113dSnw141292 execsql { 163c5c4113dSnw141292 CREATE TABLE t2 AS 164c5c4113dSnw141292 SELECT DISTINCT log FROM t1 165c5c4113dSnw141292 EXCEPT 166c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 167c5c4113dSnw141292 ORDER BY log DESC; 168c5c4113dSnw141292 SELECT * FROM t2; 169c5c4113dSnw141292 } 170c5c4113dSnw141292} {4 3 2 1 0} 171c5c4113dSnw141292execsql {DROP TABLE t2} 172c5c4113dSnw141292do_test select4-3.2 { 173c5c4113dSnw141292 execsql { 174c5c4113dSnw141292 SELECT log FROM t1 WHERE n IN 175c5c4113dSnw141292 (SELECT DISTINCT log FROM t1 EXCEPT 176c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3) 177c5c4113dSnw141292 ORDER BY log; 178c5c4113dSnw141292 } 179c5c4113dSnw141292} {0 1 2 2} 180c5c4113dSnw141292do_test select4-3.3 { 181c5c4113dSnw141292 set v [catch {execsql { 182c5c4113dSnw141292 SELECT DISTINCT log FROM t1 ORDER BY log 183c5c4113dSnw141292 EXCEPT 184c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 185c5c4113dSnw141292 ORDER BY log; 186c5c4113dSnw141292 }} msg] 187c5c4113dSnw141292 lappend v $msg 188c5c4113dSnw141292} {1 {ORDER BY clause should come after EXCEPT not before}} 189c5c4113dSnw141292 190c5c4113dSnw141292# Intersect operator 191c5c4113dSnw141292# 192c5c4113dSnw141292do_test select4-4.1.1 { 193c5c4113dSnw141292 execsql { 194c5c4113dSnw141292 SELECT DISTINCT log FROM t1 195c5c4113dSnw141292 INTERSECT 196c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 197c5c4113dSnw141292 ORDER BY log; 198c5c4113dSnw141292 } 199c5c4113dSnw141292} {5} 200c5c4113dSnw141292do_test select4-4.1.2 { 201c5c4113dSnw141292 execsql { 202c5c4113dSnw141292 SELECT DISTINCT log FROM t1 UNION ALL SELECT 6 203c5c4113dSnw141292 INTERSECT 204c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 205c5c4113dSnw141292 ORDER BY log; 206c5c4113dSnw141292 } 207c5c4113dSnw141292} {5 6} 208c5c4113dSnw141292do_test select4-4.1.3 { 209c5c4113dSnw141292 execsql { 210c5c4113dSnw141292 CREATE TABLE t2 AS 211c5c4113dSnw141292 SELECT DISTINCT log FROM t1 UNION ALL SELECT 6 212c5c4113dSnw141292 INTERSECT 213c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 214c5c4113dSnw141292 ORDER BY log; 215c5c4113dSnw141292 SELECT * FROM t2; 216c5c4113dSnw141292 } 217c5c4113dSnw141292} {5 6} 218c5c4113dSnw141292execsql {DROP TABLE t2} 219c5c4113dSnw141292do_test select4-4.1.4 { 220c5c4113dSnw141292 execsql { 221c5c4113dSnw141292 CREATE TABLE t2 AS 222c5c4113dSnw141292 SELECT DISTINCT log FROM t1 UNION ALL SELECT 6 223c5c4113dSnw141292 INTERSECT 224c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 225c5c4113dSnw141292 ORDER BY log DESC; 226c5c4113dSnw141292 SELECT * FROM t2; 227c5c4113dSnw141292 } 228c5c4113dSnw141292} {6 5} 229c5c4113dSnw141292execsql {DROP TABLE t2} 230c5c4113dSnw141292do_test select4-4.2 { 231c5c4113dSnw141292 execsql { 232c5c4113dSnw141292 SELECT log FROM t1 WHERE n IN 233c5c4113dSnw141292 (SELECT DISTINCT log FROM t1 INTERSECT 234c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3) 235c5c4113dSnw141292 ORDER BY log; 236c5c4113dSnw141292 } 237c5c4113dSnw141292} {3} 238c5c4113dSnw141292do_test select4-4.3 { 239c5c4113dSnw141292 set v [catch {execsql { 240c5c4113dSnw141292 SELECT DISTINCT log FROM t1 ORDER BY log 241c5c4113dSnw141292 INTERSECT 242c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 243c5c4113dSnw141292 ORDER BY log; 244c5c4113dSnw141292 }} msg] 245c5c4113dSnw141292 lappend v $msg 246c5c4113dSnw141292} {1 {ORDER BY clause should come after INTERSECT not before}} 247c5c4113dSnw141292 248c5c4113dSnw141292# Various error messages while processing UNION or INTERSECT 249c5c4113dSnw141292# 250c5c4113dSnw141292do_test select4-5.1 { 251c5c4113dSnw141292 set v [catch {execsql { 252c5c4113dSnw141292 SELECT DISTINCT log FROM t2 253c5c4113dSnw141292 UNION ALL 254c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 255c5c4113dSnw141292 ORDER BY log; 256c5c4113dSnw141292 }} msg] 257c5c4113dSnw141292 lappend v $msg 258c5c4113dSnw141292} {1 {no such table: t2}} 259c5c4113dSnw141292do_test select4-5.2 { 260c5c4113dSnw141292 set v [catch {execsql { 261c5c4113dSnw141292 SELECT DISTINCT log AS "xyzzy" FROM t1 262c5c4113dSnw141292 UNION ALL 263c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 264c5c4113dSnw141292 ORDER BY xyzzy; 265c5c4113dSnw141292 }} msg] 266c5c4113dSnw141292 lappend v $msg 267c5c4113dSnw141292} {0 {0 1 2 3 4 5 5 6 7 8}} 268c5c4113dSnw141292do_test select4-5.2b { 269c5c4113dSnw141292 set v [catch {execsql { 270c5c4113dSnw141292 SELECT DISTINCT log AS xyzzy FROM t1 271c5c4113dSnw141292 UNION ALL 272c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 273c5c4113dSnw141292 ORDER BY 'xyzzy'; 274c5c4113dSnw141292 }} msg] 275c5c4113dSnw141292 lappend v $msg 276c5c4113dSnw141292} {0 {0 1 2 3 4 5 5 6 7 8}} 277c5c4113dSnw141292do_test select4-5.2c { 278c5c4113dSnw141292 set v [catch {execsql { 279c5c4113dSnw141292 SELECT DISTINCT log FROM t1 280c5c4113dSnw141292 UNION ALL 281c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 282c5c4113dSnw141292 ORDER BY 'xyzzy'; 283c5c4113dSnw141292 }} msg] 284c5c4113dSnw141292 lappend v $msg 285c5c4113dSnw141292} {1 {ORDER BY term number 1 does not match any result column}} 286c5c4113dSnw141292do_test select4-5.2d { 287c5c4113dSnw141292 set v [catch {execsql { 288c5c4113dSnw141292 SELECT DISTINCT log FROM t1 289c5c4113dSnw141292 INTERSECT 290c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 291c5c4113dSnw141292 ORDER BY 'xyzzy'; 292c5c4113dSnw141292 }} msg] 293c5c4113dSnw141292 lappend v $msg 294c5c4113dSnw141292} {1 {ORDER BY term number 1 does not match any result column}} 295c5c4113dSnw141292do_test select4-5.2e { 296c5c4113dSnw141292 set v [catch {execsql { 297c5c4113dSnw141292 SELECT DISTINCT log FROM t1 298c5c4113dSnw141292 UNION ALL 299c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 300c5c4113dSnw141292 ORDER BY n; 301c5c4113dSnw141292 }} msg] 302c5c4113dSnw141292 lappend v $msg 303c5c4113dSnw141292} {0 {0 1 2 3 4 5 5 6 7 8}} 304c5c4113dSnw141292do_test select4-5.2f { 305c5c4113dSnw141292 catchsql { 306c5c4113dSnw141292 SELECT DISTINCT log FROM t1 307c5c4113dSnw141292 UNION ALL 308c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 309c5c4113dSnw141292 ORDER BY log; 310c5c4113dSnw141292 } 311c5c4113dSnw141292} {0 {0 1 2 3 4 5 5 6 7 8}} 312c5c4113dSnw141292do_test select4-5.2g { 313c5c4113dSnw141292 catchsql { 314c5c4113dSnw141292 SELECT DISTINCT log FROM t1 315c5c4113dSnw141292 UNION ALL 316c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 317c5c4113dSnw141292 ORDER BY 1; 318c5c4113dSnw141292 } 319c5c4113dSnw141292} {0 {0 1 2 3 4 5 5 6 7 8}} 320c5c4113dSnw141292do_test select4-5.2h { 321c5c4113dSnw141292 catchsql { 322c5c4113dSnw141292 SELECT DISTINCT log FROM t1 323c5c4113dSnw141292 UNION ALL 324c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 325c5c4113dSnw141292 ORDER BY 2; 326c5c4113dSnw141292 } 327c5c4113dSnw141292} {1 {ORDER BY position 2 should be between 1 and 1}} 328c5c4113dSnw141292do_test select4-5.2i { 329c5c4113dSnw141292 catchsql { 330c5c4113dSnw141292 SELECT DISTINCT 1, log FROM t1 331c5c4113dSnw141292 UNION ALL 332c5c4113dSnw141292 SELECT 2, n FROM t1 WHERE log=3 333c5c4113dSnw141292 ORDER BY 2, 1; 334c5c4113dSnw141292 } 335c5c4113dSnw141292} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}} 336c5c4113dSnw141292do_test select4-5.2j { 337c5c4113dSnw141292 catchsql { 338c5c4113dSnw141292 SELECT DISTINCT 1, log FROM t1 339c5c4113dSnw141292 UNION ALL 340c5c4113dSnw141292 SELECT 2, n FROM t1 WHERE log=3 341c5c4113dSnw141292 ORDER BY 1, 2 DESC; 342c5c4113dSnw141292 } 343c5c4113dSnw141292} {0 {1 5 1 4 1 3 1 2 1 1 1 0 2 8 2 7 2 6 2 5}} 344c5c4113dSnw141292do_test select4-5.2k { 345c5c4113dSnw141292 catchsql { 346c5c4113dSnw141292 SELECT DISTINCT 1, log FROM t1 347c5c4113dSnw141292 UNION ALL 348c5c4113dSnw141292 SELECT 2, n FROM t1 WHERE log=3 349c5c4113dSnw141292 ORDER BY n, 1; 350c5c4113dSnw141292 } 351c5c4113dSnw141292} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}} 352c5c4113dSnw141292do_test select4-5.3 { 353c5c4113dSnw141292 set v [catch {execsql { 354c5c4113dSnw141292 SELECT DISTINCT log, n FROM t1 355c5c4113dSnw141292 UNION ALL 356c5c4113dSnw141292 SELECT n FROM t1 WHERE log=3 357c5c4113dSnw141292 ORDER BY log; 358c5c4113dSnw141292 }} msg] 359c5c4113dSnw141292 lappend v $msg 360c5c4113dSnw141292} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}} 361c5c4113dSnw141292do_test select4-5.4 { 362c5c4113dSnw141292 set v [catch {execsql { 363c5c4113dSnw141292 SELECT log FROM t1 WHERE n=2 364c5c4113dSnw141292 UNION ALL 365c5c4113dSnw141292 SELECT log FROM t1 WHERE n=3 366c5c4113dSnw141292 UNION ALL 367c5c4113dSnw141292 SELECT log FROM t1 WHERE n=4 368c5c4113dSnw141292 UNION ALL 369c5c4113dSnw141292 SELECT log FROM t1 WHERE n=5 370c5c4113dSnw141292 ORDER BY log; 371c5c4113dSnw141292 }} msg] 372c5c4113dSnw141292 lappend v $msg 373c5c4113dSnw141292} {0 {1 2 2 3}} 374c5c4113dSnw141292 375c5c4113dSnw141292do_test select4-6.1 { 376c5c4113dSnw141292 execsql { 377c5c4113dSnw141292 SELECT log, count(*) as cnt FROM t1 GROUP BY log 378c5c4113dSnw141292 UNION 379c5c4113dSnw141292 SELECT log, n FROM t1 WHERE n=7 380c5c4113dSnw141292 ORDER BY cnt, log; 381c5c4113dSnw141292 } 382c5c4113dSnw141292} {0 1 1 1 2 2 3 4 3 7 4 8 5 15} 383c5c4113dSnw141292do_test select4-6.2 { 384c5c4113dSnw141292 execsql { 385c5c4113dSnw141292 SELECT log, count(*) FROM t1 GROUP BY log 386c5c4113dSnw141292 UNION 387c5c4113dSnw141292 SELECT log, n FROM t1 WHERE n=7 388c5c4113dSnw141292 ORDER BY count(*), log; 389c5c4113dSnw141292 } 390c5c4113dSnw141292} {0 1 1 1 2 2 3 4 3 7 4 8 5 15} 391c5c4113dSnw141292 392c5c4113dSnw141292# NULLs are indistinct for the UNION operator. 393c5c4113dSnw141292# Make sure the UNION operator recognizes this 394c5c4113dSnw141292# 395c5c4113dSnw141292do_test select4-6.3 { 396c5c4113dSnw141292 execsql { 397c5c4113dSnw141292 SELECT NULL UNION SELECT NULL UNION 398c5c4113dSnw141292 SELECT 1 UNION SELECT 2 AS 'x' 399c5c4113dSnw141292 ORDER BY x; 400c5c4113dSnw141292 } 401c5c4113dSnw141292} {{} 1 2} 402c5c4113dSnw141292do_test select4-6.3.1 { 403c5c4113dSnw141292 execsql { 404c5c4113dSnw141292 SELECT NULL UNION ALL SELECT NULL UNION ALL 405c5c4113dSnw141292 SELECT 1 UNION ALL SELECT 2 AS 'x' 406c5c4113dSnw141292 ORDER BY x; 407c5c4113dSnw141292 } 408c5c4113dSnw141292} {{} {} 1 2} 409c5c4113dSnw141292 410c5c4113dSnw141292# Make sure the DISTINCT keyword treats NULLs as indistinct. 411c5c4113dSnw141292# 412c5c4113dSnw141292do_test select4-6.4 { 413c5c4113dSnw141292 execsql { 414c5c4113dSnw141292 SELECT * FROM ( 415c5c4113dSnw141292 SELECT NULL, 1 UNION ALL SELECT NULL, 1 416c5c4113dSnw141292 ); 417c5c4113dSnw141292 } 418c5c4113dSnw141292} {{} 1 {} 1} 419c5c4113dSnw141292do_test select4-6.5 { 420c5c4113dSnw141292 execsql { 421c5c4113dSnw141292 SELECT DISTINCT * FROM ( 422c5c4113dSnw141292 SELECT NULL, 1 UNION ALL SELECT NULL, 1 423c5c4113dSnw141292 ); 424c5c4113dSnw141292 } 425c5c4113dSnw141292} {{} 1} 426c5c4113dSnw141292do_test select4-6.6 { 427c5c4113dSnw141292 execsql { 428c5c4113dSnw141292 SELECT DISTINCT * FROM ( 429c5c4113dSnw141292 SELECT 1,2 UNION ALL SELECT 1,2 430c5c4113dSnw141292 ); 431c5c4113dSnw141292 } 432c5c4113dSnw141292} {1 2} 433c5c4113dSnw141292 434c5c4113dSnw141292# Test distinctness of NULL in other ways. 435c5c4113dSnw141292# 436c5c4113dSnw141292do_test select4-6.7 { 437c5c4113dSnw141292 execsql { 438c5c4113dSnw141292 SELECT NULL EXCEPT SELECT NULL 439c5c4113dSnw141292 } 440c5c4113dSnw141292} {} 441c5c4113dSnw141292 442c5c4113dSnw141292 443c5c4113dSnw141292# Make sure column names are correct when a compound select appears as 444c5c4113dSnw141292# an expression in the WHERE clause. 445c5c4113dSnw141292# 446c5c4113dSnw141292do_test select4-7.1 { 447c5c4113dSnw141292 execsql { 448c5c4113dSnw141292 CREATE TABLE t2 AS SELECT log AS 'x', count(*) AS 'y' FROM t1 GROUP BY log; 449c5c4113dSnw141292 SELECT * FROM t2 ORDER BY x; 450c5c4113dSnw141292 } 451c5c4113dSnw141292} {0 1 1 1 2 2 3 4 4 8 5 15} 452c5c4113dSnw141292do_test select4-7.2 { 453c5c4113dSnw141292 execsql2 { 454c5c4113dSnw141292 SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 INTERSECT SELECT x FROM t2) 455c5c4113dSnw141292 ORDER BY n 456c5c4113dSnw141292 } 457c5c4113dSnw141292} {n 1 log 0 n 2 log 1 n 3 log 2 n 4 log 2 n 5 log 3} 458c5c4113dSnw141292do_test select4-7.3 { 459c5c4113dSnw141292 execsql2 { 460c5c4113dSnw141292 SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 EXCEPT SELECT x FROM t2) 461c5c4113dSnw141292 ORDER BY n LIMIT 2 462c5c4113dSnw141292 } 463c5c4113dSnw141292} {n 6 log 3 n 7 log 3} 464c5c4113dSnw141292do_test select4-7.4 { 465c5c4113dSnw141292 execsql2 { 466c5c4113dSnw141292 SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 UNION SELECT x FROM t2) 467c5c4113dSnw141292 ORDER BY n LIMIT 2 468c5c4113dSnw141292 } 469c5c4113dSnw141292} {n 1 log 0 n 2 log 1} 470c5c4113dSnw141292 471c5c4113dSnw141292# Make sure DISTINCT works appropriately on TEXT and NUMERIC columns. 472c5c4113dSnw141292# 473c5c4113dSnw141292do_test select4-8.1 { 474c5c4113dSnw141292 execsql { 475c5c4113dSnw141292 BEGIN; 476c5c4113dSnw141292 CREATE TABLE t3(a text, b float, c text); 477c5c4113dSnw141292 INSERT INTO t3 VALUES(1, 1.1, '1.1'); 478c5c4113dSnw141292 INSERT INTO t3 VALUES(2, 1.10, '1.10'); 479c5c4113dSnw141292 INSERT INTO t3 VALUES(3, 1.10, '1.1'); 480c5c4113dSnw141292 INSERT INTO t3 VALUES(4, 1.1, '1.10'); 481c5c4113dSnw141292 INSERT INTO t3 VALUES(5, 1.2, '1.2'); 482c5c4113dSnw141292 INSERT INTO t3 VALUES(6, 1.3, '1.3'); 483c5c4113dSnw141292 COMMIT; 484c5c4113dSnw141292 } 485c5c4113dSnw141292 execsql { 486c5c4113dSnw141292 SELECT DISTINCT b FROM t3 ORDER BY c; 487c5c4113dSnw141292 } 488c5c4113dSnw141292} {1.1 1.2 1.3} 489c5c4113dSnw141292do_test select4-8.2 { 490c5c4113dSnw141292 execsql { 491c5c4113dSnw141292 SELECT DISTINCT c FROM t3 ORDER BY c; 492c5c4113dSnw141292 } 493c5c4113dSnw141292} {1.1 1.10 1.2 1.3} 494c5c4113dSnw141292 495c5c4113dSnw141292 496c5c4113dSnw141292finish_test 497