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