os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/shared2.test
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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