github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/lock2.test (about)

     1  # 2001 September 15
     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 script is database locks between competing processes.
    13  #
    14  # $Id: lock2.test,v 1.11 2009/05/01 10:55:34 danielk1977 Exp $
    15  
    16  
    17  set testdir [file dirname $argv0]
    18  source $testdir/tester.tcl
    19  source $testdir/lock_common.tcl
    20  
    21  
    22  # Simple locking test case:
    23  #
    24  # lock2-1.1: Connect a second process to the database.
    25  # lock2-1.2: Establish a RESERVED lock with this process.
    26  # lock2-1.3: Get a SHARED lock with the second process.
    27  # lock2-1.4: Try for a RESERVED lock with process 2. This fails.
    28  # lock2-1.5: Try to upgrade the first process to EXCLUSIVE, this fails so
    29  #            it gets PENDING.
    30  # lock2-1.6: Release the SHARED lock held by the second process. 
    31  # lock2-1.7: Attempt to reaquire a SHARED lock with the second process.
    32  #            this fails due to the PENDING lock.
    33  # lock2-1.8: Ensure the first process can now upgrade to EXCLUSIVE.
    34  #
    35  do_test lock2-1.1 {
    36    set ::tf1 [launch_testfixture]
    37    testfixture $::tf1 {
    38      sqlite3 db test.db -key xyzzy
    39      db eval {select * from sqlite_master}
    40    }
    41  } {}
    42  do_test lock2-1.1.1 {
    43    execsql {pragma lock_status}
    44  } {main unlocked temp closed}
    45  sqlite3_soft_heap_limit 0
    46  do_test lock2-1.2 {
    47    execsql {
    48      BEGIN;
    49      CREATE TABLE abc(a, b, c);
    50    }
    51  } {}
    52  do_test lock2-1.3 {
    53    testfixture $::tf1 {
    54      db eval {
    55        BEGIN;
    56        SELECT * FROM sqlite_master;
    57      }
    58    }
    59  } {}
    60  do_test lock2-1.4 {
    61    testfixture $::tf1 {
    62      catch { db eval { CREATE TABLE def(d, e, f) } } msg
    63      set msg
    64    }
    65  } {database is locked}
    66  do_test lock2-1.5 {
    67    catchsql {
    68      COMMIT;
    69    }
    70  } {1 {database is locked}}
    71  do_test lock2-1.6 {
    72    testfixture $::tf1 {
    73      db eval {
    74        SELECT * FROM sqlite_master;
    75        COMMIT;
    76      }
    77    }
    78  } {}
    79  do_test lock2-1.7 {
    80    testfixture $::tf1 {
    81      catch { db eval {
    82        BEGIN;
    83        SELECT * FROM sqlite_master;
    84      } } msg 
    85      set msg
    86    }
    87  } {database is locked}
    88  do_test lock2-1.8 {
    89    catchsql {
    90      COMMIT;
    91    }
    92  } {0 {}}
    93  do_test lock2-1.9 {
    94    execsql {
    95      SELECT * FROM sqlite_master;
    96    }
    97  } "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}"
    98  catch flush_async_queue
    99  do_test lock2-1.10 {
   100    testfixture $::tf1 {
   101      db eval {
   102        SELECT * FROM sqlite_master;
   103      }
   104    }
   105  } "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}"
   106  
   107  catch {testfixture $::tf1 {db close}}
   108  catch {close $::tf1}
   109  sqlite3_soft_heap_limit $cmdlinearg(soft-heap-limit)
   110  
   111  finish_test