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 aggregate functions and the 16*c5c4113dSnw141292# GROUP BY and HAVING clauses of SELECT statements. 17*c5c4113dSnw141292# 18*c5c4113dSnw141292# $Id: select3.test,v 1.8 2003/01/31 17:16:37 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*c5c4113dSnw141292do_test select3-1.0 { 26*c5c4113dSnw141292 set fd [open data1.txt w] 27*c5c4113dSnw141292 for {set i 1} {$i<32} {incr i} { 28*c5c4113dSnw141292 for {set j 0} {pow(2,$j)<$i} {incr j} {} 29*c5c4113dSnw141292 puts $fd "$i\t$j" 30*c5c4113dSnw141292 } 31*c5c4113dSnw141292 close $fd 32*c5c4113dSnw141292 execsql { 33*c5c4113dSnw141292 CREATE TABLE t1(n int, log int); 34*c5c4113dSnw141292 COPY t1 FROM 'data1.txt' 35*c5c4113dSnw141292 } 36*c5c4113dSnw141292 file delete data1.txt 37*c5c4113dSnw141292 execsql {SELECT DISTINCT log FROM t1 ORDER BY log} 38*c5c4113dSnw141292} {0 1 2 3 4 5} 39*c5c4113dSnw141292 40*c5c4113dSnw141292# Basic aggregate functions. 41*c5c4113dSnw141292# 42*c5c4113dSnw141292do_test select3-1.1 { 43*c5c4113dSnw141292 execsql {SELECT count(*) FROM t1} 44*c5c4113dSnw141292} {31} 45*c5c4113dSnw141292do_test select3-1.2 { 46*c5c4113dSnw141292 execsql { 47*c5c4113dSnw141292 SELECT min(n),min(log),max(n),max(log),sum(n),sum(log),avg(n),avg(log) 48*c5c4113dSnw141292 FROM t1 49*c5c4113dSnw141292 } 50*c5c4113dSnw141292} {1 0 31 5 496 124 16 4} 51*c5c4113dSnw141292do_test select3-1.3 { 52*c5c4113dSnw141292 execsql {SELECT max(n)/avg(n), max(log)/avg(log) FROM t1} 53*c5c4113dSnw141292} {1.9375 1.25} 54*c5c4113dSnw141292 55*c5c4113dSnw141292# Try some basic GROUP BY clauses 56*c5c4113dSnw141292# 57*c5c4113dSnw141292do_test select3-2.1 { 58*c5c4113dSnw141292 execsql {SELECT log, count(*) FROM t1 GROUP BY log ORDER BY log} 59*c5c4113dSnw141292} {0 1 1 1 2 2 3 4 4 8 5 15} 60*c5c4113dSnw141292do_test select3-2.2 { 61*c5c4113dSnw141292 execsql {SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log} 62*c5c4113dSnw141292} {0 1 1 2 2 3 3 5 4 9 5 17} 63*c5c4113dSnw141292do_test select3-2.3 { 64*c5c4113dSnw141292 execsql {SELECT log, avg(n) FROM t1 GROUP BY log ORDER BY log} 65*c5c4113dSnw141292} {0 1 1 2 2 3.5 3 6.5 4 12.5 5 24} 66*c5c4113dSnw141292do_test select3-2.3 { 67*c5c4113dSnw141292 execsql {SELECT log, avg(n)+1 FROM t1 GROUP BY log ORDER BY log} 68*c5c4113dSnw141292} {0 2 1 3 2 4.5 3 7.5 4 13.5 5 25} 69*c5c4113dSnw141292do_test select3-2.4 { 70*c5c4113dSnw141292 execsql {SELECT log, avg(n)-min(n) FROM t1 GROUP BY log ORDER BY log} 71*c5c4113dSnw141292} {0 0 1 0 2 0.5 3 1.5 4 3.5 5 7} 72*c5c4113dSnw141292do_test select3-2.5 { 73*c5c4113dSnw141292 execsql {SELECT log*2+1, avg(n)-min(n) FROM t1 GROUP BY log ORDER BY log} 74*c5c4113dSnw141292} {1 0 3 0 5 0.5 7 1.5 9 3.5 11 7} 75*c5c4113dSnw141292do_test select3-2.6 { 76*c5c4113dSnw141292 execsql { 77*c5c4113dSnw141292 SELECT log*2+1 as x, count(*) FROM t1 GROUP BY x ORDER BY x 78*c5c4113dSnw141292 } 79*c5c4113dSnw141292} {1 1 3 1 5 2 7 4 9 8 11 15} 80*c5c4113dSnw141292do_test select3-2.7 { 81*c5c4113dSnw141292 execsql { 82*c5c4113dSnw141292 SELECT log*2+1 AS x, count(*) AS y FROM t1 GROUP BY x ORDER BY y 83*c5c4113dSnw141292 } 84*c5c4113dSnw141292} {1 1 3 1 5 2 7 4 9 8 11 15} 85*c5c4113dSnw141292do_test select3-2.8 { 86*c5c4113dSnw141292 execsql { 87*c5c4113dSnw141292 SELECT log*2+1 AS x, count(*) AS y FROM t1 GROUP BY x ORDER BY 10-(x+y) 88*c5c4113dSnw141292 } 89*c5c4113dSnw141292} {11 15 9 8 7 4 5 2 3 1 1 1} 90*c5c4113dSnw141292do_test select3-2.9 { 91*c5c4113dSnw141292 catchsql { 92*c5c4113dSnw141292 SELECT log, count(*) FROM t1 GROUP BY 'x' ORDER BY log; 93*c5c4113dSnw141292 } 94*c5c4113dSnw141292} {1 {GROUP BY terms must not be non-integer constants}} 95*c5c4113dSnw141292do_test select3-2.10 { 96*c5c4113dSnw141292 catchsql { 97*c5c4113dSnw141292 SELECT log, count(*) FROM t1 GROUP BY 0 ORDER BY log; 98*c5c4113dSnw141292 } 99*c5c4113dSnw141292} {1 {GROUP BY column number 0 out of range - should be between 1 and 2}} 100*c5c4113dSnw141292do_test select3-2.11 { 101*c5c4113dSnw141292 catchsql { 102*c5c4113dSnw141292 SELECT log, count(*) FROM t1 GROUP BY 3 ORDER BY log; 103*c5c4113dSnw141292 } 104*c5c4113dSnw141292} {1 {GROUP BY column number 3 out of range - should be between 1 and 2}} 105*c5c4113dSnw141292do_test select3-2.12 { 106*c5c4113dSnw141292 catchsql { 107*c5c4113dSnw141292 SELECT log, count(*) FROM t1 GROUP BY 1 ORDER BY log; 108*c5c4113dSnw141292 } 109*c5c4113dSnw141292} {0 {0 1 1 1 2 2 3 4 4 8 5 15}} 110*c5c4113dSnw141292#do_test select3-2.13 { 111*c5c4113dSnw141292# catchsql { 112*c5c4113dSnw141292# SELECT log, count(*) FROM t1 GROUP BY 2 ORDER BY log; 113*c5c4113dSnw141292# } 114*c5c4113dSnw141292#} {0 {0 1 1 1 2 2 3 4 4 8 5 15}} 115*c5c4113dSnw141292#do_test select3-2.14 { 116*c5c4113dSnw141292# catchsql { 117*c5c4113dSnw141292# SELECT log, count(*) FROM t1 GROUP BY count(*) ORDER BY log; 118*c5c4113dSnw141292# } 119*c5c4113dSnw141292#} {0 {0 1 1 1 2 2 3 4 4 8 5 15}} 120*c5c4113dSnw141292 121*c5c4113dSnw141292# Cannot have a HAVING without a GROUP BY 122*c5c4113dSnw141292# 123*c5c4113dSnw141292do_test select3-3.1 { 124*c5c4113dSnw141292 set v [catch {execsql {SELECT log, count(*) FROM t1 HAVING log>=4}} msg] 125*c5c4113dSnw141292 lappend v $msg 126*c5c4113dSnw141292} {1 {a GROUP BY clause is required before HAVING}} 127*c5c4113dSnw141292 128*c5c4113dSnw141292# Toss in some HAVING clauses 129*c5c4113dSnw141292# 130*c5c4113dSnw141292do_test select3-4.1 { 131*c5c4113dSnw141292 execsql {SELECT log, count(*) FROM t1 GROUP BY log HAVING log>=4 ORDER BY log} 132*c5c4113dSnw141292} {4 8 5 15} 133*c5c4113dSnw141292do_test select3-4.2 { 134*c5c4113dSnw141292 execsql { 135*c5c4113dSnw141292 SELECT log, count(*) FROM t1 136*c5c4113dSnw141292 GROUP BY log 137*c5c4113dSnw141292 HAVING count(*)>=4 138*c5c4113dSnw141292 ORDER BY log 139*c5c4113dSnw141292 } 140*c5c4113dSnw141292} {3 4 4 8 5 15} 141*c5c4113dSnw141292do_test select3-4.3 { 142*c5c4113dSnw141292 execsql { 143*c5c4113dSnw141292 SELECT log, count(*) FROM t1 144*c5c4113dSnw141292 GROUP BY log 145*c5c4113dSnw141292 HAVING count(*)>=4 146*c5c4113dSnw141292 ORDER BY max(n) 147*c5c4113dSnw141292 } 148*c5c4113dSnw141292} {3 4 4 8 5 15} 149*c5c4113dSnw141292do_test select3-4.4 { 150*c5c4113dSnw141292 execsql { 151*c5c4113dSnw141292 SELECT log AS x, count(*) AS y FROM t1 152*c5c4113dSnw141292 GROUP BY x 153*c5c4113dSnw141292 HAVING y>=4 154*c5c4113dSnw141292 ORDER BY max(n) 155*c5c4113dSnw141292 } 156*c5c4113dSnw141292} {3 4 4 8 5 15} 157*c5c4113dSnw141292do_test select3-4.5 { 158*c5c4113dSnw141292 execsql { 159*c5c4113dSnw141292 SELECT log AS x FROM t1 160*c5c4113dSnw141292 GROUP BY x 161*c5c4113dSnw141292 HAVING count(*)>=4 162*c5c4113dSnw141292 ORDER BY max(n) 163*c5c4113dSnw141292 } 164*c5c4113dSnw141292} {3 4 5} 165*c5c4113dSnw141292 166*c5c4113dSnw141292do_test select3-5.1 { 167*c5c4113dSnw141292 execsql { 168*c5c4113dSnw141292 SELECT log, count(*), avg(n), max(n+log*2) FROM t1 169*c5c4113dSnw141292 GROUP BY log 170*c5c4113dSnw141292 ORDER BY max(n+log*2), avg(n) 171*c5c4113dSnw141292 } 172*c5c4113dSnw141292} {0 1 1 1 1 1 2 4 2 2 3.5 8 3 4 6.5 14 4 8 12.5 24 5 15 24 41} 173*c5c4113dSnw141292do_test select3-5.2 { 174*c5c4113dSnw141292 execsql { 175*c5c4113dSnw141292 SELECT log, count(*), avg(n), max(n+log*2) FROM t1 176*c5c4113dSnw141292 GROUP BY log 177*c5c4113dSnw141292 ORDER BY max(n+log*2), min(log,avg(n)) 178*c5c4113dSnw141292 } 179*c5c4113dSnw141292} {0 1 1 1 1 1 2 4 2 2 3.5 8 3 4 6.5 14 4 8 12.5 24 5 15 24 41} 180*c5c4113dSnw141292 181*c5c4113dSnw141292# Test sorting of GROUP BY results in the presence of an index 182*c5c4113dSnw141292# on the GROUP BY column. 183*c5c4113dSnw141292# 184*c5c4113dSnw141292do_test select3-6.1 { 185*c5c4113dSnw141292 execsql { 186*c5c4113dSnw141292 SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log; 187*c5c4113dSnw141292 } 188*c5c4113dSnw141292} {0 1 1 2 2 3 3 5 4 9 5 17} 189*c5c4113dSnw141292do_test select3-6.2 { 190*c5c4113dSnw141292 execsql { 191*c5c4113dSnw141292 SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log DESC; 192*c5c4113dSnw141292 } 193*c5c4113dSnw141292} {5 17 4 9 3 5 2 3 1 2 0 1} 194*c5c4113dSnw141292do_test select3-6.3 { 195*c5c4113dSnw141292 execsql { 196*c5c4113dSnw141292 SELECT log, min(n) FROM t1 GROUP BY log ORDER BY 1; 197*c5c4113dSnw141292 } 198*c5c4113dSnw141292} {0 1 1 2 2 3 3 5 4 9 5 17} 199*c5c4113dSnw141292do_test select3-6.4 { 200*c5c4113dSnw141292 execsql { 201*c5c4113dSnw141292 SELECT log, min(n) FROM t1 GROUP BY log ORDER BY 1 DESC; 202*c5c4113dSnw141292 } 203*c5c4113dSnw141292} {5 17 4 9 3 5 2 3 1 2 0 1} 204*c5c4113dSnw141292do_test select3-6.5 { 205*c5c4113dSnw141292 execsql { 206*c5c4113dSnw141292 CREATE INDEX i1 ON t1(log); 207*c5c4113dSnw141292 SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log; 208*c5c4113dSnw141292 } 209*c5c4113dSnw141292} {0 1 1 2 2 3 3 5 4 9 5 17} 210*c5c4113dSnw141292do_test select3-6.6 { 211*c5c4113dSnw141292 execsql { 212*c5c4113dSnw141292 SELECT log, min(n) FROM t1 GROUP BY log ORDER BY log DESC; 213*c5c4113dSnw141292 } 214*c5c4113dSnw141292} {5 17 4 9 3 5 2 3 1 2 0 1} 215*c5c4113dSnw141292do_test select3-6.7 { 216*c5c4113dSnw141292 execsql { 217*c5c4113dSnw141292 SELECT log, min(n) FROM t1 GROUP BY log ORDER BY 1; 218*c5c4113dSnw141292 } 219*c5c4113dSnw141292} {0 1 1 2 2 3 3 5 4 9 5 17} 220*c5c4113dSnw141292do_test select3-6.8 { 221*c5c4113dSnw141292 execsql { 222*c5c4113dSnw141292 SELECT log, min(n) FROM t1 GROUP BY log ORDER BY 1 DESC; 223*c5c4113dSnw141292 } 224*c5c4113dSnw141292} {5 17 4 9 3 5 2 3 1 2 0 1} 225*c5c4113dSnw141292 226*c5c4113dSnw141292 227*c5c4113dSnw141292 228*c5c4113dSnw141292finish_test 229