Annotation of embedaddon/sqlite3/test/shared2.test, revision 1.1
1.1 ! misho 1: # 2005 January 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: # $Id: shared2.test,v 1.8 2009/06/05 17:09:12 drh Exp $
! 13:
! 14: set testdir [file dirname $argv0]
! 15: source $testdir/tester.tcl
! 16: source $testdir/lock_common.tcl
! 17: source $testdir/malloc_common.tcl
! 18: db close
! 19:
! 20: ifcapable !shared_cache {
! 21: finish_test
! 22: return
! 23: }
! 24: set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
! 25:
! 26: # Test that if we delete all rows from a table any read-uncommitted
! 27: # cursors are correctly invalidated. Test on both table and index btrees.
! 28: do_test shared2-1.1 {
! 29: sqlite3 db1 test.db
! 30: sqlite3 db2 test.db
! 31:
! 32: # Set up some data. Table "numbers" has 64 rows after this block
! 33: # is executed.
! 34: execsql {
! 35: BEGIN;
! 36: CREATE TABLE numbers(a PRIMARY KEY, b);
! 37: INSERT INTO numbers(oid) VALUES(NULL);
! 38: INSERT INTO numbers(oid) SELECT NULL FROM numbers;
! 39: INSERT INTO numbers(oid) SELECT NULL FROM numbers;
! 40: INSERT INTO numbers(oid) SELECT NULL FROM numbers;
! 41: INSERT INTO numbers(oid) SELECT NULL FROM numbers;
! 42: INSERT INTO numbers(oid) SELECT NULL FROM numbers;
! 43: INSERT INTO numbers(oid) SELECT NULL FROM numbers;
! 44: UPDATE numbers set a = oid, b = 'abcdefghijklmnopqrstuvwxyz0123456789';
! 45: COMMIT;
! 46: } db1
! 47: } {}
! 48: do_test shared2-1.2 {
! 49: # Put connection 2 in read-uncommitted mode and start a SELECT on table
! 50: # 'numbers'. Half way through the SELECT, use connection 1 to delete the
! 51: # contents of this table.
! 52: execsql {
! 53: pragma read_uncommitted = 1;
! 54: } db2
! 55: set count [execsql {SELECT count(*) FROM numbers} db2]
! 56: db2 eval {SELECT a FROM numbers ORDER BY oid} {
! 57: if {$a==32} {
! 58: execsql {
! 59: BEGIN;
! 60: DELETE FROM numbers;
! 61: } db1
! 62: }
! 63: }
! 64: list $a $count
! 65: } {32 64}
! 66: do_test shared2-1.3 {
! 67: # Same test as 1.2, except scan using the index this time.
! 68: execsql {
! 69: ROLLBACK;
! 70: } db1
! 71: set count [execsql {SELECT count(*) FROM numbers} db2]
! 72: db2 eval {SELECT a, b FROM numbers ORDER BY a} {
! 73: if {$a==32} {
! 74: execsql {
! 75: DELETE FROM numbers;
! 76: } db1
! 77: }
! 78: }
! 79: list $a $count
! 80: } {32 64}
! 81:
! 82: #---------------------------------------------------------------------------
! 83: # These tests, shared2.2.*, test the outcome when data is added to or
! 84: # removed from a table due to a rollback while a read-uncommitted
! 85: # cursor is scanning it.
! 86: #
! 87: do_test shared2-2.1 {
! 88: execsql {
! 89: INSERT INTO numbers VALUES(1, 'Medium length text field');
! 90: INSERT INTO numbers VALUES(2, 'Medium length text field');
! 91: INSERT INTO numbers VALUES(3, 'Medium length text field');
! 92: INSERT INTO numbers VALUES(4, 'Medium length text field');
! 93: BEGIN;
! 94: DELETE FROM numbers WHERE (a%2)=0;
! 95: } db1
! 96: set res [list]
! 97: db2 eval {
! 98: SELECT a FROM numbers ORDER BY a;
! 99: } {
! 100: lappend res $a
! 101: if {$a==3} {
! 102: execsql {ROLLBACK} db1
! 103: }
! 104: }
! 105: set res
! 106: } {1 3 4}
! 107: do_test shared2-2.2 {
! 108: execsql {
! 109: BEGIN;
! 110: INSERT INTO numbers VALUES(5, 'Medium length text field');
! 111: INSERT INTO numbers VALUES(6, 'Medium length text field');
! 112: } db1
! 113: set res [list]
! 114: db2 eval {
! 115: SELECT a FROM numbers ORDER BY a;
! 116: } {
! 117: lappend res $a
! 118: if {$a==5} {
! 119: execsql {ROLLBACK} db1
! 120: }
! 121: }
! 122: set res
! 123: } {1 2 3 4 5}
! 124:
! 125: db1 close
! 126: db2 close
! 127:
! 128: do_test shared2-3.2 {
! 129: sqlite3_enable_shared_cache 1
! 130: } {1}
! 131:
! 132: forcedelete test.db
! 133:
! 134: sqlite3 db test.db
! 135: do_test shared2-4.1 {
! 136: execsql {
! 137: CREATE TABLE t0(a, b);
! 138: CREATE TABLE t1(a, b DEFAULT 'hello world');
! 139: }
! 140: } {}
! 141: db close
! 142:
! 143: sqlite3 db test.db
! 144: sqlite3 db2 test.db
! 145:
! 146: do_test shared2-4.2 {
! 147: execsql { SELECT a, b FROM t0 } db
! 148: execsql { INSERT INTO t1(a) VALUES(1) } db2
! 149: } {}
! 150:
! 151: do_test shared2-4.3 {
! 152: db2 close
! 153: db close
! 154: } {}
! 155:
! 156: # At one point, this was causing a crash.
! 157: #
! 158: do_test shared2-5.1 {
! 159: sqlite3 db test.db
! 160: sqlite3 db2 test.db
! 161: execsql { CREATE TABLE t2(a, b, c) }
! 162:
! 163: # The following statement would crash when attempting to sqlite3_free()
! 164: # a pointer allocated from a lookaside buffer.
! 165: execsql { CREATE INDEX i1 ON t2(a) } db2
! 166: } {}
! 167:
! 168: db close
! 169: db2 close
! 170:
! 171: # The following test verifies that shared-cache mode does not automatically
! 172: # turn on exclusive-locking mode for some reason.
! 173: do_multiclient_test {tn} {
! 174: sql1 { CREATE TABLE t1(a, b) }
! 175: sql2 { CREATE TABLE t2(a, b) }
! 176: do_test shared2-6.$tn.1 { sql1 { SELECT * FROM t2 } } {}
! 177: do_test shared2-6.$tn.2 { sql2 { SELECT * FROM t1 } } {}
! 178: }
! 179:
! 180: sqlite3_enable_shared_cache $::enable_shared_cache
! 181: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>