xref: /sqlite-3.40.0/test/thread001.test (revision 9c5e1e40)
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