16b63ab47Sdan# 2010 June 30 26b63ab47Sdan# 36b63ab47Sdan# The author disclaims copyright to this source code. In place of 46b63ab47Sdan# a legal notice, here is a blessing: 56b63ab47Sdan# 66b63ab47Sdan# May you do good and not evil. 76b63ab47Sdan# May you find forgiveness for yourself and forgive others. 86b63ab47Sdan# May you share freely, never taking more than you give. 96b63ab47Sdan# 106b63ab47Sdan#*********************************************************************** 116b63ab47Sdan# This file implements regression tests for SQLite library. The 126b63ab47Sdan# focus of this file is testing the sqlite3_unlock_notify() API. 136b63ab47Sdan# 146b63ab47Sdan 156b63ab47Sdanset testdir [file dirname $argv0] 166b63ab47Sdansource $testdir/tester.tcl 176b63ab47Sdan 1884b96182Sdan# This script only runs if shared-cache and unlock-notify are available. 1984b96182Sdan# 2084b96182Sdanifcapable !unlock_notify||!shared_cache { 2184b96182Sdan finish_test 2284b96182Sdan return 2384b96182Sdan} 2484b96182Sdan 256b63ab47Sdanset esc [sqlite3_enable_shared_cache 1] 266b63ab47Sdan 276b63ab47Sdansqlite3 db test.db 28*fda06befSmistachkinforcedelete test.db2 test.db2-journal test.db2-wal 296b63ab47Sdansqlite3 db2 test.db2 306b63ab47Sdan 316b63ab47Sdando_test notify3-1.1 { 326b63ab47Sdan execsql { 336b63ab47Sdan CREATE TABLE t1(a, b); 346b63ab47Sdan INSERT INTO t1 VALUES('t1 A', 't1 B'); 356b63ab47Sdan } 366b63ab47Sdan} {} 376b63ab47Sdando_test notify3-1.2 { 386b63ab47Sdan execsql { 396b63ab47Sdan CREATE TABLE t2(a, b); 406b63ab47Sdan INSERT INTO t2 VALUES('t2 A', 't2 B'); 416b63ab47Sdan } db2 426b63ab47Sdan} {} 436b63ab47Sdan 446b63ab47Sdando_test notify3-1.3 { 456b63ab47Sdan execsql { 466b63ab47Sdan BEGIN EXCLUSIVE; 476b63ab47Sdan INSERT INTO t2 VALUES('t2 C', 't2 D'); 486b63ab47Sdan } db2 496b63ab47Sdan} {} 506b63ab47Sdando_test notify3-1.4 { 516b63ab47Sdan catchsql { ATTACH 'test.db2' AS aux } 526b63ab47Sdan} {0 {}} 539859c427Sdan 546b63ab47Sdando_test notify3-1.5 { 556b63ab47Sdan catchsql { SELECT * FROM t2 } 566b63ab47Sdan} {1 {database schema is locked: aux}} 576b63ab47Sdan 586b63ab47Sdando_test notify3-1.6 { 596b63ab47Sdan list [sqlite3_errcode db] [sqlite3_extended_errcode db] 606b63ab47Sdan} {SQLITE_LOCKED SQLITE_LOCKED_SHAREDCACHE} 616b63ab47Sdan 626b63ab47Sdando_test notify3-1.7 { 636b63ab47Sdan sqlite3_extended_result_codes db 1 646b63ab47Sdan catch { set ::stmt [sqlite3_prepare_v2 db "SELECT * FROM t2" -1 tail] } msg 656b63ab47Sdan set msg 666b63ab47Sdan} {(262) database schema is locked: aux} 676b63ab47Sdan 686b63ab47Sdando_test notify3-1.8 { 696b63ab47Sdan set ::when 1 706b63ab47Sdan db unlock_notify { set ::res $::when } 716b63ab47Sdan set ::when 2 726b63ab47Sdan execsql { COMMIT } db2 736b63ab47Sdan set ::res 746b63ab47Sdan} {2} 756b63ab47Sdando_test notify3-1.9 { 766b63ab47Sdan catchsql { SELECT * FROM t2 } 776b63ab47Sdan} {0 {{t2 A} {t2 B} {t2 C} {t2 D}}} 789859c427Sdandb close 799859c427Sdan 809859c427Sdan 819859c427Sdanset err {{1 {unable to open database: test.db2}}} 829859c427Sdanset noerr {{0 {}}} 839859c427Sdan 849859c427Sdan# When a new database is attached, the connection doing the attaching 859859c427Sdan# tries to load any unloaded schemas for both the new database and any 869859c427Sdan# already attached databases (including the main database). If it is 879859c427Sdan# unable to load any such schemas, then the ATTACH statement fails. 889859c427Sdan# 899859c427Sdan# This block tests that if the loading of schemas as a result of an 909859c427Sdan# ATTACH fails due to locks on the schema table held by other shared-cache 919859c427Sdan# connections the extended error code is SQLITE_LOCKED_SHAREDCACHE and 929859c427Sdan# it is possible to use the unlock-notify mechanism to determine when 939859c427Sdan# the ATTACH might succeed. 949859c427Sdan# 95cb79e513Sdan# This test does not work for test-permutations that specify SQL to 96cb79e513Sdan# be executed as part of the [sqlite3] command that opens the database. 97cb79e513Sdan# Executing such SQL causes SQLite to load the database schema into memory 98cb79e513Sdan# earlier than expected, causing test cases to fail. 99cb79e513Sdan# 100cb79e513Sdanif {[presql] == ""} { 1019859c427Sdan foreach { 1029859c427Sdan tn 1039859c427Sdan db1_loaded 1049859c427Sdan db2_loaded 1059859c427Sdan enable_extended_errors 1069859c427Sdan result 1079859c427Sdan error1 error2 1089859c427Sdan } " 1099859c427Sdan 0 0 0 0 $err SQLITE_LOCKED SQLITE_LOCKED_SHAREDCACHE 1109859c427Sdan 1 0 0 1 $err SQLITE_LOCKED_SHAREDCACHE SQLITE_LOCKED_SHAREDCACHE 1119859c427Sdan 2 0 1 0 $err SQLITE_LOCKED SQLITE_LOCKED_SHAREDCACHE 1129859c427Sdan 3 0 1 1 $err SQLITE_LOCKED_SHAREDCACHE SQLITE_LOCKED_SHAREDCACHE 1139859c427Sdan 4 1 0 0 $err SQLITE_LOCKED SQLITE_LOCKED_SHAREDCACHE 1149859c427Sdan 5 1 0 1 $err SQLITE_LOCKED_SHAREDCACHE SQLITE_LOCKED_SHAREDCACHE 1159859c427Sdan 6 1 1 0 $noerr SQLITE_OK SQLITE_OK 1169859c427Sdan 7 1 1 1 $noerr SQLITE_OK SQLITE_OK 1179859c427Sdan " { 1189859c427Sdan 1199859c427Sdan do_test notify3-2.$tn.1 { 1209859c427Sdan catch { db1 close } 1219859c427Sdan catch { db2 close } 1229859c427Sdan sqlite3 db1 test.db 1239859c427Sdan sqlite3 db2 test.db2 1249859c427Sdan 1259859c427Sdan sqlite3_extended_result_codes db1 $enable_extended_errors 1269859c427Sdan sqlite3_extended_result_codes db2 $enable_extended_errors 1279859c427Sdan 1289859c427Sdan if { $db1_loaded } { db1 eval "SELECT * FROM sqlite_master" } 1299859c427Sdan if { $db2_loaded } { db2 eval "SELECT * FROM sqlite_master" } 1309859c427Sdan 1319859c427Sdan db2 eval "BEGIN EXCLUSIVE" 1329859c427Sdan catchsql "ATTACH 'test.db2' AS two" db1 1339859c427Sdan } $result 1349859c427Sdan 1359859c427Sdan do_test notify3-2.$tn.2 { 1369859c427Sdan list [sqlite3_errcode db1] [sqlite3_extended_errcode db1] 1379859c427Sdan } [list $error1 $error2] 1389859c427Sdan 1399859c427Sdan do_test notify3-2.$tn.3 { 1409859c427Sdan db1 unlock_notify {set invoked 1} 1419859c427Sdan set invoked 0 1429859c427Sdan db2 eval commit 1439859c427Sdan set invoked 1449859c427Sdan } [lindex $result 0] 1459859c427Sdan } 146cb79e513Sdan} 1479859c427Sdancatch { db1 close } 1489859c427Sdancatch { db2 close } 1499859c427Sdan 1506b63ab47Sdan 1516b63ab47Sdansqlite3_enable_shared_cache $esc 1526b63ab47Sdanfinish_test 153