diff -r 000000000000 -r bde4ae8d615e os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/thread001.test --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/thread001.test Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,138 @@ +# 2007 September 7 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# $Id: thread001.test,v 1.5 2008/07/12 14:52:20 drh Exp $ + +set testdir [file dirname $argv0] + +source $testdir/tester.tcl +source $testdir/thread_common.tcl +if {[info commands sqlthread] eq ""} { + return +} + +set ::NTHREAD 10 + +# Run this test three times: +# +# 1) All threads use the same database handle. +# 2) All threads use their own database handles. +# 3) All threads use their own database handles, shared-cache is enabled. +# +foreach {tn same_db shared_cache} [list \ + 1 1 0 \ + 2 0 0 \ + 3 0 1 \ +] { + # Empty the database. + # + catchsql { DROP TABLE ab; } + + do_test thread001.$tn.0 { + db close + sqlite3_enable_shared_cache $shared_cache + sqlite3_enable_shared_cache $shared_cache + } $shared_cache + sqlite3 db test.db + + set dbconfig "" + if {$same_db} { + set dbconfig [list set ::DB [sqlite3_connection_pointer db]] + } + + # Set up a database and a schema. The database contains a single + # table with two columns. The first column ("a") is an INTEGER PRIMARY + # KEY. The second contains the md5sum of all rows in the table with + # a smaller value stored in column "a". + # + do_test thread001.$tn.1 { + execsql { + CREATE TABLE ab(a INTEGER PRIMARY KEY, b); + CREATE INDEX ab_i ON ab(b); + INSERT INTO ab SELECT NULL, md5sum(a, b) FROM ab; + SELECT count(*) FROM ab; + } + } {1} + do_test thread001.$tn.2 { + execsql { + SELECT + (SELECT md5sum(a, b) FROM ab WHERE a < (SELECT max(a) FROM ab)) == + (SELECT b FROM ab WHERE a = (SELECT max(a) FROM ab)) + } + } {1} + do_test thread001.$tn.3 { + execsql { PRAGMA integrity_check } + } {ok} + + set thread_program { + set needToClose 0 + if {![info exists ::DB]} { + set ::DB [sqlthread open test.db] + set needToClose 1 + } + + for {set i 0} {$i < 100} {incr i} { + # Test that the invariant is true. + do_test t1 { + execsql { + SELECT + (SELECT md5sum(a, b) FROM ab WHERE a < (SELECT max(a) FROM ab)) == + (SELECT b FROM ab WHERE a = (SELECT max(a) FROM ab)) + } + } {1} + + # Add another row to the database. + execsql { INSERT INTO ab SELECT NULL, md5sum(a, b) FROM ab } + } + + if {$needToClose} { + sqlite3_close $::DB + } + + list OK + } + + # Kick off $::NTHREAD threads: + # + array unset finished + for {set i 0} {$i < $::NTHREAD} {incr i} { + thread_spawn finished($i) $dbconfig $thread_procs $thread_program + } + + # Wait for all threads to finish, then check they all returned "OK". + # + for {set i 0} {$i < $::NTHREAD} {incr i} { + if {![info exists finished($i)]} { + vwait finished($i) + } + do_test thread001.$tn.4.$i { + set ::finished($i) + } OK + } + + # Check the database still looks Ok. + # + do_test thread001.$tn.5 { + execsql { SELECT count(*) FROM ab; } + } [expr {1 + $::NTHREAD*100}] + do_test thread001.$tn.6 { + execsql { + SELECT + (SELECT md5sum(a, b) FROM ab WHERE a < (SELECT max(a) FROM ab)) == + (SELECT b FROM ab WHERE a = (SELECT max(a) FROM ab)) + } + } {1} + do_test thread001.$tn.7 { + execsql { PRAGMA integrity_check } + } {ok} +} + +finish_test