164b1bea3Sdrh# 2006 January 14 264b1bea3Sdrh# 364b1bea3Sdrh# The author disclaims copyright to this source code. In place of 464b1bea3Sdrh# a legal notice, here is a blessing: 564b1bea3Sdrh# 664b1bea3Sdrh# May you do good and not evil. 764b1bea3Sdrh# May you find forgiveness for yourself and forgive others. 864b1bea3Sdrh# May you share freely, never taking more than you give. 964b1bea3Sdrh# 1064b1bea3Sdrh#*********************************************************************** 1164b1bea3Sdrh# This file implements regression tests for SQLite library. The 1264b1bea3Sdrh# focus of this script is multithreading behavior 1364b1bea3Sdrh# 1418472fa7Sdrh# $Id: thread2.test,v 1.3 2008/10/07 15:25:49 drh Exp $ 1564b1bea3Sdrh 1664b1bea3Sdrh 1764b1bea3Sdrhset testdir [file dirname $argv0] 1864b1bea3Sdrhsource $testdir/tester.tcl 1964b1bea3Sdrh 20*fe98f9b2Sdanif {[run_thread_tests]==0} { finish_test ; return } 21e7823cb5Sdanielk1977 2264b1bea3Sdrh# Skip this whole file if the thread testing code is not enabled 2364b1bea3Sdrh# 2464b1bea3Sdrhif {[llength [info command thread_step]]==0 || [sqlite3 -has-codec]} { 2564b1bea3Sdrh finish_test 2664b1bea3Sdrh return 2764b1bea3Sdrh} 2864b1bea3Sdrh 2964b1bea3Sdrh# Create some data to work with 3064b1bea3Sdrh# 3164b1bea3Sdrhdo_test thread1-1.1 { 3264b1bea3Sdrh execsql { 3364b1bea3Sdrh CREATE TABLE t1(a,b); 3464b1bea3Sdrh INSERT INTO t1 VALUES(1,'abcdefgh'); 3564b1bea3Sdrh INSERT INTO t1 SELECT a+1, b||b FROM t1; 3664b1bea3Sdrh INSERT INTO t1 SELECT a+2, b||b FROM t1; 3764b1bea3Sdrh INSERT INTO t1 SELECT a+4, b||b FROM t1; 3864b1bea3Sdrh SELECT count(*), max(length(b)) FROM t1; 3964b1bea3Sdrh } 4064b1bea3Sdrh} {8 64} 4164b1bea3Sdrh 4264b1bea3Sdrh# Use the thread_swap command to move the database connections between 4364b1bea3Sdrh# threads, then verify that they still work. 4464b1bea3Sdrh# 4564b1bea3Sdrhdo_test thread2-1.2 { 4664b1bea3Sdrh db close 4764b1bea3Sdrh thread_create A test.db 4864b1bea3Sdrh thread_create B test.db 4964b1bea3Sdrh thread_swap A B 5064b1bea3Sdrh thread_compile A {SELECT a FROM t1 LIMIT 1} 5164b1bea3Sdrh thread_result A 5264b1bea3Sdrh} {SQLITE_OK} 5364b1bea3Sdrhdo_test thread2-1.3 { 5464b1bea3Sdrh thread_step A 5564b1bea3Sdrh thread_result A 5664b1bea3Sdrh} {SQLITE_ROW} 5764b1bea3Sdrhdo_test thread2-1.4 { 5864b1bea3Sdrh thread_argv A 0 5964b1bea3Sdrh} {1} 6064b1bea3Sdrhdo_test thread2-1.5 { 6164b1bea3Sdrh thread_finalize A 6264b1bea3Sdrh thread_result A 6364b1bea3Sdrh} {SQLITE_OK} 6464b1bea3Sdrhdo_test thread2-1.6 { 6564b1bea3Sdrh thread_compile B {SELECT a FROM t1 LIMIT 1} 6664b1bea3Sdrh thread_result B 6764b1bea3Sdrh} {SQLITE_OK} 6864b1bea3Sdrhdo_test thread2-1.7 { 6964b1bea3Sdrh thread_step B 7064b1bea3Sdrh thread_result B 7164b1bea3Sdrh} {SQLITE_ROW} 7264b1bea3Sdrhdo_test thread2-1.8 { 7364b1bea3Sdrh thread_argv B 0 7464b1bea3Sdrh} {1} 7564b1bea3Sdrhdo_test thread2-1.9 { 7664b1bea3Sdrh thread_finalize B 7764b1bea3Sdrh thread_result B 7864b1bea3Sdrh} {SQLITE_OK} 7964b1bea3Sdrh 8064b1bea3Sdrh# Swap them again. 8164b1bea3Sdrh# 8264b1bea3Sdrhdo_test thread2-2.2 { 8364b1bea3Sdrh thread_swap A B 8464b1bea3Sdrh thread_compile A {SELECT a FROM t1 LIMIT 1} 8564b1bea3Sdrh thread_result A 8664b1bea3Sdrh} {SQLITE_OK} 8764b1bea3Sdrhdo_test thread2-2.3 { 8864b1bea3Sdrh thread_step A 8964b1bea3Sdrh thread_result A 9064b1bea3Sdrh} {SQLITE_ROW} 9164b1bea3Sdrhdo_test thread2-2.4 { 9264b1bea3Sdrh thread_argv A 0 9364b1bea3Sdrh} {1} 9464b1bea3Sdrhdo_test thread2-2.5 { 9564b1bea3Sdrh thread_finalize A 9664b1bea3Sdrh thread_result A 9764b1bea3Sdrh} {SQLITE_OK} 9864b1bea3Sdrhdo_test thread2-2.6 { 9964b1bea3Sdrh thread_compile B {SELECT a FROM t1 LIMIT 1} 10064b1bea3Sdrh thread_result B 10164b1bea3Sdrh} {SQLITE_OK} 10264b1bea3Sdrhdo_test thread2-2.7 { 10364b1bea3Sdrh thread_step B 10464b1bea3Sdrh thread_result B 10564b1bea3Sdrh} {SQLITE_ROW} 10664b1bea3Sdrhdo_test thread2-2.8 { 10764b1bea3Sdrh thread_argv B 0 10864b1bea3Sdrh} {1} 10964b1bea3Sdrhdo_test thread2-2.9 { 11064b1bea3Sdrh thread_finalize B 11164b1bea3Sdrh thread_result B 11264b1bea3Sdrh} {SQLITE_OK} 11364b1bea3Sdrhthread_halt A 11464b1bea3Sdrhthread_halt B 11564b1bea3Sdrh 11664b1bea3Sdrh# Also important to halt the worker threads, which are using spin 11764b1bea3Sdrh# locks and eating away CPU cycles. 11864b1bea3Sdrh# 11964b1bea3Sdrhthread_halt * 12064b1bea3Sdrhfinish_test 121