multiplex.test 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. # 2010 October 29
  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. set testdir [file dirname $argv0]
  13. source $testdir/tester.tcl
  14. source $testdir/malloc_common.tcl
  15. # The tests in this file assume that SQLite is compiled without
  16. # ENABLE_8_3_NAMES.
  17. #
  18. ifcapable 8_3_names {
  19. puts -nonewline "SQLite compiled with SQLITE_ENABLE_8_3_NAMES. "
  20. puts "Skipping tests multiplex-*."
  21. finish_test
  22. return
  23. }
  24. set g_chunk_size [ expr ($::SQLITE_MAX_PAGE_SIZE*16384) ]
  25. set g_max_chunks 32
  26. # This handles appending the chunk number
  27. # to the end of the filename. if
  28. # SQLITE_MULTIPLEX_EXT_OVWR is defined, then
  29. # it overwrites the last 2 bytes of the
  30. # file name with the chunk number.
  31. proc multiplex_name {name chunk} {
  32. if {$chunk==0} { return $name }
  33. set num [format "%03d" $chunk]
  34. ifcapable {multiplex_ext_overwrite} {
  35. set name [string range $name 0 [expr [string length $name]-2-1]]
  36. }
  37. return $name$num
  38. }
  39. # This saves off the parameters and calls the
  40. # underlying sqlite3_multiplex_control() API.
  41. proc multiplex_set {db name chunk_size max_chunks} {
  42. global g_chunk_size
  43. global g_max_chunks
  44. set g_chunk_size [ expr (($chunk_size+($::SQLITE_MAX_PAGE_SIZE-1)) & ~($::SQLITE_MAX_PAGE_SIZE-1)) ]
  45. set g_max_chunks $max_chunks
  46. set rc [catch {sqlite3_multiplex_control $db $name chunk_size $chunk_size} msg]
  47. if { $rc==0 } {
  48. set rc [catch {sqlite3_multiplex_control $db $name max_chunks $max_chunks} msg]
  49. }
  50. list $msg
  51. }
  52. # This attempts to delete the base file and
  53. # and files with the chunk extension.
  54. proc multiplex_delete {name} {
  55. global g_max_chunks
  56. forcedelete $name
  57. for {set i 0} {$i<$g_max_chunks} {incr i} {
  58. forcedelete [multiplex_name $name $i]
  59. forcedelete [multiplex_name $name-journal $i]
  60. forcedelete [multiplex_name $name-wal $i]
  61. }
  62. }
  63. db close
  64. multiplex_delete test.db
  65. multiplex_delete test2.db
  66. #-------------------------------------------------------------------------
  67. # multiplex-1.1.*: Test initialize and shutdown.
  68. do_test multiplex-1.1 { sqlite3_multiplex_initialize nosuchvfs 1 } {SQLITE_ERROR}
  69. do_test multiplex-1.2 { sqlite3_multiplex_initialize "" 1 } {SQLITE_OK}
  70. do_test multiplex-1.3 { sqlite3_multiplex_initialize "" 1 } {SQLITE_MISUSE}
  71. do_test multiplex-1.4 { sqlite3_multiplex_shutdown } {SQLITE_OK}
  72. do_test multiplex-1.5 { sqlite3_multiplex_initialize "" 0 } {SQLITE_OK}
  73. do_test multiplex-1.6 { sqlite3_multiplex_shutdown } {SQLITE_OK}
  74. do_test multiplex-1.7 { sqlite3_multiplex_initialize "" 1 } {SQLITE_OK}
  75. do_test multiplex-1.8 { sqlite3_multiplex_shutdown } {SQLITE_OK}
  76. do_test multiplex-1.9.1 { sqlite3_multiplex_initialize "" 1 } {SQLITE_OK}
  77. do_test multiplex-1.9.2 { sqlite3 db test.db } {}
  78. do_test multiplex-1.9.3 { multiplex_set db main 32768 16 } {SQLITE_OK}
  79. do_test multiplex-1.9.4 { multiplex_set db main 32768 -1 } {SQLITE_OK}
  80. do_test multiplex-1.9.6 { multiplex_set db main 31 16 } {SQLITE_OK}
  81. do_test multiplex-1.9.7 { multiplex_set db main 32768 100 } {SQLITE_OK}
  82. do_test multiplex-1.9.8 { multiplex_set db main 1073741824 1 } {SQLITE_OK}
  83. do_test multiplex-1.9.9 { db close } {}
  84. do_test multiplex-1.9.10 { sqlite3_multiplex_shutdown } {SQLITE_OK}
  85. do_test multiplex-1.10.1 { sqlite3_multiplex_initialize "" 1 } {SQLITE_OK}
  86. do_test multiplex-1.10.2 { sqlite3 db test.db } {}
  87. do_test multiplex-1.10.3 { lindex [ catchsql { SELECT multiplex_control(2, 32768); } ] 0 } {0}
  88. do_test multiplex-1.10.4 { lindex [ catchsql { SELECT multiplex_control(3, -1); } ] 0 } {0}
  89. do_test multiplex-1.10.6 { lindex [ catchsql { SELECT multiplex_control(2, 31); } ] 0 } {0}
  90. do_test multiplex-1.10.7 { lindex [ catchsql { SELECT multiplex_control(3, 100); } ] 0 } {0}
  91. do_test multiplex-1.10.8 { lindex [ catchsql { SELECT multiplex_control(2, 1073741824); } ] 0 } {0}
  92. do_test multiplex-1.10.9 { db close } {}
  93. do_test multiplex-1.10.10 { sqlite3_multiplex_shutdown } {SQLITE_OK}
  94. do_test multiplex-1.11.1 { sqlite3_multiplex_initialize "" 1 } {SQLITE_OK}
  95. do_test multiplex-1.11.2 { sqlite3 db test.db } {}
  96. do_test multiplex-1.11.3 { sqlite3_multiplex_control db main enable 0 } {SQLITE_OK}
  97. do_test multiplex-1.11.4 { sqlite3_multiplex_control db main enable 1 } {SQLITE_OK}
  98. do_test multiplex-1.11.5 { sqlite3_multiplex_control db main enable -1 } {SQLITE_OK}
  99. do_test multiplex-1.11.6 { db close } {}
  100. do_test multiplex-1.11.7 { sqlite3_multiplex_shutdown } {SQLITE_OK}
  101. do_test multiplex-1.12.1 { sqlite3_multiplex_initialize "" 1 } {SQLITE_OK}
  102. do_test multiplex-1.12.2 { sqlite3 db test.db } {}
  103. do_test multiplex-1.12.3 { lindex [ catchsql { SELECT multiplex_control(1, 0); } ] 0 } {0}
  104. do_test multiplex-1.12.4 { lindex [ catchsql { SELECT multiplex_control(1, 1); } ] 0 } {0}
  105. do_test multiplex-1.12.5 { lindex [ catchsql { SELECT multiplex_control(1, -1); } ] 0 } {0}
  106. do_test multiplex-1.12.6 { db close } {}
  107. do_test multiplex-1.12.7 { sqlite3_multiplex_shutdown } {SQLITE_OK}
  108. do_test multiplex-1.13.1 { sqlite3_multiplex_initialize "" 1 } {SQLITE_OK}
  109. do_test multiplex-1.13.2 { sqlite3 db test.db } {}
  110. do_test multiplex-1.13.3 { lindex [ catchsql { SELECT multiplex_control(-1, 0); } ] 0 } {1}
  111. do_test multiplex-1.13.4 { lindex [ catchsql { SELECT multiplex_control(4, 1); } ] 0 } {1}
  112. do_test multiplex-1.13.6 { db close } {}
  113. do_test multiplex-1.13.7 { sqlite3_multiplex_shutdown } {SQLITE_OK}
  114. #-------------------------------------------------------------------------
  115. # Some simple warm-body tests with a single database file in rollback
  116. # mode:
  117. #
  118. # multiplex-2.1.*: Test simple writing to a multiplex file.
  119. #
  120. # multiplex-2.2.*: More writing.
  121. #
  122. # multiplex-2.3.*: Open and close a second db.
  123. #
  124. # multiplex-2.4.*: Try to shutdown the multiplex system before closing the db
  125. # file. Check that this fails and the multiplex system still works
  126. # afterwards. Then close the database and successfully shut
  127. # down the multiplex system.
  128. #
  129. # multiplex-2.5.*: More reading/writing.
  130. #
  131. # multiplex-2.6.*: More reading/writing with varying small chunk sizes, as
  132. # well as varying journal mode.
  133. #
  134. # multiplex-2.7.*: Disable/enable tests.
  135. #
  136. sqlite3_multiplex_initialize "" 1
  137. multiplex_set db main 32768 16
  138. forcedelete test.x
  139. foreach f [glob -nocomplain {test.x*[0-9][0-9][0-9]}] {
  140. forcedelete $f
  141. }
  142. do_test multiplex-2.1.2 {
  143. sqlite3 db test.x
  144. execsql {
  145. PRAGMA page_size=1024;
  146. PRAGMA auto_vacuum=OFF;
  147. PRAGMA journal_mode=DELETE;
  148. }
  149. execsql {
  150. CREATE TABLE t1(a, b);
  151. INSERT INTO t1 VALUES(1, randomblob(1100));
  152. INSERT INTO t1 VALUES(2, randomblob(1100));
  153. }
  154. } {}
  155. do_test multiplex-2.1.3 { file size [multiplex_name test.x 0] } {4096}
  156. do_test multiplex-2.1.4 {
  157. execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) }
  158. } {}
  159. do_test multiplex-2.2.1 {
  160. execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) }
  161. } {}
  162. do_test multiplex-2.2.3 { file size [multiplex_name test.x 0] } {6144}
  163. do_test multiplex-2.3.1 {
  164. sqlite3 db2 test2.x
  165. db2 close
  166. } {}
  167. do_test multiplex-2.4.1 {
  168. sqlite3_multiplex_shutdown
  169. } {SQLITE_MISUSE}
  170. do_test multiplex-2.4.2 {
  171. execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) }
  172. } {}
  173. do_test multiplex-2.4.4 { file size [multiplex_name test.x 0] } {7168}
  174. do_test multiplex-2.4.5 {
  175. db close
  176. sqlite3 db test.x
  177. db eval vacuum
  178. db close
  179. glob test.x*
  180. } {test.x}
  181. do_test multiplex-2.4.99 {
  182. sqlite3_multiplex_shutdown
  183. } {SQLITE_OK}
  184. do_test multiplex-2.5.1 {
  185. multiplex_delete test.x
  186. sqlite3_multiplex_initialize "" 1
  187. sqlite3 db test.x
  188. multiplex_set db main 4096 16
  189. } {SQLITE_OK}
  190. do_test multiplex-2.5.2 {
  191. execsql {
  192. PRAGMA page_size = 1024;
  193. PRAGMA journal_mode = delete;
  194. PRAGMA auto_vacuum = off;
  195. CREATE TABLE t1(a PRIMARY KEY, b);
  196. }
  197. } {delete}
  198. do_test multiplex-2.5.3 {
  199. execsql {
  200. INSERT INTO t1 VALUES(1, 'one');
  201. INSERT INTO t1 VALUES(2, randomblob(4000));
  202. INSERT INTO t1 VALUES(3, 'three');
  203. INSERT INTO t1 VALUES(4, randomblob(4000));
  204. INSERT INTO t1 VALUES(5, 'five');
  205. INSERT INTO t1 VALUES(6, randomblob($g_chunk_size));
  206. INSERT INTO t1 VALUES(7, randomblob($g_chunk_size));
  207. }
  208. } {}
  209. do_test multiplex-2.5.4 {
  210. db eval {SELECT * FROM t1 WHERE a=1}
  211. } {1 one}
  212. do_test multiplex-2.5.5 {
  213. db eval {SELECT * FROM t1 WHERE a=3}
  214. } {3 three}
  215. do_test multiplex-2.5.6 {
  216. db eval {SELECT * FROM t1 WHERE a=5}
  217. } {5 five}
  218. do_test multiplex-2.5.7 {
  219. db eval {SELECT a,length(b) FROM t1 WHERE a=2}
  220. } {2 4000}
  221. do_test multiplex-2.5.8 {
  222. db eval {SELECT a,length(b) FROM t1 WHERE a=4}
  223. } {4 4000}
  224. do_test multiplex-2.5.9 { file size [multiplex_name test.x 0] } [list $g_chunk_size]
  225. do_test multiplex-2.5.10 { file size [multiplex_name test.x 1] } [list $g_chunk_size]
  226. do_test multiplex-2.5.99 {
  227. db close
  228. sqlite3_multiplex_shutdown
  229. } {SQLITE_OK}
  230. set all_journal_modes {delete persist truncate memory off}
  231. foreach jmode $all_journal_modes {
  232. for {set sz 151} {$sz<8000} {set sz [expr $sz+419]} {
  233. do_test multiplex-2.6.1.$sz.$jmode {
  234. multiplex_delete test.db
  235. sqlite3_multiplex_initialize "" 1
  236. sqlite3 db test.db
  237. multiplex_set db main $sz 32
  238. } {SQLITE_OK}
  239. do_test multiplex-2.6.2.$sz.$jmode {
  240. db eval {
  241. PRAGMA page_size = 1024;
  242. PRAGMA auto_vacuum = off;
  243. }
  244. db eval "PRAGMA journal_mode = $jmode;"
  245. } $jmode
  246. do_test multiplex-2.6.3.$sz.$jmode {
  247. execsql {
  248. CREATE TABLE t1(a PRIMARY KEY, b);
  249. INSERT INTO t1 VALUES(1, 'one');
  250. INSERT INTO t1 VALUES(2, randomblob($g_chunk_size));
  251. }
  252. } {}
  253. do_test multiplex-2.6.4.$sz.$jmode {
  254. db eval {SELECT b FROM t1 WHERE a=1}
  255. } {one}
  256. do_test multiplex-2.6.5.$sz.$jmode {
  257. db eval {SELECT length(b) FROM t1 WHERE a=2}
  258. } [list $g_chunk_size]
  259. do_test multiplex-2.6.6.$sz.$jmode { file size [multiplex_name test.db 0] } [list $g_chunk_size]
  260. do_test multiplex-2.6.99.$sz.$jmode {
  261. db close
  262. sqlite3_multiplex_shutdown
  263. } {SQLITE_OK}
  264. }
  265. }
  266. do_test multiplex-2.7.1 { multiplex_delete test.db } {}
  267. do_test multiplex-2.7.2 { sqlite3_multiplex_initialize "" 1 } {SQLITE_OK}
  268. do_test multiplex-2.7.3 { sqlite3 db test.db } {}
  269. do_test multiplex-2.7.4 { lindex [ catchsql { SELECT multiplex_control(2, 65536); } ] 0 } {0}
  270. do_test multiplex-2.7.5 { lindex [ catchsql { SELECT multiplex_control(1, 0); } ] 0 } {0}
  271. do_test multiplex-2.7.6 {
  272. execsql {
  273. CREATE TABLE t1(a PRIMARY KEY, b);
  274. INSERT INTO t1 VALUES(1, randomblob(1000));
  275. }
  276. } {}
  277. # verify only one file, and file size is less than chunks size
  278. do_test multiplex-2.7.7 { expr ([file size [multiplex_name test.db 0]] < 65536) } {1}
  279. do_test multiplex-2.7.8 { file exists [multiplex_name test.db 1] } {0}
  280. do_test multiplex-2.7.9 {
  281. execsql {
  282. INSERT INTO t1 VALUES(2, randomblob(65536));
  283. }
  284. } {}
  285. # verify only one file, and file size exceeds chunks size
  286. do_test multiplex-2.7.10 { expr ([file size [multiplex_name test.db 0]] > 65536) } {1}
  287. do_test multiplex-2.7.11 { file exists [multiplex_name test.db 1] } {0}
  288. do_test multiplex-2.7.12 { db close } {}
  289. do_test multiplex-2.7.13 { sqlite3_multiplex_shutdown } {SQLITE_OK}
  290. #-------------------------------------------------------------------------
  291. # Try some tests with more than one connection to a database file. Still
  292. # in rollback mode.
  293. #
  294. # multiplex-3.1.*: Two connections to a single database file.
  295. #
  296. # multiplex-3.2.*: Two connections to each of several database files (that
  297. # are in the same multiplex group).
  298. #
  299. do_test multiplex-3.1.1 {
  300. multiplex_delete test.db
  301. sqlite3_multiplex_initialize "" 1
  302. sqlite3 db test.db
  303. multiplex_set db main 32768 16
  304. } {SQLITE_OK}
  305. do_test multiplex-3.1.2 {
  306. execsql {
  307. PRAGMA page_size = 1024;
  308. PRAGMA journal_mode = delete;
  309. PRAGMA auto_vacuum = off;
  310. CREATE TABLE t1(a PRIMARY KEY, b);
  311. INSERT INTO t1 VALUES(1, 'one');
  312. }
  313. file size [multiplex_name test.db 0]
  314. } {3072}
  315. do_test multiplex-3.1.3 {
  316. sqlite3 db2 test.db
  317. execsql { CREATE TABLE t2(a, b) } db2
  318. } {}
  319. do_test multiplex-3.1.4 {
  320. execsql { CREATE TABLE t3(a, b) }
  321. } {}
  322. do_test multiplex-3.1.5 {
  323. catchsql { CREATE TABLE t3(a, b) }
  324. } {1 {table t3 already exists}}
  325. do_test multiplex-3.1.6 {
  326. db close
  327. db2 close
  328. } {}
  329. do_test multiplex-3.2.1a {
  330. multiplex_delete test.db
  331. multiplex_delete test2.db
  332. sqlite3 db1a test.db
  333. sqlite3 db2a test2.db
  334. foreach db {db1a db2a} {
  335. execsql {
  336. PRAGMA page_size = 1024;
  337. PRAGMA journal_mode = delete;
  338. PRAGMA auto_vacuum = off;
  339. CREATE TABLE t1(a, b);
  340. } $db
  341. }
  342. list [file size [multiplex_name test.db 0]] [file size [multiplex_name test2.db 0]]
  343. } {2048 2048}
  344. do_test multiplex-3.2.1b {
  345. sqlite3 db1b test.db
  346. sqlite3 db2b test2.db
  347. } {}
  348. do_test multiplex-3.2.2 { execsql { INSERT INTO t1 VALUES('x', 'y') } db1a } {}
  349. do_test multiplex-3.2.3 { execsql { INSERT INTO t1 VALUES('v', 'w') } db1b } {}
  350. do_test multiplex-3.2.4 { execsql { INSERT INTO t1 VALUES('t', 'u') } db2a } {}
  351. do_test multiplex-3.2.5 { execsql { INSERT INTO t1 VALUES('r', 's') } db2b } {}
  352. do_test multiplex-3.2.6 {
  353. execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1a
  354. } {}
  355. do_test multiplex-3.2.7 {
  356. execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1b
  357. } {}
  358. do_test multiplex-3.2.8 {
  359. execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2a
  360. } {}
  361. do_test multiplex-3.2.9 {
  362. execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2b
  363. } {}
  364. do_test multiplex-3.3.1 {
  365. execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1a
  366. execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1b
  367. execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2a
  368. execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2b
  369. } {}
  370. do_test multiplex-3.2.X {
  371. foreach db {db1a db2a db2b db1b} { catch { $db close } }
  372. } {}
  373. #-------------------------------------------------------------------------
  374. #
  375. sqlite3_multiplex_initialize "" 1
  376. multiplex_set db main 32768 16
  377. # Return a list of all currently defined multiplexs.
  378. proc multiplex_list {} {
  379. set allq {}
  380. foreach q [sqlite3_multiplex_dump] {
  381. lappend allq [lindex $q 0]
  382. }
  383. return [lsort $allq]
  384. }
  385. do_test multiplex-4.1.6 {
  386. multiplex_delete test2.db
  387. sqlite3 db test2.db
  388. db eval {CREATE TABLE t2(x); INSERT INTO t2 VALUES('tab-t2');}
  389. set res [multiplex_list]
  390. list [regexp {test2.db} $res]
  391. } {1}
  392. do_test multiplex-4.1.6a {
  393. sqlite3 db2 test2.db
  394. db2 eval {SELECT * FROM t2}
  395. } {tab-t2}
  396. do_test multiplex-4.1.7 {
  397. execsql {INSERT INTO t2 VALUES(zeroblob(200000))}
  398. } {}
  399. do_test multiplex-4.1.8 {
  400. sqlite3 db2 test2.db
  401. db2 eval {SELECT count(*) FROM t2}
  402. } {2}
  403. do_test multiplex-4.1.8a {
  404. db2 eval { DELETE FROM t2 WHERE x = 'tab-t2' }
  405. } {}
  406. do_test multiplex-4.1.8b {
  407. sqlite3 db2 test2.db
  408. db2 eval {SELECT count(*) FROM t2}
  409. } {1}
  410. do_test multiplex-4.1.9 {
  411. execsql {INSERT INTO t2 VALUES(zeroblob(200000))}
  412. } {}
  413. do_test multiplex-4.1.10 {
  414. set res [multiplex_list]
  415. list [regexp {test2.db} $res]
  416. } {1}
  417. do_test multiplex-4.1.11 {
  418. db2 close
  419. set res [multiplex_list]
  420. list [regexp {test2.db} $res]
  421. } {1}
  422. do_test multiplex-4.1.12 {
  423. db close
  424. multiplex_list
  425. } {}
  426. #-------------------------------------------------------------------------
  427. # The following tests test that the multiplex VFS handles malloc and IO
  428. # errors.
  429. #
  430. sqlite3_multiplex_initialize "" 1
  431. multiplex_set db main 32768 16
  432. do_faultsim_test multiplex-5.1 -prep {
  433. catch {db close}
  434. } -body {
  435. sqlite3 db test2.db
  436. }
  437. do_faultsim_test multiplex-5.2 -prep {
  438. catch {db close}
  439. } -body {
  440. sqlite3 db test.db
  441. }
  442. catch { db close }
  443. multiplex_delete test.db
  444. multiplex_delete test2.db
  445. do_test multiplex-5.3.prep {
  446. sqlite3 db test.db
  447. execsql {
  448. PRAGMA auto_vacuum = 1;
  449. PRAGMA page_size = 1024;
  450. CREATE TABLE t1(a, b);
  451. INSERT INTO t1 VALUES(10, zeroblob(1200));
  452. }
  453. faultsim_save_and_close
  454. } {}
  455. do_faultsim_test multiplex-5.3 -prep {
  456. faultsim_restore_and_reopen
  457. } -body {
  458. execsql { DELETE FROM t1 }
  459. }
  460. do_test multiplex-5.4.1 {
  461. catch { db close }
  462. multiplex_delete test.db
  463. file mkdir test.db
  464. list [catch { sqlite3 db test.db } msg] $msg
  465. } {1 {unable to open database file}}
  466. catch { delete_file test.db }
  467. do_faultsim_test multiplex-5.5 -prep {
  468. catch { sqlite3_multiplex_shutdown }
  469. } -body {
  470. sqlite3_multiplex_initialize "" 1
  471. multiplex_set db main 32768 16
  472. }
  473. #-------------------------------------------------------------------------
  474. # Test that you can vacuum a multiplex'ed DB.
  475. ifcapable vacuum {
  476. sqlite3_multiplex_shutdown
  477. do_test multiplex-6.0.0 {
  478. multiplex_delete test.db
  479. multiplex_delete test.x
  480. sqlite3_multiplex_initialize "" 1
  481. sqlite3 db test.x
  482. multiplex_set db main 4096 16
  483. } {SQLITE_OK}
  484. do_test multiplex-6.1.0 {
  485. execsql {
  486. PRAGMA page_size=1024;
  487. PRAGMA journal_mode=DELETE;
  488. PRAGMA auto_vacuum=OFF;
  489. }
  490. execsql {
  491. CREATE TABLE t1(a, b);
  492. INSERT INTO t1 VALUES(1, randomblob($g_chunk_size));
  493. INSERT INTO t1 VALUES(2, randomblob($g_chunk_size));
  494. }
  495. } {}
  496. do_test multiplex-6.2.1 { file size [multiplex_name test.x 0] } [list $g_chunk_size]
  497. do_test multiplex-6.2.2 { file size [multiplex_name test.x 1] } [list $g_chunk_size]
  498. do_test multiplex-6.3.0 {
  499. execsql { VACUUM }
  500. } {}
  501. do_test multiplex-6.99 {
  502. db close
  503. multiplex_delete test.x
  504. sqlite3_multiplex_shutdown
  505. } {SQLITE_OK}
  506. }
  507. catch { sqlite3_multiplex_shutdown }
  508. finish_test