malloc.test 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. # 2001 September 15
  2. #
  3. # The author disclaims copyright to this source code. In place of
  4. # 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 attempts to check the library in an out-of-memory situation.
  12. # When compiled with -DMEMORY_DEBUG=1, the SQLite library accepts a special
  13. # command (sqlite_malloc_fail N) which causes the N-th malloc to fail. This
  14. # 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. #
  17. # $Id: malloc.test,v 1.5 2002/05/23 02:09:05 drh Exp $
  18. set testdir [file dirname $argv0]
  19. source $testdir/tester.tcl
  20. # Only run these tests if memory debugging is turned on.
  21. #
  22. if {[info command sqlite_malloc_fail]==""} {
  23. puts "Skipping malloc tests: not compiled with -DMEMORY_DEBUG..."
  24. finish_test
  25. return
  26. }
  27. for {set go 1; set i 1} {$go} {incr i} {
  28. do_test malloc-1.$i {
  29. sqlite_malloc_fail 0
  30. catch {db close}
  31. catch {file delete -force test.db}
  32. catch {file delete -force test.db-journal}
  33. sqlite_malloc_fail $i
  34. set v [catch {sqlite db test.db} msg]
  35. if {$v} {
  36. set msg ""
  37. } else {
  38. set v [catch {execsql {
  39. CREATE TABLE t1(
  40. a int, b float, c double, d text, e varchar(20),
  41. primary key(a,b,c)
  42. );
  43. CREATE INDEX i1 ON t1(a,b);
  44. INSERT INTO t1 VALUES(1,2.3,4.5,'hi','there');
  45. INSERT INTO t1 VALUES(6,7.0,0.8,'hello','out yonder');
  46. SELECT * FROM t1;
  47. SELECT avg(b) FROM t1 GROUP BY a HAVING b>20.0;
  48. DELETE FROM t1 WHERE a IN (SELECT min(a) FROM t1);
  49. SELECT count(*) FROM t1;
  50. }} msg]
  51. }
  52. set leftover [lindex [sqlite_malloc_stat] 2]
  53. if {$leftover>0} {
  54. if {$leftover>1} {puts "\nLeftover: $leftover\nReturn=$v Message=$msg"}
  55. set ::go 0
  56. set v {1 1}
  57. } else {
  58. set v2 [expr {$msg=="" || $msg=="out of memory"}]
  59. if {!$v2} {puts "\nError message returned: $msg"}
  60. lappend v $v2
  61. }
  62. } {1 1}
  63. }
  64. set fd [open ./data.tmp w]
  65. for {set i 1} {$i<=20} {incr i} {
  66. puts $fd "$i\t[expr {$i*$i}]\t[expr {100-$i}] abcdefghijklmnopqrstuvwxyz"
  67. }
  68. close $fd
  69. for {set go 1; set i 1} {$go} {incr i} {
  70. do_test malloc-2.$i {
  71. sqlite_malloc_fail 0
  72. catch {db close}
  73. catch {file delete -force test.db}
  74. catch {file delete -force test.db-journal}
  75. sqlite_malloc_fail $i
  76. set v [catch {sqlite db test.db} msg]
  77. if {$v} {
  78. set msg ""
  79. } else {
  80. set v [catch {execsql {
  81. CREATE TABLE t1(a int, b int, c int);
  82. CREATE INDEX i1 ON t1(a,b);
  83. COPY t1 FROM 'data.tmp';
  84. SELECT 'stuff', count(*) as 'other stuff', max(a+10) FROM t1;
  85. UPDATE t1 SET b=b||b||b||b;
  86. UPDATE t1 SET b=a WHERE a in (10,12,22);
  87. INSERT INTO t1(c,b,a) VALUES(20,10,5);
  88. INSERT INTO t1 SELECT * FROM t1
  89. WHERE a IN (SELECT a FROM t1 WHERE a<10);
  90. DELETE FROM t1 WHERE a>=10;
  91. DROP INDEX i1;
  92. DELETE FROM t1;
  93. }} msg]
  94. }
  95. set leftover [lindex [sqlite_malloc_stat] 2]
  96. if {$leftover>0} {
  97. if {$leftover>1} {puts "\nLeftover: $leftover\nReturn=$v Message=$msg"}
  98. set ::go 0
  99. set v {1 1}
  100. } else {
  101. set v2 [expr {$msg=="" || $msg=="out of memory"}]
  102. if {!$v2} {puts "\nError message returned: $msg"}
  103. lappend v $v2
  104. }
  105. } {1 1}
  106. }
  107. set fd [open ./data.tmp w]
  108. for {set i 1} {$i<=10} {incr i} {
  109. puts $fd "$i\t[expr {$i*$i}]\t[expr {100-$i}]"
  110. }
  111. close $fd
  112. for {set go 1; set i 1} {$go} {incr i} {
  113. do_test malloc-3.$i {
  114. sqlite_malloc_fail 0
  115. catch {db close}
  116. catch {file delete -force test.db}
  117. catch {file delete -force test.db-journal}
  118. sqlite_malloc_fail $i
  119. set v [catch {sqlite db test.db} msg]
  120. if {$v} {
  121. set msg ""
  122. } else {
  123. set v [catch {execsql {
  124. BEGIN TRANSACTION;
  125. CREATE TABLE t1(a int, b int, c int);
  126. CREATE INDEX i1 ON t1(a,b);
  127. COPY t1 FROM 'data.tmp';
  128. INSERT INTO t1(c,b,a) VALUES(20,10,5);
  129. DELETE FROM t1 WHERE a>=10;
  130. DROP INDEX i1;
  131. DELETE FROM t1;
  132. ROLLBACK;
  133. }} msg]
  134. }
  135. set leftover [lindex [sqlite_malloc_stat] 2]
  136. if {$leftover>0} {
  137. if {$leftover>1} {puts "\nLeftover: $leftover\nReturn=$v Message=$msg"}
  138. set ::go 0
  139. set v {1 1}
  140. } else {
  141. set v2 [expr {$msg=="" || $msg=="out of memory"}]
  142. if {!$v2} {puts "\nError message returned: $msg"}
  143. lappend v $v2
  144. }
  145. } {1 1}
  146. }
  147. for {set go 1; set i 1} {$go} {incr i} {
  148. do_test malloc-4.$i {
  149. sqlite_malloc_fail 0
  150. catch {db close}
  151. catch {file delete -force test.db}
  152. catch {file delete -force test.db-journal}
  153. sqlite_malloc_fail $i
  154. set v [catch {sqlite db test.db} msg]
  155. if {$v} {
  156. set msg ""
  157. } else {
  158. set v [catch {execsql {
  159. BEGIN TRANSACTION;
  160. CREATE TABLE t1(a int, b int, c int);
  161. CREATE INDEX i1 ON t1(a,b);
  162. COPY t1 FROM 'data.tmp';
  163. UPDATE t1 SET b=a WHERE a in (10,12,22);
  164. INSERT INTO t1 SELECT * FROM t1
  165. WHERE a IN (SELECT a FROM t1 WHERE a<10);
  166. DROP INDEX i1;
  167. DELETE FROM t1;
  168. COMMIT;
  169. }} msg]
  170. }
  171. set leftover [lindex [sqlite_malloc_stat] 2]
  172. if {$leftover>0} {
  173. if {$leftover>1} {puts "\nLeftover: $leftover\nReturn=$v Message=$msg"}
  174. set ::go 0
  175. set v {1 1}
  176. } else {
  177. set v2 [expr {$msg=="" || $msg=="out of memory"}]
  178. if {!$v2} {puts "\nError message returned: $msg"}
  179. lappend v $v2
  180. }
  181. } {1 1}
  182. }
  183. for {set go 1; set i 1} {$go} {incr i} {
  184. do_test malloc-5.$i {
  185. sqlite_malloc_fail 0
  186. catch {db close}
  187. catch {file delete -force test.db}
  188. catch {file delete -force test.db-journal}
  189. sqlite_malloc_fail $i
  190. set v [catch {sqlite db test.db} msg]
  191. if {$v} {
  192. set msg ""
  193. } else {
  194. set v [catch {execsql {
  195. BEGIN TRANSACTION;
  196. CREATE TABLE t1(a,b);
  197. CREATE TABLE t2(x,y);
  198. CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
  199. INSERT INTO t2(x,y) VALUES(new.rowid,1);
  200. END;
  201. INSERT INTO t1(a,b) VALUES(2,3);
  202. COMMIT;
  203. }} msg]
  204. }
  205. set leftover [lindex [sqlite_malloc_stat] 2]
  206. if {$leftover>0} {
  207. if {$leftover>1} {puts "\nLeftover: $leftover\nReturn=$v Message=$msg"}
  208. set ::go 0
  209. set v {1 1}
  210. } else {
  211. set v2 [expr {$msg=="" || $msg=="out of memory"}]
  212. if {!$v2} {puts "\nError message returned: $msg"}
  213. lappend v $v2
  214. }
  215. } {1 1}
  216. }
  217. sqlite_malloc_fail 0
  218. finish_test