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 238