AryaWu/sqlite
0
1# 2005 January 192#3# The author disclaims copyright to this source code. In place of4# 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 14set testdir [file dirname $argv0]15source $testdir/tester.tcl16source $testdir/lock_common.tcl17source $testdir/malloc_common.tcl18db close19 20ifcapable !shared_cache {21 finish_test22 return23}24set ::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.28do_test shared2-1.1 {29 sqlite3 db1 test.db30 sqlite3 db2 test.db31 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 } db147} {}48do_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 the51 # contents of this table.52 execsql {53 pragma read_uncommitted = 1;54 } db255 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 } db162 }63 }64 list $a $count65} {32 64}66do_test shared2-1.3 {67 # Same test as 1.2, except scan using the index this time.68 execsql {69 ROLLBACK;70 } db171 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 } db177 }78 }79 list $a $count80} {32 64}81 82 83db1 close84db2 close85 86do_test shared2-3.2 {87 sqlite3_enable_shared_cache 188} {1}89 90forcedelete test.db91 92sqlite3 db test.db93do_test shared2-4.1 {94 execsql {95 CREATE TABLE t0(a, b);96 CREATE TABLE t1(a, b DEFAULT 'hello world');97 }98} {}99db close100 101sqlite3 db test.db102sqlite3 db2 test.db103 104do_test shared2-4.2 {105 execsql { SELECT a, b FROM t0 } db106 execsql { INSERT INTO t1(a) VALUES(1) } db2107} {}108 109do_test shared2-4.3 {110 db2 close111 db close112} {}113 114# At one point, this was causing a crash.115#116do_test shared2-5.1 {117 sqlite3 db test.db118 sqlite3 db2 test.db119 execsql { CREATE TABLE t2(a, b, c) }120 121 # The following statement would crash when attempting to sqlite3_free()122 # a pointer allocated from a lookaside buffer.123 execsql { CREATE INDEX i1 ON t2(a) } db2124} {}125 126db close127db2 close128 129# The following test verifies that shared-cache mode does not automatically130# turn on exclusive-locking mode for some reason.131do_multiclient_test {tn} {132 sql1 { CREATE TABLE t1(a, b) }133 sql2 { CREATE TABLE t2(a, b) }134 do_test shared2-6.$tn.1 { sql1 { SELECT * FROM t2 } } {}135 do_test shared2-6.$tn.2 { sql2 { SELECT * FROM t1 } } {}136}137 138sqlite3_enable_shared_cache $::enable_shared_cache139finish_test140 