OLD | NEW |
| (Empty) |
1 # 2008 Feb 19 | |
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 # | |
12 # The focus of this file is testing that the r-tree correctly handles | |
13 # out-of-memory conditions. | |
14 # | |
15 | |
16 if {![info exists testdir]} { | |
17 set testdir [file join [file dirname [info script]] .. .. test] | |
18 } | |
19 source $testdir/tester.tcl | |
20 source $testdir/malloc_common.tcl | |
21 ifcapable !rtree { | |
22 finish_test | |
23 return | |
24 } | |
25 | |
26 # Test summary: | |
27 # | |
28 # rtree3-1: Test OOM in simple CREATE TABLE, INSERT, DELETE and SELECT | |
29 # commands on an almost empty table. | |
30 # | |
31 # rtree3-2: Test OOM in a DROP TABLE command. | |
32 # | |
33 # rtree3-3a: Test OOM during a transaction to insert 100 pseudo-random rows. | |
34 # | |
35 # rtree3-3b: Test OOM during a transaction deleting all entries in the | |
36 # database constructed in [rtree3-3a] in pseudo-random order. | |
37 # | |
38 # rtree3-4a: OOM during "SELECT count(*) FROM ..." on a big table. | |
39 # | |
40 # rtree3-4b: OOM while deleting rows from a big table. | |
41 # | |
42 # rtree3-5: Test OOM while inserting rows into a big table. | |
43 # | |
44 # rtree3-6: Test OOM while deleting all rows of a table, one at a time. | |
45 # | |
46 # rtree3-7: OOM during an ALTER TABLE RENAME TABLE command. | |
47 # | |
48 # rtree3-8: Test OOM while registering the r-tree module with sqlite. | |
49 # | |
50 | |
51 do_faultsim_test rtree3-1 -faults oom* -prep { | |
52 faultsim_delete_and_reopen | |
53 } -body { | |
54 execsql { | |
55 BEGIN TRANSACTION; | |
56 CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2); | |
57 INSERT INTO rt VALUES(NULL, 3, 5, 7, 9); | |
58 INSERT INTO rt VALUES(NULL, 13, 15, 17, 19); | |
59 DELETE FROM rt WHERE ii = 1; | |
60 SELECT * FROM rt; | |
61 SELECT ii FROM rt WHERE ii = 2; | |
62 COMMIT; | |
63 } | |
64 } | |
65 | |
66 do_test rtree3-2.prep { | |
67 faultsim_delete_and_reopen | |
68 execsql { | |
69 CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2); | |
70 INSERT INTO rt VALUES(NULL, 3, 5, 7, 9); | |
71 } | |
72 faultsim_save_and_close | |
73 } {} | |
74 do_faultsim_test rtree3-2 -faults oom* -prep { | |
75 faultsim_restore_and_reopen | |
76 } -body { | |
77 execsql { DROP TABLE rt } | |
78 } | |
79 | |
80 do_malloc_test rtree3-3.prep { | |
81 faultsim_delete_and_reopen | |
82 execsql { | |
83 CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2); | |
84 INSERT INTO rt VALUES(NULL, 3, 5, 7, 9); | |
85 } | |
86 faultsim_save_and_close | |
87 } {} | |
88 | |
89 do_faultsim_test rtree3-3a -faults oom* -prep { | |
90 faultsim_restore_and_reopen | |
91 } -body { | |
92 db eval BEGIN | |
93 for {set ii 0} {$ii < 100} {incr ii} { | |
94 set f [expr rand()] | |
95 db eval {INSERT INTO rt VALUES(NULL, $f*10.0, $f*10.0, $f*15.0, $f*15.0)} | |
96 } | |
97 db eval COMMIT | |
98 } | |
99 faultsim_save_and_close | |
100 | |
101 do_faultsim_test rtree3-3b -faults oom* -prep { | |
102 faultsim_restore_and_reopen | |
103 } -body { | |
104 db eval BEGIN | |
105 for {set ii 0} {$ii < 100} {incr ii} { | |
106 set f [expr rand()] | |
107 db eval { DELETE FROM rt WHERE x1<($f*10.0) AND x1>($f*10.5) } | |
108 } | |
109 db eval COMMIT | |
110 } | |
111 | |
112 do_test rtree3-4.prep { | |
113 faultsim_delete_and_reopen | |
114 execsql { | |
115 BEGIN; | |
116 PRAGMA page_size = 512; | |
117 CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2); | |
118 } | |
119 for {set i 0} {$i < 1500} {incr i} { | |
120 execsql { INSERT INTO rt VALUES($i, $i, $i+1, $i, $i+1) } | |
121 } | |
122 execsql { COMMIT } | |
123 faultsim_save_and_close | |
124 } {} | |
125 | |
126 do_faultsim_test rtree3-4a -faults oom-* -prep { | |
127 faultsim_restore_and_reopen | |
128 } -body { | |
129 db eval { SELECT count(*) FROM rt } | |
130 } -test { | |
131 faultsim_test_result {0 1500} | |
132 } | |
133 | |
134 do_faultsim_test rtree3-4b -faults oom-transient -prep { | |
135 faultsim_restore_and_reopen | |
136 } -body { | |
137 db eval { DELETE FROM rt WHERE ii BETWEEN 1 AND 100 } | |
138 } -test { | |
139 faultsim_test_result {0 {}} | |
140 } | |
141 | |
142 do_test rtree3-5.prep { | |
143 faultsim_delete_and_reopen | |
144 execsql { | |
145 BEGIN; | |
146 PRAGMA page_size = 512; | |
147 CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2); | |
148 } | |
149 for {set i 0} {$i < 100} {incr i} { | |
150 execsql { INSERT INTO rt VALUES($i, $i, $i+1, $i, $i+1) } | |
151 } | |
152 execsql { COMMIT } | |
153 faultsim_save_and_close | |
154 } {} | |
155 do_faultsim_test rtree3-5 -faults oom-* -prep { | |
156 faultsim_restore_and_reopen | |
157 } -body { | |
158 for {set i 100} {$i < 110} {incr i} { | |
159 execsql { INSERT INTO rt VALUES($i, $i, $i+1, $i, $i+1) } | |
160 } | |
161 } -test { | |
162 faultsim_test_result {0 {}} | |
163 } | |
164 | |
165 do_test rtree3-6.prep { | |
166 faultsim_delete_and_reopen | |
167 execsql { | |
168 BEGIN; | |
169 PRAGMA page_size = 512; | |
170 CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2); | |
171 } | |
172 for {set i 0} {$i < 50} {incr i} { | |
173 execsql { INSERT INTO rt VALUES($i, $i, $i+1, $i, $i+1) } | |
174 } | |
175 execsql { COMMIT } | |
176 faultsim_save_and_close | |
177 } {} | |
178 do_faultsim_test rtree3-6 -faults oom-* -prep { | |
179 faultsim_restore_and_reopen | |
180 } -body { | |
181 execsql BEGIN | |
182 for {set i 0} {$i < 50} {incr i} { | |
183 execsql { DELETE FROM rt WHERE ii=$i } | |
184 } | |
185 execsql COMMIT | |
186 } -test { | |
187 faultsim_test_result {0 {}} | |
188 } | |
189 | |
190 do_test rtree3-7.prep { | |
191 faultsim_delete_and_reopen | |
192 execsql { CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2) } | |
193 faultsim_save_and_close | |
194 } {} | |
195 do_faultsim_test rtree3-7 -faults oom-* -prep { | |
196 faultsim_restore_and_reopen | |
197 } -body { | |
198 execsql { ALTER TABLE rt RENAME TO rt2 } | |
199 } -test { | |
200 faultsim_test_result {0 {}} | |
201 } | |
202 | |
203 do_faultsim_test rtree3-8 -faults oom-* -prep { | |
204 catch { db close } | |
205 } -body { | |
206 sqlite3 db test.db | |
207 } | |
208 | |
209 do_faultsim_test rtree3-9 -faults oom-* -prep { | |
210 sqlite3 db :memory: | |
211 } -body { | |
212 set rc [register_cube_geom db] | |
213 if {$rc != "SQLITE_OK"} { error $rc } | |
214 } -test { | |
215 faultsim_test_result {0 {}} {1 SQLITE_NOMEM} | |
216 } | |
217 | |
218 do_test rtree3-10.prep { | |
219 faultsim_delete_and_reopen | |
220 execsql { | |
221 CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2, z1, z2); | |
222 INSERT INTO rt VALUES(1, 10, 10, 10, 11, 11, 11); | |
223 INSERT INTO rt VALUES(2, 5, 6, 6, 7, 7, 8); | |
224 } | |
225 faultsim_save_and_close | |
226 } {} | |
227 do_faultsim_test rtree3-10 -faults oom-* -prep { | |
228 faultsim_restore_and_reopen | |
229 register_cube_geom db | |
230 execsql { SELECT * FROM rt } | |
231 } -body { | |
232 execsql { SELECT ii FROM rt WHERE ii MATCH cube(4.5, 5.5, 6.5, 1, 1, 1) } | |
233 } -test { | |
234 faultsim_test_result {0 2} | |
235 } | |
236 | |
237 finish_test | |
OLD | NEW |