1acf4ac96Sdrh# 2003 December 17 2acf4ac96Sdrh# 3acf4ac96Sdrh# The author disclaims copyright to this source code. In place of 4acf4ac96Sdrh# a legal notice, here is a blessing: 5acf4ac96Sdrh# 6acf4ac96Sdrh# May you do good and not evil. 7acf4ac96Sdrh# May you find forgiveness for yourself and forgive others. 8acf4ac96Sdrh# May you share freely, never taking more than you give. 9acf4ac96Sdrh# 10acf4ac96Sdrh#*********************************************************************** 11acf4ac96Sdrh# This file implements regression tests for SQLite library. 12acf4ac96Sdrh# 13acf4ac96Sdrh# This file implements tests for miscellanous features that were 14acf4ac96Sdrh# left out of other test files. 15acf4ac96Sdrh# 16dc70e4c3Sdrh# $Id: misc3.test,v 1.20 2009/05/06 00:49:01 drh Exp $ 17acf4ac96Sdrh 18acf4ac96Sdrhset testdir [file dirname $argv0] 19acf4ac96Sdrhsource $testdir/tester.tcl 20acf4ac96Sdrh 21798da52cSdrhifcapable {integrityck} { 22acf4ac96Sdrh # Ticket #529. Make sure an ABORT does not damage the in-memory cache 23acf4ac96Sdrh # that will be used by subsequent statements in the same transaction. 24acf4ac96Sdrh # 25acf4ac96Sdrh do_test misc3-1.1 { 26acf4ac96Sdrh execsql { 27acf4ac96Sdrh CREATE TABLE t1(a UNIQUE,b); 28acf4ac96Sdrh INSERT INTO t1 29acf4ac96Sdrh VALUES(1,'a23456789_b23456789_c23456789_d23456789_e23456789_'); 30acf4ac96Sdrh UPDATE t1 SET b=b||b; 31acf4ac96Sdrh UPDATE t1 SET b=b||b; 32acf4ac96Sdrh UPDATE t1 SET b=b||b; 33acf4ac96Sdrh UPDATE t1 SET b=b||b; 34acf4ac96Sdrh UPDATE t1 SET b=b||b; 35acf4ac96Sdrh INSERT INTO t1 VALUES(2,'x'); 36acf4ac96Sdrh UPDATE t1 SET b=substr(b,1,500); 37acf4ac96Sdrh BEGIN; 38acf4ac96Sdrh } 39acf4ac96Sdrh catchsql {UPDATE t1 SET a=CASE a WHEN 2 THEN 1 ELSE a END, b='y';} 40acf4ac96Sdrh execsql { 41acf4ac96Sdrh CREATE TABLE t2(x,y); 42acf4ac96Sdrh COMMIT; 43acf4ac96Sdrh PRAGMA integrity_check; 44acf4ac96Sdrh } 45acf4ac96Sdrh } ok 46798da52cSdrh} 47798da52cSdrhifcapable {integrityck} { 48acf4ac96Sdrh do_test misc3-1.2 { 49acf4ac96Sdrh execsql { 50acf4ac96Sdrh DROP TABLE t1; 51acf4ac96Sdrh DROP TABLE t2; 52798da52cSdrh } 53798da52cSdrh ifcapable {vacuum} {execsql VACUUM} 54798da52cSdrh execsql { 55acf4ac96Sdrh CREATE TABLE t1(a UNIQUE,b); 56acf4ac96Sdrh INSERT INTO t1 57acf4ac96Sdrh VALUES(1,'a23456789_b23456789_c23456789_d23456789_e23456789_'); 58acf4ac96Sdrh INSERT INTO t1 SELECT a+1, b||b FROM t1; 59acf4ac96Sdrh INSERT INTO t1 SELECT a+2, b||b FROM t1; 60acf4ac96Sdrh INSERT INTO t1 SELECT a+4, b FROM t1; 61acf4ac96Sdrh INSERT INTO t1 SELECT a+8, b FROM t1; 62acf4ac96Sdrh INSERT INTO t1 SELECT a+16, b FROM t1; 63acf4ac96Sdrh INSERT INTO t1 SELECT a+32, b FROM t1; 64acf4ac96Sdrh INSERT INTO t1 SELECT a+64, b FROM t1; 65acf4ac96Sdrh BEGIN; 66acf4ac96Sdrh } 67acf4ac96Sdrh catchsql {UPDATE t1 SET a=CASE a WHEN 128 THEN 127 ELSE a END, b='';} 68acf4ac96Sdrh execsql { 69acf4ac96Sdrh INSERT INTO t1 VALUES(200,'hello out there'); 70acf4ac96Sdrh COMMIT; 71acf4ac96Sdrh PRAGMA integrity_check; 72acf4ac96Sdrh } 73acf4ac96Sdrh } ok 74798da52cSdrh} 75acf4ac96Sdrh 7693a5c6bdSdrh# Tests of the sqliteAtoF() function in util.c 7793a5c6bdSdrh# 7893a5c6bdSdrhdo_test misc3-2.1 { 7993a5c6bdSdrh execsql {SELECT 2e-25*0.5e25} 8092febd92Sdrh} 1.0 8193a5c6bdSdrhdo_test misc3-2.2 { 8293a5c6bdSdrh execsql {SELECT 2.0e-25*000000.500000000000000000000000000000e+00025} 8392febd92Sdrh} 1.0 8493a5c6bdSdrhdo_test misc3-2.3 { 8593a5c6bdSdrh execsql {SELECT 000000000002e-0000000025*0.5e25} 8692febd92Sdrh} 1.0 8793a5c6bdSdrhdo_test misc3-2.4 { 8893a5c6bdSdrh execsql {SELECT 2e-25*0.5e250} 8993a5c6bdSdrh} 1e+225 9093a5c6bdSdrhdo_test misc3-2.5 { 9193a5c6bdSdrh execsql {SELECT 2.0e-250*0.5e25} 9293a5c6bdSdrh} 1e-225 9393a5c6bdSdrhdo_test misc3-2.6 { 9493a5c6bdSdrh execsql {SELECT '-2.0e-127' * '-0.5e27'} 9593a5c6bdSdrh} 1e-100 9693a5c6bdSdrhdo_test misc3-2.7 { 9793a5c6bdSdrh execsql {SELECT '+2.0e-127' * '-0.5e27'} 9893a5c6bdSdrh} -1e-100 9993a5c6bdSdrhdo_test misc3-2.8 { 10093a5c6bdSdrh execsql {SELECT 2.0e-27 * '+0.5e+127'} 10193a5c6bdSdrh} 1e+100 10293a5c6bdSdrhdo_test misc3-2.9 { 10393a5c6bdSdrh execsql {SELECT 2.0e-27 * '+0.000005e+132'} 10493a5c6bdSdrh} 1e+100 10593a5c6bdSdrh 106202b2df7Sdrh# Ticket #522. Make sure integer overflow is handled properly in 107202b2df7Sdrh# indices. 108202b2df7Sdrh# 10940e016e4Sdrhintegrity_check misc3-3.1 110202b2df7Sdrhdo_test misc3-3.2 { 111202b2df7Sdrh execsql { 112202b2df7Sdrh CREATE TABLE t2(a INT UNIQUE); 113202b2df7Sdrh } 11440e016e4Sdrh} {} 11540e016e4Sdrhintegrity_check misc3-3.2.1 116202b2df7Sdrhdo_test misc3-3.3 { 117202b2df7Sdrh execsql { 118202b2df7Sdrh INSERT INTO t2 VALUES(2147483648); 119202b2df7Sdrh } 12040e016e4Sdrh} {} 12140e016e4Sdrhintegrity_check misc3-3.3.1 122202b2df7Sdrhdo_test misc3-3.4 { 123202b2df7Sdrh execsql { 124202b2df7Sdrh INSERT INTO t2 VALUES(-2147483649); 125202b2df7Sdrh } 12640e016e4Sdrh} {} 12740e016e4Sdrhintegrity_check misc3-3.4.1 1289d4280d5Sdrhdo_test misc3-3.5 { 1299d4280d5Sdrh execsql { 1309d4280d5Sdrh INSERT INTO t2 VALUES(+2147483649); 1319d4280d5Sdrh } 13240e016e4Sdrh} {} 13340e016e4Sdrhintegrity_check misc3-3.5.1 1349d4280d5Sdrhdo_test misc3-3.6 { 1359d4280d5Sdrh execsql { 1369d4280d5Sdrh INSERT INTO t2 VALUES(+2147483647); 1379d4280d5Sdrh INSERT INTO t2 VALUES(-2147483648); 1389d4280d5Sdrh INSERT INTO t2 VALUES(-2147483647); 1399d4280d5Sdrh INSERT INTO t2 VALUES(2147483646); 1409d4280d5Sdrh SELECT * FROM t2 ORDER BY a; 1419d4280d5Sdrh } 1429d4280d5Sdrh} {-2147483649 -2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649} 1439d4280d5Sdrhdo_test misc3-3.7 { 1449d4280d5Sdrh execsql { 1459d4280d5Sdrh SELECT * FROM t2 WHERE a>=-2147483648 ORDER BY a; 1469d4280d5Sdrh } 1479d4280d5Sdrh} {-2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649} 1489d4280d5Sdrhdo_test misc3-3.8 { 1499d4280d5Sdrh execsql { 1509d4280d5Sdrh SELECT * FROM t2 WHERE a>-2147483648 ORDER BY a; 1519d4280d5Sdrh } 1529d4280d5Sdrh} {-2147483647 2147483646 2147483647 2147483648 2147483649} 1539d4280d5Sdrhdo_test misc3-3.9 { 1549d4280d5Sdrh execsql { 1559d4280d5Sdrh SELECT * FROM t2 WHERE a>-2147483649 ORDER BY a; 1569d4280d5Sdrh } 1579d4280d5Sdrh} {-2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649} 1589d4280d5Sdrhdo_test misc3-3.10 { 1599d4280d5Sdrh execsql { 1609d4280d5Sdrh SELECT * FROM t2 WHERE a>=0 AND a<2147483649 ORDER BY a DESC; 1619d4280d5Sdrh } 1629d4280d5Sdrh} {2147483648 2147483647 2147483646} 1639d4280d5Sdrhdo_test misc3-3.11 { 1649d4280d5Sdrh execsql { 1659d4280d5Sdrh SELECT * FROM t2 WHERE a>=0 AND a<=2147483648 ORDER BY a DESC; 1669d4280d5Sdrh } 1679d4280d5Sdrh} {2147483648 2147483647 2147483646} 1689d4280d5Sdrhdo_test misc3-3.12 { 1699d4280d5Sdrh execsql { 1709d4280d5Sdrh SELECT * FROM t2 WHERE a>=0 AND a<2147483648 ORDER BY a DESC; 1719d4280d5Sdrh } 1729d4280d5Sdrh} {2147483647 2147483646} 1739d4280d5Sdrhdo_test misc3-3.13 { 1749d4280d5Sdrh execsql { 1759d4280d5Sdrh SELECT * FROM t2 WHERE a>=0 AND a<=2147483647 ORDER BY a DESC; 1769d4280d5Sdrh } 1779d4280d5Sdrh} {2147483647 2147483646} 1789d4280d5Sdrhdo_test misc3-3.14 { 1799d4280d5Sdrh execsql { 1809d4280d5Sdrh SELECT * FROM t2 WHERE a>=0 AND a<2147483647 ORDER BY a DESC; 1819d4280d5Sdrh } 1829d4280d5Sdrh} {2147483646} 1839d4280d5Sdrh 18452b36cabSdrh# Ticket #565. A stack overflow is occurring when the subquery to the 18552b36cabSdrh# right of an IN operator contains many NULLs 18652b36cabSdrh# 18752b36cabSdrhdo_test misc3-4.1 { 18852b36cabSdrh execsql { 18952b36cabSdrh CREATE TABLE t3(a INTEGER PRIMARY KEY, b); 19052b36cabSdrh INSERT INTO t3(b) VALUES('abc'); 19152b36cabSdrh INSERT INTO t3(b) VALUES('xyz'); 19252b36cabSdrh INSERT INTO t3(b) VALUES(NULL); 19352b36cabSdrh INSERT INTO t3(b) VALUES(NULL); 19452b36cabSdrh INSERT INTO t3(b) SELECT b||'d' FROM t3; 19552b36cabSdrh INSERT INTO t3(b) SELECT b||'e' FROM t3; 19652b36cabSdrh INSERT INTO t3(b) SELECT b||'f' FROM t3; 19752b36cabSdrh INSERT INTO t3(b) SELECT b||'g' FROM t3; 19852b36cabSdrh INSERT INTO t3(b) SELECT b||'h' FROM t3; 19952b36cabSdrh SELECT count(a), count(b) FROM t3; 20052b36cabSdrh } 20152b36cabSdrh} {128 64} 2023e8c37e7Sdanielk1977ifcapable subquery { 20352b36cabSdrhdo_test misc3-4.2 { 20452b36cabSdrh execsql { 20552b36cabSdrh SELECT count(a) FROM t3 WHERE b IN (SELECT b FROM t3); 20652b36cabSdrh } 20752b36cabSdrh } {64} 20852b36cabSdrh do_test misc3-4.3 { 20952b36cabSdrh execsql { 21052b36cabSdrh SELECT count(a) FROM t3 WHERE b IN (SELECT b FROM t3 ORDER BY a+1); 21152b36cabSdrh } 21252b36cabSdrh } {64} 2133e8c37e7Sdanielk1977} 21493a5c6bdSdrh 215e2201971Sdrh# Ticket #601: Putting a left join inside "SELECT * FROM (<join-here>)" 216e2201971Sdrh# gives different results that if the outer "SELECT * FROM ..." is omitted. 217e2201971Sdrh# 2183e8c37e7Sdanielk1977ifcapable subquery { 21902f75f19Sdrh do_test misc3-5.1 { 220e2201971Sdrh execsql { 221e2201971Sdrh CREATE TABLE x1 (b, c); 222e2201971Sdrh INSERT INTO x1 VALUES('dog',3); 223e2201971Sdrh INSERT INTO x1 VALUES('cat',1); 224e2201971Sdrh INSERT INTO x1 VALUES('dog',4); 225e2201971Sdrh CREATE TABLE x2 (c, e); 226e2201971Sdrh INSERT INTO x2 VALUES(1,'one'); 227e2201971Sdrh INSERT INTO x2 VALUES(2,'two'); 228e2201971Sdrh INSERT INTO x2 VALUES(3,'three'); 229e2201971Sdrh INSERT INTO x2 VALUES(4,'four'); 230e2201971Sdrh SELECT x2.c AS c, e, b FROM x2 LEFT JOIN 231137b35e4Sdrh (SELECT b, max(c)+0 AS c FROM x1 GROUP BY b) 232e2201971Sdrh USING(c); 233e2201971Sdrh } 234e2201971Sdrh } {1 one cat 2 two {} 3 three {} 4 four dog} 2353e8c37e7Sdanielk1977 do_test misc3-5.2 { 236e2201971Sdrh execsql { 237e2201971Sdrh SELECT * FROM ( 238e2201971Sdrh SELECT x2.c AS c, e, b FROM x2 LEFT JOIN 239137b35e4Sdrh (SELECT b, max(c)+0 AS c FROM x1 GROUP BY b) 240e2201971Sdrh USING(c) 241e2201971Sdrh ); 242e2201971Sdrh } 243e2201971Sdrh } {1 one cat 2 two {} 3 three {} 4 four dog} 2443e8c37e7Sdanielk1977} 245e2201971Sdrh 2466bf89570Sdrhifcapable {explain} { 24702f75f19Sdrh # Ticket #626: make sure EXPLAIN prevents BEGIN and COMMIT from working. 24802f75f19Sdrh # 24902f75f19Sdrh do_test misc3-6.1 { 25002f75f19Sdrh execsql {EXPLAIN BEGIN} 25102f75f19Sdrh catchsql {BEGIN} 25202f75f19Sdrh } {0 {}} 25302f75f19Sdrh do_test misc3-6.2 { 25402f75f19Sdrh execsql {EXPLAIN COMMIT} 25502f75f19Sdrh catchsql {COMMIT} 25602f75f19Sdrh } {0 {}} 25702f75f19Sdrh do_test misc3-6.3 { 25802f75f19Sdrh execsql {BEGIN; EXPLAIN ROLLBACK} 25902f75f19Sdrh catchsql {ROLLBACK} 26002f75f19Sdrh } {0 {}} 26191fd4d46Sdrh 26291fd4d46Sdrh # Do some additional EXPLAIN operations to exercise the displayP4 logic. 26391fd4d46Sdrh do_test misc3-6.10 { 26491fd4d46Sdrh set x [execsql { 265de4fcfddSdrh CREATE TABLE ex1( 266de4fcfddSdrh a INTEGER DEFAULT 54321, 267de4fcfddSdrh b TEXT DEFAULT "hello", 268de4fcfddSdrh c REAL DEFAULT 3.1415926 269de4fcfddSdrh ); 27091fd4d46Sdrh CREATE UNIQUE INDEX ex1i1 ON ex1(a); 27191fd4d46Sdrh EXPLAIN REINDEX; 27291fd4d46Sdrh }] 273a682a6b5Sdan ifcapable mergesort { 274d40807ddSdrh regexp { SorterCompare \d+ \d+ \d+ } $x 275a682a6b5Sdan } else { 276a682a6b5Sdan regexp { IsUnique \d+ \d+ \d+ \d+ } $x 277a682a6b5Sdan } 27891fd4d46Sdrh } {1} 279dc70e4c3Sdrh if {[regexp {16} [db one {PRAGMA encoding}]]} { 280dc70e4c3Sdrh do_test misc3-6.11-utf16 { 281dc70e4c3Sdrh set x [execsql { 282dc70e4c3Sdrh EXPLAIN SELECT a+123456789012, b*4.5678, c FROM ex1 ORDER BY +a, b DESC 283dc70e4c3Sdrh }] 284dc70e4c3Sdrh set y [regexp { 123456789012 } $x] 285dc70e4c3Sdrh lappend y [regexp { 4.5678 } $x] 286*5b843aa0Sdrh lappend y [regexp {,-B} $x] 287dc70e4c3Sdrh } {1 1 1} 288dc70e4c3Sdrh } else { 289dc70e4c3Sdrh do_test misc3-6.11-utf8 { 29091fd4d46Sdrh set x [execsql { 291ff354e91Sdrh EXPLAIN SELECT a+123456789012, b*4.5678, c FROM ex1 ORDER BY +a, b DESC 29291fd4d46Sdrh }] 29391fd4d46Sdrh set y [regexp { 123456789012 } $x] 29491fd4d46Sdrh lappend y [regexp { 4.5678 } $x] 29591fd4d46Sdrh lappend y [regexp { hello } $x] 296*5b843aa0Sdrh lappend y [regexp {,-B} $x] 29791fd4d46Sdrh } {1 1 1 1} 298dc70e4c3Sdrh } 2996bf89570Sdrh} 300751f4121Sdrh 301798da52cSdrhifcapable {trigger} { 302b1aa04fcSdrh# Ticket #640: vdbe stack overflow with a LIMIT clause on a SELECT inside 303b1aa04fcSdrh# of a trigger. 304b1aa04fcSdrh# 305b1aa04fcSdrhdo_test misc3-7.1 { 306b1aa04fcSdrh execsql { 307b1aa04fcSdrh BEGIN; 308b1aa04fcSdrh CREATE TABLE y1(a); 309b1aa04fcSdrh CREATE TABLE y2(b); 310b1aa04fcSdrh CREATE TABLE y3(c); 311b1aa04fcSdrh CREATE TRIGGER r1 AFTER DELETE ON y1 FOR EACH ROW BEGIN 312b1aa04fcSdrh INSERT INTO y3(c) SELECT b FROM y2 ORDER BY b LIMIT 1; 313b1aa04fcSdrh END; 314b1aa04fcSdrh INSERT INTO y1 VALUES(1); 315b1aa04fcSdrh INSERT INTO y1 VALUES(2); 316b1aa04fcSdrh INSERT INTO y1 SELECT a+2 FROM y1; 317b1aa04fcSdrh INSERT INTO y1 SELECT a+4 FROM y1; 318b1aa04fcSdrh INSERT INTO y1 SELECT a+8 FROM y1; 319b1aa04fcSdrh INSERT INTO y1 SELECT a+16 FROM y1; 320b1aa04fcSdrh INSERT INTO y2 SELECT a FROM y1; 321b1aa04fcSdrh COMMIT; 322b1aa04fcSdrh SELECT count(*) FROM y1; 323b1aa04fcSdrh } 324b1aa04fcSdrh} 32 325b1aa04fcSdrhdo_test misc3-7.2 { 326b1aa04fcSdrh execsql { 327b1aa04fcSdrh DELETE FROM y1; 328b1aa04fcSdrh SELECT count(*) FROM y1; 329b1aa04fcSdrh } 330b1aa04fcSdrh} 0 331b1aa04fcSdrhdo_test misc3-7.3 { 332b1aa04fcSdrh execsql { 333b1aa04fcSdrh SELECT count(*) FROM y3; 334b1aa04fcSdrh } 335b1aa04fcSdrh} 32 336798da52cSdrh} ;# endif trigger 337b1aa04fcSdrh 3388b8891bfSdrh# Ticket #668: VDBE stack overflow occurs when the left-hand side 3398b8891bfSdrh# of an IN expression is NULL and the result is used as an integer, not 3408b8891bfSdrh# as a jump. 3418b8891bfSdrh# 3423e8c37e7Sdanielk1977ifcapable subquery { 3438b8891bfSdrh do_test misc-8.1 { 3448b8891bfSdrh execsql { 3458b8891bfSdrh SELECT count(CASE WHEN b IN ('abc','xyz') THEN 'x' END) FROM t3 3468b8891bfSdrh } 3478b8891bfSdrh } {2} 3488b8891bfSdrh do_test misc-8.2 { 3498b8891bfSdrh execsql { 3508b8891bfSdrh SELECT count(*) FROM t3 WHERE 1+(b IN ('abc','xyz'))==2 3518b8891bfSdrh } 3528b8891bfSdrh } {2} 3533e8c37e7Sdanielk1977} 354b1aa04fcSdrh 355acf4ac96Sdrhfinish_test 356