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