xref: /sqlite-3.40.0/test/multiplex.test (revision 37bbcb48)
18a922f75Sshaneh# 2010 October 29
28a922f75Sshaneh#
38a922f75Sshaneh# The author disclaims copyright to this source code.  In place of
48a922f75Sshaneh# a legal notice, here is a blessing:
58a922f75Sshaneh#
68a922f75Sshaneh#    May you do good and not evil.
78a922f75Sshaneh#    May you find forgiveness for yourself and forgive others.
88a922f75Sshaneh#    May you share freely, never taking more than you give.
98a922f75Sshaneh#
108a922f75Sshaneh#***********************************************************************
118a922f75Sshaneh#
128a922f75Sshaneh
138a922f75Sshanehset testdir [file dirname $argv0]
148a922f75Sshanehsource $testdir/tester.tcl
158a922f75Sshanehsource $testdir/malloc_common.tcl
168a922f75Sshaneh
17658dd586Sdrh# The tests in this file assume that SQLite is compiled without
18658dd586Sdrh# ENABLE_8_3_NAMES.
19658dd586Sdrh#
20658dd586Sdrhifcapable 8_3_names {
21658dd586Sdrh  puts -nonewline "SQLite compiled with SQLITE_ENABLE_8_3_NAMES. "
22658dd586Sdrh  puts            "Skipping tests multiplex-*."
23658dd586Sdrh  finish_test
24658dd586Sdrh  return
25658dd586Sdrh}
26658dd586Sdrh
27c27fa4b0Sshanehset g_chunk_size [ expr ($::SQLITE_MAX_PAGE_SIZE*16384) ]
28b5830294Sshanehset g_max_chunks 32
29b5830294Sshaneh
30050d09abSshaneh# This handles appending the chunk number
31050d09abSshaneh# to the end of the filename.  if
32050d09abSshaneh# SQLITE_MULTIPLEX_EXT_OVWR is defined, then
33050d09abSshaneh# it overwrites the last 2 bytes of the
34050d09abSshaneh# file name with the chunk number.
35050d09abSshanehproc multiplex_name {name chunk} {
36050d09abSshaneh  if {$chunk==0} { return $name }
37658dd586Sdrh  set num [format "%03d" $chunk]
38050d09abSshaneh  ifcapable {multiplex_ext_overwrite} {
39050d09abSshaneh    set name [string range $name 0 [expr [string length $name]-2-1]]
40050d09abSshaneh  }
41050d09abSshaneh  return $name$num
42050d09abSshaneh}
43050d09abSshaneh
44050d09abSshaneh# This saves off the parameters and calls the
45d50deeebSshaneh# underlying sqlite3_multiplex_control() API.
46d50deeebSshanehproc multiplex_set {db name chunk_size max_chunks} {
47b5830294Sshaneh  global g_chunk_size
48b5830294Sshaneh  global g_max_chunks
4978c4de4cSshaneh  set g_chunk_size [ expr (($chunk_size+($::SQLITE_MAX_PAGE_SIZE-1)) & ~($::SQLITE_MAX_PAGE_SIZE-1)) ]
50b5830294Sshaneh  set g_max_chunks $max_chunks
51d50deeebSshaneh  set rc [catch {sqlite3_multiplex_control $db $name chunk_size $chunk_size} msg]
52d50deeebSshaneh  if { $rc==0 } {
53d50deeebSshaneh    set rc [catch {sqlite3_multiplex_control $db $name max_chunks $max_chunks} msg]
54d50deeebSshaneh  }
55d50deeebSshaneh  list $msg
56b5830294Sshaneh}
57b5830294Sshaneh
58050d09abSshaneh# This attempts to delete the base file and
59050d09abSshaneh# and files with the chunk extension.
608a922f75Sshanehproc multiplex_delete {name} {
61b5830294Sshaneh  global g_max_chunks
62f3717af4Sdrh  forcedelete $name
63050d09abSshaneh  for {set i 0} {$i<$g_max_chunks} {incr i} {
64050d09abSshaneh    forcedelete [multiplex_name $name $i]
65050d09abSshaneh    forcedelete [multiplex_name $name-journal $i]
66050d09abSshaneh    forcedelete [multiplex_name $name-wal $i]
678a922f75Sshaneh  }
688a922f75Sshaneh}
698a922f75Sshaneh
708a922f75Sshanehdb close
71a1a8298cSdrhsqlite3_shutdown
72a1a8298cSdrhtest_sqlite3_log xLog
73a1a8298cSdrhproc xLog {error_code msg} {
74a1a8298cSdrh  lappend ::log $error_code $msg
75a1a8298cSdrh}
76a1a8298cSdrhunset -nocomplain log
778a922f75Sshaneh
78f5913a27Sshanehmultiplex_delete test.db
79f5913a27Sshanehmultiplex_delete test2.db
80f5913a27Sshaneh
81fd1552f2Sshaneh#-------------------------------------------------------------------------
82fd1552f2Sshaneh#   multiplex-1.1.*: Test initialize and shutdown.
83fd1552f2Sshaneh
848a922f75Sshanehdo_test multiplex-1.1 { sqlite3_multiplex_initialize nosuchvfs 1 } {SQLITE_ERROR}
858a922f75Sshanehdo_test multiplex-1.2 { sqlite3_multiplex_initialize "" 1 }        {SQLITE_OK}
868a922f75Sshanehdo_test multiplex-1.3 { sqlite3_multiplex_initialize "" 1 }        {SQLITE_MISUSE}
878a922f75Sshanehdo_test multiplex-1.4 { sqlite3_multiplex_shutdown }               {SQLITE_OK}
888a922f75Sshaneh
898a922f75Sshanehdo_test multiplex-1.5 { sqlite3_multiplex_initialize "" 0 }        {SQLITE_OK}
908a922f75Sshanehdo_test multiplex-1.6 { sqlite3_multiplex_shutdown }               {SQLITE_OK}
918a922f75Sshanehdo_test multiplex-1.7 { sqlite3_multiplex_initialize "" 1 }        {SQLITE_OK}
928a922f75Sshanehdo_test multiplex-1.8 { sqlite3_multiplex_shutdown }               {SQLITE_OK}
938a922f75Sshaneh
94c27fa4b0Sshaneh
9578c4de4cSshanehdo_test multiplex-1.9.1  { sqlite3_multiplex_initialize "" 1 }     {SQLITE_OK}
9678c4de4cSshanehdo_test multiplex-1.9.2  { sqlite3 db test.db }                    {}
9778c4de4cSshanehdo_test multiplex-1.9.3  { multiplex_set db main 32768 16 }        {SQLITE_OK}
98f3717af4Sdrhdo_test multiplex-1.9.4  { multiplex_set db main 32768 -1 }        {SQLITE_OK}
9978c4de4cSshanehdo_test multiplex-1.9.6  { multiplex_set db main 31 16 }           {SQLITE_OK}
100f3717af4Sdrhdo_test multiplex-1.9.7  { multiplex_set db main 32768 100 }       {SQLITE_OK}
101c27fa4b0Sshanehdo_test multiplex-1.9.8  { multiplex_set db main 1073741824 1 }    {SQLITE_OK}
102c27fa4b0Sshanehdo_test multiplex-1.9.9  { db close }                              {}
103c27fa4b0Sshanehdo_test multiplex-1.9.10 { sqlite3_multiplex_shutdown }            {SQLITE_OK}
10478c4de4cSshaneh
10578c4de4cSshanehdo_test multiplex-1.10.1  { sqlite3_multiplex_initialize "" 1 }                                  {SQLITE_OK}
10678c4de4cSshanehdo_test multiplex-1.10.2  { sqlite3 db test.db }                                                 {}
1073801b65dSshanehdo_test multiplex-1.10.3  { lindex [ catchsql { SELECT multiplex_control(2, 32768); } ] 0 }      {0}
108f3717af4Sdrhdo_test multiplex-1.10.4  { lindex [ catchsql { SELECT multiplex_control(3, -1); } ] 0 }         {0}
1093801b65dSshanehdo_test multiplex-1.10.6  { lindex [ catchsql { SELECT multiplex_control(2, 31); } ] 0 }         {0}
110f3717af4Sdrhdo_test multiplex-1.10.7  { lindex [ catchsql { SELECT multiplex_control(3, 100); } ] 0 }        {0}
1113801b65dSshanehdo_test multiplex-1.10.8  { lindex [ catchsql { SELECT multiplex_control(2, 1073741824); } ] 0 } {0}
112c27fa4b0Sshanehdo_test multiplex-1.10.9  { db close }                                                           {}
113c27fa4b0Sshanehdo_test multiplex-1.10.10 { sqlite3_multiplex_shutdown }                                         {SQLITE_OK}
114c27fa4b0Sshaneh
115c27fa4b0Sshanehdo_test multiplex-1.11.1  { sqlite3_multiplex_initialize "" 1 }               {SQLITE_OK}
116c27fa4b0Sshanehdo_test multiplex-1.11.2  { sqlite3 db test.db }                              {}
117c27fa4b0Sshanehdo_test multiplex-1.11.3  { sqlite3_multiplex_control db main enable 0  }     {SQLITE_OK}
118c27fa4b0Sshanehdo_test multiplex-1.11.4  { sqlite3_multiplex_control db main enable 1  }     {SQLITE_OK}
119c27fa4b0Sshanehdo_test multiplex-1.11.5  { sqlite3_multiplex_control db main enable -1 }     {SQLITE_OK}
120c27fa4b0Sshanehdo_test multiplex-1.11.6  { db close }                                        {}
121c27fa4b0Sshanehdo_test multiplex-1.11.7  { sqlite3_multiplex_shutdown }                      {SQLITE_OK}
122c27fa4b0Sshaneh
123c27fa4b0Sshanehdo_test multiplex-1.12.1  { sqlite3_multiplex_initialize "" 1 }                           {SQLITE_OK}
124c27fa4b0Sshanehdo_test multiplex-1.12.2  { sqlite3 db test.db }                                          {}
1253801b65dSshanehdo_test multiplex-1.12.3  { lindex [ catchsql { SELECT multiplex_control(1, 0); } ] 0 }   {0}
1263801b65dSshanehdo_test multiplex-1.12.4  { lindex [ catchsql { SELECT multiplex_control(1, 1); } ] 0 }   {0}
1273801b65dSshanehdo_test multiplex-1.12.5  { lindex [ catchsql { SELECT multiplex_control(1, -1); } ] 0 }  {0}
128c27fa4b0Sshanehdo_test multiplex-1.12.6  { db close }                                                    {}
129c27fa4b0Sshanehdo_test multiplex-1.12.7  { sqlite3_multiplex_shutdown }                                  {SQLITE_OK}
130e5a6ad6dSshaneh
1313801b65dSshanehdo_test multiplex-1.13.1  { sqlite3_multiplex_initialize "" 1 }                           {SQLITE_OK}
1323801b65dSshanehdo_test multiplex-1.13.2  { sqlite3 db test.db }                                          {}
1333801b65dSshanehdo_test multiplex-1.13.3  { lindex [ catchsql { SELECT multiplex_control(-1, 0); } ] 0 }  {1}
1343801b65dSshanehdo_test multiplex-1.13.4  { lindex [ catchsql { SELECT multiplex_control(4, 1); } ] 0 }   {1}
1353801b65dSshanehdo_test multiplex-1.13.6  { db close }                                                    {}
1363801b65dSshanehdo_test multiplex-1.13.7  { sqlite3_multiplex_shutdown }                                  {SQLITE_OK}
1373801b65dSshaneh
1388a922f75Sshaneh#-------------------------------------------------------------------------
1398a922f75Sshaneh# Some simple warm-body tests with a single database file in rollback
1408a922f75Sshaneh# mode:
1418a922f75Sshaneh#
1428a922f75Sshaneh#   multiplex-2.1.*: Test simple writing to a multiplex file.
1438a922f75Sshaneh#
1448a922f75Sshaneh#   multiplex-2.2.*: More writing.
1458a922f75Sshaneh#
1468a922f75Sshaneh#   multiplex-2.3.*: Open and close a second db.
1478a922f75Sshaneh#
1488a922f75Sshaneh#   multiplex-2.4.*: Try to shutdown the multiplex system before closing the db
1498a922f75Sshaneh#                file. Check that this fails and the multiplex system still works
1508a922f75Sshaneh#                afterwards. Then close the database and successfully shut
1518a922f75Sshaneh#                down the multiplex system.
1528a922f75Sshaneh#
153b5830294Sshaneh#   multiplex-2.5.*: More reading/writing.
154b5830294Sshaneh#
1550596beecSshaneh#   multiplex-2.6.*: More reading/writing with varying small chunk sizes, as
1560596beecSshaneh#                well as varying journal mode.
157c27fa4b0Sshaneh#
158c27fa4b0Sshaneh#   multiplex-2.7.*: Disable/enable tests.
159c27fa4b0Sshaneh#
1608a922f75Sshaneh
1618a922f75Sshanehsqlite3_multiplex_initialize "" 1
162d50deeebSshanehmultiplex_set db main 32768 16
1638a922f75Sshaneh
164fda06befSmistachkinforcedelete test.x
165ec0c765dSdrhforeach f [glob -nocomplain {test.x*[0-9][0-9][0-9]}] {
166ec0c765dSdrh  forcedelete $f
167ec0c765dSdrh}
1688a922f75Sshanehdo_test multiplex-2.1.2 {
169f3717af4Sdrh  sqlite3 db test.x
1708a922f75Sshaneh  execsql {
1718a922f75Sshaneh    PRAGMA page_size=1024;
1728a922f75Sshaneh    PRAGMA auto_vacuum=OFF;
1738a922f75Sshaneh    PRAGMA journal_mode=DELETE;
1748a922f75Sshaneh  }
1758a922f75Sshaneh  execsql {
1768a922f75Sshaneh    CREATE TABLE t1(a, b);
1778a922f75Sshaneh    INSERT INTO t1 VALUES(1, randomblob(1100));
1788a922f75Sshaneh    INSERT INTO t1 VALUES(2, randomblob(1100));
1798a922f75Sshaneh  }
1808a922f75Sshaneh} {}
181f3717af4Sdrhdo_test multiplex-2.1.3 { file size [multiplex_name test.x 0] } {4096}
1828a922f75Sshanehdo_test multiplex-2.1.4 {
1838a922f75Sshaneh  execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) }
1848a922f75Sshaneh} {}
185*37bbcb48Sdrhdo_execsql_test multiplex-2.1.5 {
186*37bbcb48Sdrh  PRAGMA multiplex_enabled;
187*37bbcb48Sdrh  PRAGMA multiplex_filecount;
188*37bbcb48Sdrh  PRAGMA multiplex_chunksize;
189*37bbcb48Sdrh} {1 1 2147418112}
1908a922f75Sshaneh
1918a922f75Sshanehdo_test multiplex-2.2.1 {
1928a922f75Sshaneh  execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) }
1938a922f75Sshaneh} {}
194f3717af4Sdrhdo_test multiplex-2.2.3 { file size [multiplex_name test.x 0] } {6144}
1958a922f75Sshaneh
1968a922f75Sshanehdo_test multiplex-2.3.1 {
197f3717af4Sdrh  sqlite3 db2 test2.x
1988a922f75Sshaneh  db2 close
1998a922f75Sshaneh} {}
2008a922f75Sshaneh
201d50deeebSshaneh
202a1a8298cSdrhunset -nocomplain ::log
203dadafa88Sdan#do_test multiplex-2.4.1 {
204dadafa88Sdan#  sqlite3_multiplex_shutdown
205dadafa88Sdan#} {SQLITE_MISUSE}
2068a922f75Sshanehdo_test multiplex-2.4.2 {
2078a922f75Sshaneh  execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) }
2088a922f75Sshaneh} {}
209dadafa88Sdan#do_test multiplex-2.4.3 {
210dadafa88Sdan#  set ::log
211dadafa88Sdan#} {SQLITE_MISUSE {sqlite3_multiplex_shutdown() called while database connections are still open}}
212dadafa88Sdan
213f3717af4Sdrhdo_test multiplex-2.4.4 { file size [multiplex_name test.x 0] } {7168}
214ec0c765dSdrhdo_test multiplex-2.4.5 {
2158a922f75Sshaneh  db close
216ec0c765dSdrh  sqlite3 db test.x
217ec0c765dSdrh  db eval vacuum
218ec0c765dSdrh  db close
219ec0c765dSdrh  glob test.x*
220ec0c765dSdrh} {test.x}
221ec0c765dSdrhdo_test multiplex-2.4.99 {
2228a922f75Sshaneh  sqlite3_multiplex_shutdown
2238a922f75Sshaneh} {SQLITE_OK}
2248a922f75Sshaneh
225fd1552f2Sshanehdo_test multiplex-2.5.1 {
226f3717af4Sdrh  multiplex_delete test.x
227fd1552f2Sshaneh  sqlite3_multiplex_initialize "" 1
228f3717af4Sdrh  sqlite3 db test.x
229d50deeebSshaneh  multiplex_set db main 4096 16
230fd1552f2Sshaneh} {SQLITE_OK}
231fd1552f2Sshaneh
232fd1552f2Sshanehdo_test multiplex-2.5.2 {
233fd1552f2Sshaneh  execsql {
234fd1552f2Sshaneh    PRAGMA page_size = 1024;
235fd1552f2Sshaneh    PRAGMA journal_mode = delete;
236fd1552f2Sshaneh    PRAGMA auto_vacuum = off;
237fd1552f2Sshaneh    CREATE TABLE t1(a PRIMARY KEY, b);
238fd1552f2Sshaneh  }
239fd1552f2Sshaneh} {delete}
240fd1552f2Sshaneh
241fd1552f2Sshanehdo_test multiplex-2.5.3 {
242fd1552f2Sshaneh  execsql {
243fd1552f2Sshaneh    INSERT INTO t1 VALUES(1, 'one');
244fd1552f2Sshaneh    INSERT INTO t1 VALUES(2, randomblob(4000));
245fd1552f2Sshaneh    INSERT INTO t1 VALUES(3, 'three');
246fd1552f2Sshaneh    INSERT INTO t1 VALUES(4, randomblob(4000));
24778c4de4cSshaneh    INSERT INTO t1 VALUES(5, 'five');
24878c4de4cSshaneh    INSERT INTO t1 VALUES(6, randomblob($g_chunk_size));
24978c4de4cSshaneh    INSERT INTO t1 VALUES(7, randomblob($g_chunk_size));
250fd1552f2Sshaneh  }
251fd1552f2Sshaneh} {}
252fd1552f2Sshaneh
253fd1552f2Sshanehdo_test multiplex-2.5.4 {
254fd1552f2Sshaneh  db eval {SELECT * FROM t1 WHERE a=1}
255fd1552f2Sshaneh} {1 one}
256fd1552f2Sshaneh
257fd1552f2Sshanehdo_test multiplex-2.5.5 {
258fd1552f2Sshaneh  db eval {SELECT * FROM t1 WHERE a=3}
259fd1552f2Sshaneh} {3 three}
260fd1552f2Sshaneh
261fd1552f2Sshanehdo_test multiplex-2.5.6 {
262fd1552f2Sshaneh  db eval {SELECT * FROM t1 WHERE a=5}
263fd1552f2Sshaneh} {5 five}
264fd1552f2Sshaneh
265fd1552f2Sshanehdo_test multiplex-2.5.7 {
266fd1552f2Sshaneh  db eval {SELECT a,length(b) FROM t1 WHERE a=2}
267fd1552f2Sshaneh} {2 4000}
268fd1552f2Sshaneh
269fd1552f2Sshanehdo_test multiplex-2.5.8 {
270fd1552f2Sshaneh  db eval {SELECT a,length(b) FROM t1 WHERE a=4}
271fd1552f2Sshaneh} {4 4000}
272fd1552f2Sshaneh
273f3717af4Sdrhdo_test multiplex-2.5.9 { file size [multiplex_name test.x 0] } [list $g_chunk_size]
274f3717af4Sdrhdo_test multiplex-2.5.10 { file size [multiplex_name test.x 1] } [list $g_chunk_size]
275*37bbcb48Sdrhdo_execsql_test multiplex-2.5.11 {
276*37bbcb48Sdrh  PRAGMA multiplex_enabled;
277*37bbcb48Sdrh  PRAGMA multiplex_filecount;
278*37bbcb48Sdrh  PRAGMA multiplex_chunksize;
279*37bbcb48Sdrh} {1 3 65536}
280*37bbcb48Sdrhsqlite3 db test.x
281*37bbcb48Sdrhdo_execsql_test multiplex-2.5.12 {
282*37bbcb48Sdrh  PRAGMA multiplex_filecount;
283*37bbcb48Sdrh  PRAGMA multiplex_chunksize;
284*37bbcb48Sdrh} {3 65536}
285*37bbcb48Sdrh
286*37bbcb48Sdrh
287b5830294Sshaneh
288fd1552f2Sshanehdo_test multiplex-2.5.99 {
289fd1552f2Sshaneh  db close
290fd1552f2Sshaneh  sqlite3_multiplex_shutdown
291fd1552f2Sshaneh} {SQLITE_OK}
292fd1552f2Sshaneh
293b5830294Sshaneh
2940596beecSshanehset all_journal_modes {delete persist truncate memory off}
2950596beecSshanehforeach jmode $all_journal_modes {
296b5830294Sshaneh  for {set sz 151} {$sz<8000} {set sz [expr $sz+419]} {
297b5830294Sshaneh
2980596beecSshaneh    do_test multiplex-2.6.1.$sz.$jmode {
299b5830294Sshaneh      multiplex_delete test.db
300b5830294Sshaneh      sqlite3_multiplex_initialize "" 1
301ac039688Sshaneh      sqlite3 db test.db
302d50deeebSshaneh      multiplex_set db main $sz 32
303b5830294Sshaneh    } {SQLITE_OK}
304b5830294Sshaneh
3050596beecSshaneh    do_test multiplex-2.6.2.$sz.$jmode {
3060596beecSshaneh      db eval {
307b5830294Sshaneh        PRAGMA page_size = 1024;
308b5830294Sshaneh        PRAGMA auto_vacuum = off;
309b5830294Sshaneh      }
3100596beecSshaneh      db eval "PRAGMA journal_mode = $jmode;"
3110596beecSshaneh    } $jmode
312b5830294Sshaneh
3130596beecSshaneh    do_test multiplex-2.6.3.$sz.$jmode {
314b5830294Sshaneh      execsql {
3150596beecSshaneh        CREATE TABLE t1(a PRIMARY KEY, b);
316b5830294Sshaneh        INSERT INTO t1 VALUES(1, 'one');
317b5830294Sshaneh        INSERT INTO t1 VALUES(2, randomblob($g_chunk_size));
318b5830294Sshaneh      }
319b5830294Sshaneh    } {}
320b5830294Sshaneh
3210596beecSshaneh    do_test multiplex-2.6.4.$sz.$jmode {
322b5830294Sshaneh      db eval {SELECT b FROM t1 WHERE a=1}
323b5830294Sshaneh    } {one}
324b5830294Sshaneh
3250596beecSshaneh    do_test multiplex-2.6.5.$sz.$jmode {
326b5830294Sshaneh      db eval {SELECT length(b) FROM t1 WHERE a=2}
327b5830294Sshaneh    } [list $g_chunk_size]
328b5830294Sshaneh
329050d09abSshaneh    do_test multiplex-2.6.6.$sz.$jmode { file size [multiplex_name test.db 0] } [list $g_chunk_size]
330b5830294Sshaneh
3310596beecSshaneh    do_test multiplex-2.6.99.$sz.$jmode {
332b5830294Sshaneh      db close
333b5830294Sshaneh      sqlite3_multiplex_shutdown
334b5830294Sshaneh    } {SQLITE_OK}
335b5830294Sshaneh
336b5830294Sshaneh  }
3370596beecSshaneh}
338b5830294Sshaneh
339c27fa4b0Sshanehdo_test multiplex-2.7.1  { multiplex_delete test.db }                                       {}
340c27fa4b0Sshanehdo_test multiplex-2.7.2  { sqlite3_multiplex_initialize "" 1 }                              {SQLITE_OK}
341c27fa4b0Sshanehdo_test multiplex-2.7.3  { sqlite3 db test.db }                                             {}
3423801b65dSshanehdo_test multiplex-2.7.4  { lindex [ catchsql { SELECT multiplex_control(2, 65536); } ] 0 }  {0}
3433801b65dSshanehdo_test multiplex-2.7.5  { lindex [ catchsql { SELECT multiplex_control(1, 0); } ] 0 }      {0}
344c27fa4b0Sshanehdo_test multiplex-2.7.6 {
345c27fa4b0Sshaneh  execsql {
346c27fa4b0Sshaneh    CREATE TABLE t1(a PRIMARY KEY, b);
347c27fa4b0Sshaneh    INSERT INTO t1 VALUES(1, randomblob(1000));
348c27fa4b0Sshaneh  }
349c27fa4b0Sshaneh} {}
350c27fa4b0Sshaneh# verify only one file, and file size is less than chunks size
351c27fa4b0Sshanehdo_test multiplex-2.7.7  { expr ([file size [multiplex_name test.db 0]] < 65536) } {1}
352c27fa4b0Sshanehdo_test multiplex-2.7.8  { file exists [multiplex_name test.db 1] }                {0}
353c27fa4b0Sshanehdo_test multiplex-2.7.9 {
354c27fa4b0Sshaneh  execsql {
3553801b65dSshaneh    INSERT INTO t1 VALUES(2, randomblob(65536));
356c27fa4b0Sshaneh  }
357c27fa4b0Sshaneh} {}
358c27fa4b0Sshaneh# verify only one file, and file size exceeds chunks size
359c27fa4b0Sshanehdo_test multiplex-2.7.10 { expr ([file size [multiplex_name test.db 0]] > 65536) } {1}
360c27fa4b0Sshanehdo_test multiplex-2.7.11 { file exists [multiplex_name test.db 1] }                {0}
361c27fa4b0Sshanehdo_test multiplex-2.7.12 { db close }                                              {}
362c27fa4b0Sshanehdo_test multiplex-2.7.13 { sqlite3_multiplex_shutdown }                            {SQLITE_OK}
363c27fa4b0Sshaneh
3648a922f75Sshaneh#-------------------------------------------------------------------------
3658a922f75Sshaneh# Try some tests with more than one connection to a database file. Still
3668a922f75Sshaneh# in rollback mode.
3678a922f75Sshaneh#
3688a922f75Sshaneh#   multiplex-3.1.*: Two connections to a single database file.
3698a922f75Sshaneh#
3708a922f75Sshaneh#   multiplex-3.2.*: Two connections to each of several database files (that
3718a922f75Sshaneh#                are in the same multiplex group).
3728a922f75Sshaneh#
3738a922f75Sshanehdo_test multiplex-3.1.1 {
3748a922f75Sshaneh  multiplex_delete test.db
3758a922f75Sshaneh  sqlite3_multiplex_initialize "" 1
376ac039688Sshaneh  sqlite3 db test.db
377d50deeebSshaneh  multiplex_set db main 32768 16
3788a922f75Sshaneh} {SQLITE_OK}
3798a922f75Sshanehdo_test multiplex-3.1.2 {
3808a922f75Sshaneh  execsql {
3818a922f75Sshaneh    PRAGMA page_size = 1024;
3828a922f75Sshaneh    PRAGMA journal_mode = delete;
3838a922f75Sshaneh    PRAGMA auto_vacuum = off;
3848a922f75Sshaneh    CREATE TABLE t1(a PRIMARY KEY, b);
3858a922f75Sshaneh    INSERT INTO t1 VALUES(1, 'one');
3868a922f75Sshaneh  }
387050d09abSshaneh  file size [multiplex_name test.db 0]
3888a922f75Sshaneh} {3072}
3898a922f75Sshanehdo_test multiplex-3.1.3 {
3908a922f75Sshaneh  sqlite3 db2 test.db
3918a922f75Sshaneh  execsql { CREATE TABLE t2(a, b) } db2
3928a922f75Sshaneh} {}
3938a922f75Sshanehdo_test multiplex-3.1.4 {
3948a922f75Sshaneh  execsql { CREATE TABLE t3(a, b) }
3958a922f75Sshaneh} {}
3968a922f75Sshanehdo_test multiplex-3.1.5 {
3978a922f75Sshaneh  catchsql { CREATE TABLE t3(a, b) }
3988a922f75Sshaneh} {1 {table t3 already exists}}
3998a922f75Sshanehdo_test multiplex-3.1.6 {
4008a922f75Sshaneh  db close
4018a922f75Sshaneh  db2 close
4028a922f75Sshaneh} {}
4038a922f75Sshaneh
4048a922f75Sshanehdo_test multiplex-3.2.1a {
4058a922f75Sshaneh
4068a922f75Sshaneh  multiplex_delete test.db
4078a922f75Sshaneh  multiplex_delete test2.db
4088a922f75Sshaneh
4098a922f75Sshaneh  sqlite3 db1a test.db
4108a922f75Sshaneh  sqlite3 db2a test2.db
4118a922f75Sshaneh
4128a922f75Sshaneh  foreach db {db1a db2a} {
4138a922f75Sshaneh    execsql {
4148a922f75Sshaneh      PRAGMA page_size = 1024;
4158a922f75Sshaneh      PRAGMA journal_mode = delete;
4168a922f75Sshaneh      PRAGMA auto_vacuum = off;
4178a922f75Sshaneh      CREATE TABLE t1(a, b);
4188a922f75Sshaneh    } $db
4198a922f75Sshaneh  }
4208a922f75Sshaneh
421050d09abSshaneh  list [file size [multiplex_name test.db 0]] [file size [multiplex_name test2.db 0]]
4228a922f75Sshaneh} {2048 2048}
4238a922f75Sshaneh
4248a922f75Sshanehdo_test multiplex-3.2.1b {
4258a922f75Sshaneh  sqlite3 db1b test.db
4268a922f75Sshaneh  sqlite3 db2b test2.db
4278a922f75Sshaneh} {}
4288a922f75Sshaneh
4298a922f75Sshanehdo_test multiplex-3.2.2 { execsql { INSERT INTO t1 VALUES('x', 'y') } db1a } {}
4308a922f75Sshanehdo_test multiplex-3.2.3 { execsql { INSERT INTO t1 VALUES('v', 'w') } db1b } {}
4318a922f75Sshanehdo_test multiplex-3.2.4 { execsql { INSERT INTO t1 VALUES('t', 'u') } db2a } {}
4328a922f75Sshanehdo_test multiplex-3.2.5 { execsql { INSERT INTO t1 VALUES('r', 's') } db2b } {}
4338a922f75Sshaneh
4348a922f75Sshanehdo_test multiplex-3.2.6 {
4358a922f75Sshaneh  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1a
4368a922f75Sshaneh} {}
4378a922f75Sshanehdo_test multiplex-3.2.7 {
4388a922f75Sshaneh  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1b
4398a922f75Sshaneh} {}
4408a922f75Sshanehdo_test multiplex-3.2.8 {
4418a922f75Sshaneh  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2a
4428a922f75Sshaneh} {}
4438a922f75Sshanehdo_test multiplex-3.2.9 {
4448a922f75Sshaneh  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2b
4458a922f75Sshaneh} {}
4468a922f75Sshaneh
4478a922f75Sshanehdo_test multiplex-3.3.1 {
4488a922f75Sshaneh  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1a
4498a922f75Sshaneh  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1b
4508a922f75Sshaneh  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2a
4518a922f75Sshaneh  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2b
4528a922f75Sshaneh} {}
4538a922f75Sshaneh
4548a922f75Sshanehdo_test multiplex-3.2.X {
4558a922f75Sshaneh  foreach db {db1a db2a db2b db1b} { catch { $db close } }
4568a922f75Sshaneh} {}
4578a922f75Sshaneh
4588a922f75Sshaneh#-------------------------------------------------------------------------
4598a922f75Sshaneh#
4608a922f75Sshaneh
4618a922f75Sshanehsqlite3_multiplex_initialize "" 1
462d50deeebSshanehmultiplex_set db main 32768 16
4638a922f75Sshaneh
4648a922f75Sshaneh# Return a list of all currently defined multiplexs.
4658a922f75Sshanehproc multiplex_list {} {
466dadafa88Sdan  glob -nocomplain test2.db*
4678a922f75Sshaneh}
4688a922f75Sshaneh
4698a922f75Sshanehdo_test multiplex-4.1.6 {
4708a922f75Sshaneh  multiplex_delete test2.db
4718a922f75Sshaneh  sqlite3 db test2.db
4728a922f75Sshaneh  db eval {CREATE TABLE t2(x); INSERT INTO t2 VALUES('tab-t2');}
4738a922f75Sshaneh  set res [multiplex_list]
4748a922f75Sshaneh  list [regexp {test2.db} $res]
4758a922f75Sshaneh} {1}
4768a922f75Sshanehdo_test multiplex-4.1.6a {
4778a922f75Sshaneh  sqlite3 db2 test2.db
4788a922f75Sshaneh  db2 eval {SELECT * FROM t2}
4798a922f75Sshaneh} {tab-t2}
4808a922f75Sshanehdo_test multiplex-4.1.7 {
4818a922f75Sshaneh  execsql {INSERT INTO t2 VALUES(zeroblob(200000))}
4828a922f75Sshaneh} {}
4838a922f75Sshanehdo_test multiplex-4.1.8 {
4848a922f75Sshaneh  sqlite3 db2 test2.db
4858a922f75Sshaneh  db2 eval {SELECT count(*) FROM t2}
4868a922f75Sshaneh} {2}
4878a922f75Sshanehdo_test multiplex-4.1.8a {
4888a922f75Sshaneh   db2 eval { DELETE FROM t2 WHERE x = 'tab-t2' }
4898a922f75Sshaneh} {}
4908a922f75Sshanehdo_test multiplex-4.1.8b {
4918a922f75Sshaneh  sqlite3 db2 test2.db
4928a922f75Sshaneh  db2 eval {SELECT count(*) FROM t2}
4938a922f75Sshaneh} {1}
4948a922f75Sshaneh
4958a922f75Sshaneh
4968a922f75Sshanehdo_test multiplex-4.1.9 {
4978a922f75Sshaneh  execsql {INSERT INTO t2 VALUES(zeroblob(200000))}
4988a922f75Sshaneh} {}
4998a922f75Sshanehdo_test multiplex-4.1.10 {
5008a922f75Sshaneh  set res [multiplex_list]
5018a922f75Sshaneh  list [regexp {test2.db} $res]
5028a922f75Sshaneh} {1}
5038a922f75Sshanehdo_test multiplex-4.1.11 {
5048a922f75Sshaneh  db2 close
5058a922f75Sshaneh  set res [multiplex_list]
5068a922f75Sshaneh  list [regexp {test2.db} $res]
5078a922f75Sshaneh} {1}
5088a922f75Sshanehdo_test multiplex-4.1.12 {
5098a922f75Sshaneh  db close
5108a922f75Sshaneh  multiplex_list
511dadafa88Sdan} {test2.db}
5128a922f75Sshaneh
5138a922f75Sshaneh
5148a922f75Sshaneh#-------------------------------------------------------------------------
5158a922f75Sshaneh# The following tests test that the multiplex VFS handles malloc and IO
5168a922f75Sshaneh# errors.
5178a922f75Sshaneh#
5188a922f75Sshaneh
5198a922f75Sshanehsqlite3_multiplex_initialize "" 1
520d50deeebSshanehmultiplex_set db main 32768 16
5218a922f75Sshaneh
5228a922f75Sshanehdo_faultsim_test multiplex-5.1 -prep {
5238a922f75Sshaneh  catch {db close}
5248a922f75Sshaneh} -body {
5258a922f75Sshaneh  sqlite3 db test2.db
5268a922f75Sshaneh}
5278a922f75Sshanehdo_faultsim_test multiplex-5.2 -prep {
5288a922f75Sshaneh  catch {db close}
5298a922f75Sshaneh} -body {
5308a922f75Sshaneh  sqlite3 db test.db
5318a922f75Sshaneh}
5328a922f75Sshaneh
5338a922f75Sshanehcatch { db close }
5348a922f75Sshanehmultiplex_delete test.db
535b5830294Sshanehmultiplex_delete test2.db
5368a922f75Sshaneh
5378a922f75Sshanehdo_test multiplex-5.3.prep {
5388a922f75Sshaneh  sqlite3 db test.db
5398a922f75Sshaneh  execsql {
5408a922f75Sshaneh    PRAGMA auto_vacuum = 1;
5418a922f75Sshaneh    PRAGMA page_size = 1024;
5428a922f75Sshaneh    CREATE TABLE t1(a, b);
5438a922f75Sshaneh    INSERT INTO t1 VALUES(10, zeroblob(1200));
5448a922f75Sshaneh  }
5458a922f75Sshaneh  faultsim_save_and_close
5468a922f75Sshaneh} {}
5478a922f75Sshanehdo_faultsim_test multiplex-5.3 -prep {
5488a922f75Sshaneh  faultsim_restore_and_reopen
5498a922f75Sshaneh} -body {
5508a922f75Sshaneh  execsql { DELETE FROM t1 }
5518a922f75Sshaneh}
5528a922f75Sshaneh
5538a922f75Sshanehdo_test multiplex-5.4.1 {
5548a922f75Sshaneh  catch { db close }
5558a922f75Sshaneh  multiplex_delete test.db
5568a922f75Sshaneh  file mkdir test.db
5578a922f75Sshaneh  list [catch { sqlite3 db test.db } msg] $msg
5588a922f75Sshaneh} {1 {unable to open database file}}
559fda06befSmistachkincatch { delete_file test.db }
5608a922f75Sshaneh
5618a922f75Sshanehdo_faultsim_test multiplex-5.5 -prep {
5628a922f75Sshaneh  catch { sqlite3_multiplex_shutdown }
5638a922f75Sshaneh} -body {
5648a922f75Sshaneh  sqlite3_multiplex_initialize "" 1
565d50deeebSshaneh  multiplex_set db main 32768 16
5668a922f75Sshaneh}
5678a922f75Sshaneh
568cc4e19beSshaneh#-------------------------------------------------------------------------
569cc4e19beSshaneh# Test that you can vacuum a multiplex'ed DB.
570cc4e19beSshaneh
571cc4e19beSshanehifcapable vacuum {
572cc4e19beSshaneh
573babb61f3Sdrhsqlite3_multiplex_shutdown
574cc4e19beSshanehdo_test multiplex-6.0.0 {
575cc4e19beSshaneh  multiplex_delete test.db
576f3717af4Sdrh  multiplex_delete test.x
577cc4e19beSshaneh  sqlite3_multiplex_initialize "" 1
578f3717af4Sdrh  sqlite3 db test.x
579cc4e19beSshaneh  multiplex_set db main 4096 16
580cc4e19beSshaneh} {SQLITE_OK}
581cc4e19beSshaneh
582cc4e19beSshanehdo_test multiplex-6.1.0 {
583cc4e19beSshaneh  execsql {
584cc4e19beSshaneh    PRAGMA page_size=1024;
585cc4e19beSshaneh    PRAGMA journal_mode=DELETE;
586cc4e19beSshaneh    PRAGMA auto_vacuum=OFF;
587cc4e19beSshaneh  }
588cc4e19beSshaneh  execsql {
589cc4e19beSshaneh    CREATE TABLE t1(a, b);
590cc4e19beSshaneh    INSERT INTO t1 VALUES(1, randomblob($g_chunk_size));
591cc4e19beSshaneh    INSERT INTO t1 VALUES(2, randomblob($g_chunk_size));
592cc4e19beSshaneh  }
593cc4e19beSshaneh} {}
594f3717af4Sdrhdo_test multiplex-6.2.1 { file size [multiplex_name test.x 0] } [list $g_chunk_size]
595f3717af4Sdrhdo_test multiplex-6.2.2 { file size [multiplex_name test.x 1] } [list $g_chunk_size]
596cc4e19beSshaneh
597cc4e19beSshanehdo_test multiplex-6.3.0 {
598cc4e19beSshaneh  execsql { VACUUM }
599cc4e19beSshaneh} {}
600cc4e19beSshaneh
601cc4e19beSshanehdo_test multiplex-6.99 {
602cc4e19beSshaneh  db close
603f3717af4Sdrh  multiplex_delete test.x
604cc4e19beSshaneh  sqlite3_multiplex_shutdown
605cc4e19beSshaneh} {SQLITE_OK}
606cc4e19beSshaneh
607cc4e19beSshaneh}
608cc4e19beSshaneh
609cc4e19beSshaneh
610f6296cafSdancatch { db close }
6118a922f75Sshanehcatch { sqlite3_multiplex_shutdown }
612f6296cafSdansqlite3_shutdown
613f6296cafSdantest_sqlite3_log
614f6296cafSdansqlite3_initialize
6158a922f75Sshanehfinish_test
616