xref: /sqlite-3.40.0/ext/rtree/rtree3.test (revision f703b42d)
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