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