persistentstorage/sqlite3api/TEST/TclScript/shared2.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     1 # 2005 January 19
       
     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 # $Id: shared2.test,v 1.5 2007/08/23 02:47:54 drh Exp $
       
    13 
       
    14 set testdir [file dirname $argv0]
       
    15 source $testdir/tester.tcl
       
    16 db close
       
    17 
       
    18 ifcapable !shared_cache {
       
    19   finish_test
       
    20   return
       
    21 }
       
    22 set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
       
    23 
       
    24 # Test that if we delete all rows from a table any read-uncommitted 
       
    25 # cursors are correctly invalidated. Test on both table and index btrees.
       
    26 do_test shared2-1.1 {
       
    27   sqlite3 db1 test.db
       
    28   sqlite3 db2 test.db
       
    29 
       
    30   # Set up some data. Table "numbers" has 64 rows after this block 
       
    31   # is executed.
       
    32   execsql {
       
    33     BEGIN;
       
    34     CREATE TABLE numbers(a PRIMARY KEY, b);
       
    35     INSERT INTO numbers(oid) VALUES(NULL);
       
    36     INSERT INTO numbers(oid) SELECT NULL FROM numbers;
       
    37     INSERT INTO numbers(oid) SELECT NULL FROM numbers;
       
    38     INSERT INTO numbers(oid) SELECT NULL FROM numbers;
       
    39     INSERT INTO numbers(oid) SELECT NULL FROM numbers;
       
    40     INSERT INTO numbers(oid) SELECT NULL FROM numbers;
       
    41     INSERT INTO numbers(oid) SELECT NULL FROM numbers;
       
    42     UPDATE numbers set a = oid, b = 'abcdefghijklmnopqrstuvwxyz0123456789';
       
    43     COMMIT;
       
    44   } db1
       
    45 } {}
       
    46 do_test shared2-1.2 {
       
    47   # Put connection 2 in read-uncommitted mode and start a SELECT on table 
       
    48   # 'numbers'. Half way through the SELECT, use connection 1 to delete the
       
    49   # contents of this table.
       
    50   execsql {
       
    51     pragma read_uncommitted = 1;
       
    52   } db2
       
    53   set count [execsql {SELECT count(*) FROM numbers} db2]
       
    54   db2 eval {SELECT a FROM numbers ORDER BY oid} {
       
    55     if {$a==32} {
       
    56       execsql {
       
    57         BEGIN;
       
    58         DELETE FROM numbers;
       
    59       } db1
       
    60     }
       
    61   }
       
    62   list $a $count
       
    63 } {32 64}
       
    64 do_test shared2-1.3 {
       
    65   # Same test as 1.2, except scan using the index this time.
       
    66   execsql {
       
    67     ROLLBACK;
       
    68   } db1
       
    69   set count [execsql {SELECT count(*) FROM numbers} db2]
       
    70   db2 eval {SELECT a, b FROM numbers ORDER BY a} {
       
    71     if {$a==32} {
       
    72       execsql {
       
    73         DELETE FROM numbers;
       
    74       } db1
       
    75     }
       
    76   }
       
    77   list $a $count
       
    78 } {32 64}
       
    79 
       
    80 #---------------------------------------------------------------------------
       
    81 # These tests, shared2.2.*, test the outcome when data is added to or 
       
    82 # removed from a table due to a rollback while a read-uncommitted 
       
    83 # cursor is scanning it.
       
    84 #
       
    85 do_test shared2-2.1 {
       
    86   execsql {
       
    87     INSERT INTO numbers VALUES(1, 'Medium length text field');
       
    88     INSERT INTO numbers VALUES(2, 'Medium length text field');
       
    89     INSERT INTO numbers VALUES(3, 'Medium length text field');
       
    90     INSERT INTO numbers VALUES(4, 'Medium length text field');
       
    91     BEGIN;
       
    92     DELETE FROM numbers WHERE (a%2)=0;
       
    93   } db1
       
    94   set res [list]
       
    95   db2 eval {
       
    96     SELECT a FROM numbers ORDER BY a;
       
    97   } {
       
    98     lappend res $a
       
    99     if {$a==3} {
       
   100       execsql {ROLLBACK} db1
       
   101     }
       
   102   }
       
   103   set res
       
   104 } {1 3 4}
       
   105 do_test shared2-2.2 {
       
   106   execsql {
       
   107     BEGIN;
       
   108     INSERT INTO numbers VALUES(5, 'Medium length text field');
       
   109     INSERT INTO numbers VALUES(6, 'Medium length text field');
       
   110   } db1
       
   111   set res [list]
       
   112   db2 eval {
       
   113     SELECT a FROM numbers ORDER BY a;
       
   114   } {
       
   115     lappend res $a
       
   116     if {$a==5} {
       
   117       execsql {ROLLBACK} db1
       
   118     }
       
   119   }
       
   120   set res
       
   121 } {1 2 3 4 5}
       
   122 
       
   123 db1 close
       
   124 db2 close
       
   125 
       
   126 do_test shared2-3.2 {
       
   127   sqlite3_enable_shared_cache 1
       
   128 } {1}
       
   129 
       
   130 sqlite3_enable_shared_cache $::enable_shared_cache
       
   131 finish_test