Annotation of embedaddon/sqlite3/test/notify3.test, revision 1.1

1.1     ! misho       1: # 2010 June 30
        !             2: #
        !             3: # The author disclaims copyright to this source code.  In place of
        !             4: # a legal notice, here is a blessing:
        !             5: #
        !             6: #    May you do good and not evil.
        !             7: #    May you find forgiveness for yourself and forgive others.
        !             8: #    May you share freely, never taking more than you give.
        !             9: #
        !            10: #***********************************************************************
        !            11: # This file implements regression tests for SQLite library.  The
        !            12: # focus of this file is testing the sqlite3_unlock_notify() API.
        !            13: #
        !            14: 
        !            15: set testdir [file dirname $argv0]
        !            16: source $testdir/tester.tcl
        !            17: 
        !            18: # This script only runs if shared-cache and unlock-notify are available.
        !            19: #
        !            20: ifcapable !unlock_notify||!shared_cache { 
        !            21:   finish_test 
        !            22:   return 
        !            23: }
        !            24: 
        !            25: set esc [sqlite3_enable_shared_cache 1]
        !            26: 
        !            27: sqlite3 db  test.db
        !            28: forcedelete test.db2 test.db2-journal test.db2-wal
        !            29: sqlite3 db2 test.db2
        !            30: 
        !            31: do_test notify3-1.1 {
        !            32:   execsql { 
        !            33:     CREATE TABLE t1(a, b); 
        !            34:     INSERT INTO t1 VALUES('t1 A', 't1 B');
        !            35:   }
        !            36: } {}
        !            37: do_test notify3-1.2 {
        !            38:   execsql { 
        !            39:     CREATE TABLE t2(a, b);
        !            40:     INSERT INTO t2 VALUES('t2 A', 't2 B');
        !            41:   } db2
        !            42: } {}
        !            43: 
        !            44: do_test notify3-1.3 {
        !            45:   execsql { 
        !            46:     BEGIN EXCLUSIVE;
        !            47:     INSERT INTO t2 VALUES('t2 C', 't2 D');
        !            48:   } db2
        !            49: } {}
        !            50: do_test notify3-1.4 {
        !            51:   catchsql { ATTACH 'test.db2' AS aux }
        !            52: } {0 {}}
        !            53: 
        !            54: do_test notify3-1.5 {
        !            55:   catchsql { SELECT * FROM t2 }
        !            56: } {1 {database schema is locked: aux}}
        !            57: 
        !            58: do_test notify3-1.6 {
        !            59:   list [sqlite3_errcode db] [sqlite3_extended_errcode db]
        !            60: } {SQLITE_LOCKED SQLITE_LOCKED_SHAREDCACHE}
        !            61: 
        !            62: do_test notify3-1.7 {
        !            63:   sqlite3_extended_result_codes db 1
        !            64:   catch { set ::stmt [sqlite3_prepare_v2 db "SELECT * FROM t2" -1 tail] } msg
        !            65:   set msg
        !            66: } {(262) database schema is locked: aux}
        !            67: 
        !            68: do_test notify3-1.8 {
        !            69:   set ::when 1
        !            70:   db unlock_notify { set ::res $::when }
        !            71:   set ::when 2
        !            72:   execsql { COMMIT } db2
        !            73:   set ::res
        !            74: } {2}
        !            75: do_test notify3-1.9 {
        !            76:   catchsql { SELECT * FROM t2 }
        !            77: } {0 {{t2 A} {t2 B} {t2 C} {t2 D}}}
        !            78: db close
        !            79: 
        !            80: 
        !            81: set err   {{1 {unable to open database: test.db2}}}
        !            82: set noerr {{0 {}}}
        !            83: 
        !            84: # When a new database is attached, the connection doing the attaching 
        !            85: # tries to load any unloaded schemas for both the new database and any
        !            86: # already attached databases (including the main database). If it is
        !            87: # unable to load any such schemas, then the ATTACH statement fails.
        !            88: #
        !            89: # This block tests that if the loading of schemas as a result of an
        !            90: # ATTACH fails due to locks on the schema table held by other shared-cache
        !            91: # connections the extended error code is SQLITE_LOCKED_SHAREDCACHE and
        !            92: # it is possible to use the unlock-notify mechanism to determine when
        !            93: # the ATTACH might succeed.
        !            94: #
        !            95: # This test does not work for test-permutations that specify SQL to
        !            96: # be executed as part of the [sqlite3] command that opens the database.
        !            97: # Executing such SQL causes SQLite to load the database schema into memory 
        !            98: # earlier than expected, causing test cases to fail.
        !            99: #
        !           100: if {[presql] == ""} {
        !           101:   foreach {
        !           102:     tn
        !           103:     db1_loaded
        !           104:     db2_loaded
        !           105:     enable_extended_errors
        !           106:     result
        !           107:     error1 error2
        !           108:   } "
        !           109:     0   0 0 0   $err     SQLITE_LOCKED               SQLITE_LOCKED_SHAREDCACHE
        !           110:     1   0 0 1   $err     SQLITE_LOCKED_SHAREDCACHE   SQLITE_LOCKED_SHAREDCACHE
        !           111:     2   0 1 0   $err     SQLITE_LOCKED               SQLITE_LOCKED_SHAREDCACHE
        !           112:     3   0 1 1   $err     SQLITE_LOCKED_SHAREDCACHE   SQLITE_LOCKED_SHAREDCACHE
        !           113:     4   1 0 0   $err     SQLITE_LOCKED               SQLITE_LOCKED_SHAREDCACHE
        !           114:     5   1 0 1   $err     SQLITE_LOCKED_SHAREDCACHE   SQLITE_LOCKED_SHAREDCACHE
        !           115:     6   1 1 0   $noerr   SQLITE_OK                   SQLITE_OK
        !           116:     7   1 1 1   $noerr   SQLITE_OK                   SQLITE_OK
        !           117:   " {
        !           118:   
        !           119:     do_test notify3-2.$tn.1 {
        !           120:       catch { db1 close }
        !           121:       catch { db2 close }
        !           122:       sqlite3 db1 test.db
        !           123:       sqlite3 db2 test.db2
        !           124:   
        !           125:       sqlite3_extended_result_codes db1 $enable_extended_errors
        !           126:       sqlite3_extended_result_codes db2 $enable_extended_errors
        !           127:   
        !           128:       if { $db1_loaded } { db1 eval "SELECT * FROM sqlite_master" }
        !           129:       if { $db2_loaded } { db2 eval "SELECT * FROM sqlite_master" }
        !           130:   
        !           131:       db2 eval "BEGIN EXCLUSIVE"
        !           132:       catchsql "ATTACH 'test.db2' AS two" db1
        !           133:     } $result
        !           134:   
        !           135:     do_test notify3-2.$tn.2 {
        !           136:       list [sqlite3_errcode db1] [sqlite3_extended_errcode db1]
        !           137:     } [list $error1 $error2]
        !           138:   
        !           139:     do_test notify3-2.$tn.3 {
        !           140:       db1 unlock_notify {set invoked 1}
        !           141:       set invoked 0
        !           142:       db2 eval commit
        !           143:       set invoked
        !           144:     } [lindex $result 0]
        !           145:   }
        !           146: }
        !           147: catch { db1 close }
        !           148: catch { db2 close }
        !           149: 
        !           150: 
        !           151: sqlite3_enable_shared_cache $esc
        !           152: finish_test
        !           153: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>