102b4e3b3Sdanielk1977# 2009 February 26 202b4e3b3Sdanielk1977# 302b4e3b3Sdanielk1977# The author disclaims copyright to this source code. In place of 402b4e3b3Sdanielk1977# a legal notice, here is a blessing: 502b4e3b3Sdanielk1977# 602b4e3b3Sdanielk1977# May you do good and not evil. 702b4e3b3Sdanielk1977# May you find forgiveness for yourself and forgive others. 802b4e3b3Sdanielk1977# May you share freely, never taking more than you give. 902b4e3b3Sdanielk1977# 1002b4e3b3Sdanielk1977#*********************************************************************** 1102b4e3b3Sdanielk1977# 12*dda70fe3Sdrh# $Id: thread004.test,v 1.3 2009/06/05 17:09:12 drh Exp $ 1302b4e3b3Sdanielk1977 1402b4e3b3Sdanielk1977set testdir [file dirname $argv0] 1502b4e3b3Sdanielk1977 1602b4e3b3Sdanielk1977source $testdir/tester.tcl 176d961009Sdanielk1977if {[run_thread_tests]==0} { finish_test ; return } 186d961009Sdanielk1977ifcapable !shared_cache { 196d961009Sdanielk1977 finish_test 2002b4e3b3Sdanielk1977 return 2102b4e3b3Sdanielk1977} 226d961009Sdanielk1977if { [info commands sqlite3_table_column_metadata] eq "" } { 236d961009Sdanielk1977 finish_test 2402b4e3b3Sdanielk1977 return 2502b4e3b3Sdanielk1977} 2602b4e3b3Sdanielk1977 2702b4e3b3Sdanielk1977# Use shared-cache mode for this test. 2802b4e3b3Sdanielk1977# 2902b4e3b3Sdanielk1977db close 3002b4e3b3Sdanielk1977set ::enable_shared_cache [sqlite3_enable_shared_cache] 3102b4e3b3Sdanielk1977sqlite3_enable_shared_cache 1 3202b4e3b3Sdanielk1977 3302b4e3b3Sdanielk1977# Create a table in database test.db 3402b4e3b3Sdanielk1977# 3502b4e3b3Sdanielk1977sqlite3 db test.db 3602b4e3b3Sdanielk1977do_test thread004-1.1 { 3702b4e3b3Sdanielk1977 execsql { CREATE TABLE t1(a, b, c) } 3802b4e3b3Sdanielk1977} {} 3902b4e3b3Sdanielk1977 4002b4e3b3Sdanielk1977do_test thread004-1.2 { 4102b4e3b3Sdanielk1977 4202b4e3b3Sdanielk1977 set ThreadOne { 4302b4e3b3Sdanielk1977 set iStart [clock_seconds] 4402b4e3b3Sdanielk1977 while {[clock_seconds]<$iStart+20} { 4502b4e3b3Sdanielk1977 set ::DB [sqlite3_open test.db] 4602b4e3b3Sdanielk1977 sqlite3_close $::DB 4702b4e3b3Sdanielk1977 } 4802b4e3b3Sdanielk1977 } 4902b4e3b3Sdanielk1977 set ThreadTwo { 5002b4e3b3Sdanielk1977 set ::DB [sqlite3_open test.db] 5102b4e3b3Sdanielk1977 set iStart [clock_seconds] 5202b4e3b3Sdanielk1977 set nErr 0 5302b4e3b3Sdanielk1977 while {[clock_seconds] <$iStart+20} { 5402b4e3b3Sdanielk1977 incr nErr [catch {sqlite3_table_column_metadata $::DB main t1 a}] 5502b4e3b3Sdanielk1977 } 5602b4e3b3Sdanielk1977 sqlite3_close $::DB 5702b4e3b3Sdanielk1977 set nErr 5802b4e3b3Sdanielk1977 } 5902b4e3b3Sdanielk1977 6002b4e3b3Sdanielk1977 # Run two threads. The first thread opens and closes database test.db 6102b4e3b3Sdanielk1977 # repeatedly. Each time this happens, the in-memory schema used by 6202b4e3b3Sdanielk1977 # all connections to test.db is discarded. 6302b4e3b3Sdanielk1977 # 6402b4e3b3Sdanielk1977 # The second thread calls sqlite3_table_column_metadata() over and 6502b4e3b3Sdanielk1977 # over again. Each time it is called, the database schema is loaded 6602b4e3b3Sdanielk1977 # if it is not already in memory. At one point this was crashing. 6702b4e3b3Sdanielk1977 # 6802b4e3b3Sdanielk1977 unset -nocomplain finished 6902b4e3b3Sdanielk1977 thread_spawn finished(1) $thread_procs $ThreadOne 7002b4e3b3Sdanielk1977 thread_spawn finished(2) $thread_procs $ThreadTwo 7102b4e3b3Sdanielk1977 7202b4e3b3Sdanielk1977 foreach t {1 2} { 7302b4e3b3Sdanielk1977 if {![info exists finished($t)]} { vwait finished($t) } 7402b4e3b3Sdanielk1977 } 7502b4e3b3Sdanielk1977 7602b4e3b3Sdanielk1977 set finished(2) 7702b4e3b3Sdanielk1977} {0} 7802b4e3b3Sdanielk1977sqlite3_enable_shared_cache $::enable_shared_cache 7902b4e3b3Sdanielk1977finish_test 80