1652fbf55Sdrh# 2008 April 1 2652fbf55Sdrh# 3652fbf55Sdrh# The author disclaims copyright to this source code. In place of 4652fbf55Sdrh# a legal notice, here is a blessing: 5652fbf55Sdrh# 6652fbf55Sdrh# May you do good and not evil. 7652fbf55Sdrh# May you find forgiveness for yourself and forgive others. 8652fbf55Sdrh# May you share freely, never taking more than you give. 9652fbf55Sdrh# 10652fbf55Sdrh#*********************************************************************** 11652fbf55Sdrh# 12652fbf55Sdrh# Test cases designed to exercise and verify the logic for 13652fbf55Sdrh# factoring constant expressions out of loops and for 14652fbf55Sdrh# common subexpression eliminations. 15652fbf55Sdrh# 16de3e41e3Sdanielk1977# $Id: cse.test,v 1.6 2008/08/04 03:51:24 danielk1977 Exp $ 17652fbf55Sdrh# 18652fbf55Sdrh 19652fbf55Sdrhset testdir [file dirname $argv0] 20652fbf55Sdrhsource $testdir/tester.tcl 21*c59b4acfSdanset testprefix cse 22652fbf55Sdrh 23652fbf55Sdrhdo_test cse-1.1 { 24652fbf55Sdrh execsql { 25652fbf55Sdrh CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d, e, f); 26652fbf55Sdrh INSERT INTO t1 VALUES(1,11,12,13,14,15); 27652fbf55Sdrh INSERT INTO t1 VALUES(2,21,22,23,24,25); 28652fbf55Sdrh } 29652fbf55Sdrh execsql { 30652fbf55Sdrh SELECT b, -b, ~b, NOT b, NOT NOT b, b-b, b+b, b*b, b/b, b FROM t1 31652fbf55Sdrh } 32652fbf55Sdrh} {11 -11 -12 0 1 0 22 121 1 11 21 -21 -22 0 1 0 42 441 1 21} 33652fbf55Sdrhdo_test cse-1.2 { 34652fbf55Sdrh execsql { 35652fbf55Sdrh SELECT b, b%b, b==b, b!=b, b<b, b<=b, b IS NULL, b NOT NULL, b FROM t1 36652fbf55Sdrh } 37652fbf55Sdrh} {11 0 1 0 0 1 0 1 11 21 0 1 0 0 1 0 1 21} 38652fbf55Sdrhdo_test cse-1.3 { 39652fbf55Sdrh execsql { 40652fbf55Sdrh SELECT b, abs(b), coalesce(b,-b,NOT b,c,NOT c), c, -c FROM t1; 41652fbf55Sdrh } 42652fbf55Sdrh} {11 11 11 12 -12 21 21 21 22 -22} 43652fbf55Sdrhdo_test cse-1.4 { 44652fbf55Sdrh execsql { 45652fbf55Sdrh SELECT CASE WHEN a==1 THEN b ELSE c END, b, c FROM t1 46652fbf55Sdrh } 47652fbf55Sdrh} {11 11 12 22 21 22} 48652fbf55Sdrhdo_test cse-1.5 { 49652fbf55Sdrh execsql { 50652fbf55Sdrh SELECT CASE a WHEN 1 THEN b WHEN 2 THEN c ELSE d END, b, c, d FROM t1 51652fbf55Sdrh } 52652fbf55Sdrh} {11 11 12 13 22 21 22 23} 5347de955eSdrhdo_test cse-1.6.1 { 54652fbf55Sdrh execsql { 55652fbf55Sdrh SELECT CASE b WHEN 11 THEN -b WHEN 21 THEN -c ELSE -d END, b, c, d FROM t1 56652fbf55Sdrh } 57652fbf55Sdrh} {-11 11 12 13 -22 21 22 23} 5847de955eSdrhdo_test cse-1.6.2 { 5947de955eSdrh execsql { 6047de955eSdrh SELECT CASE b+1 WHEN c THEN d WHEN e THEN f ELSE 999 END, b, c, d FROM t1 6147de955eSdrh } 6247de955eSdrh} {13 11 12 13 23 21 22 23} 6347de955eSdrhdo_test cse-1.6.3 { 6447de955eSdrh execsql { 6547de955eSdrh SELECT CASE WHEN b THEN d WHEN e THEN f ELSE 999 END, b, c, d FROM t1 6647de955eSdrh } 6747de955eSdrh} {13 11 12 13 23 21 22 23} 6847de955eSdrhdo_test cse-1.6.4 { 6947de955eSdrh execsql { 7047de955eSdrh SELECT b, c, d, CASE WHEN b THEN d WHEN e THEN f ELSE 999 END FROM t1 7147de955eSdrh } 7247de955eSdrh} {11 12 13 13 21 22 23 23} 7347de955eSdrhdo_test cse-1.6.5 { 7447de955eSdrh execsql { 7547de955eSdrh SELECT b, c, d, CASE WHEN 0 THEN d WHEN e THEN f ELSE 999 END FROM t1 7647de955eSdrh } 7747de955eSdrh} {11 12 13 15 21 22 23 25} 78652fbf55Sdrhdo_test cse-1.7 { 79652fbf55Sdrh execsql { 80652fbf55Sdrh SELECT a, -a, ~a, NOT a, NOT NOT a, a-a, a+a, a*a, a/a, a FROM t1 81652fbf55Sdrh } 82652fbf55Sdrh} {1 -1 -2 0 1 0 2 1 1 1 2 -2 -3 0 1 0 4 4 1 2} 83652fbf55Sdrhdo_test cse-1.8 { 84652fbf55Sdrh execsql { 85652fbf55Sdrh SELECT a, a%a, a==a, a!=a, a<a, a<=a, a IS NULL, a NOT NULL, a FROM t1 86652fbf55Sdrh } 87652fbf55Sdrh} {1 0 1 0 0 1 0 1 1 2 0 1 0 0 1 0 1 2} 88b3843a82Sdrhdo_test cse-1.9 { 89b3843a82Sdrh execsql { 90b3843a82Sdrh SELECT NOT b, ~b, NOT NOT b, b FROM t1 91b3843a82Sdrh } 92b3843a82Sdrh} {0 -12 1 11 0 -22 1 21} 93b3843a82Sdrhdo_test cse-1.10 { 94b3843a82Sdrh execsql { 95b3843a82Sdrh SELECT CAST(b AS integer), typeof(b), CAST(b AS text), typeof(b) FROM t1 96b3843a82Sdrh } 97b3843a82Sdrh} {11 integer 11 integer 21 integer 21 integer} 98de3e41e3Sdanielk1977ifcapable compound { 99c5499befSdrh do_test cse-1.11 { 100c5499befSdrh execsql { 101c5499befSdrh SELECT *,* FROM t1 WHERE a=2 102c5499befSdrh UNION ALL 103c5499befSdrh SELECT *,* FROM t1 WHERE a=1 104c5499befSdrh } 105c5499befSdrh } {2 21 22 23 24 25 2 21 22 23 24 25 1 11 12 13 14 15 1 11 12 13 14 15} 106c5499befSdrh do_test cse-1.12 { 107c5499befSdrh execsql { 108c5499befSdrh SELECT coalesce(b,c,d,e), a, b, c, d, e FROM t1 WHERE a=2 109c5499befSdrh UNION ALL 110c5499befSdrh SELECT coalesce(e,d,c,b), e, d, c, b, a FROM t1 WHERE a=1 111c5499befSdrh } 112c5499befSdrh } {21 2 21 22 23 24 14 14 13 12 11 1} 113de3e41e3Sdanielk1977} 114c5499befSdrhdo_test cse-1.13 { 115c5499befSdrh execsql { 116c5499befSdrh SELECT upper(b), typeof(b), b FROM t1 117c5499befSdrh } 118c5499befSdrh} {11 integer 11 21 integer 21} 119c5499befSdrhdo_test cse-1.14 { 120c5499befSdrh execsql { 121c5499befSdrh SELECT b, typeof(b), upper(b), typeof(b), b FROM t1 122c5499befSdrh } 123c5499befSdrh} {11 integer 11 integer 11 21 integer 21 integer 21} 124652fbf55Sdrh 1252f7794c1Sdrh# Overflow the column cache. Create queries involving more and more 1262f7794c1Sdrh# columns until the cache overflows. Verify correct operation throughout. 1272f7794c1Sdrh# 1282f7794c1Sdrhdo_test cse-2.1 { 1292f7794c1Sdrh execsql { 1302f7794c1Sdrh CREATE TABLE t2(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9, 1312f7794c1Sdrh a10,a11,a12,a13,a14,a15,a16,a17,a18,a19, 1322f7794c1Sdrh a20,a21,a22,a23,a24,a25,a26,a27,a28,a29, 1332f7794c1Sdrh a30,a31,a32,a33,a34,a35,a36,a37,a38,a39, 1342f7794c1Sdrh a40,a41,a42,a43,a44,a45,a46,a47,a48,a49); 1352f7794c1Sdrh INSERT INTO t2 VALUES(0,1,2,3,4,5,6,7,8,9, 1362f7794c1Sdrh 10,11,12,13,14,15,16,17,18,19, 1372f7794c1Sdrh 20,21,22,23,24,25,26,27,28,29, 1382f7794c1Sdrh 30,31,32,33,34,35,36,37,38,39, 1392f7794c1Sdrh 40,41,42,43,44,45,46,47,48,49); 1402f7794c1Sdrh SELECT * FROM t2; 1412f7794c1Sdrh } 1422f7794c1Sdrh} {0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49} 1432f7794c1Sdrh 1442f7794c1Sdrhfor {set i 1} {$i<100} {incr i} { 1452f7794c1Sdrh set n [expr {int(rand()*44)+5}] 1462f7794c1Sdrh set colset {} 1472f7794c1Sdrh set answer {} 1482f7794c1Sdrh for {set j 0} {$j<$n} {incr j} { 1492f7794c1Sdrh set r [expr {$j+int(rand()*5)}] 1502f7794c1Sdrh if {$r>49} {set r [expr {99-$r}]} 1512f7794c1Sdrh lappend colset a$j a$r 1522f7794c1Sdrh lappend answer $j $r 1532f7794c1Sdrh } 1542f7794c1Sdrh set sql "SELECT [join $colset ,] FROM t2" 1552f7794c1Sdrh do_test cse-2.2.$i { 1562f7794c1Sdrh # explain $::sql 1572f7794c1Sdrh execsql $::sql 1582f7794c1Sdrh } $answer 1592f7794c1Sdrh} 160652fbf55Sdrh 161*c59b4acfSdan#------------------------------------------------------------------------- 162*c59b4acfSdan# Ticket fd1bda016d1a 163*c59b4acfSdan# 164*c59b4acfSdanreset_db 165*c59b4acfSdando_execsql_test 3.0 { 166*c59b4acfSdan CREATE TABLE t1(a TEXT, b); 167*c59b4acfSdan INSERT INTO t1 VALUES('hello', 0); 168*c59b4acfSdan INSERT INTO t1 VALUES('world', 0); 169*c59b4acfSdan 170*c59b4acfSdan CREATE TABLE t2(x TEXT); 171*c59b4acfSdan INSERT INTO t2 VALUES('hello'); 172*c59b4acfSdan INSERT INTO t2 VALUES('world'); 173*c59b4acfSdan 174*c59b4acfSdan CREATE TABLE t3(y); 175*c59b4acfSdan INSERT INTO t3 VALUES(1000); 176*c59b4acfSdan} {} 177*c59b4acfSdan 178*c59b4acfSdando_execsql_test 3.1 { 179*c59b4acfSdan SELECT 1000 = y FROM t3 180*c59b4acfSdan} {1} 181*c59b4acfSdan 182*c59b4acfSdando_execsql_test 3.2 { 183*c59b4acfSdan SELECT 1000 IN (SELECT x FROM t2), 1000 = y FROM t3 184*c59b4acfSdan} {0 1} 185*c59b4acfSdan 186*c59b4acfSdando_execsql_test 3.3 { 187*c59b4acfSdan SELECT 0 IN (SELECT a), (SELECT a LIMIT 0) FROM t1 188*c59b4acfSdan} {0 {} 0 {}} 189*c59b4acfSdan 190*c59b4acfSdando_execsql_test 3.4 { 191*c59b4acfSdan SELECT 0 IN (SELECT a) FROM t1 WHERE a = 'hello' OR (SELECT a LIMIT 0); 192*c59b4acfSdan} {0} 193*c59b4acfSdan 194*c59b4acfSdando_execsql_test 3.5 { 195*c59b4acfSdan CREATE TABLE v0(v1 VARCHAR0); 196*c59b4acfSdan INSERT INTO v0 VALUES(2), (3); 197*c59b4acfSdan SELECT 0 IN(SELECT v1) FROM v0 WHERE v1 = 2 OR(SELECT v1 LIMIT 0); 198*c59b4acfSdan} {0} 199*c59b4acfSdan 200652fbf55Sdrhfinish_test 201