blob: 319d8ad676d59dfb4f2a9010ccc1fd5603d3b5bf [file] [log] [blame]
drhb19a2bc2001-09-16 00:13:26 +00001# 2001 September 15
drhed7c8552001-04-11 14:29:21 +00002#
drhb19a2bc2001-09-16 00:13:26 +00003# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
drhed7c8552001-04-11 14:29:21 +00005#
drhb19a2bc2001-09-16 00:13:26 +00006# 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.
drhed7c8552001-04-11 14:29:21 +00009#
10#***********************************************************************
11# This file attempts to check the library in an out-of-memory situation.
12# When compiled with -DMEMORY_DEBUG=1, the SQLite library accepts a special
drh6d4abfb2001-10-22 02:58:08 +000013# command (sqlite_malloc_fail N) which causes the N-th malloc to fail. This
drhed7c8552001-04-11 14:29:21 +000014# special feature is used to see what happens in the library if a malloc
15# were to really fail due to an out-of-memory situation.
16#
danielk1977b5548a82004-06-26 13:51:33 +000017# $Id: malloc.test,v 1.9 2004/06/26 13:51:34 danielk1977 Exp $
drhed7c8552001-04-11 14:29:21 +000018
19set testdir [file dirname $argv0]
20source $testdir/tester.tcl
21
22# Only run these tests if memory debugging is turned on.
23#
drhb5f70c22004-02-14 01:39:50 +000024if {[info command sqlite_malloc_stat]==""} {
drhed7c8552001-04-11 14:29:21 +000025 puts "Skipping malloc tests: not compiled with -DMEMORY_DEBUG..."
26 finish_test
27 return
28}
29
30for {set go 1; set i 1} {$go} {incr i} {
31 do_test malloc-1.$i {
32 sqlite_malloc_fail 0
drh6d4abfb2001-10-22 02:58:08 +000033 catch {db close}
34 catch {file delete -force test.db}
35 catch {file delete -force test.db-journal}
drhed7c8552001-04-11 14:29:21 +000036 sqlite_malloc_fail $i
drhef4ac8f2004-06-19 00:16:31 +000037 set v [catch {sqlite3 db test.db} msg]
drh6d4abfb2001-10-22 02:58:08 +000038 if {$v} {
39 set msg ""
40 } else {
41 set v [catch {execsql {
42 CREATE TABLE t1(
43 a int, b float, c double, d text, e varchar(20),
44 primary key(a,b,c)
45 );
46 CREATE INDEX i1 ON t1(a,b);
47 INSERT INTO t1 VALUES(1,2.3,4.5,'hi','there');
48 INSERT INTO t1 VALUES(6,7.0,0.8,'hello','out yonder');
49 SELECT * FROM t1;
50 SELECT avg(b) FROM t1 GROUP BY a HAVING b>20.0;
51 DELETE FROM t1 WHERE a IN (SELECT min(a) FROM t1);
52 SELECT count(*) FROM t1;
53 }} msg]
54 }
55 set leftover [lindex [sqlite_malloc_stat] 2]
56 if {$leftover>0} {
57 if {$leftover>1} {puts "\nLeftover: $leftover\nReturn=$v Message=$msg"}
drhed7c8552001-04-11 14:29:21 +000058 set ::go 0
59 set v {1 1}
60 } else {
drh6d4abfb2001-10-22 02:58:08 +000061 set v2 [expr {$msg=="" || $msg=="out of memory"}]
62 if {!$v2} {puts "\nError message returned: $msg"}
63 lappend v $v2
drhed7c8552001-04-11 14:29:21 +000064 }
65 } {1 1}
66}
drhd4007282001-04-12 23:21:58 +000067
danielk1977b5548a82004-06-26 13:51:33 +000068# Ensure that no file descriptors were leaked.
69do_test malloc-1.X {
70 catch {db close}
71 set sqlite_open_file_count
72} {0}
73
drhd4007282001-04-12 23:21:58 +000074set fd [open ./data.tmp w]
drh6d4abfb2001-10-22 02:58:08 +000075for {set i 1} {$i<=20} {incr i} {
drh5f3b4ab2004-05-27 17:22:54 +000076 puts $fd "$i\t[expr {$i*$i}]\t[expr {100-$i}] abcdefghijklmnopqrstuvwxyz"
drhd4007282001-04-12 23:21:58 +000077}
78close $fd
79
80for {set go 1; set i 1} {$go} {incr i} {
81 do_test malloc-2.$i {
82 sqlite_malloc_fail 0
drh6d4abfb2001-10-22 02:58:08 +000083 catch {db close}
84 catch {file delete -force test.db}
85 catch {file delete -force test.db-journal}
drhd4007282001-04-12 23:21:58 +000086 sqlite_malloc_fail $i
drhef4ac8f2004-06-19 00:16:31 +000087 set v [catch {sqlite3 db test.db} msg]
drh6d4abfb2001-10-22 02:58:08 +000088 if {$v} {
89 set msg ""
90 } else {
91 set v [catch {execsql {
92 CREATE TABLE t1(a int, b int, c int);
93 CREATE INDEX i1 ON t1(a,b);
drh5f3b4ab2004-05-27 17:22:54 +000094 INSERT INTO t1 VALUES(1,1,'99 abcdefghijklmnopqrstuvwxyz');
95 INSERT INTO t1 VALUES(2,4,'98 abcdefghijklmnopqrstuvwxyz');
96 INSERT INTO t1 VALUES(3,9,'97 abcdefghijklmnopqrstuvwxyz');
97 INSERT INTO t1 VALUES(4,16,'96 abcdefghijklmnopqrstuvwxyz');
98 INSERT INTO t1 VALUES(5,25,'95 abcdefghijklmnopqrstuvwxyz');
99 INSERT INTO t1 VALUES(6,36,'94 abcdefghijklmnopqrstuvwxyz');
drh6d4abfb2001-10-22 02:58:08 +0000100 SELECT 'stuff', count(*) as 'other stuff', max(a+10) FROM t1;
101 UPDATE t1 SET b=b||b||b||b;
102 UPDATE t1 SET b=a WHERE a in (10,12,22);
103 INSERT INTO t1(c,b,a) VALUES(20,10,5);
104 INSERT INTO t1 SELECT * FROM t1
105 WHERE a IN (SELECT a FROM t1 WHERE a<10);
106 DELETE FROM t1 WHERE a>=10;
107 DROP INDEX i1;
108 DELETE FROM t1;
109 }} msg]
110 }
111 set leftover [lindex [sqlite_malloc_stat] 2]
112 if {$leftover>0} {
113 if {$leftover>1} {puts "\nLeftover: $leftover\nReturn=$v Message=$msg"}
drhd4007282001-04-12 23:21:58 +0000114 set ::go 0
115 set v {1 1}
116 } else {
drh6d4abfb2001-10-22 02:58:08 +0000117 set v2 [expr {$msg=="" || $msg=="out of memory"}]
118 if {!$v2} {puts "\nError message returned: $msg"}
119 lappend v $v2
120 }
121 } {1 1}
122}
123
danielk1977b5548a82004-06-26 13:51:33 +0000124# Ensure that no file descriptors were leaked.
125do_test malloc-2.X {
126 catch {db close}
127 set sqlite_open_file_count
128} {0}
129
drh6d4abfb2001-10-22 02:58:08 +0000130for {set go 1; set i 1} {$go} {incr i} {
131 do_test malloc-3.$i {
132 sqlite_malloc_fail 0
133 catch {db close}
134 catch {file delete -force test.db}
135 catch {file delete -force test.db-journal}
136 sqlite_malloc_fail $i
drhef4ac8f2004-06-19 00:16:31 +0000137 set v [catch {sqlite3 db test.db} msg]
drh6d4abfb2001-10-22 02:58:08 +0000138 if {$v} {
139 set msg ""
140 } else {
141 set v [catch {execsql {
142 BEGIN TRANSACTION;
143 CREATE TABLE t1(a int, b int, c int);
144 CREATE INDEX i1 ON t1(a,b);
drh5f3b4ab2004-05-27 17:22:54 +0000145 INSERT INTO t1 VALUES(1,1,99);
146 INSERT INTO t1 VALUES(2,4,98);
147 INSERT INTO t1 VALUES(3,9,97);
148 INSERT INTO t1 VALUES(4,16,96);
149 INSERT INTO t1 VALUES(5,25,95);
150 INSERT INTO t1 VALUES(6,36,94);
drh6d4abfb2001-10-22 02:58:08 +0000151 INSERT INTO t1(c,b,a) VALUES(20,10,5);
152 DELETE FROM t1 WHERE a>=10;
153 DROP INDEX i1;
154 DELETE FROM t1;
155 ROLLBACK;
156 }} msg]
157 }
158 set leftover [lindex [sqlite_malloc_stat] 2]
159 if {$leftover>0} {
160 if {$leftover>1} {puts "\nLeftover: $leftover\nReturn=$v Message=$msg"}
161 set ::go 0
162 set v {1 1}
163 } else {
164 set v2 [expr {$msg=="" || $msg=="out of memory"}]
165 if {!$v2} {puts "\nError message returned: $msg"}
166 lappend v $v2
167 }
168 } {1 1}
169}
danielk1977b5548a82004-06-26 13:51:33 +0000170
171# Ensure that no file descriptors were leaked.
172do_test malloc-3.X {
173 catch {db close}
174 set sqlite_open_file_count
175} {0}
176
drh6d4abfb2001-10-22 02:58:08 +0000177for {set go 1; set i 1} {$go} {incr i} {
178 do_test malloc-4.$i {
179 sqlite_malloc_fail 0
180 catch {db close}
181 catch {file delete -force test.db}
182 catch {file delete -force test.db-journal}
183 sqlite_malloc_fail $i
drhef4ac8f2004-06-19 00:16:31 +0000184 set v [catch {sqlite3 db test.db} msg]
drh6d4abfb2001-10-22 02:58:08 +0000185 if {$v} {
186 set msg ""
187 } else {
188 set v [catch {execsql {
189 BEGIN TRANSACTION;
190 CREATE TABLE t1(a int, b int, c int);
191 CREATE INDEX i1 ON t1(a,b);
drh5f3b4ab2004-05-27 17:22:54 +0000192 INSERT INTO t1 VALUES(1,1,99);
193 INSERT INTO t1 VALUES(2,4,98);
194 INSERT INTO t1 VALUES(3,9,97);
195 INSERT INTO t1 VALUES(4,16,96);
196 INSERT INTO t1 VALUES(5,25,95);
197 INSERT INTO t1 VALUES(6,36,94);
drh6d4abfb2001-10-22 02:58:08 +0000198 UPDATE t1 SET b=a WHERE a in (10,12,22);
199 INSERT INTO t1 SELECT * FROM t1
200 WHERE a IN (SELECT a FROM t1 WHERE a<10);
201 DROP INDEX i1;
202 DELETE FROM t1;
203 COMMIT;
204 }} msg]
205 }
206 set leftover [lindex [sqlite_malloc_stat] 2]
207 if {$leftover>0} {
208 if {$leftover>1} {puts "\nLeftover: $leftover\nReturn=$v Message=$msg"}
209 set ::go 0
210 set v {1 1}
211 } else {
212 set v2 [expr {$msg=="" || $msg=="out of memory"}]
213 if {!$v2} {puts "\nError message returned: $msg"}
214 lappend v $v2
drhd4007282001-04-12 23:21:58 +0000215 }
216 } {1 1}
217}
danielk1977b5548a82004-06-26 13:51:33 +0000218
219# Ensure that no file descriptors were leaked.
220do_test malloc-4.X {
221 catch {db close}
222 set sqlite_open_file_count
223} {0}
224
drhe4697f52002-05-23 02:09:03 +0000225for {set go 1; set i 1} {$go} {incr i} {
226 do_test malloc-5.$i {
227 sqlite_malloc_fail 0
228 catch {db close}
229 catch {file delete -force test.db}
230 catch {file delete -force test.db-journal}
231 sqlite_malloc_fail $i
drhef4ac8f2004-06-19 00:16:31 +0000232 set v [catch {sqlite3 db test.db} msg]
drhe4697f52002-05-23 02:09:03 +0000233 if {$v} {
234 set msg ""
235 } else {
236 set v [catch {execsql {
237 BEGIN TRANSACTION;
238 CREATE TABLE t1(a,b);
239 CREATE TABLE t2(x,y);
240 CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
241 INSERT INTO t2(x,y) VALUES(new.rowid,1);
242 END;
243 INSERT INTO t1(a,b) VALUES(2,3);
244 COMMIT;
245 }} msg]
246 }
247 set leftover [lindex [sqlite_malloc_stat] 2]
248 if {$leftover>0} {
249 if {$leftover>1} {puts "\nLeftover: $leftover\nReturn=$v Message=$msg"}
250 set ::go 0
251 set v {1 1}
252 } else {
253 set v2 [expr {$msg=="" || $msg=="out of memory"}]
254 if {!$v2} {puts "\nError message returned: $msg"}
255 lappend v $v2
256 }
257 } {1 1}
258}
danielk1977b5548a82004-06-26 13:51:33 +0000259
260# Ensure that no file descriptors were leaked.
261do_test malloc-5.X {
262 catch {db close}
263 set sqlite_open_file_count
264} {0}
265
drhed7c8552001-04-11 14:29:21 +0000266sqlite_malloc_fail 0
267finish_test