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 16set testdir [file dirname $argv0] 17source $testdir/tester.tcl 18db close 19puts hello 20 21# This script is only valid if we are running shared-cache mode in a 22# threadsafe-capable database engine. 23# 24ifcapable !shared_cache||!compound { 25 finish_test 26 return 27} 28set ::enable_shared_cache [sqlite3_enable_shared_cache 1] 29 30# Prepare multiple databases in shared cache mode. 31# 32do_test shared4-1.1 { 33 forcedelete test1.db test1.db-journal 34 forcedelete test2.db test2.db-journal 35 forcedelete test3.db test3.db-journal 36 forcedelete 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} 84do_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} 92do_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} 100do_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} 108do_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} 116do_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} 124do_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} 132do_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} 140do_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} 148do_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} 156do_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} 164do_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 173do_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} 205do_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} 213do_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} 221do_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 231db1 close 232db2 close 233db3 close 234db4 close 235 236sqlite3_enable_shared_cache $::enable_shared_cache 237finish_test 238