1ebaecc14Sdanielk1977# 2008 Feb 19 2ebaecc14Sdanielk1977# 3ebaecc14Sdanielk1977# The author disclaims copyright to this source code. In place of 4ebaecc14Sdanielk1977# a legal notice, here is a blessing: 5ebaecc14Sdanielk1977# 6ebaecc14Sdanielk1977# May you do good and not evil. 7ebaecc14Sdanielk1977# May you find forgiveness for yourself and forgive others. 8ebaecc14Sdanielk1977# May you share freely, never taking more than you give. 9ebaecc14Sdanielk1977# 10ebaecc14Sdanielk1977#*********************************************************************** 11ebaecc14Sdanielk1977# 12ebaecc14Sdanielk1977# The focus of this file is testing that the r-tree correctly handles 13ebaecc14Sdanielk1977# out-of-memory conditions. 14ebaecc14Sdanielk1977# 15ebaecc14Sdanielk1977 16b13dee99Sdanielk1977if {![info exists testdir]} { 17897230ebSdan set testdir [file join [file dirname [info script]] .. .. test] 18b13dee99Sdanielk1977} 19ebaecc14Sdanielk1977source $testdir/tester.tcl 2092e01aafSdansource $testdir/malloc_common.tcl 21ebaecc14Sdanielk1977ifcapable !rtree { 22ebaecc14Sdanielk1977 finish_test 23ebaecc14Sdanielk1977 return 24ebaecc14Sdanielk1977} 25ebaecc14Sdanielk1977 26*f703b42dSdanset ::TMPDBERROR [list 1 \ 27*f703b42dSdan {unable to open a temporary database file for storing temporary tables} 28*f703b42dSdan] 29*f703b42dSdan 30897230ebSdan# Test summary: 31ebaecc14Sdanielk1977# 32897230ebSdan# rtree3-1: Test OOM in simple CREATE TABLE, INSERT, DELETE and SELECT 33897230ebSdan# commands on an almost empty table. 34897230ebSdan# 35897230ebSdan# rtree3-2: Test OOM in a DROP TABLE command. 36897230ebSdan# 37897230ebSdan# rtree3-3a: Test OOM during a transaction to insert 100 pseudo-random rows. 38897230ebSdan# 39897230ebSdan# rtree3-3b: Test OOM during a transaction deleting all entries in the 40897230ebSdan# database constructed in [rtree3-3a] in pseudo-random order. 41897230ebSdan# 42897230ebSdan# rtree3-4a: OOM during "SELECT count(*) FROM ..." on a big table. 43897230ebSdan# 44897230ebSdan# rtree3-4b: OOM while deleting rows from a big table. 45897230ebSdan# 46897230ebSdan# rtree3-5: Test OOM while inserting rows into a big table. 47897230ebSdan# 48897230ebSdan# rtree3-6: Test OOM while deleting all rows of a table, one at a time. 49897230ebSdan# 50897230ebSdan# rtree3-7: OOM during an ALTER TABLE RENAME TABLE command. 51897230ebSdan# 52897230ebSdan# rtree3-8: Test OOM while registering the r-tree module with sqlite. 53897230ebSdan# 545782bc27Sdan# rtree3-11: OOM following a constraint failure 555782bc27Sdan# 5692e01aafSdando_faultsim_test rtree3-1 -faults oom* -prep { 5792e01aafSdan faultsim_delete_and_reopen 5892e01aafSdan} -body { 5992e01aafSdan execsql { 60ebaecc14Sdanielk1977 BEGIN TRANSACTION; 61ebaecc14Sdanielk1977 CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2); 62ebaecc14Sdanielk1977 INSERT INTO rt VALUES(NULL, 3, 5, 7, 9); 63ebaecc14Sdanielk1977 INSERT INTO rt VALUES(NULL, 13, 15, 17, 19); 64ebaecc14Sdanielk1977 DELETE FROM rt WHERE ii = 1; 65ebaecc14Sdanielk1977 SELECT * FROM rt; 66ebaecc14Sdanielk1977 SELECT ii FROM rt WHERE ii = 2; 67ebaecc14Sdanielk1977 COMMIT; 68ebaecc14Sdanielk1977 } 69ebaecc14Sdanielk1977} 70ebaecc14Sdanielk1977 7192e01aafSdando_test rtree3-2.prep { 7292e01aafSdan faultsim_delete_and_reopen 7392e01aafSdan execsql { 74ebaecc14Sdanielk1977 CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2); 75ebaecc14Sdanielk1977 INSERT INTO rt VALUES(NULL, 3, 5, 7, 9); 7692e01aafSdan } 7792e01aafSdan faultsim_save_and_close 7892e01aafSdan} {} 7992e01aafSdando_faultsim_test rtree3-2 -faults oom* -prep { 8092e01aafSdan faultsim_restore_and_reopen 8192e01aafSdan} -body { 8292e01aafSdan execsql { DROP TABLE rt } 8392e01aafSdan} 8492e01aafSdan 8592e01aafSdando_malloc_test rtree3-3.prep { 8692e01aafSdan faultsim_delete_and_reopen 8792e01aafSdan execsql { 887578456cSdrh CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2, +a1, +a2); 8992e01aafSdan INSERT INTO rt VALUES(NULL, 3, 5, 7, 9); 9092e01aafSdan } 9192e01aafSdan faultsim_save_and_close 9292e01aafSdan} {} 9392e01aafSdan 9492e01aafSdando_faultsim_test rtree3-3a -faults oom* -prep { 9592e01aafSdan faultsim_restore_and_reopen 9692e01aafSdan} -body { 97ebaecc14Sdanielk1977 db eval BEGIN 98ebaecc14Sdanielk1977 for {set ii 0} {$ii < 100} {incr ii} { 99ebaecc14Sdanielk1977 set f [expr rand()] 100ebaecc14Sdanielk1977 db eval {INSERT INTO rt VALUES(NULL, $f*10.0, $f*10.0, $f*15.0, $f*15.0)} 101ebaecc14Sdanielk1977 } 102ebaecc14Sdanielk1977 db eval COMMIT 10392e01aafSdan} 10492e01aafSdanfaultsim_save_and_close 10592e01aafSdan 10692e01aafSdando_faultsim_test rtree3-3b -faults oom* -prep { 10792e01aafSdan faultsim_restore_and_reopen 10892e01aafSdan} -body { 109ebaecc14Sdanielk1977 db eval BEGIN 110ebaecc14Sdanielk1977 for {set ii 0} {$ii < 100} {incr ii} { 111ebaecc14Sdanielk1977 set f [expr rand()] 112ebaecc14Sdanielk1977 db eval { DELETE FROM rt WHERE x1<($f*10.0) AND x1>($f*10.5) } 113ebaecc14Sdanielk1977 } 114ebaecc14Sdanielk1977 db eval COMMIT 115ebaecc14Sdanielk1977} 116ebaecc14Sdanielk1977 11792e01aafSdando_test rtree3-4.prep { 11892e01aafSdan faultsim_delete_and_reopen 11992e01aafSdan execsql { 12092e01aafSdan BEGIN; 12192e01aafSdan PRAGMA page_size = 512; 12292e01aafSdan CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2); 12392e01aafSdan } 12492e01aafSdan for {set i 0} {$i < 1500} {incr i} { 12592e01aafSdan execsql { INSERT INTO rt VALUES($i, $i, $i+1, $i, $i+1) } 12692e01aafSdan } 12792e01aafSdan execsql { COMMIT } 12892e01aafSdan faultsim_save_and_close 12992e01aafSdan} {} 13092e01aafSdan 1312bf19178Sdando_faultsim_test rtree3-4a -faults oom-* -prep { 13292e01aafSdan faultsim_restore_and_reopen 13392e01aafSdan} -body { 13492e01aafSdan db eval { SELECT count(*) FROM rt } 13592e01aafSdan} -test { 13692e01aafSdan faultsim_test_result {0 1500} 13792e01aafSdan} 1382bf19178Sdan 139897230ebSdando_faultsim_test rtree3-4b -faults oom-transient -prep { 140f836afd4Sdan faultsim_restore_and_reopen 141f836afd4Sdan} -body { 1422bf19178Sdan db eval { DELETE FROM rt WHERE ii BETWEEN 1 AND 100 } 143f836afd4Sdan} -test { 144f836afd4Sdan faultsim_test_result {0 {}} 145f836afd4Sdan} 14692e01aafSdan 1472bf19178Sdando_test rtree3-5.prep { 1482bf19178Sdan faultsim_delete_and_reopen 1492bf19178Sdan execsql { 1502bf19178Sdan BEGIN; 1512bf19178Sdan PRAGMA page_size = 512; 1522bf19178Sdan CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2); 1532bf19178Sdan } 1542bf19178Sdan for {set i 0} {$i < 100} {incr i} { 1552bf19178Sdan execsql { INSERT INTO rt VALUES($i, $i, $i+1, $i, $i+1) } 1562bf19178Sdan } 1572bf19178Sdan execsql { COMMIT } 1582bf19178Sdan faultsim_save_and_close 1592bf19178Sdan} {} 1602bf19178Sdando_faultsim_test rtree3-5 -faults oom-* -prep { 1612bf19178Sdan faultsim_restore_and_reopen 1622bf19178Sdan} -body { 1632bf19178Sdan for {set i 100} {$i < 110} {incr i} { 1642bf19178Sdan execsql { INSERT INTO rt VALUES($i, $i, $i+1, $i, $i+1) } 1652bf19178Sdan } 1662bf19178Sdan} -test { 1672bf19178Sdan faultsim_test_result {0 {}} 1682bf19178Sdan} 1692bf19178Sdan 1702bf19178Sdando_test rtree3-6.prep { 1712bf19178Sdan faultsim_delete_and_reopen 1722bf19178Sdan execsql { 1732bf19178Sdan BEGIN; 1742bf19178Sdan PRAGMA page_size = 512; 1752bf19178Sdan CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2); 1762bf19178Sdan } 1772bf19178Sdan for {set i 0} {$i < 50} {incr i} { 1782bf19178Sdan execsql { INSERT INTO rt VALUES($i, $i, $i+1, $i, $i+1) } 1792bf19178Sdan } 1802bf19178Sdan execsql { COMMIT } 1812bf19178Sdan faultsim_save_and_close 1822bf19178Sdan} {} 1832bf19178Sdando_faultsim_test rtree3-6 -faults oom-* -prep { 1842bf19178Sdan faultsim_restore_and_reopen 1852bf19178Sdan} -body { 1862bf19178Sdan execsql BEGIN 1872bf19178Sdan for {set i 0} {$i < 50} {incr i} { 1882bf19178Sdan execsql { DELETE FROM rt WHERE ii=$i } 1892bf19178Sdan } 1902bf19178Sdan execsql COMMIT 1912bf19178Sdan} -test { 1922bf19178Sdan faultsim_test_result {0 {}} 1932bf19178Sdan} 1942bf19178Sdan 1952bf19178Sdando_test rtree3-7.prep { 1962bf19178Sdan faultsim_delete_and_reopen 1972bf19178Sdan execsql { CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2) } 1982bf19178Sdan faultsim_save_and_close 1992bf19178Sdan} {} 2002bf19178Sdando_faultsim_test rtree3-7 -faults oom-* -prep { 2012bf19178Sdan faultsim_restore_and_reopen 2022bf19178Sdan} -body { 2032bf19178Sdan execsql { ALTER TABLE rt RENAME TO rt2 } 2042bf19178Sdan} -test { 205*f703b42dSdan faultsim_test_result {0 {}} $::TMPDBERROR 2062bf19178Sdan} 2072bf19178Sdan 2082bf19178Sdando_faultsim_test rtree3-8 -faults oom-* -prep { 2092bf19178Sdan catch { db close } 2102bf19178Sdan} -body { 2112bf19178Sdan sqlite3 db test.db 2122bf19178Sdan} 2132bf19178Sdan 2147bddb755Sdando_faultsim_test rtree3-9 -faults oom-* -prep { 2157bddb755Sdan sqlite3 db :memory: 2167bddb755Sdan} -body { 2177bddb755Sdan set rc [register_cube_geom db] 2187bddb755Sdan if {$rc != "SQLITE_OK"} { error $rc } 2197bddb755Sdan} -test { 2207bddb755Sdan faultsim_test_result {0 {}} {1 SQLITE_NOMEM} 2217bddb755Sdan} 2227bddb755Sdan 2237bddb755Sdando_test rtree3-10.prep { 2247bddb755Sdan faultsim_delete_and_reopen 2257bddb755Sdan execsql { 2267bddb755Sdan CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2, z1, z2); 2277bddb755Sdan INSERT INTO rt VALUES(1, 10, 10, 10, 11, 11, 11); 2287bddb755Sdan INSERT INTO rt VALUES(2, 5, 6, 6, 7, 7, 8); 2297bddb755Sdan } 2307bddb755Sdan faultsim_save_and_close 2317bddb755Sdan} {} 2327bddb755Sdando_faultsim_test rtree3-10 -faults oom-* -prep { 2337bddb755Sdan faultsim_restore_and_reopen 2347bddb755Sdan register_cube_geom db 2357bddb755Sdan execsql { SELECT * FROM rt } 2367bddb755Sdan} -body { 2377bddb755Sdan execsql { SELECT ii FROM rt WHERE ii MATCH cube(4.5, 5.5, 6.5, 1, 1, 1) } 2387bddb755Sdan} -test { 2397bddb755Sdan faultsim_test_result {0 2} 2407bddb755Sdan} 2417bddb755Sdan 2425782bc27Sdan 2435782bc27Sdando_test rtree3-11.prep { 2445782bc27Sdan faultsim_delete_and_reopen 2455782bc27Sdan execsql { 2465782bc27Sdan CREATE VIRTUAL TABLE rt USING rtree(ii, x1, x2, y1, y2); 2475782bc27Sdan INSERT INTO rt VALUES(1, 2, 3, 4, 5); 2485782bc27Sdan } 2495782bc27Sdan faultsim_save_and_close 2505782bc27Sdan} {} 2515782bc27Sdando_faultsim_test rtree3-10.1 -faults oom-* -prep { 2525782bc27Sdan faultsim_restore_and_reopen 2535782bc27Sdan execsql { SELECT * FROM rt } 2545782bc27Sdan} -body { 2555782bc27Sdan execsql { INSERT INTO rt VALUES(1, 2, 3, 4, 5) } 2565782bc27Sdan} -test { 2575782bc27Sdan faultsim_test_result {1 {UNIQUE constraint failed: rt.ii}} \ 2585782bc27Sdan {1 {constraint failed}} 2595782bc27Sdan} 2605782bc27Sdando_faultsim_test rtree3-10.2 -faults oom-* -prep { 2615782bc27Sdan faultsim_restore_and_reopen 2625782bc27Sdan execsql { SELECT * FROM rt } 2635782bc27Sdan} -body { 2645782bc27Sdan execsql { INSERT INTO rt VALUES(2, 2, 3, 5, 4) } 2655782bc27Sdan} -test { 2665782bc27Sdan faultsim_test_result {1 {rtree constraint failed: rt.(y1<=y2)}} \ 2675782bc27Sdan {1 {constraint failed}} 2685782bc27Sdan} 2695782bc27Sdan 270ebaecc14Sdanielk1977finish_test 271