Home | History | Annotate | Download | only in test
      1 # 2008 July 14
      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 # Test the btree mutex protocol for shared cache mode.
     13 #
     14 # $Id: shared4.test,v 1.2 2008/08/04 03:51:24 danielk1977 Exp $
     15 
     16 set testdir [file dirname $argv0]
     17 source $testdir/tester.tcl
     18 db close
     19 puts hello
     20 
     21 # This script is only valid if we are running shared-cache mode in a
     22 # threadsafe-capable database engine.
     23 #
     24 ifcapable !shared_cache||!compound {
     25   finish_test
     26   return
     27 }
     28 set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
     29 
     30 # Prepare multiple databases in shared cache mode.
     31 #
     32 do_test shared4-1.1 {
     33   file delete -force test1.db test1.db-journal
     34   file delete -force test2.db test2.db-journal
     35   file delete -force test3.db test3.db-journal
     36   file delete -force test4.db test4.db-journal
     37   sqlite3 db1 test1.db
     38   sqlite3 db2 test2.db
     39   sqlite3 db3 test3.db
     40   sqlite3 db4 test4.db
     41   db1 eval {
     42     CREATE TABLE t1(a);
     43     INSERT INTO t1 VALUES(111);
     44   }
     45   db2 eval {
     46     CREATE TABLE t2(b);
     47     INSERT INTO t2 VALUES(222);
     48   }
     49   db3 eval {
     50     CREATE TABLE t3(c);
     51     INSERT INTO t3 VALUES(333);
     52   }
     53   db4 eval {
     54     CREATE TABLE t4(d);
     55     INSERT INTO t4 VALUES(444);
     56   }
     57   db1 eval {
     58     ATTACH DATABASE 'test2.db' AS two;
     59     ATTACH DATABASE 'test3.db' AS three;
     60     ATTACH DATABASE 'test4.db' AS four;
     61   }
     62   db2 eval {
     63     ATTACH DATABASE 'test4.db' AS four;
     64     ATTACH DATABASE 'test3.db' AS three;
     65     ATTACH DATABASE 'test1.db' AS one;
     66   }
     67   db3 eval {
     68     ATTACH DATABASE 'test1.db' AS one;
     69     ATTACH DATABASE 'test2.db' AS two;
     70     ATTACH DATABASE 'test4.db' AS four;
     71   }
     72   db4 eval {
     73     ATTACH DATABASE 'test3.db' AS three;
     74     ATTACH DATABASE 'test2.db' AS two;
     75     ATTACH DATABASE 'test1.db' AS one;
     76   }
     77   db1 eval {
     78      SELECT a FROM t1 UNION ALL
     79      SELECT b FROM t2 UNION ALL
     80      SELECT c FROM t3 UNION ALL
     81      SELECT d FROM t4;
     82   }
     83 } {111 222 333 444}
     84 do_test shared4-1.2 {
     85   db2 eval {
     86      SELECT a FROM t1 UNION ALL
     87      SELECT b FROM t2 UNION ALL
     88      SELECT d FROM t4 UNION ALL
     89      SELECT c FROM t3;
     90   }
     91 } {111 222 444 333}
     92 do_test shared4-1.3 {
     93   db3 eval {
     94      SELECT a FROM t1 UNION ALL
     95      SELECT c FROM t3 UNION ALL
     96      SELECT b FROM t2 UNION ALL
     97      SELECT d FROM t4;
     98   }
     99 } {111 333 222 444}
    100 do_test shared4-1.4 {
    101   db4 eval {
    102      SELECT a FROM t1 UNION ALL
    103      SELECT c FROM t3 UNION ALL
    104      SELECT d FROM t4 UNION ALL
    105      SELECT b FROM t2;
    106   }
    107 } {111 333 444 222}
    108 do_test shared4-1.5 {
    109   db3 eval {
    110      SELECT a FROM t1 UNION ALL
    111      SELECT d FROM t4 UNION ALL
    112      SELECT b FROM t2 UNION ALL
    113      SELECT c FROM t3;
    114   }
    115 } {111 444 222 333}
    116 do_test shared4-1.6 {
    117   db4 eval {
    118      SELECT a FROM t1 UNION ALL
    119      SELECT d FROM t4 UNION ALL
    120      SELECT c FROM t3 UNION ALL
    121      SELECT b FROM t2;
    122   }
    123 } {111 444 333 222}
    124 do_test shared4-1.7 {
    125   db1 eval {
    126      SELECT b FROM t2 UNION ALL
    127      SELECT a FROM t1 UNION ALL
    128      SELECT c FROM t3 UNION ALL
    129      SELECT d FROM t4;
    130   }
    131 } {222 111 333 444}
    132 do_test shared4-1.8 {
    133   db2 eval {
    134      SELECT b FROM t2 UNION ALL
    135      SELECT a FROM t1 UNION ALL
    136      SELECT d FROM t4 UNION ALL
    137      SELECT c FROM t3;
    138   }
    139 } {222 111 444 333}
    140 do_test shared4-1.9 {
    141   db3 eval {
    142      SELECT b FROM t2 UNION ALL
    143      SELECT c FROM t3 UNION ALL
    144      SELECT a FROM t1 UNION ALL
    145      SELECT d FROM t4;
    146   }
    147 } {222 333 111 444}
    148 do_test shared4-1.10 {
    149   db4 eval {
    150      SELECT b FROM t2 UNION ALL
    151      SELECT c FROM t3 UNION ALL
    152      SELECT d FROM t4 UNION ALL
    153      SELECT a FROM t1;
    154   }
    155 } {222 333 444 111}
    156 do_test shared4-1.11 {
    157   db1 eval {
    158      SELECT c FROM t3 UNION ALL
    159      SELECT a FROM t1 UNION ALL
    160      SELECT b FROM t2 UNION ALL
    161      SELECT d FROM t4;
    162   }
    163 } {333 111 222 444}
    164 do_test shared4-1.12 {
    165   db2 eval {
    166      SELECT c FROM t3 UNION ALL
    167      SELECT a FROM t1 UNION ALL
    168      SELECT d FROM t4 UNION ALL
    169      SELECT b FROM t2;
    170   }
    171 } {333 111 444 222}
    172 
    173 do_test shared4-2.1 {
    174   db1 eval {
    175     UPDATE t1 SET a=a+1000;
    176     UPDATE t2 SET b=b+2000;
    177     UPDATE t3 SET c=c+3000;
    178     UPDATE t4 SET d=d+4000;
    179   }
    180   db2 eval {
    181     UPDATE t1 SET a=a+10000;
    182     UPDATE t2 SET b=b+20000;
    183     UPDATE t3 SET c=c+30000;
    184     UPDATE t4 SET d=d+40000;
    185   }
    186   db3 eval {
    187     UPDATE t1 SET a=a+100000;
    188     UPDATE t2 SET b=b+200000;
    189     UPDATE t3 SET c=c+300000;
    190     UPDATE t4 SET d=d+400000;
    191   }
    192   db4 eval {
    193     UPDATE t1 SET a=a+1000000;
    194     UPDATE t2 SET b=b+2000000;
    195     UPDATE t3 SET c=c+3000000;
    196     UPDATE t4 SET d=d+4000000;
    197   }
    198   db1 eval {
    199      SELECT a FROM t1 UNION ALL
    200      SELECT b FROM t2 UNION ALL
    201      SELECT c FROM t3 UNION ALL
    202      SELECT d FROM t4;
    203   }
    204 } {1111111 2222222 3333333 4444444}
    205 do_test shared4-2.2 {
    206   db2 eval {
    207      SELECT a FROM t1 UNION ALL
    208      SELECT b FROM t2 UNION ALL
    209      SELECT d FROM t4 UNION ALL
    210      SELECT c FROM t3;
    211   }
    212 } {1111111 2222222 4444444 3333333}
    213 do_test shared4-2.3 {
    214   db3 eval {
    215      SELECT a FROM t1 UNION ALL
    216      SELECT c FROM t3 UNION ALL
    217      SELECT b FROM t2 UNION ALL
    218      SELECT d FROM t4;
    219   }
    220 } {1111111 3333333 2222222 4444444}
    221 do_test shared4-2.4 {
    222   db4 eval {
    223      SELECT a FROM t1 UNION ALL
    224      SELECT c FROM t3 UNION ALL
    225      SELECT d FROM t4 UNION ALL
    226      SELECT b FROM t2;
    227   }
    228 } {1111111 3333333 4444444 2222222}
    229 
    230 
    231 db1 close
    232 db2 close
    233 db3 close
    234 db4 close
    235 
    236 sqlite3_enable_shared_cache $::enable_shared_cache
    237 finish_test
    238