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