144918fa0Sdanielk1977# 2007 September 7 244918fa0Sdanielk1977# 344918fa0Sdanielk1977# The author disclaims copyright to this source code. In place of 444918fa0Sdanielk1977# a legal notice, here is a blessing: 544918fa0Sdanielk1977# 644918fa0Sdanielk1977# May you do good and not evil. 744918fa0Sdanielk1977# May you find forgiveness for yourself and forgive others. 844918fa0Sdanielk1977# May you share freely, never taking more than you give. 944918fa0Sdanielk1977# 1044918fa0Sdanielk1977#*********************************************************************** 1144918fa0Sdanielk1977# 126d961009Sdanielk1977# $Id: thread001.test,v 1.10 2009/03/26 14:48:07 danielk1977 Exp $ 1344918fa0Sdanielk1977 1444918fa0Sdanielk1977set testdir [file dirname $argv0] 1544918fa0Sdanielk1977 1649e439d9Sdanielk1977source $testdir/tester.tcl 176d961009Sdanielk1977if {[run_thread_tests]==0} { finish_test ; return } 18*9c5e1e40Sdrhifcapable !shared_cache { finish_test ; return } 1944918fa0Sdanielk1977 208a569e29Sdanielk1977set ::enable_shared_cache [sqlite3_enable_shared_cache] 218a569e29Sdanielk1977 22d9b5b117Sdanielk1977set ::NTHREAD 10 2344918fa0Sdanielk1977 2449e439d9Sdanielk1977# Run this test three times: 2544918fa0Sdanielk1977# 2649e439d9Sdanielk1977# 1) All threads use the same database handle. 2749e439d9Sdanielk1977# 2) All threads use their own database handles. 2849e439d9Sdanielk1977# 3) All threads use their own database handles, shared-cache is enabled. 29d9b5b117Sdanielk1977# 30b8613ab1Sdrh# 31b8613ab1Sdrh# 3249e439d9Sdanielk1977foreach {tn same_db shared_cache} [list \ 3349e439d9Sdanielk1977 1 1 0 \ 3449e439d9Sdanielk1977 2 0 0 \ 3549e439d9Sdanielk1977 3 0 1 \ 3649e439d9Sdanielk1977] { 37d9b5b117Sdanielk1977 # Empty the database. 38d9b5b117Sdanielk1977 # 39d9b5b117Sdanielk1977 catchsql { DROP TABLE ab; } 40d9b5b117Sdanielk1977 4149e439d9Sdanielk1977 do_test thread001.$tn.0 { 4249e439d9Sdanielk1977 db close 4349e439d9Sdanielk1977 sqlite3_enable_shared_cache $shared_cache 4449e439d9Sdanielk1977 sqlite3_enable_shared_cache $shared_cache 4549e439d9Sdanielk1977 } $shared_cache 460ee469c9Sdrh sqlite3 db test.db -fullmutex 1 -key xyzzy 4749e439d9Sdanielk1977 4849e439d9Sdanielk1977 set dbconfig "" 4949e439d9Sdanielk1977 if {$same_db} { 5049e439d9Sdanielk1977 set dbconfig [list set ::DB [sqlite3_connection_pointer db]] 5149e439d9Sdanielk1977 } 5249e439d9Sdanielk1977 53d9b5b117Sdanielk1977 # Set up a database and a schema. The database contains a single 54d9b5b117Sdanielk1977 # table with two columns. The first column ("a") is an INTEGER PRIMARY 55d9b5b117Sdanielk1977 # KEY. The second contains the md5sum of all rows in the table with 56d9b5b117Sdanielk1977 # a smaller value stored in column "a". 57d9b5b117Sdanielk1977 # 58d9b5b117Sdanielk1977 do_test thread001.$tn.1 { 59d9b5b117Sdanielk1977 execsql { 60d9b5b117Sdanielk1977 CREATE TABLE ab(a INTEGER PRIMARY KEY, b); 61d9b5b117Sdanielk1977 CREATE INDEX ab_i ON ab(b); 62d9b5b117Sdanielk1977 INSERT INTO ab SELECT NULL, md5sum(a, b) FROM ab; 63d9b5b117Sdanielk1977 SELECT count(*) FROM ab; 64d9b5b117Sdanielk1977 } 65d9b5b117Sdanielk1977 } {1} 66d9b5b117Sdanielk1977 do_test thread001.$tn.2 { 67d9b5b117Sdanielk1977 execsql { 68d9b5b117Sdanielk1977 SELECT 69d9b5b117Sdanielk1977 (SELECT md5sum(a, b) FROM ab WHERE a < (SELECT max(a) FROM ab)) == 70d9b5b117Sdanielk1977 (SELECT b FROM ab WHERE a = (SELECT max(a) FROM ab)) 71d9b5b117Sdanielk1977 } 72d9b5b117Sdanielk1977 } {1} 73d9b5b117Sdanielk1977 do_test thread001.$tn.3 { 74d9b5b117Sdanielk1977 execsql { PRAGMA integrity_check } 75d9b5b117Sdanielk1977 } {ok} 76d9b5b117Sdanielk1977 77d9b5b117Sdanielk1977 set thread_program { 78b8613ab1Sdrh #sqlthread parent {puts STARTING..} 79d9b5b117Sdanielk1977 set needToClose 0 80d9b5b117Sdanielk1977 if {![info exists ::DB]} { 810ee469c9Sdrh set ::DB [sqlthread open test.db xyzzy] 82b8613ab1Sdrh #sqlthread parent "puts \"OPEN $::DB\"" 83d9b5b117Sdanielk1977 set needToClose 1 84d9b5b117Sdanielk1977 } 85570f7e25Sdanielk1977 8644918fa0Sdanielk1977 for {set i 0} {$i < 100} {incr i} { 8744918fa0Sdanielk1977 # Test that the invariant is true. 88570f7e25Sdanielk1977 do_test t1 { 89570f7e25Sdanielk1977 execsql { 9044918fa0Sdanielk1977 SELECT 9197305a7cSdan (SELECT md5sum(a, b) FROM ab WHERE +a < (SELECT max(a) FROM ab)) == 9244918fa0Sdanielk1977 (SELECT b FROM ab WHERE a = (SELECT max(a) FROM ab)) 93570f7e25Sdanielk1977 } 94570f7e25Sdanielk1977 } {1} 9544918fa0Sdanielk1977 9644918fa0Sdanielk1977 # Add another row to the database. 9744918fa0Sdanielk1977 execsql { INSERT INTO ab SELECT NULL, md5sum(a, b) FROM ab } 9844918fa0Sdanielk1977 } 9944918fa0Sdanielk1977 100d9b5b117Sdanielk1977 if {$needToClose} { 101b8613ab1Sdrh #sqlthread parent "puts \"CLOSE $::DB\"" 102d9b5b117Sdanielk1977 sqlite3_close $::DB 10344918fa0Sdanielk1977 } 104b8613ab1Sdrh #sqlthread parent "puts \"DONE\"" 10544918fa0Sdanielk1977 106d9b5b117Sdanielk1977 list OK 107d9b5b117Sdanielk1977 } 108d9b5b117Sdanielk1977 109d9b5b117Sdanielk1977 # Kick off $::NTHREAD threads: 110d9b5b117Sdanielk1977 # 111d9b5b117Sdanielk1977 array unset finished 112d9b5b117Sdanielk1977 for {set i 0} {$i < $::NTHREAD} {incr i} { 113d9b5b117Sdanielk1977 thread_spawn finished($i) $dbconfig $thread_procs $thread_program 114d9b5b117Sdanielk1977 } 115d9b5b117Sdanielk1977 116d9b5b117Sdanielk1977 # Wait for all threads to finish, then check they all returned "OK". 117d9b5b117Sdanielk1977 # 118d9b5b117Sdanielk1977 for {set i 0} {$i < $::NTHREAD} {incr i} { 11944918fa0Sdanielk1977 if {![info exists finished($i)]} { 12044918fa0Sdanielk1977 vwait finished($i) 12144918fa0Sdanielk1977 } 122d9b5b117Sdanielk1977 do_test thread001.$tn.4.$i { 12344918fa0Sdanielk1977 set ::finished($i) 12444918fa0Sdanielk1977 } OK 12544918fa0Sdanielk1977 } 12644918fa0Sdanielk1977 127d9b5b117Sdanielk1977 # Check the database still looks Ok. 128d9b5b117Sdanielk1977 # 129d9b5b117Sdanielk1977 do_test thread001.$tn.5 { 13044918fa0Sdanielk1977 execsql { SELECT count(*) FROM ab; } 131d9b5b117Sdanielk1977 } [expr {1 + $::NTHREAD*100}] 132d9b5b117Sdanielk1977 do_test thread001.$tn.6 { 13344918fa0Sdanielk1977 execsql { 13444918fa0Sdanielk1977 SELECT 13597305a7cSdan (SELECT md5sum(a, b) FROM ab WHERE +a < (SELECT max(a) FROM ab)) == 13644918fa0Sdanielk1977 (SELECT b FROM ab WHERE a = (SELECT max(a) FROM ab)) 13744918fa0Sdanielk1977 } 13844918fa0Sdanielk1977 } {1} 139d9b5b117Sdanielk1977 do_test thread001.$tn.7 { 14044918fa0Sdanielk1977 execsql { PRAGMA integrity_check } 14144918fa0Sdanielk1977 } {ok} 142d9b5b117Sdanielk1977} 14344918fa0Sdanielk1977 1448a569e29Sdanielk1977sqlite3_enable_shared_cache $::enable_shared_cache 1459f2b0453Sdancatch { db close } 146a32e0d05Sdrhset sqlite_open_file_count 0 14744918fa0Sdanielk1977finish_test 148