xref: /sqlite-3.40.0/test/avfs.test (revision 5cad178b)
1b47e4c28Slarrybr# 2021-03-06
2b47e4c28Slarrybr#
3b47e4c28Slarrybr# The author disclaims copyright to this source code.  In place of
4b47e4c28Slarrybr# a legal notice, here is a blessing:
5b47e4c28Slarrybr#
6b47e4c28Slarrybr#    May you do good and not evil.
7b47e4c28Slarrybr#    May you find forgiveness for yourself and forgive others.
8b47e4c28Slarrybr#    May you share freely, never taking more than you give.
9b47e4c28Slarrybr#
10b47e4c28Slarrybr#***********************************************************************
11b47e4c28Slarrybr#
12b47e4c28Slarrybr# This file implements tests for the appendvfs extension.
13b47e4c28Slarrybr#
14b47e4c28Slarrybr# Tests performed:
15ddf49720Slarrybr# avfs-1.0. Test that an appendvfs DB can be added to an empty (ZLF) file.
16b47e4c28Slarrybr# avfs-1.1. Test that the DB can be read with correct content upon reopen.
17b47e4c28Slarrybr# avfs-1.2. Test that an appendvfs DB can be added to a simple text file.
18b47e4c28Slarrybr# avfs-1.3. Test that the DB can be read with correct content upon reopen.
19ddf49720Slarrybr# avfs-1.4. Test that appended DB is aligned to default page boundary.
20b47e4c28Slarrybr# avfs-2.1. Test that the simple text file retains its initial text.
21b47e4c28Slarrybr# avfs-3.1. Test that the appendvfs can grow and shrink, remaining intact.
22b47e4c28Slarrybr# avfs-3.2. Test that appendvfs is intact after grow/shrink/close/reopen.
23*5cad178bSlarrybr# avfs-3.3. Test that appendvfs can grow by many pages and be written.
24*5cad178bSlarrybr# avfs-3.4. Test that grown appendvfs can be reopened and appear intact.
25*5cad178bSlarrybr# avfs-3.5. Test that much grown appendvfs can shrink and reopen intact.
26b47e4c28Slarrybr# avfs-4.1. Test shell's ability to append to a non-appendvfs file.
27b47e4c28Slarrybr# avfs-4.2. Test shell's ability to append to empty or nonexistent file.
28b47e4c28Slarrybr# avfs-4.3. Test shell's ability to reopen and alter an appendvfs file.
29ddf49720Slarrybr# avfs-5.1. Test appendvfs refusal to open too-tiny DB appended onto ZLF.
30ddf49720Slarrybr# avfs-5.2. Test appendvfs refusal to open too-tiny DB appended on other.
31b47e4c28Slarrybr# ...
32b47e4c28Slarrybr# (more to come)
33b47e4c28Slarrybr
34b47e4c28Slarrybrset testdir [file dirname $argv0]
35b47e4c28Slarrybrsource $testdir/tester.tcl
36b47e4c28Slarrybrset ::testprefix avfs
37ba34b79fSdan
38ba34b79fSdan# Do not attempt this test if SQLITE_OMIT_VIRTUALTABLE is defined.
39ba34b79fSdan#
40ba34b79fSdanifcapable !vtab {
41ba34b79fSdan  finish_test
42ba34b79fSdan  return
43ba34b79fSdan}
44ba34b79fSdan
45b47e4c28Slarrybrset CLI [test_find_cli]
46b47e4c28Slarrybrdb close
47c5edbd1cSlarrybr# forcedelete test.db
48b47e4c28Slarrybr
49b47e4c28Slarrybrload_static_extension db appendvfs
50b47e4c28Slarrybr
51b47e4c28Slarrybrset ::fa avfs.adb
52b47e4c28Slarrybrset ::fza avfs.sdb
53b47e4c28Slarrybrforcedelete $::fa $::fza
54b47e4c28Slarrybrset ::result {}
55b47e4c28Slarrybr
56c5edbd1cSlarrybrproc shellDoesAr {} {
57c5edbd1cSlarrybr  set shdo "sh_app1.sql"
58c5edbd1cSlarrybr  forcedelete $shdo
59c5edbd1cSlarrybr  set fd [open $shdo w]
60c5edbd1cSlarrybr  puts $fd ".help\n.q"
61c5edbd1cSlarrybr  close $fd
62c5edbd1cSlarrybr  set res [catchcmd "-batch -cmd \".read $shdo\""]
63c5edbd1cSlarrybr  return [regexp {^.archive} [lindex $res 1]]
64c5edbd1cSlarrybr}
65c5edbd1cSlarrybr
66b47e4c28Slarrybrset ::vf "&vfs=apndvfs"
67b47e4c28Slarrybr
68b47e4c28Slarrybr# Return file offset of appendvfs portion of a file, or {} if none such.
69b47e4c28Slarrybrproc fosAvfs {fname} {
70b47e4c28Slarrybr  if {[file size $fname] < 25} {
71b47e4c28Slarrybr    return {}
72b47e4c28Slarrybr  }
73b47e4c28Slarrybr  if {[catch {set fd [open $fname rb]}]} {
74b47e4c28Slarrybr    return {}
75b47e4c28Slarrybr  }
76b47e4c28Slarrybr  seek $fd -25 end
77b47e4c28Slarrybr  set am [read $fd 17]
78b47e4c28Slarrybr  set ao [read $fd 8]
79b47e4c28Slarrybr  close $fd
80b47e4c28Slarrybr  if {$am ne "Start-Of-SQLite3-"} {
81b47e4c28Slarrybr    return {}
82b47e4c28Slarrybr  }
83b47e4c28Slarrybr  binary scan $ao "W" rvo
84b47e4c28Slarrybr  return $rvo
85b47e4c28Slarrybr}
86b47e4c28Slarrybr
87b47e4c28Slarrybrdo_test 1.0 {
88b47e4c28Slarrybr  set results {}
89b47e4c28Slarrybr  set out [open $::fza wb]
90b47e4c28Slarrybr  close $out
91b47e4c28Slarrybr  sqlite3 adb "file:$::fza?mode=rwc$::vf" -uri 1
92b47e4c28Slarrybr  adb eval {
93b47e4c28Slarrybr    PRAGMA page_size=1024;
94b47e4c28Slarrybr    PRAGMA cache_size=10;
95b47e4c28Slarrybr    CREATE TABLE t1(a TEXT);
96b47e4c28Slarrybr    INSERT INTO t1 VALUES ('dog'),('cat');
97b47e4c28Slarrybr    SELECT group_concat(a) as pets FROM (SELECT a FROM t1 ORDER BY a);
98b47e4c28Slarrybr  } { lappend results $pets }
99b47e4c28Slarrybr  adb close
100b47e4c28Slarrybr  lappend results [fosAvfs $fza]
101b47e4c28Slarrybr  set ::result [join $results " | "]
102b47e4c28Slarrybr} {cat,dog | 0}
103b47e4c28Slarrybr
104b47e4c28Slarrybrdo_test 1.1 {
105b47e4c28Slarrybr  set results {}
106b47e4c28Slarrybr  sqlite3 adb "file:$::fza?mode=rw$::vf" -uri 1
107b47e4c28Slarrybr  adb eval {
108b47e4c28Slarrybr    SELECT group_concat(a) as pets FROM (SELECT a FROM t1 ORDER BY a DESC);
109b47e4c28Slarrybr  } { lappend results $pets }
110b47e4c28Slarrybr  adb close
111b47e4c28Slarrybr  set ::result [join $results " | "]
112b47e4c28Slarrybr} {dog,cat}
113b47e4c28Slarrybr
114b47e4c28Slarrybrdo_test 1.2 {
115b47e4c28Slarrybr  set results {}
116b47e4c28Slarrybr  set out [open $::fa wb]
117b47e4c28Slarrybr  set ::tlo { "Just some text," "and more text," "ending at 3 lines." }
118b47e4c28Slarrybr  puts $out [join $::tlo "\n"]
119b47e4c28Slarrybr  close $out
120b47e4c28Slarrybr  set adbSz [file size $::fa]
121b47e4c28Slarrybr  sqlite3 adb "file:$::fa?mode=rwc$::vf" -uri 1
122b47e4c28Slarrybr  adb eval {
123bc3c4e08Sdan    PRAGMA auto_vacuum = 0;
124b47e4c28Slarrybr    PRAGMA page_size=512;
125b47e4c28Slarrybr    PRAGMA cache_size=0;
126b47e4c28Slarrybr    CREATE TABLE t1(a TEXT);
127b47e4c28Slarrybr    INSERT INTO t1 VALUES ('dog'),('cat'),('pig');
128b47e4c28Slarrybr    SELECT group_concat(a) as pets FROM (SELECT a FROM t1 ORDER BY a);
129b47e4c28Slarrybr  } { lappend results $pets }
130b47e4c28Slarrybr  adb close
131b47e4c28Slarrybr  set adaSz [file size $::fa]
132b47e4c28Slarrybr  lappend results "Bytes before/after $adbSz/$adaSz"
133b47e4c28Slarrybr  set ::result [join $results " | "]
134b47e4c28Slarrybr} {cat,dog,pig | Bytes before/after 50/5145}
135b47e4c28Slarrybr
136b47e4c28Slarrybrdo_test 1.3 {
137b47e4c28Slarrybr  set results {}
138b47e4c28Slarrybr  sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1
139b47e4c28Slarrybr  adb eval {
140b47e4c28Slarrybr    SELECT group_concat(a) as pets FROM (SELECT a FROM t1 ORDER BY a DESC);
141b47e4c28Slarrybr  } { lappend results $pets }
142b47e4c28Slarrybr  adb close
143b47e4c28Slarrybr  set ::result [join $results " | "]
144ddf49720Slarrybr} {pig,dog,cat}
145ddf49720Slarrybr
146ddf49720Slarrybrdo_test 1.4 {
147ddf49720Slarrybr  set ::result [fosAvfs $fa]
148ddf49720Slarrybr} {4096}
149b47e4c28Slarrybr
150b47e4c28Slarrybrdo_test 2.1 {
151b47e4c28Slarrybr  set in [open $::fa r]
152b47e4c28Slarrybr  set tli {}
153b47e4c28Slarrybr  for {set i [llength $::tlo]} {$i > 0} {incr i -1} {
154b47e4c28Slarrybr    lappend tli [gets $in]
155b47e4c28Slarrybr  }
156b47e4c28Slarrybr  close $in
157b47e4c28Slarrybr  if { [join $tli ":"] ne [join $::tlo ":"] } {
158b47e4c28Slarrybr    set ::result "Appendee changed."
159b47e4c28Slarrybr  } else {
160b47e4c28Slarrybr    set ::result "Appendee intact."
161b47e4c28Slarrybr  }
162b47e4c28Slarrybr} {Appendee intact.}
163b47e4c28Slarrybr
164b47e4c28Slarrybr# Set of repeatable random integers for a couple tests.
165*5cad178bSlarrybrset ::nrint 50000
166b47e4c28Slarrybrproc rint {v} {
167b47e4c28Slarrybr  return [::tcl::mathfunc::int [expr $v * 100000]]
168b47e4c28Slarrybr}
169b47e4c28Slarrybrarray set ::randints [list 0 [rint [::tcl::mathfunc::srand 0]]]
170*5cad178bSlarrybrfor {set i 1} {$i < $::nrint} {incr i} {
171b47e4c28Slarrybr  set ::randints($i) [rint [::tcl::mathfunc::rand]]
172b47e4c28Slarrybr}
173b47e4c28Slarrybr
174b47e4c28Slarrybrdo_test 3.1 {
175b47e4c28Slarrybr  set results {}
176b47e4c28Slarrybr  sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1
177b47e4c28Slarrybr  adb eval {
178b47e4c28Slarrybr    DROP TABLE t1;
179b47e4c28Slarrybr    PRAGMA cache_size=10;
180b47e4c28Slarrybr    CREATE TABLE ri (i INTEGER);
181b47e4c28Slarrybr    BEGIN;
182b47e4c28Slarrybr  }
183*5cad178bSlarrybr  for {set i 0} {$i < $::nrint} {incr i} {
184b47e4c28Slarrybr    set r $::randints($i)
185b47e4c28Slarrybr    set s $::randints([incr i])
186b47e4c28Slarrybr    set t $::randints([incr i])
187b47e4c28Slarrybr    set u $::randints([incr i])
188b47e4c28Slarrybr    set v $::randints([incr i])
189b47e4c28Slarrybr    adb eval {
190b47e4c28Slarrybr      INSERT INTO ri VALUES ($r),($s),($t),($u),($v)
191b47e4c28Slarrybr    }
192b47e4c28Slarrybr  }
193b47e4c28Slarrybr  adb eval {
194b47e4c28Slarrybr    COMMIT;
195b47e4c28Slarrybr    SELECT integrity_check as ic FROM pragma_integrity_check();
196b47e4c28Slarrybr  } { lappend results $ic }
197b47e4c28Slarrybr  set adbSz [file size $::fa]
198b47e4c28Slarrybr  set qr {}
199b47e4c28Slarrybr  adb eval {
200b47e4c28Slarrybr    SELECT count(*) as ic FROM ri;
201b47e4c28Slarrybr    DELETE FROM ri WHERE (i % 50) <> 25;
202b47e4c28Slarrybr    SELECT integrity_check as ic FROM pragma_integrity_check();
203b47e4c28Slarrybr    VACUUM;
204b47e4c28Slarrybr    SELECT integrity_check as ic FROM pragma_integrity_check();
205b47e4c28Slarrybr    SELECT count(*) as ic FROM ri;
206b47e4c28Slarrybr  } { lappend qr $ic }
207b47e4c28Slarrybr  adb close
208b47e4c28Slarrybr  set adaSz [file size $::fa]
209b47e4c28Slarrybr  set adba [expr ($adbSz + 0.1)/$adaSz]
210*5cad178bSlarrybr  # lappend results $adba
211b47e4c28Slarrybr  set results [concat $results [lrange $qr 0 2]]
212*5cad178bSlarrybr  lappend results [expr {$adba > 10.0}]
213b47e4c28Slarrybr  set ::result [join $results " | "]
214*5cad178bSlarrybr} "ok | $::nrint | ok | ok | 1"
215b47e4c28Slarrybr
216b47e4c28Slarrybrdo_test 3.2 {
217b47e4c28Slarrybr  set results {}
218b47e4c28Slarrybr  sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1
219b47e4c28Slarrybr  adb eval {
220b47e4c28Slarrybr    SELECT integrity_check as ic FROM pragma_integrity_check();
221b47e4c28Slarrybr  } { lappend results $ic }
222b47e4c28Slarrybr  adb close
223b47e4c28Slarrybr  set ::result [join $results " | "]
224b47e4c28Slarrybr} {ok}
225b47e4c28Slarrybr
226*5cad178bSlarrybr# avfs-3.3. Test that appendvfs can grow by many pages and be written.
227*5cad178bSlarrybrdo_test 3.3 {
228*5cad178bSlarrybr  set results {}
229*5cad178bSlarrybr  sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1
230*5cad178bSlarrybr  set npages 300
231*5cad178bSlarrybr  adb eval { BEGIN }
232*5cad178bSlarrybr  while {$npages > 0} {
233*5cad178bSlarrybr    adb eval { INSERT INTO ri VALUES (randomblob(1500)) }
234*5cad178bSlarrybr    incr npages -1
235*5cad178bSlarrybr  }
236*5cad178bSlarrybr  adb eval { COMMIT }
237*5cad178bSlarrybr  adb eval {
238*5cad178bSlarrybr    SELECT integrity_check as ic FROM pragma_integrity_check();
239*5cad178bSlarrybr  } { lappend results $ic }
240*5cad178bSlarrybr  adb close
241*5cad178bSlarrybr  set adaSzr [expr [file size $::fa] / 300.0 / 1500 ]
242*5cad178bSlarrybr  set okSzr [expr $adaSzr > 1.0 && $adaSzr < 1.3 ]
243*5cad178bSlarrybr  lappend results $okSzr
244*5cad178bSlarrybr  set ::result [join $results " | "]
245*5cad178bSlarrybr} {ok | 1}
246*5cad178bSlarrybr
247*5cad178bSlarrybr# avfs-3.4. Test that grown appendvfs can be reopened and appear intact.
248*5cad178bSlarrybrdo_test 3.4 {
249*5cad178bSlarrybr  set results {}
250*5cad178bSlarrybr  sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1
251*5cad178bSlarrybr  adb eval {
252*5cad178bSlarrybr    SELECT integrity_check as ic FROM pragma_integrity_check();
253*5cad178bSlarrybr  } { lappend results $ic }
254*5cad178bSlarrybr  adb close
255*5cad178bSlarrybr  set ::result $ic
256*5cad178bSlarrybr} {ok}
257*5cad178bSlarrybr
258*5cad178bSlarrybr# avfs-3.5. Test that much grown appendvfs can shrink and reopen intact.
259*5cad178bSlarrybrdo_test 3.5 {
260*5cad178bSlarrybr  set results {}
261*5cad178bSlarrybr  set adbsz [file size $::fa]
262*5cad178bSlarrybr  sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1
263*5cad178bSlarrybr  adb eval {
264*5cad178bSlarrybr    DELETE FROM ri WHERE rowid % 8 <> 0;
265*5cad178bSlarrybr    SELECT integrity_check as ic FROM pragma_integrity_check();
266*5cad178bSlarrybr    VACUUM;
267*5cad178bSlarrybr    SELECT integrity_check as ic FROM pragma_integrity_check();
268*5cad178bSlarrybr  } { lappend results $ic }
269*5cad178bSlarrybr  adb close
270*5cad178bSlarrybr  set adasz [file size $::fa]
271*5cad178bSlarrybr  lappend results [expr {$adbsz/$adasz > 5}]
272*5cad178bSlarrybr  sqlite3 adb "file:$::fa?mode=rw$::vf" -uri 1
273*5cad178bSlarrybr  adb eval {
274*5cad178bSlarrybr    SELECT integrity_check as ic FROM pragma_integrity_check();
275*5cad178bSlarrybr  } { lappend results $ic }
276*5cad178bSlarrybr  adb close
277*5cad178bSlarrybr  set ::result [join $results " | "]
278*5cad178bSlarrybr} {ok | ok | 1 | ok}
279*5cad178bSlarrybr
280c5edbd1cSlarrybrset ::cliDoesAr [shellDoesAr]
281c5edbd1cSlarrybr
282b47e4c28Slarrybrdo_test 4.1 {
283b47e4c28Slarrybr  set shdo "sh_app1.sql"
284b47e4c28Slarrybr  set shod "sh_app1.adb"
285b47e4c28Slarrybr  forcedelete $shdo $shod
286b47e4c28Slarrybr  set ofd [open $shdo w]
287c5edbd1cSlarrybr  if {$::cliDoesAr} {
288b47e4c28Slarrybr    puts $ofd ".ar -c"
289c5edbd1cSlarrybr  } else {
290c5edbd1cSlarrybr    puts $ofd "pragma page_size=512;"
291c5edbd1cSlarrybr    puts $ofd "create table sqlar (a);"
292c5edbd1cSlarrybr  }
293b47e4c28Slarrybr  puts $ofd ".tables"
294b47e4c28Slarrybr  puts $ofd ".q"
295b47e4c28Slarrybr  close $ofd
296b47e4c28Slarrybr  set ofd [open $shod wb]
297b47e4c28Slarrybr  puts $ofd "Some text."
298b47e4c28Slarrybr  close $ofd
299b47e4c28Slarrybr  set res [catchcmd "-append -batch -init $shdo $shod" ""]
300b47e4c28Slarrybr  lappend res [fosAvfs $shod]
301b47e4c28Slarrybr  forcedelete $shdo $shod
302b47e4c28Slarrybr  set ::result [join $res " | "]
303b47e4c28Slarrybr} {0 | sqlar | 4096}
304b47e4c28Slarrybr
305b47e4c28Slarrybrdo_test 4.2 {
306b47e4c28Slarrybr  set shdo "sh_app1.sql"
307b47e4c28Slarrybr  set shod "sh_app1.adb"
308b47e4c28Slarrybr  forcedelete $shdo $shod
309b47e4c28Slarrybr  set ofd [open $shdo w]
310c5edbd1cSlarrybr  if {$::cliDoesAr} {
311b47e4c28Slarrybr    puts $ofd ".ar -c"
312c5edbd1cSlarrybr  } else {
313c5edbd1cSlarrybr    puts $ofd "pragma page_size=512;"
314c5edbd1cSlarrybr    puts $ofd "create table sqlar (a);"
315c5edbd1cSlarrybr  }
316b47e4c28Slarrybr  puts $ofd ".tables"
317b47e4c28Slarrybr  puts $ofd ".q"
318b47e4c28Slarrybr  close $ofd
319b47e4c28Slarrybr  set ofd [open $shod wb]
320b47e4c28Slarrybr  close $ofd
321b47e4c28Slarrybr  set res [catchcmd "-append -batch -init $shdo $shod" ""]
322b47e4c28Slarrybr  lappend res [fosAvfs $shod]
323b47e4c28Slarrybr  forcedelete $shdo ; # Leave $shod for next test.
324b47e4c28Slarrybr  set ::result [join $res " | "]
325b47e4c28Slarrybr} {0 | sqlar | 0}
326b47e4c28Slarrybr
327b47e4c28Slarrybrdo_test 4.3 {
328b47e4c28Slarrybr  set shdo "sh_app1.sql"
329b47e4c28Slarrybr  set shod "sh_app1.adb" ; # Same as test 4.2, reusing ADB.
330b47e4c28Slarrybr  forcedelete $shdo
331b47e4c28Slarrybr  set ofd [open $shdo w]
332c5edbd1cSlarrybr  if {$::cliDoesAr} {
333b47e4c28Slarrybr    puts $ofd ".ar -u $shdo"
334b47e4c28Slarrybr    puts $ofd "select count(*) from sqlar where name = '$shdo';"
335c5edbd1cSlarrybr  } else {
336c5edbd1cSlarrybr    puts $ofd "insert into sqlar values (1);"
337c5edbd1cSlarrybr    puts $ofd "select count(*) from sqlar;"
338c5edbd1cSlarrybr  }
339b47e4c28Slarrybr  puts $ofd ".q"
340b47e4c28Slarrybr  close $ofd
341b47e4c28Slarrybr  set res [catchcmd "-append -batch -init $shdo $shod" ""]
342b47e4c28Slarrybr  sqlite3 adb "file:$shod?mode=rw$::vf" -uri 1
343b47e4c28Slarrybr  adb eval {
344b47e4c28Slarrybr    SELECT count(*) as n FROM sqlar
345b47e4c28Slarrybr  } { lappend res $n }
346b47e4c28Slarrybr  adb close
347b47e4c28Slarrybr  forcedelete $shdo $shod;
348b47e4c28Slarrybr  set ::result [join $res " | "]
349b47e4c28Slarrybr} {0 | 1 | 1}
350b47e4c28Slarrybr
351ddf49720Slarrybrdo_test 5.1 {
352ddf49720Slarrybr  set fake "faketiny.sdb"
353ddf49720Slarrybr  forcedelete $fake
354ddf49720Slarrybr  set ofd [open $fake wb]
355ddf49720Slarrybr  puts -nonewline $ofd "SQLite format 3"
356ddf49720Slarrybr  puts -nonewline $ofd [binary format "c" 0]
357ddf49720Slarrybr  puts -nonewline $ofd "Start-Of-SQLite3-"
358ddf49720Slarrybr  puts -nonewline $ofd [binary format "W" 0]
359ddf49720Slarrybr  close $ofd
360ddf49720Slarrybr  if {[catch {sqlite3 adb "file:$fake?mode=rw$::vf" -uri 1}]} {
361ddf49720Slarrybr    set res "Open failed."
362ddf49720Slarrybr  } else {
363ddf49720Slarrybr    adb close
364ddf49720Slarrybr    set res "Opened when should not."
365ddf49720Slarrybr  }
366ddf49720Slarrybr  forcedelete $fake
367ddf49720Slarrybr  set ::result $res
368ddf49720Slarrybr} {Open failed.}
369ddf49720Slarrybr
370ddf49720Slarrybrdo_test 5.2 {
371ddf49720Slarrybr  set fake "faketiny.sdb"
372ddf49720Slarrybr  forcedelete $fake
373ddf49720Slarrybr  set ofd [open $fake wb]
374ddf49720Slarrybr  set fakeAppendee "Dog ate my homework.\n"
375ddf49720Slarrybr  puts -nonewline $ofd $fakeAppendee
376ddf49720Slarrybr  puts -nonewline $ofd "SQLite format 3"
377ddf49720Slarrybr  puts -nonewline $ofd [binary format "c" 0]
378ddf49720Slarrybr  puts -nonewline $ofd "Start-Of-SQLite3-"
379ddf49720Slarrybr  puts -nonewline $ofd [binary format "W" [string length $fakeAppendee]]
380ddf49720Slarrybr  close $ofd
381ddf49720Slarrybr  if {[catch {sqlite3 adb "file:$fake?mode=rw$::vf" -uri 1}]} {
382ddf49720Slarrybr    set res "Open failed."
383ddf49720Slarrybr  } else {
384ddf49720Slarrybr    adb close
385ddf49720Slarrybr    set res "Opened when should not."
386ddf49720Slarrybr  }
387ddf49720Slarrybr  forcedelete $fake
388ddf49720Slarrybr  set ::result $res
389ddf49720Slarrybr} {Open failed.}
390ddf49720Slarrybr
391b47e4c28Slarrybrforcedelete $::fa $::fza
392b47e4c28Slarrybr
393*5cad178bSlarrybrunset -nocomplain ::fa ::fza ::tlo ::result ::randints ::nrint ::cliDoesAr
394b47e4c28Slarrybr
395b47e4c28Slarrybrfinish_test
396