mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Fixes for compilation/testing when the various OMIT macros are defined. (CVS 4423)
FossilOrigin-Name: c8405b15c074c94dab5e33272cf1471f458d11df
This commit is contained in:
328
test/malloc.test
328
test/malloc.test
@ -16,7 +16,7 @@
|
||||
# to see what happens in the library if a malloc were to really fail
|
||||
# due to an out-of-memory situation.
|
||||
#
|
||||
# $Id: malloc.test,v 1.47 2007/09/04 01:25:49 drh Exp $
|
||||
# $Id: malloc.test,v 1.48 2007/09/12 17:01:45 danielk1977 Exp $
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
@ -31,26 +31,28 @@ ifcapable !memdebug {
|
||||
|
||||
source $testdir/malloc_common.tcl
|
||||
|
||||
do_malloc_test 1 -tclprep {
|
||||
db close
|
||||
} -tclbody {
|
||||
if {[catch {sqlite3 db test.db}]} {
|
||||
error "out of memory"
|
||||
}
|
||||
} -sqlbody {
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1(
|
||||
a int, b float, c double, d text, e varchar(20),
|
||||
primary key(a,b,c)
|
||||
);
|
||||
CREATE INDEX i1 ON t1(a,b);
|
||||
INSERT INTO t1 VALUES(1,2.3,4.5,'hi',x'746865726500');
|
||||
INSERT INTO t1 VALUES(6,7.0,0.8,'hello','out yonder');
|
||||
SELECT * FROM t1;
|
||||
SELECT avg(b) FROM t1 GROUP BY a HAVING b>20.0;
|
||||
DELETE FROM t1 WHERE a IN (SELECT min(a) FROM t1);
|
||||
SELECT count(*) FROM t1;
|
||||
}
|
||||
ifcapable bloblit&&subquery {
|
||||
do_malloc_test 1 -tclprep {
|
||||
db close
|
||||
} -tclbody {
|
||||
if {[catch {sqlite3 db test.db}]} {
|
||||
error "out of memory"
|
||||
}
|
||||
} -sqlbody {
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1(
|
||||
a int, b float, c double, d text, e varchar(20),
|
||||
primary key(a,b,c)
|
||||
);
|
||||
CREATE INDEX i1 ON t1(a,b);
|
||||
INSERT INTO t1 VALUES(1,2.3,4.5,'hi',x'746865726500');
|
||||
INSERT INTO t1 VALUES(6,7.0,0.8,'hello','out yonder');
|
||||
SELECT * FROM t1;
|
||||
SELECT avg(b) FROM t1 GROUP BY a HAVING b>20.0;
|
||||
DELETE FROM t1 WHERE a IN (SELECT min(a) FROM t1);
|
||||
SELECT count(*) FROM t1;
|
||||
}
|
||||
}
|
||||
|
||||
# Ensure that no file descriptors were leaked.
|
||||
do_test malloc-1.X {
|
||||
@ -58,25 +60,27 @@ do_test malloc-1.X {
|
||||
set sqlite_open_file_count
|
||||
} {0}
|
||||
|
||||
do_malloc_test 2 -sqlbody {
|
||||
CREATE TABLE t1(a int, b int default 'abc', c int default 1);
|
||||
CREATE INDEX i1 ON t1(a,b);
|
||||
INSERT INTO t1 VALUES(1,1,'99 abcdefghijklmnopqrstuvwxyz');
|
||||
INSERT INTO t1 VALUES(2,4,'98 abcdefghijklmnopqrstuvwxyz');
|
||||
INSERT INTO t1 VALUES(3,9,'97 abcdefghijklmnopqrstuvwxyz');
|
||||
INSERT INTO t1 VALUES(4,16,'96 abcdefghijklmnopqrstuvwxyz');
|
||||
INSERT INTO t1 VALUES(5,25,'95 abcdefghijklmnopqrstuvwxyz');
|
||||
INSERT INTO t1 VALUES(6,36,'94 abcdefghijklmnopqrstuvwxyz');
|
||||
SELECT 'stuff', count(*) as 'other stuff', max(a+10) FROM t1;
|
||||
UPDATE t1 SET b=b||b||b||b;
|
||||
UPDATE t1 SET b=a WHERE a in (10,12,22);
|
||||
INSERT INTO t1(c,b,a) VALUES(20,10,5);
|
||||
INSERT INTO t1 SELECT * FROM t1
|
||||
WHERE a IN (SELECT a FROM t1 WHERE a<10);
|
||||
DELETE FROM t1 WHERE a>=10;
|
||||
DROP INDEX i1;
|
||||
DELETE FROM t1;
|
||||
}
|
||||
ifcapable subquery {
|
||||
do_malloc_test 2 -sqlbody {
|
||||
CREATE TABLE t1(a int, b int default 'abc', c int default 1);
|
||||
CREATE INDEX i1 ON t1(a,b);
|
||||
INSERT INTO t1 VALUES(1,1,'99 abcdefghijklmnopqrstuvwxyz');
|
||||
INSERT INTO t1 VALUES(2,4,'98 abcdefghijklmnopqrstuvwxyz');
|
||||
INSERT INTO t1 VALUES(3,9,'97 abcdefghijklmnopqrstuvwxyz');
|
||||
INSERT INTO t1 VALUES(4,16,'96 abcdefghijklmnopqrstuvwxyz');
|
||||
INSERT INTO t1 VALUES(5,25,'95 abcdefghijklmnopqrstuvwxyz');
|
||||
INSERT INTO t1 VALUES(6,36,'94 abcdefghijklmnopqrstuvwxyz');
|
||||
SELECT 'stuff', count(*) as 'other stuff', max(a+10) FROM t1;
|
||||
UPDATE t1 SET b=b||b||b||b;
|
||||
UPDATE t1 SET b=a WHERE a in (10,12,22);
|
||||
INSERT INTO t1(c,b,a) VALUES(20,10,5);
|
||||
INSERT INTO t1 SELECT * FROM t1
|
||||
WHERE a IN (SELECT a FROM t1 WHERE a<10);
|
||||
DELETE FROM t1 WHERE a>=10;
|
||||
DROP INDEX i1;
|
||||
DELETE FROM t1;
|
||||
}
|
||||
}
|
||||
|
||||
# Ensure that no file descriptors were leaked.
|
||||
do_test malloc-2.X {
|
||||
@ -108,23 +112,25 @@ do_test malloc-3.X {
|
||||
set sqlite_open_file_count
|
||||
} {0}
|
||||
|
||||
do_malloc_test 4 -sqlbody {
|
||||
BEGIN TRANSACTION;
|
||||
CREATE TABLE t1(a int, b int, c int);
|
||||
CREATE INDEX i1 ON t1(a,b);
|
||||
INSERT INTO t1 VALUES(1,1,99);
|
||||
INSERT INTO t1 VALUES(2,4,98);
|
||||
INSERT INTO t1 VALUES(3,9,97);
|
||||
INSERT INTO t1 VALUES(4,16,96);
|
||||
INSERT INTO t1 VALUES(5,25,95);
|
||||
INSERT INTO t1 VALUES(6,36,94);
|
||||
UPDATE t1 SET b=a WHERE a in (10,12,22);
|
||||
INSERT INTO t1 SELECT * FROM t1
|
||||
WHERE a IN (SELECT a FROM t1 WHERE a<10);
|
||||
DROP INDEX i1;
|
||||
DELETE FROM t1;
|
||||
COMMIT;
|
||||
}
|
||||
ifcapable subquery {
|
||||
do_malloc_test 4 -sqlbody {
|
||||
BEGIN TRANSACTION;
|
||||
CREATE TABLE t1(a int, b int, c int);
|
||||
CREATE INDEX i1 ON t1(a,b);
|
||||
INSERT INTO t1 VALUES(1,1,99);
|
||||
INSERT INTO t1 VALUES(2,4,98);
|
||||
INSERT INTO t1 VALUES(3,9,97);
|
||||
INSERT INTO t1 VALUES(4,16,96);
|
||||
INSERT INTO t1 VALUES(5,25,95);
|
||||
INSERT INTO t1 VALUES(6,36,94);
|
||||
UPDATE t1 SET b=a WHERE a in (10,12,22);
|
||||
INSERT INTO t1 SELECT * FROM t1
|
||||
WHERE a IN (SELECT a FROM t1 WHERE a<10);
|
||||
DROP INDEX i1;
|
||||
DELETE FROM t1;
|
||||
COMMIT;
|
||||
}
|
||||
}
|
||||
|
||||
# Ensure that no file descriptors were leaked.
|
||||
do_test malloc-4.X {
|
||||
@ -132,21 +138,23 @@ do_test malloc-4.X {
|
||||
set sqlite_open_file_count
|
||||
} {0}
|
||||
|
||||
do_malloc_test 5 -sqlbody {
|
||||
BEGIN TRANSACTION;
|
||||
CREATE TABLE t1(a,b);
|
||||
CREATE TABLE t2(x,y);
|
||||
CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
|
||||
INSERT INTO t2(x,y) VALUES(new.rowid,1);
|
||||
INSERT INTO t2(x,y) SELECT * FROM t2;
|
||||
INSERT INTO t2 SELECT * FROM t2;
|
||||
UPDATE t2 SET y=y+1 WHERE x=new.rowid;
|
||||
SELECT 123;
|
||||
DELETE FROM t2 WHERE x=new.rowid;
|
||||
END;
|
||||
INSERT INTO t1(a,b) VALUES(2,3);
|
||||
COMMIT;
|
||||
}
|
||||
ifcapable trigger {
|
||||
do_malloc_test 5 -sqlbody {
|
||||
BEGIN TRANSACTION;
|
||||
CREATE TABLE t1(a,b);
|
||||
CREATE TABLE t2(x,y);
|
||||
CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
|
||||
INSERT INTO t2(x,y) VALUES(new.rowid,1);
|
||||
INSERT INTO t2(x,y) SELECT * FROM t2;
|
||||
INSERT INTO t2 SELECT * FROM t2;
|
||||
UPDATE t2 SET y=y+1 WHERE x=new.rowid;
|
||||
SELECT 123;
|
||||
DELETE FROM t2 WHERE x=new.rowid;
|
||||
END;
|
||||
INSERT INTO t1(a,b) VALUES(2,3);
|
||||
COMMIT;
|
||||
}
|
||||
}
|
||||
|
||||
# Ensure that no file descriptors were leaked.
|
||||
do_test malloc-5.X {
|
||||
@ -154,25 +162,27 @@ do_test malloc-5.X {
|
||||
set sqlite_open_file_count
|
||||
} {0}
|
||||
|
||||
do_malloc_test 6 -sqlprep {
|
||||
BEGIN TRANSACTION;
|
||||
CREATE TABLE t1(a);
|
||||
INSERT INTO t1 VALUES(1);
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
DELETE FROM t1 where rowid%5 = 0;
|
||||
COMMIT;
|
||||
} -sqlbody {
|
||||
VACUUM;
|
||||
}
|
||||
ifcapable vacuum {
|
||||
do_malloc_test 6 -sqlprep {
|
||||
BEGIN TRANSACTION;
|
||||
CREATE TABLE t1(a);
|
||||
INSERT INTO t1 VALUES(1);
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
INSERT INTO t1 SELECT a*2 FROM t1;
|
||||
DELETE FROM t1 where rowid%5 = 0;
|
||||
COMMIT;
|
||||
} -sqlbody {
|
||||
VACUUM;
|
||||
}
|
||||
}
|
||||
|
||||
do_malloc_test 7 -sqlprep {
|
||||
CREATE TABLE t1(a, b);
|
||||
@ -198,7 +208,7 @@ do_malloc_test 7 -sqlprep {
|
||||
#
|
||||
# These tests only run if UTF-16 support is compiled in.
|
||||
#
|
||||
if {$::sqlite_options(utf16)} {
|
||||
ifcapable utf16 {
|
||||
set ::STMT {}
|
||||
do_malloc_test 8 -tclprep {
|
||||
set sql "SELECT '[string repeat abc 20]', '[string repeat def 20]', ?"
|
||||
@ -334,20 +344,22 @@ proc string_compare {a b} {
|
||||
# Test for malloc() failures in sqlite3_create_collation() and
|
||||
# sqlite3_create_collation16().
|
||||
#
|
||||
do_malloc_test 15 -start 4 -tclbody {
|
||||
db collate string_compare string_compare
|
||||
if {[catch {add_test_collate db 1 1 1} msg]} {
|
||||
if {$msg=="SQLITE_NOMEM"} {set msg "out of memory"}
|
||||
error $msg
|
||||
}
|
||||
|
||||
db complete {SELECT "hello """||'world"' [microsoft], * FROM anicetable;}
|
||||
db complete {-- Useful comment}
|
||||
|
||||
execsql {
|
||||
CREATE TABLE t1(a, b COLLATE string_compare);
|
||||
INSERT INTO t1 VALUES(10, 'string');
|
||||
INSERT INTO t1 VALUES(10, 'string2');
|
||||
ifcapable utf16 {
|
||||
do_malloc_test 15 -start 4 -tclbody {
|
||||
db collate string_compare string_compare
|
||||
if {[catch {add_test_collate db 1 1 1} msg]} {
|
||||
if {$msg=="SQLITE_NOMEM"} {set msg "out of memory"}
|
||||
error $msg
|
||||
}
|
||||
|
||||
db complete {SELECT "hello """||'world"' [microsoft], * FROM anicetable;}
|
||||
db complete {-- Useful comment}
|
||||
|
||||
execsql {
|
||||
CREATE TABLE t1(a, b COLLATE string_compare);
|
||||
INSERT INTO t1 VALUES(10, 'string');
|
||||
INSERT INTO t1 VALUES(10, 'string2');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -364,58 +376,62 @@ do_malloc_test 16 -tclbody {
|
||||
|
||||
# Test handling of malloc() failures in sqlite3_open16().
|
||||
#
|
||||
do_malloc_test 17 -tclbody {
|
||||
set DB2 0
|
||||
set STMT 0
|
||||
|
||||
# open database using sqlite3_open16()
|
||||
set filename [encoding convertto unicode test.db]
|
||||
append filename "\x00\x00"
|
||||
set DB2 [sqlite3_open16 $filename -unused]
|
||||
if {0==$DB2} {
|
||||
error "out of memory"
|
||||
}
|
||||
|
||||
# Prepare statement
|
||||
set rc [catch {sqlite3_prepare $DB2 {SELECT * FROM sqlite_master} -1 X} msg]
|
||||
if {$rc} {
|
||||
error [string range $msg 4 end]
|
||||
}
|
||||
set STMT $msg
|
||||
|
||||
# Finalize statement
|
||||
set rc [sqlite3_finalize $STMT]
|
||||
if {$rc!="SQLITE_OK"} {
|
||||
error [sqlite3_errmsg $DB2]
|
||||
}
|
||||
set STMT 0
|
||||
|
||||
# Close database
|
||||
set rc [sqlite3_close $DB2]
|
||||
if {$rc!="SQLITE_OK"} {
|
||||
error [sqlite3_errmsg $DB2]
|
||||
}
|
||||
set DB2 0
|
||||
} -cleanup {
|
||||
if {$STMT!="0"} {
|
||||
sqlite3_finalize $STMT
|
||||
}
|
||||
if {$DB2!="0"} {
|
||||
ifcapable utf16 {
|
||||
do_malloc_test 17 -tclbody {
|
||||
set DB2 0
|
||||
set STMT 0
|
||||
|
||||
# open database using sqlite3_open16()
|
||||
set filename [encoding convertto unicode test.db]
|
||||
append filename "\x00\x00"
|
||||
set DB2 [sqlite3_open16 $filename -unused]
|
||||
if {0==$DB2} {
|
||||
error "out of memory"
|
||||
}
|
||||
|
||||
# Prepare statement
|
||||
set rc [catch {sqlite3_prepare $DB2 {SELECT * FROM sqlite_master} -1 X} msg]
|
||||
if {$rc} {
|
||||
error [string range $msg 4 end]
|
||||
}
|
||||
set STMT $msg
|
||||
|
||||
# Finalize statement
|
||||
set rc [sqlite3_finalize $STMT]
|
||||
if {$rc!="SQLITE_OK"} {
|
||||
error [sqlite3_errmsg $DB2]
|
||||
}
|
||||
set STMT 0
|
||||
|
||||
# Close database
|
||||
set rc [sqlite3_close $DB2]
|
||||
if {$rc!="SQLITE_OK"} {
|
||||
error [sqlite3_errmsg $DB2]
|
||||
}
|
||||
set DB2 0
|
||||
} -cleanup {
|
||||
if {$STMT!="0"} {
|
||||
sqlite3_finalize $STMT
|
||||
}
|
||||
if {$DB2!="0"} {
|
||||
set rc [sqlite3_close $DB2]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Test handling of malloc() failures in sqlite3_errmsg16().
|
||||
#
|
||||
do_malloc_test 18 -tclbody {
|
||||
catch {
|
||||
db eval "SELECT [string repeat longcolumnname 10] FROM sqlite_master"
|
||||
} msg
|
||||
if {$msg=="out of memory"} {error $msg}
|
||||
set utf16 [sqlite3_errmsg16 [sqlite3_connection_pointer db]]
|
||||
binary scan $utf16 c* bytes
|
||||
if {[llength $bytes]==0} {
|
||||
error "out of memory"
|
||||
ifcapable utf16 {
|
||||
do_malloc_test 18 -tclbody {
|
||||
catch {
|
||||
db eval "SELECT [string repeat longcolumnname 10] FROM sqlite_master"
|
||||
} msg
|
||||
if {$msg=="out of memory"} {error $msg}
|
||||
set utf16 [sqlite3_errmsg16 [sqlite3_connection_pointer db]]
|
||||
binary scan $utf16 c* bytes
|
||||
if {[llength $bytes]==0} {
|
||||
error "out of memory"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -470,9 +486,11 @@ do_malloc_test 20 -tclprep {
|
||||
|
||||
# Test malloc failure whilst installing a foreign key.
|
||||
#
|
||||
do_malloc_test 21 -sqlbody {
|
||||
CREATE TABLE abc(a, b, c, FOREIGN KEY(a) REFERENCES abc(b))
|
||||
}
|
||||
ifcapable foreignkey {
|
||||
do_malloc_test 21 -sqlbody {
|
||||
CREATE TABLE abc(a, b, c, FOREIGN KEY(a) REFERENCES abc(b))
|
||||
}
|
||||
}
|
||||
|
||||
# Test malloc failure in an sqlite3_prepare_v2() call.
|
||||
#
|
||||
|
Reference in New Issue
Block a user