xref: /sqlite-3.40.0/test/thread2.test (revision fe98f9b2)
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