xref: /sqlite-3.40.0/test/notify3.test (revision 5822d6fe)
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