xref: /sqlite-3.40.0/test/lock2.test (revision 0cf408ff)
1489468cfSdanielk1977# 2001 September 15
2489468cfSdanielk1977#
3489468cfSdanielk1977# The author disclaims copyright to this source code.  In place of
4489468cfSdanielk1977# a legal notice, here is a blessing:
5489468cfSdanielk1977#
6489468cfSdanielk1977#    May you do good and not evil.
7489468cfSdanielk1977#    May you find forgiveness for yourself and forgive others.
8489468cfSdanielk1977#    May you share freely, never taking more than you give.
9489468cfSdanielk1977#
10489468cfSdanielk1977#***********************************************************************
11489468cfSdanielk1977# This file implements regression tests for SQLite library.  The
12489468cfSdanielk1977# focus of this script is database locks between competing processes.
13489468cfSdanielk1977#
14ff340d8eSdanielk1977# $Id: lock2.test,v 1.11 2009/05/01 10:55:34 danielk1977 Exp $
15489468cfSdanielk1977
16489468cfSdanielk1977
17489468cfSdanielk1977set testdir [file dirname $argv0]
18489468cfSdanielk1977source $testdir/tester.tcl
19e264d983Sdansource $testdir/lock_common.tcl
20489468cfSdanielk1977
21489468cfSdanielk1977
22489468cfSdanielk1977# Simple locking test case:
23489468cfSdanielk1977#
24489468cfSdanielk1977# lock2-1.1: Connect a second process to the database.
25489468cfSdanielk1977# lock2-1.2: Establish a RESERVED lock with this process.
26489468cfSdanielk1977# lock2-1.3: Get a SHARED lock with the second process.
27489468cfSdanielk1977# lock2-1.4: Try for a RESERVED lock with process 2. This fails.
28489468cfSdanielk1977# lock2-1.5: Try to upgrade the first process to EXCLUSIVE, this fails so
29489468cfSdanielk1977#            it gets PENDING.
30489468cfSdanielk1977# lock2-1.6: Release the SHARED lock held by the second process.
31489468cfSdanielk1977# lock2-1.7: Attempt to reaquire a SHARED lock with the second process.
32489468cfSdanielk1977#            this fails due to the PENDING lock.
33489468cfSdanielk1977# lock2-1.8: Ensure the first process can now upgrade to EXCLUSIVE.
34489468cfSdanielk1977#
35489468cfSdanielk1977do_test lock2-1.1 {
36489468cfSdanielk1977  set ::tf1 [launch_testfixture]
37489468cfSdanielk1977  testfixture $::tf1 {
3825d6543dSdrh    sqlite3 db test.db -key xyzzy
39489468cfSdanielk1977    db eval {select * from sqlite_master}
40489468cfSdanielk1977  }
41489468cfSdanielk1977} {}
42a67367e7Sdrhdo_test lock2-1.1.1 {
43a67367e7Sdrh  execsql {pragma lock_status}
44a67367e7Sdrh} {main unlocked temp closed}
453aefabafSdrhsqlite3_soft_heap_limit 0
46489468cfSdanielk1977do_test lock2-1.2 {
47489468cfSdanielk1977  execsql {
48489468cfSdanielk1977    BEGIN;
49489468cfSdanielk1977    CREATE TABLE abc(a, b, c);
50489468cfSdanielk1977  }
51489468cfSdanielk1977} {}
52489468cfSdanielk1977do_test lock2-1.3 {
53489468cfSdanielk1977  testfixture $::tf1 {
54489468cfSdanielk1977    db eval {
55489468cfSdanielk1977      BEGIN;
56489468cfSdanielk1977      SELECT * FROM sqlite_master;
57489468cfSdanielk1977    }
58489468cfSdanielk1977  }
59489468cfSdanielk1977} {}
60489468cfSdanielk1977do_test lock2-1.4 {
61489468cfSdanielk1977  testfixture $::tf1 {
622fce9ab3Sdan    catch { db eval { CREATE TABLE def(d, e, f) } } msg
632fce9ab3Sdan    set msg
64489468cfSdanielk1977  }
65489468cfSdanielk1977} {database is locked}
66489468cfSdanielk1977do_test lock2-1.5 {
67489468cfSdanielk1977  catchsql {
68489468cfSdanielk1977    COMMIT;
69489468cfSdanielk1977  }
70489468cfSdanielk1977} {1 {database is locked}}
71489468cfSdanielk1977do_test lock2-1.6 {
72489468cfSdanielk1977  testfixture $::tf1 {
73489468cfSdanielk1977    db eval {
74489468cfSdanielk1977      SELECT * FROM sqlite_master;
75489468cfSdanielk1977      COMMIT;
76489468cfSdanielk1977    }
77489468cfSdanielk1977  }
78489468cfSdanielk1977} {}
79489468cfSdanielk1977do_test lock2-1.7 {
80489468cfSdanielk1977  testfixture $::tf1 {
812fce9ab3Sdan    catch { db eval {
82489468cfSdanielk1977      BEGIN;
83489468cfSdanielk1977      SELECT * FROM sqlite_master;
842fce9ab3Sdan    } } msg
852fce9ab3Sdan    set msg
86489468cfSdanielk1977  }
87489468cfSdanielk1977} {database is locked}
88489468cfSdanielk1977do_test lock2-1.8 {
89489468cfSdanielk1977  catchsql {
90489468cfSdanielk1977    COMMIT;
91489468cfSdanielk1977  }
92489468cfSdanielk1977} {0 {}}
93489468cfSdanielk1977do_test lock2-1.9 {
94489468cfSdanielk1977  execsql {
95489468cfSdanielk1977    SELECT * FROM sqlite_master;
96489468cfSdanielk1977  }
9745901d62Sdanielk1977} "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}"
98*0cf408ffSdancatch flush_async_queue
99489468cfSdanielk1977do_test lock2-1.10 {
100489468cfSdanielk1977  testfixture $::tf1 {
101489468cfSdanielk1977    db eval {
102489468cfSdanielk1977      SELECT * FROM sqlite_master;
103489468cfSdanielk1977    }
104489468cfSdanielk1977  }
10545901d62Sdanielk1977} "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}"
106489468cfSdanielk1977
1072ec81649Sdrhcatch {testfixture $::tf1 {db close}}
1082ec81649Sdrhcatch {close $::tf1}
109c1a60c51Sdansqlite3_soft_heap_limit $cmdlinearg(soft-heap-limit)
110489468cfSdanielk1977
1112ec81649Sdrhfinish_test
112