From e36d23a85ebff914d74bb541558c2b6082b78edb Mon Sep 17 00:00:00 2001 From: dan miller Date: Sat, 20 Oct 2007 02:49:29 +0000 Subject: sqlite source (unix build) added to libraries --- .../sqlite/unix/sqlite-3.5.1/test/thread001.test | 139 +++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 libraries/sqlite/unix/sqlite-3.5.1/test/thread001.test (limited to 'libraries/sqlite/unix/sqlite-3.5.1/test/thread001.test') diff --git a/libraries/sqlite/unix/sqlite-3.5.1/test/thread001.test b/libraries/sqlite/unix/sqlite-3.5.1/test/thread001.test new file mode 100644 index 0000000..a6ad19d --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/test/thread001.test @@ -0,0 +1,139 @@ +# 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.4 2007/09/10 07:35:47 danielk1977 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 + -- cgit v1.1