Home | History | Annotate | Download | only in test
      1 # 2008 May 2
      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 #
     12 # Ticket #3093
     13 #
     14 # Verify that a busy callback waiting on a reserved lock resolves
     15 # once the lock clears.
     16 #
     17 # $Id: tkt3093.test,v 1.2 2008/05/02 14:23:55 drh Exp $
     18 #
     19 
     20 set testdir [file dirname $argv0]
     21 source $testdir/tester.tcl
     22 
     23 # Set up a test database
     24 #
     25 do_test tkt3093.1 {
     26   db eval {
     27     CREATE TABLE t1(x);
     28     INSERT INTO t1 VALUES(1);
     29     SELECT * FROM t1
     30   }
     31 } {1}
     32 
     33 # Establish a separate, independent connection to that database.
     34 #
     35 do_test tkt3093.2 {
     36   catch {sqlite3_enable_shared_cache 0}
     37   sqlite3 db2 test.db
     38   db2 eval {
     39     SELECT * FROM t1
     40   }
     41 } {1}
     42 
     43 # Make sure that clearing a lock allows a pending request for
     44 # a reserved lock to continue.
     45 #
     46 do_test tkt3093.3 {
     47   # This will be the busy callback for connection db2.  On the first
     48   # busy callback, commit the transaction in db.  This should clear
     49   # the lock so that there should not be a second callback.  If the
     50   # busy handler is called a second time, then fail so that we get
     51   # timeout.
     52   proc busy_callback {cnt} {
     53     if {$cnt==0} {
     54       db eval COMMIT
     55       return 0
     56     } else {
     57       return 1
     58     }
     59   }
     60   db2 busy ::busy_callback
     61 
     62   # Start a write transaction on db.
     63   db eval {
     64      BEGIN;
     65      INSERT INTO t1 VALUES(2);
     66   }
     67 
     68   # Attempt to modify the database on db2
     69   catchsql {
     70      UPDATE t1 SET x=x+1;
     71   } db2
     72 } {0 {}}
     73 
     74 # Verify that everything worked as expected.  The db transaction should
     75 # have gone first and added entry 2.  Then the db2 transaction would have
     76 # run and added one to each entry.
     77 #
     78 do_test tkt3093.4 {
     79   db eval {SELECT * FROM t1}
     80 } {2 3}
     81 do_test tkt3093.5 {
     82   db2 eval {SELECT * FROM t1}
     83 } {2 3}
     84 db2 close
     85 
     86 finish_test
     87