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