File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / tkt-fc62af4523.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 4 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    1: # 2010 June 16
    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: # This file implements regression tests for SQLite library. Specifically,
   12: # it tests that ticket [fc62af4523] has been resolved.
   13: #
   14: 
   15: set testdir [file dirname $argv0]
   16: source $testdir/tester.tcl
   17: source $testdir/lock_common.tcl
   18: source $testdir/malloc_common.tcl
   19: 
   20: do_test tkt-fc62af4523.1 {
   21:   execsql {
   22:     PRAGMA cache_size = 10;
   23:     PRAGMA journal_mode = persist;
   24:     CREATE TABLE t1(a UNIQUE, b UNIQUE);
   25:     INSERT INTO t1 SELECT randomblob(200), randomblob(300);
   26:     INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; --  2
   27:     INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; --  4
   28:     INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; --  8
   29:     INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 16
   30:     INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 32
   31:     INSERT INTO t1 SELECT randomblob(200), randomblob(300) FROM t1; -- 64
   32:   }
   33:   execsql {
   34:     PRAGMA integrity_check;
   35:     SELECT count(*) FROM t1;
   36:   }
   37: } {ok 64}
   38: 
   39: # Launch an external process. Have it write (but not commit) a large
   40: # transaction to the database.
   41: #
   42: set ::chan [launch_testfixture]
   43: proc buddy {code} { testfixture $::chan $code }
   44: do_test tkt-fc62af4523.2 {
   45:   testfixture $::chan {
   46:     sqlite3 db test.db
   47:     db eval {
   48:       PRAGMA cache_size = 10;
   49:       BEGIN;
   50:         UPDATE t1 SET b = randomblob(400);
   51:         UPDATE t1 SET a = randomblob(201);
   52:     }
   53:   }
   54:   file exists test.db-journal
   55: } {1}
   56: 
   57: # Now do "PRAGMA journal_mode = DELETE" in this process. At one point
   58: # this was causing SQLite to delete the journal file from the file-system,
   59: # even though the external process is currently using it.
   60: #
   61: do_test tkt-fc62af4523.3 { execsql { PRAGMA journal_mode = DELETE } } {delete}
   62: do_test tkt-fc62af4523.4 { file exists test.db-journal } {1}
   63: 
   64: # Cause the external process to crash. Since it has already written 
   65: # uncommitted data into the database file, the next reader will have
   66: # to do a hot-journal rollback to recover the database.
   67: #
   68: # Or, if this test is run in a version with the bug present, the journal
   69: # file has already been deleted. In this case we are left with a corrupt
   70: # database file and no hot-journal to fix it with.
   71: #
   72: do_test tkt-fc62af4523.5 {
   73:   testfixture $::chan sqlite_abort
   74: } {ERROR: Child process hung up}
   75: after 200
   76: do_test tkt-fc62af4523.6 {
   77:   execsql {
   78:     PRAGMA integrity_check;
   79:     SELECT count(*) FROM t1;
   80:   }
   81: } {ok 64}
   82: 
   83: catch { close $::chan }
   84: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>