modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/rtree/rtree3.test (about)

     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  #   rtree3-11: OOM following a constraint failure
    51  #
    52  do_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  
    67  do_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  } {}
    75  do_faultsim_test rtree3-2 -faults oom* -prep {
    76    faultsim_restore_and_reopen
    77  } -body {
    78    execsql { DROP TABLE rt } 
    79  }
    80  
    81  do_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  
    90  do_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  }
   100  faultsim_save_and_close
   101  
   102  do_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  
   113  do_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  
   127  do_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  
   135  do_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  
   143  do_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  } {}
   156  do_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  
   166  do_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  } {}
   179  do_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  
   191  do_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  } {}
   196  do_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  
   204  do_faultsim_test rtree3-8 -faults oom-* -prep {
   205    catch { db close }
   206  } -body {
   207    sqlite3 db test.db
   208  } 
   209  
   210  do_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  
   219  do_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  } {}
   228  do_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  
   239  do_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  } {}
   247  do_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  }
   256  do_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  
   266  finish_test