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

     1  # 2017 January 13
     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  # This file contains tests for resumption of RBU operations in the
    13  # case where the previous RBU process crashed.
    14  #
    15  
    16  source [file join [file dirname [info script]] rbu_common.tcl]
    17  set ::testprefix rburesume
    18  
    19  forcedelete test.db-shm test.db-oal
    20  do_execsql_test 1.0 {
    21    CREATE TABLE t1(a PRIMARY KEY, b, c);
    22    CREATE INDEX t1a ON t1(a);
    23    CREATE INDEX t1b ON t1(b);
    24    CREATE INDEX t1c ON t1(c);
    25    WITH s(i) AS (
    26      VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<50
    27    )
    28    INSERT INTO t1 SELECT randomblob(50), randomblob(75), randomblob(100) FROM s;
    29  }
    30  db_save_and_close
    31  
    32  do_test 1.1 {
    33    list [file exists test.db] \
    34         [file exists test.db-wal] \
    35         [file exists test.db-shm] \
    36         [file exists test.db-oal]
    37  } {1 0 0 0}
    38  
    39  # Each iteration of the following loop:
    40  #
    41  #   1. Restores the db to the state it was in following test case 1.0
    42  #   2. Opens an RBU vacuum and steps it $n times.
    43  #   3. Closes the RBU vacuum handled opened in (2).
    44  #   4. Opens a second RBU vacuum handle, resumes and completes the vacuum op. 
    45  #
    46  # The loop runs until $n is large enough that step (2) vacuums the entire
    47  # database.
    48  #
    49  for {set n 1} {$n < 5000} {incr n} {
    50    db_restore
    51    forcedelete state.db
    52    sqlite3rbu_vacuum rbu test.db state.db
    53    for {set i 0} {$i<$n} {incr i} {
    54      set rc [rbu step]
    55      if {$rc == "SQLITE_DONE"} break
    56    }
    57    rbu close
    58    if {$rc == "SQLITE_DONE"} break
    59  
    60    do_test 1.2.$n.1 {
    61      sqlite3rbu_vacuum rbu test.db state.db
    62      while {[rbu step]=="SQLITE_OK"} {}
    63      rbu close
    64    } {SQLITE_DONE}
    65  
    66    do_test 1.2.$n.2 {
    67      sqlite3 db2 test.db
    68      db2 eval { 
    69        SELECT count(*) FROM t1;
    70        PRAGMA integrity_check;
    71      }
    72    } {50 ok}
    73    db2 close
    74  }
    75  
    76  # Each iteration of this loop:
    77  #
    78  #   1. Restores the db to the state it was in following test case 1.0
    79  #   2. Opens an RBU vacuum and steps it $n times.
    80  #   3. Takes a copy of all database files and the state db.
    81  #   4. Opens a second RBU vacuum handle on the copy, resumes and completes the
    82  #      vacuum op. 
    83  #
    84  # The loop runs until $n is large enough that step (2) vacuums the entire
    85  # database.
    86  #
    87  for {set n 1} {$n < 5000} {incr n} {
    88    db_restore
    89    forcedelete state.db state.db-shm state.db-oal state.db-wal
    90    sqlite3rbu_vacuum rbu test.db state.db
    91    for {set i 0} {$i<$n} {incr i} {
    92      set rc [rbu step]
    93      if {$rc == "SQLITE_DONE"} break
    94    }
    95    if {$rc == "SQLITE_DONE"} {
    96      rbu close
    97      break
    98    }
    99  
   100    foreach f {test.db test.db-oal test.db-wal test.db-shm test.db-vacuum} {
   101      set f2 [string map [list test.db test.db2] $f]
   102      if {[file exists $f]} {
   103        forcecopy $f $f2
   104      } else {
   105        forcedelete $f2
   106      }
   107    }
   108    forcecopy state.db state.db2
   109    rbu close
   110  
   111    do_test 1.3.$n.1 {
   112      sqlite3rbu_vacuum rbu test.db2 state.db2
   113      while {[rbu step]=="SQLITE_OK"} {}
   114      rbu close
   115    } {SQLITE_DONE}
   116  
   117    do_test 1.3.$n.2 {
   118      sqlite3 db2 test.db2
   119      db2 eval { 
   120        SELECT count(*) FROM t1;
   121        PRAGMA integrity_check;
   122      }
   123    } {50 ok}
   124    db2 close
   125  }
   126  
   127  # Each iteration of this loop:
   128  #
   129  #   1. Restores the db to the state it was in following test case 1.0
   130  #   2. Opens an RBU vacuum and steps it 10 times. Then closes it.
   131  #   2. Opens an RBU vacuum and steps it $n times.
   132  #   3. Takes a copy of all database files and the state db.
   133  #   4. Opens a second RBU vacuum handle on the copy, resumes and completes the
   134  #      vacuum op. 
   135  #
   136  # The loop runs until $n is large enough that step (3) vacuums the entire
   137  # database.
   138  #
   139  for {set n 1} {$n < 5000} {incr n} {
   140    db_restore
   141    forcedelete state.db state.db-shm state.db-oal state.db-wal
   142  
   143    sqlite3rbu_vacuum rbu test.db state.db
   144    for {set i 0} {$i<10} {incr i} {
   145      rbu step
   146    }
   147    rbu close
   148  
   149    sqlite3rbu_vacuum rbu test.db state.db
   150    for {set i 0} {$i<$n} {incr i} {
   151      set rc [rbu step]
   152      if {$rc == "SQLITE_DONE"} break
   153    }
   154    if {$rc == "SQLITE_DONE"} {
   155      rbu close
   156      break
   157    }
   158  
   159    foreach f {test.db test.db-oal test.db-wal test.db-shm test.db-vacuum} {
   160      set f2 [string map [list test.db test.db2] $f]
   161      if {[file exists $f]} {
   162        forcecopy $f $f2
   163      } else {
   164        forcedelete $f2
   165      }
   166    }
   167    forcecopy state.db state.db2
   168    rbu close
   169  
   170    do_test 1.4.$n.1 {
   171      sqlite3rbu_vacuum rbu test.db2 state.db2
   172      while {[rbu step]=="SQLITE_OK"} {}
   173      rbu close
   174    } {SQLITE_DONE}
   175  
   176    do_test 1.4.$n.2 {
   177      sqlite3 db2 test.db2
   178      db2 eval { 
   179        SELECT count(*) FROM t1;
   180        PRAGMA integrity_check;
   181      }
   182    } {50 ok}
   183    db2 close
   184  }
   185  
   186  forcedelete rbu.db
   187  do_test 2.0 {
   188    sqlite3 db2 rbu.db
   189    db2 eval {
   190      CREATE TABLE data_t1(a, b, c, rbu_control);
   191      WITH s(i) AS (
   192          VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<10
   193      )
   194      INSERT INTO data_t1 
   195        SELECT randomblob(50), randomblob(75), randomblob(100), 0 FROM s;
   196    }
   197    db2 close
   198  } {}
   199  
   200  # Each iteration of this loop:
   201  #
   202  #   1. Restores the db to the state it was in following test case 1.0
   203  #   2. Opens an RBU handle to apply the RBU update created in test case 2.0.
   204  #   3. Steps the RBU handle $n times.
   205  #   4. Takes a copy of all database files and the state db.
   206  #   5. Opens a second RBU handle on the copy, resumes and completes the
   207  #      RBU op. Checks it worked as expected.
   208  #
   209  # The loop runs until $n is large enough that step (3) applies the entire
   210  # update.
   211  #
   212  for {set n 1} {$n < 5000} {incr n} {
   213    db_restore
   214    forcedelete state.db state.db-shm state.db-oal state.db-wal
   215    sqlite3rbu rbu test.db rbu.db state.db
   216  
   217    for {set i 0} {$i<$n} {incr i} {
   218      set rc [rbu step]
   219      if {$rc == "SQLITE_DONE"} break
   220    }
   221    if {$rc == "SQLITE_DONE"} {
   222      rbu close
   223      break
   224    }
   225  
   226    foreach f {test.db test.db-oal test.db-wal test.db-shm test.db-vacuum} {
   227      set f2 [string map [list test.db test.db2] $f]
   228      if {[file exists $f]} {
   229        forcecopy $f $f2
   230      } else {
   231        forcedelete $f2
   232      }
   233    }
   234    forcecopy state.db state.db2
   235    rbu close
   236  
   237    do_test 2.$n.1 {
   238      sqlite3rbu rbu test.db2 rbu.db state.db2
   239      while {[rbu step]=="SQLITE_OK"} {}
   240      rbu close
   241    } {SQLITE_DONE}
   242  
   243    do_test 2.$n.2 {
   244      sqlite3 db2 test.db2
   245      db2 eval { 
   246        SELECT count(*) FROM t1;
   247        PRAGMA integrity_check;
   248      }
   249    } {60 ok}
   250    db2 close
   251  }
   252  
   253  finish_test
   254