AryaWu/sqlite
0
1# 2003 December 172#3# The author disclaims copyright to this source code. In place of4# a legal notice, here is a blessing:5#6# May you do good and not evil.7# May you find forgiveness for yourself and forgive others.8# May you share freely, never taking more than you give.9#10#***********************************************************************11# This file implements regression tests for SQLite library.12#13# This file implements tests for miscellanous features that were14# left out of other test files.15#16# $Id: misc3.test,v 1.20 2009/05/06 00:49:01 drh Exp $17 18set testdir [file dirname $argv0]19source $testdir/tester.tcl20 21ifcapable {integrityck} {22 # Ticket #529. Make sure an ABORT does not damage the in-memory cache23 # that will be used by subsequent statements in the same transaction.24 #25 do_test misc3-1.1 {26 execsql {27 CREATE TABLE t1(a UNIQUE,b);28 INSERT INTO t129 VALUES(1,'a23456789_b23456789_c23456789_d23456789_e23456789_');30 UPDATE t1 SET b=b||b;31 UPDATE t1 SET b=b||b;32 UPDATE t1 SET b=b||b;33 UPDATE t1 SET b=b||b;34 UPDATE t1 SET b=b||b;35 INSERT INTO t1 VALUES(2,'x');36 UPDATE t1 SET b=substr(b,1,500);37 BEGIN;38 }39 catchsql {UPDATE t1 SET a=CASE a WHEN 2 THEN 1 ELSE a END, b='y';}40 execsql {41 CREATE TABLE t2(x,y);42 COMMIT;43 PRAGMA integrity_check;44 }45 } ok46}47ifcapable {integrityck} {48 do_test misc3-1.2 {49 execsql {50 DROP TABLE t1;51 DROP TABLE t2;52 }53 ifcapable {vacuum} {execsql VACUUM}54 execsql {55 CREATE TABLE t1(a UNIQUE,b);56 INSERT INTO t157 VALUES(1,'a23456789_b23456789_c23456789_d23456789_e23456789_');58 INSERT INTO t1 SELECT a+1, b||b FROM t1;59 INSERT INTO t1 SELECT a+2, b||b FROM t1;60 INSERT INTO t1 SELECT a+4, b FROM t1;61 INSERT INTO t1 SELECT a+8, b FROM t1;62 INSERT INTO t1 SELECT a+16, b FROM t1;63 INSERT INTO t1 SELECT a+32, b FROM t1;64 INSERT INTO t1 SELECT a+64, b FROM t1;65 BEGIN;66 }67 catchsql {UPDATE t1 SET a=CASE a WHEN 128 THEN 127 ELSE a END, b='';}68 execsql {69 INSERT INTO t1 VALUES(200,'hello out there');70 COMMIT;71 PRAGMA integrity_check;72 }73 } ok74}75 76# Tests of the sqliteAtoF() function in util.c77#78do_test misc3-2.1 {79 execsql {SELECT 2e-25*0.5e25}80} 1.081do_test misc3-2.2 {82 execsql {SELECT 2.0e-25*000000.500000000000000000000000000000e+00025}83} 1.084do_test misc3-2.3 {85 execsql {SELECT 000000000002e-0000000025*0.5e25}86} 1.087do_test misc3-2.4 {88 execsql {SELECT 2e-25*0.5e250}89} 1e+22590do_test misc3-2.5 {91 execsql {SELECT format('%.15e',2.0e-250*0.5e25)}92} {1.0000000000000e-225}93do_test misc3-2.6 {94 execsql {SELECT '-2.0e-127' * '-0.5e27'}95} 1e-10096do_test misc3-2.7 {97 execsql {SELECT '+2.0e-127' * '-0.5e27'}98} -1e-10099do_test misc3-2.8 {100 execsql {SELECT 2.0e-27 * '+0.5e+127'}101} 1e+100102do_test misc3-2.9 {103 execsql {SELECT 2.0e-27 * '+0.000005e+132'}104} 1e+100105 106# Ticket #522. Make sure integer overflow is handled properly in107# indices.108#109integrity_check misc3-3.1110do_test misc3-3.2 {111 execsql {112 CREATE TABLE t2(a INT UNIQUE);113 }114} {}115integrity_check misc3-3.2.1116do_test misc3-3.3 {117 execsql {118 INSERT INTO t2 VALUES(2147483648);119 }120} {}121integrity_check misc3-3.3.1122do_test misc3-3.4 {123 execsql {124 INSERT INTO t2 VALUES(-2147483649);125 }126} {}127integrity_check misc3-3.4.1128do_test misc3-3.5 {129 execsql {130 INSERT INTO t2 VALUES(+2147483649);131 }132} {}133integrity_check misc3-3.5.1134do_test misc3-3.6 {135 execsql {136 INSERT INTO t2 VALUES(+2147483647);137 INSERT INTO t2 VALUES(-2147483648);138 INSERT INTO t2 VALUES(-2147483647);139 INSERT INTO t2 VALUES(2147483646);140 SELECT * FROM t2 ORDER BY a;141 }142} {-2147483649 -2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}143do_test misc3-3.7 {144 execsql {145 SELECT * FROM t2 WHERE a>=-2147483648 ORDER BY a;146 }147} {-2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}148do_test misc3-3.8 {149 execsql {150 SELECT * FROM t2 WHERE a>-2147483648 ORDER BY a;151 }152} {-2147483647 2147483646 2147483647 2147483648 2147483649}153do_test misc3-3.9 {154 execsql {155 SELECT * FROM t2 WHERE a>-2147483649 ORDER BY a;156 }157} {-2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}158do_test misc3-3.10 {159 execsql {160 SELECT * FROM t2 WHERE a>=0 AND a<2147483649 ORDER BY a DESC;161 }162} {2147483648 2147483647 2147483646}163do_test misc3-3.11 {164 execsql {165 SELECT * FROM t2 WHERE a>=0 AND a<=2147483648 ORDER BY a DESC;166 }167} {2147483648 2147483647 2147483646}168do_test misc3-3.12 {169 execsql {170 SELECT * FROM t2 WHERE a>=0 AND a<2147483648 ORDER BY a DESC;171 }172} {2147483647 2147483646}173do_test misc3-3.13 {174 execsql {175 SELECT * FROM t2 WHERE a>=0 AND a<=2147483647 ORDER BY a DESC;176 }177} {2147483647 2147483646}178do_test misc3-3.14 {179 execsql {180 SELECT * FROM t2 WHERE a>=0 AND a<2147483647 ORDER BY a DESC;181 }182} {2147483646}183 184# Ticket #565. A stack overflow is occurring when the subquery to the185# right of an IN operator contains many NULLs186#187do_test misc3-4.1 {188 execsql {189 CREATE TABLE t3(a INTEGER PRIMARY KEY, b);190 INSERT INTO t3(b) VALUES('abc');191 INSERT INTO t3(b) VALUES('xyz');192 INSERT INTO t3(b) VALUES(NULL);193 INSERT INTO t3(b) VALUES(NULL);194 INSERT INTO t3(b) SELECT b||'d' FROM t3;195 INSERT INTO t3(b) SELECT b||'e' FROM t3;196 INSERT INTO t3(b) SELECT b||'f' FROM t3;197 INSERT INTO t3(b) SELECT b||'g' FROM t3;198 INSERT INTO t3(b) SELECT b||'h' FROM t3;199 SELECT count(a), count(b) FROM t3;200 }201} {128 64}202ifcapable subquery {203do_test misc3-4.2 {204 execsql {205 SELECT count(a) FROM t3 WHERE b IN (SELECT b FROM t3);206 }207 } {64}208 do_test misc3-4.3 {209 execsql {210 SELECT count(a) FROM t3 WHERE b IN (SELECT b FROM t3 ORDER BY a+1);211 }212 } {64}213}214 215# Ticket #601: Putting a left join inside "SELECT * FROM (<join-here>)"216# gives different results that if the outer "SELECT * FROM ..." is omitted.217#218ifcapable subquery {219 do_test misc3-5.1 {220 execsql {221 CREATE TABLE x1 (b, c);222 INSERT INTO x1 VALUES('dog',3);223 INSERT INTO x1 VALUES('cat',1);224 INSERT INTO x1 VALUES('dog',4);225 CREATE TABLE x2 (c, e);226 INSERT INTO x2 VALUES(1,'one');227 INSERT INTO x2 VALUES(2,'two');228 INSERT INTO x2 VALUES(3,'three');229 INSERT INTO x2 VALUES(4,'four');230 SELECT x2.c AS c, e, b FROM x2 LEFT JOIN231 (SELECT b, max(c)+0 AS c FROM x1 GROUP BY b)232 USING(c);233 }234 } {1 one cat 2 two {} 3 three {} 4 four dog}235 do_test misc3-5.2 {236 execsql {237 SELECT * FROM (238 SELECT x2.c AS c, e, b FROM x2 LEFT JOIN239 (SELECT b, max(c)+0 AS c FROM x1 GROUP BY b)240 USING(c)241 );242 }243 } {1 one cat 2 two {} 3 three {} 4 four dog}244}245 246ifcapable {explain} {247 # Ticket #626: make sure EXPLAIN prevents BEGIN and COMMIT from working.248 #249 do_test misc3-6.1 {250 execsql {EXPLAIN BEGIN}251 catchsql {BEGIN}252 } {0 {}}253 do_test misc3-6.2 {254 execsql {EXPLAIN COMMIT}255 catchsql {COMMIT}256 } {0 {}}257 do_test misc3-6.3 {258 execsql {BEGIN; EXPLAIN ROLLBACK}259 catchsql {ROLLBACK}260 } {0 {}}261 262 # Do some additional EXPLAIN operations to exercise the displayP4 logic.263 do_test misc3-6.10 {264 set x [execsql {265 CREATE TABLE ex1(266 a INTEGER DEFAULT 54321,267 b TEXT DEFAULT "hello",268 c REAL DEFAULT 3.1415926269 );270 CREATE UNIQUE INDEX ex1i1 ON ex1(a);271 EXPLAIN REINDEX;272 }]273 ifcapable mergesort {274 regexp { SorterCompare \d+ \d+ \d+ } $x275 } else {276 regexp { IsUnique \d+ \d+ \d+ \d+ } $x277 }278 } {1}279 if {[regexp {16} [db one {PRAGMA encoding}]]} {280 do_test misc3-6.11-utf16 {281 set x [execsql {282 EXPLAIN SELECT a+123456789012, b*4.5678, c FROM ex1 ORDER BY +a, b DESC283 }]284 set y [regexp { 123456789012 } $x]285 lappend y [regexp { 4.5678 } $x]286 lappend y [regexp {,-B} $x]287 } {1 1 1}288 } else {289 do_test misc3-6.11-utf8 {290 set x [execsql {291 EXPLAIN SELECT a+123456789012, b*4.5678, c FROM ex1 ORDER BY +a, b DESC292 }]293 set y [regexp { 123456789012 } $x]294 lappend y [regexp { 4.5678 } $x]295 lappend y [regexp { hello } $x]296 lappend y [regexp {,-B} $x]297 } {1 1 1 1}298 }299}300 301ifcapable {trigger} {302# Ticket #640: vdbe stack overflow with a LIMIT clause on a SELECT inside303# of a trigger.304#305do_test misc3-7.1 {306 execsql {307 BEGIN;308 CREATE TABLE y1(a);309 CREATE TABLE y2(b);310 CREATE TABLE y3(c);311 CREATE TRIGGER r1 AFTER DELETE ON y1 FOR EACH ROW BEGIN312 INSERT INTO y3(c) SELECT b FROM y2 ORDER BY b LIMIT 1;313 END;314 INSERT INTO y1 VALUES(1);315 INSERT INTO y1 VALUES(2);316 INSERT INTO y1 SELECT a+2 FROM y1;317 INSERT INTO y1 SELECT a+4 FROM y1;318 INSERT INTO y1 SELECT a+8 FROM y1;319 INSERT INTO y1 SELECT a+16 FROM y1;320 INSERT INTO y2 SELECT a FROM y1;321 COMMIT;322 SELECT count(*) FROM y1;323 }324} 32325do_test misc3-7.2 {326 execsql {327 DELETE FROM y1;328 SELECT count(*) FROM y1;329 }330} 0331do_test misc3-7.3 {332 execsql {333 SELECT count(*) FROM y3;334 }335} 32336} ;# endif trigger337 338# Ticket #668: VDBE stack overflow occurs when the left-hand side339# of an IN expression is NULL and the result is used as an integer, not340# as a jump.341#342ifcapable subquery {343 do_test misc-8.1 {344 execsql {345 SELECT count(CASE WHEN b IN ('abc','xyz') THEN 'x' END) FROM t3346 }347 } {2}348 do_test misc-8.2 {349 execsql {350 SELECT count(*) FROM t3 WHERE 1+(b IN ('abc','xyz'))==2351 }352 } {2}353}354 355finish_test356 