xref: /sqlite-3.40.0/ext/rtree/rtree3.test (revision dfe4e6bb)
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
16if {![info exists testdir]} {
17  set testdir [file join [file dirname [info script]] .. .. test]
18}
19source $testdir/tester.tcl
20source $testdir/malloc_common.tcl
21ifcapable !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#   rtree3-11: OOM following a constraint failure
51#
52do_faultsim_test rtree3-1 -faults oom* -prep {
53  faultsim_delete_and_reopen
54} -body {
55  execsql {
56    BEGIN TRANSACTION;
57    CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2);
58    INSERT INTO rt VALUES(NULL, 3, 5, 7, 9);
59    INSERT INTO rt VALUES(NULL, 13, 15, 17, 19);
60    DELETE FROM rt WHERE ii = 1;
61    SELECT * FROM rt;
62    SELECT ii FROM rt WHERE ii = 2;
63    COMMIT;
64  }
65}
66
67do_test rtree3-2.prep {
68  faultsim_delete_and_reopen
69  execsql {
70    CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2);
71    INSERT INTO rt VALUES(NULL, 3, 5, 7, 9);
72  }
73  faultsim_save_and_close
74} {}
75do_faultsim_test rtree3-2 -faults oom* -prep {
76  faultsim_restore_and_reopen
77} -body {
78  execsql { DROP TABLE rt }
79}
80
81do_malloc_test rtree3-3.prep {
82  faultsim_delete_and_reopen
83  execsql {
84    CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2);
85    INSERT INTO rt VALUES(NULL, 3, 5, 7, 9);
86  }
87  faultsim_save_and_close
88} {}
89
90do_faultsim_test rtree3-3a -faults oom* -prep {
91  faultsim_restore_and_reopen
92} -body {
93  db eval BEGIN
94  for {set ii 0} {$ii < 100} {incr ii} {
95    set f [expr rand()]
96    db eval {INSERT INTO rt VALUES(NULL, $f*10.0, $f*10.0, $f*15.0, $f*15.0)}
97  }
98  db eval COMMIT
99}
100faultsim_save_and_close
101
102do_faultsim_test rtree3-3b -faults oom* -prep {
103  faultsim_restore_and_reopen
104} -body {
105  db eval BEGIN
106  for {set ii 0} {$ii < 100} {incr ii} {
107    set f [expr rand()]
108    db eval { DELETE FROM rt WHERE x1<($f*10.0) AND x1>($f*10.5) }
109  }
110  db eval COMMIT
111}
112
113do_test rtree3-4.prep {
114  faultsim_delete_and_reopen
115  execsql {
116    BEGIN;
117    PRAGMA page_size = 512;
118    CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2);
119  }
120  for {set i 0} {$i < 1500} {incr i} {
121    execsql { INSERT INTO rt VALUES($i, $i, $i+1, $i, $i+1) }
122  }
123  execsql { COMMIT }
124  faultsim_save_and_close
125} {}
126
127do_faultsim_test rtree3-4a -faults oom-* -prep {
128  faultsim_restore_and_reopen
129} -body {
130  db eval { SELECT count(*) FROM rt }
131} -test {
132  faultsim_test_result {0 1500}
133}
134
135do_faultsim_test rtree3-4b -faults oom-transient -prep {
136  faultsim_restore_and_reopen
137} -body {
138  db eval { DELETE FROM rt WHERE ii BETWEEN 1 AND 100 }
139} -test {
140  faultsim_test_result {0 {}}
141}
142
143do_test rtree3-5.prep {
144  faultsim_delete_and_reopen
145  execsql {
146    BEGIN;
147    PRAGMA page_size = 512;
148    CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2);
149  }
150  for {set i 0} {$i < 100} {incr i} {
151    execsql { INSERT INTO rt VALUES($i, $i, $i+1, $i, $i+1) }
152  }
153  execsql { COMMIT }
154  faultsim_save_and_close
155} {}
156do_faultsim_test rtree3-5 -faults oom-* -prep {
157  faultsim_restore_and_reopen
158} -body {
159  for {set i 100} {$i < 110} {incr i} {
160    execsql { INSERT INTO rt VALUES($i, $i, $i+1, $i, $i+1) }
161  }
162} -test {
163  faultsim_test_result {0 {}}
164}
165
166do_test rtree3-6.prep {
167  faultsim_delete_and_reopen
168  execsql {
169    BEGIN;
170    PRAGMA page_size = 512;
171    CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2);
172  }
173  for {set i 0} {$i < 50} {incr i} {
174    execsql { INSERT INTO rt VALUES($i, $i, $i+1, $i, $i+1) }
175  }
176  execsql { COMMIT }
177  faultsim_save_and_close
178} {}
179do_faultsim_test rtree3-6 -faults oom-* -prep {
180  faultsim_restore_and_reopen
181} -body {
182  execsql BEGIN
183  for {set i 0} {$i < 50} {incr i} {
184    execsql { DELETE FROM rt WHERE ii=$i }
185  }
186  execsql COMMIT
187} -test {
188  faultsim_test_result {0 {}}
189}
190
191do_test rtree3-7.prep {
192  faultsim_delete_and_reopen
193  execsql { CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2) }
194  faultsim_save_and_close
195} {}
196do_faultsim_test rtree3-7 -faults oom-* -prep {
197  faultsim_restore_and_reopen
198} -body {
199  execsql { ALTER TABLE rt RENAME TO rt2 }
200} -test {
201  faultsim_test_result {0 {}}
202}
203
204do_faultsim_test rtree3-8 -faults oom-* -prep {
205  catch { db close }
206} -body {
207  sqlite3 db test.db
208}
209
210do_faultsim_test rtree3-9 -faults oom-* -prep {
211  sqlite3 db :memory:
212} -body {
213  set rc [register_cube_geom db]
214  if {$rc != "SQLITE_OK"} { error $rc }
215} -test {
216  faultsim_test_result {0 {}} {1 SQLITE_NOMEM}
217}
218
219do_test rtree3-10.prep {
220  faultsim_delete_and_reopen
221  execsql {
222    CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2, z1, z2);
223    INSERT INTO rt VALUES(1,  10, 10, 10, 11, 11, 11);
224    INSERT INTO rt VALUES(2,  5, 6, 6, 7, 7, 8);
225  }
226  faultsim_save_and_close
227} {}
228do_faultsim_test rtree3-10 -faults oom-* -prep {
229  faultsim_restore_and_reopen
230  register_cube_geom db
231  execsql { SELECT * FROM rt }
232} -body {
233  execsql { SELECT ii FROM rt WHERE ii MATCH cube(4.5, 5.5, 6.5, 1, 1, 1) }
234} -test {
235  faultsim_test_result {0 2}
236}
237
238
239do_test rtree3-11.prep {
240  faultsim_delete_and_reopen
241  execsql {
242    CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2);
243    INSERT INTO rt VALUES(1, 2, 3, 4, 5);
244  }
245  faultsim_save_and_close
246} {}
247do_faultsim_test rtree3-10.1 -faults oom-* -prep {
248  faultsim_restore_and_reopen
249  execsql { SELECT * FROM rt }
250} -body {
251  execsql { INSERT INTO rt VALUES(1, 2, 3, 4, 5) }
252} -test {
253  faultsim_test_result {1 {UNIQUE constraint failed: rt.ii}} \
254                       {1 {constraint failed}}
255}
256do_faultsim_test rtree3-10.2 -faults oom-* -prep {
257  faultsim_restore_and_reopen
258  execsql { SELECT * FROM rt }
259} -body {
260  execsql { INSERT INTO rt VALUES(2, 2, 3, 5, 4) }
261} -test {
262  faultsim_test_result {1 {rtree constraint failed: rt.(y1<=y2)}} \
263                       {1 {constraint failed}}
264}
265
266finish_test
267