xref: /sqlite-3.40.0/test/zipfile.test (revision 68b63c01)
1373dc3bbSdan# 2017 December 9
2373dc3bbSdan#
3373dc3bbSdan# The author disclaims copyright to this source code.  In place of
4373dc3bbSdan# a legal notice, here is a blessing:
5373dc3bbSdan#
6373dc3bbSdan#    May you do good and not evil.
7373dc3bbSdan#    May you find forgiveness for yourself and forgive others.
8373dc3bbSdan#    May you share freely, never taking more than you give.
9373dc3bbSdan#
10373dc3bbSdan#***********************************************************************
11373dc3bbSdan#
12373dc3bbSdan
13b5a4a705Smistachkinpackage require Tcl 8.6
14b5a4a705Smistachkin
15373dc3bbSdanset testdir [file dirname $argv0]
16373dc3bbSdansource $testdir/tester.tcl
17373dc3bbSdanset testprefix zipfile
18373dc3bbSdan
19c48e0271Sdanifcapable !vtab {
20c48e0271Sdan  finish_test; return
21c48e0271Sdan}
22f2e8aa63Smistachkinif {[catch {load_static_extension db zipfile} error]} {
23f2e8aa63Smistachkin  puts "Skipping zipfile tests, hit load error: $error"
24f2e8aa63Smistachkin  finish_test; return
25f2e8aa63Smistachkin}
26b5a4a705Smistachkinif {[catch {load_static_extension db fileio} error]} {
27b5a4a705Smistachkin  puts "Skipping zipfile tests, hit load error: $error"
28b5a4a705Smistachkin  finish_test; return
29b5a4a705Smistachkin}
30373dc3bbSdan
31f8c4b99aSdanproc readfile {f} {
32f8c4b99aSdan  set fd [open $f]
338005d605Sdan  fconfigure $fd -translation binary -encoding binary
348005d605Sdan  set data [read $fd]
358005d605Sdan  close $fd
36f8c4b99aSdan  set data
37f8c4b99aSdan}
388005d605Sdan
39b5a4a705Smistachkinunset -nocomplain ::UNZIP
40b5a4a705Smistachkin
41b5a4a705Smistachkinif {[catch {exec unzip} msg]==0 && \
42b5a4a705Smistachkin    [regexp -line {^UnZip \d+\.\d+ .*? Info-ZIP\.} $msg]} {
43b5a4a705Smistachkin  set ::UNZIP unzip
44b5a4a705Smistachkin  proc fix_stat_mode {name mode} {
45b5a4a705Smistachkin    if {$::tcl_platform(platform)=="windows"} {
46b5a4a705Smistachkin      #
47b5a4a705Smistachkin      # NOTE: Set or unset the write bits of the file permissions
48b5a4a705Smistachkin      #       based on the read-only attribute because the Win32
49b5a4a705Smistachkin      #       version of UnZip does this.
50b5a4a705Smistachkin      #
51b5a4a705Smistachkin      set writebits 0x12; # 0o22
52b5a4a705Smistachkin      set result $mode
53b5a4a705Smistachkin      if {[file attributes $name -readonly]} {
54b5a4a705Smistachkin        set result [expr {$result | $writebits}]
55b5a4a705Smistachkin      } else {
56b5a4a705Smistachkin        set result [expr {$result & ~$writebits}]
57b5a4a705Smistachkin      }
58b5a4a705Smistachkin      return $result
59b5a4a705Smistachkin    } else {
60b5a4a705Smistachkin      return $mode
61b5a4a705Smistachkin    }
62b5a4a705Smistachkin  }
63ea4125bbSdan  proc do_unzip {file} {
64ea4125bbSdan    forcedelete test_unzip
65ea4125bbSdan    file mkdir test_unzip
66b5a4a705Smistachkin    exec $::UNZIP -d test_unzip $file
67b5a4a705Smistachkin
68b5a4a705Smistachkin    db func modefix fix_stat_mode
69ea4125bbSdan
70ea4125bbSdan    set res [db eval {
71b5a4a705Smistachkin      SELECT replace(name,'test_unzip/',''),modefix(name,mode),mtime,data
72ea4125bbSdan      FROM fsdir('test_unzip')
73ea4125bbSdan      WHERE name!='test_unzip'
74ea4125bbSdan      ORDER BY name
75ea4125bbSdan    }]
76ea4125bbSdan    set res
77ea4125bbSdan  }
78ea4125bbSdan}
79ea4125bbSdan
8044091ed3Sdan
8144091ed3Sdan# The argument is a blob (not a hex string) containing a zip archive.
8244091ed3Sdan# This proc removes the extended timestamp fields from the archive
8344091ed3Sdan# and returns the result.
8444091ed3Sdan#
8544091ed3Sdanproc remove_timestamps {blob} {
8644091ed3Sdan  set hex [binary encode hex $blob]
8744091ed3Sdan  set hex [string map {55540500 00000500} $hex]
8844091ed3Sdan  binary decode hex $hex
8944091ed3Sdan}
9044091ed3Sdan
9144091ed3Sdan
92f8c4b99aSdan# Argument $file is the name of a zip archive on disk. This function
93f8c4b99aSdan# executes test cases to check that the results of each of the following
94f8c4b99aSdan# are the same:
95f8c4b99aSdan#
96f8c4b99aSdan#         SELECT * FROM zipfile($file)
97f8c4b99aSdan#         SELECT * FROM zipfile( readfile($file) )
98f8c4b99aSdan#         SELECT * FROM zipfile(
99f8c4b99aSdan#           (SELECT zipfile(name,mode,mtime,data,method) FROM zipfile($file))
100f8c4b99aSdan#         )
101f8c4b99aSdan#
102f8c4b99aSdanproc do_zipfile_blob_test {tn file} {
10326333ee3Sdan
104f8c4b99aSdan  db func r readfile
105f8c4b99aSdan  set q1 {SELECT name,mode,mtime,method,quote(data) FROM zipfile($file)}
106f8c4b99aSdan  set q2 {SELECT name,mode,mtime,method,quote(data) FROM zipfile( r($file) )}
107f8c4b99aSdan  set q3 {SELECT name,mode,mtime,method,quote(data) FROM zipfile(
108f8c4b99aSdan    ( SELECT zipfile(name,mode,mtime,data,method) FROM zipfile($file) )
109f8c4b99aSdan  )}
11026333ee3Sdan
11126333ee3Sdan
112f8c4b99aSdan  set r1 [db eval $q1]
113f8c4b99aSdan  set r2 [db eval $q2]
114f8c4b99aSdan  set r3 [db eval $q3]
115f8c4b99aSdan  #puts $r1
116f8c4b99aSdan  #puts $r2
117f8c4b99aSdan  #puts $r3
11826333ee3Sdan
119f8c4b99aSdan  uplevel [list do_test $tn.1 [list set {} $r2] $r1]
120ea4125bbSdan  uplevel [list do_test $tn.2 [list set {} $r3] $r1]
121ea4125bbSdan}
122ea4125bbSdan
123ea4125bbSdan# Argument $file is a zip file on disk. This command runs tests to:
124ea4125bbSdan#
125ea4125bbSdan#   1. Unpack the archive with unix command [unzip] and compare the
126ea4125bbSdan#      results to reading the same archive using the zipfile() table
127ea4125bbSdan#      valued function.
128ea4125bbSdan#
129ea4125bbSdan#   2. Creates a new archive with the same contents using the zipfile()
130ea4125bbSdan#      aggregate function as follows:
131ea4125bbSdan#
132ea4125bbSdan#      SELECT writefile('test_unzip.zip',
133ea4125bbSdan#          ( SELECT zipfile(name,mode,mtime,data,method) FROM zipfile($file) )
134ea4125bbSdan#      );
135ea4125bbSdan#
136ea4125bbSdan#      Then tests that unpacking the new archive using [unzip] produces
137ea4125bbSdan#      the same results as in (1).
138ea4125bbSdan#
139ea4125bbSdanproc do_unzip_test {tn file} {
140ea4125bbSdan  db func sss strip_slash
141ea4125bbSdan
142ea4125bbSdan  db eval {
143ea4125bbSdan    SELECT writefile('test_unzip.zip',
144ea4125bbSdan        ( SELECT zipfile(name,mode,mtime,data,method) FROM zipfile($file) )
145ea4125bbSdan    );
146ea4125bbSdan  }
147ea4125bbSdan
148ea4125bbSdan  set r1 [db eval {
149ea4125bbSdan    SELECT sss(name),mode,mtime,data FROM zipfile($file) ORDER BY name
150ea4125bbSdan  }]
151ea4125bbSdan  set r2 [do_unzip $file]
152ea4125bbSdan  set r3 [do_unzip test_unzip.zip]
153ea4125bbSdan
154ea4125bbSdan  uplevel [list do_test $tn.1 [list set {} $r2] $r1]
155ea4125bbSdan  uplevel [list do_test $tn.2 [list set {} $r3] $r1]
156ea4125bbSdan}
157ea4125bbSdanproc strip_slash {in} { regsub {/$} $in {} }
158ea4125bbSdan
159ea4125bbSdanproc do_zip_tests {tn file} {
160ea4125bbSdan  uplevel do_zipfile_blob_test $tn.1 $file
161a8728e74Sdan  if {[info exists ::UNZIP]} {
162ea4125bbSdan    uplevel do_unzip_test $tn.2 $file
1638005d605Sdan  }
164a8728e74Sdan}
1658005d605Sdan
166373dc3bbSdanforcedelete test.zip
167373dc3bbSdando_execsql_test 1.0 {
168373dc3bbSdan  CREATE VIRTUAL TABLE temp.zz USING zipfile('test.zip');
169373dc3bbSdan  PRAGMA table_info(zz);
170373dc3bbSdan} {
17166a3a91aSdan  0 name {} 1 {} 1
172373dc3bbSdan  1 mode {} 0 {} 0
173373dc3bbSdan  2 mtime {} 0 {} 0
174373dc3bbSdan  3 sz {} 0 {} 0
1757c15ac1aSdan  4 rawdata {} 0 {} 0
1767c15ac1aSdan  5 data {} 0 {} 0
1777c15ac1aSdan  6 method {} 0 {} 0
178373dc3bbSdan}
179373dc3bbSdan
1802d620070Sdando_catchsql_test 1.1.0.1 {
1817c15ac1aSdan  INSERT INTO zz(name, mode, mtime, sz, rawdata, method)
1827c15ac1aSdan  VALUES('f.txt', '-rw-r--r--', 1000000000, 5, 'abcde', 0);
18341a6f2cbSdrh} {1 {rawdata must be NULL}}
18415daa6b5Sdando_catchsql_test 1.1.0.2 {
18515daa6b5Sdan  INSERT INTO zz(name, mtime, sz, data, method)
1867c15ac1aSdan  VALUES('g.txt', 1000000002, 5, '12345', 0);
18741a6f2cbSdrh} {1 {sz must be NULL}}
18815daa6b5Sdando_catchsql_test 1.1.0.3 {
18915daa6b5Sdan  INSERT INTO zz(name, mtime, rawdata, method)
19015daa6b5Sdan  VALUES('g.txt', 1000000002, '12345', 0);
19141a6f2cbSdrh} {1 {rawdata must be NULL}}
19215daa6b5Sdando_catchsql_test 1.1.0.4 {
19315daa6b5Sdan  INSERT INTO zz(name, data, method)
19415daa6b5Sdan  VALUES('g.txt', '12345', 7);
19541a6f2cbSdrh} {1 {unknown compression method: 7}}
1962d620070Sdan
1972d620070Sdando_execsql_test 1.1.1 {
1982d620070Sdan  INSERT INTO zz(name, mode, mtime, data, method)
1992d620070Sdan  VALUES('f.txt', '-rw-r--r--', 1000000000, 'abcde', 0);
2002d620070Sdan}
2012d620070Sdando_execsql_test 1.1.2 {
2022d620070Sdan  INSERT INTO zz(name, mode, mtime, data, method)
2032d620070Sdan  VALUES('g.txt', NULL, 1000000002, '12345', 0);
204373dc3bbSdan}
205373dc3bbSdan
206373dc3bbSdando_execsql_test 1.2 {
2070cde0c62Sdan  SELECT name, mtime, data FROM zipfile('test.zip')
208373dc3bbSdan} {
209373dc3bbSdan  f.txt 1000000000 abcde
210db0cb303Sdan  g.txt 1000000002 12345
211373dc3bbSdan}
212ea4125bbSdando_zip_tests 1.2a test.zip
213373dc3bbSdan
214373dc3bbSdando_execsql_test 1.3 {
2157c15ac1aSdan  INSERT INTO zz(name, mode, mtime, data) VALUES('h.txt',
2167c15ac1aSdan    '-rw-r--r--', 1000000004, 'aaaaaaaaaabbbbbbbbbb'
217373dc3bbSdan  );
218373dc3bbSdan}
219ea4125bbSdando_zip_tests 1.3a test.zip
220373dc3bbSdan
221373dc3bbSdando_execsql_test 1.4 {
2227c15ac1aSdan  SELECT name, mtime, data, method FROM zipfile('test.zip');
223373dc3bbSdan} {
224373dc3bbSdan  f.txt 1000000000 abcde 0
225373dc3bbSdan  g.txt 1000000002 12345 0
226db0cb303Sdan  h.txt 1000000004 aaaaaaaaaabbbbbbbbbb 8
227373dc3bbSdan}
228373dc3bbSdan
229f1939376Sdanifcapable json1 {
2302879952fSdan  do_execsql_test 1.4.1 {
2312879952fSdan    SELECT name, json_extract( zipfile_cds(z) , '$.crc32')!=0
2322879952fSdan    FROM zipfile('test.zip');
2332879952fSdan  } {
2342879952fSdan    f.txt 1
2352879952fSdan    g.txt 1
2362879952fSdan    h.txt 1
2372879952fSdan  }
238f1939376Sdan}
23915daa6b5Sdando_catchsql_test 1.4.2 {
24015daa6b5Sdan  SELECT zipfile_cds(mode) FROM zipfile('test.zip');
24115daa6b5Sdan} {0 {{} {} {}}}
2422879952fSdan
2430cde0c62Sdando_execsql_test 1.5.1 {
2440cde0c62Sdan  BEGIN;
2457c15ac1aSdan    INSERT INTO zz(name, mode, mtime, data, method)
2467c15ac1aSdan    VALUES('i.txt', '-rw-r--r--', 1000000006, 'zxcvb', 0);
2470cde0c62Sdan    SELECT name FROM zz;
2480cde0c62Sdan  COMMIT;
2490cde0c62Sdan} {f.txt g.txt h.txt i.txt}
2500cde0c62Sdando_execsql_test 1.5.2 {
2510cde0c62Sdan  SELECT name FROM zz;
2520cde0c62Sdan} {f.txt g.txt h.txt i.txt}
253f42884c3Sdando_execsql_test 1.5.3 {
254f42884c3Sdan  SELECT data FROM zz WHERE name='i.txt';
255f42884c3Sdan} {zxcvb}
2560cde0c62Sdan
2570cde0c62Sdando_execsql_test 1.6.0 {
2580cde0c62Sdan  DELETE FROM zz WHERE name='g.txt';
2590cde0c62Sdan  SELECT name FROM zz;
2600cde0c62Sdan} {f.txt h.txt i.txt}
2610cde0c62Sdan
262f42884c3Sdando_execsql_test 1.6.1 {
263f42884c3Sdan  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
264f42884c3Sdan} {
265f42884c3Sdan  f.txt 33188 1000000000 abcde 0
266f42884c3Sdan  h.txt 33188 1000000004 aaaaaaaaaabbbbbbbbbb 8
267f42884c3Sdan  i.txt 33188 1000000006 zxcvb 0
268f42884c3Sdan}
269ea4125bbSdando_zip_tests 1.6.1a test.zip
270f42884c3Sdan
271f42884c3Sdando_execsql_test 1.6.2 {
272f42884c3Sdan  UPDATE zz SET mtime=4 WHERE name='i.txt';
273f42884c3Sdan  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
274f42884c3Sdan} {
275f42884c3Sdan  f.txt 33188 1000000000 abcde 0
276f42884c3Sdan  h.txt 33188 1000000004 aaaaaaaaaabbbbbbbbbb 8
277f42884c3Sdan  i.txt 33188 4 zxcvb 0
278f42884c3Sdan}
279f42884c3Sdan
280b5a4a705Smistachkinif {$::tcl_platform(platform)=="unix"} {
281b5a4a705Smistachkin  set modes -rw-r--r-x
282b5a4a705Smistachkin  set perms 33189
283b5a4a705Smistachkin} else {
284b5a4a705Smistachkin  set modes -rw-r--r--; # no execute bits on Win32
285b5a4a705Smistachkin  set perms 33188
286f42884c3Sdan}
287b5a4a705Smistachkin
288b5a4a705Smistachkindo_execsql_test 1.6.3 {
289b5a4a705Smistachkin  UPDATE zz SET mode=$modes WHERE name='h.txt';
290b5a4a705Smistachkin  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
291b5a4a705Smistachkin} [string map [list %perms% $perms] {
292b5a4a705Smistachkin  f.txt 33188 1000000000 abcde 0
293b5a4a705Smistachkin  h.txt %perms% 1000000004 aaaaaaaaaabbbbbbbbbb 8
294b5a4a705Smistachkin  i.txt 33188 4 zxcvb 0
295b5a4a705Smistachkin}]
296ea4125bbSdando_zip_tests 1.6.3a test.zip
297f42884c3Sdan
298f42884c3Sdando_execsql_test 1.6.4 {
299f42884c3Sdan  UPDATE zz SET name = 'blue.txt' WHERE name='f.txt';
300f42884c3Sdan  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
301b5a4a705Smistachkin} [string map [list %perms% $perms] {
302f42884c3Sdan  blue.txt 33188 1000000000 abcde 0
303b5a4a705Smistachkin  h.txt %perms% 1000000004 aaaaaaaaaabbbbbbbbbb 8
304f42884c3Sdan  i.txt 33188 4 zxcvb 0
305b5a4a705Smistachkin}]
306ea4125bbSdando_zip_tests 1.6.4a test.zip
307f42884c3Sdan
308f42884c3Sdando_execsql_test 1.6.5 {
309f42884c3Sdan  UPDATE zz SET data = 'edcba' WHERE name='blue.txt';
310f42884c3Sdan  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
311b5a4a705Smistachkin} [string map [list %perms% $perms] {
312f42884c3Sdan  blue.txt 33188 1000000000 edcba 0
313b5a4a705Smistachkin  h.txt %perms% 1000000004 aaaaaaaaaabbbbbbbbbb 8
314f42884c3Sdan  i.txt 33188 4 zxcvb 0
315b5a4a705Smistachkin}]
316f42884c3Sdan
317f42884c3Sdando_execsql_test 1.6.6 {
318f42884c3Sdan  UPDATE zz SET mode=NULL, data = NULL WHERE name='blue.txt';
319f42884c3Sdan  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
320b5a4a705Smistachkin} [string map [list %perms% $perms] {
321f42884c3Sdan  blue.txt/ 16877 1000000000 {} 0
322b5a4a705Smistachkin  h.txt %perms% 1000000004 aaaaaaaaaabbbbbbbbbb 8
323f42884c3Sdan  i.txt 33188 4 zxcvb 0
324b5a4a705Smistachkin}]
325f42884c3Sdan
326f42884c3Sdando_catchsql_test 1.6.7 {
327f42884c3Sdan  UPDATE zz SET data=NULL WHERE name='i.txt'
32841a6f2cbSdrh} {1 {zipfile: mode does not match data}}
329f42884c3Sdando_execsql_test 1.6.8 {
330f42884c3Sdan  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
331b5a4a705Smistachkin} [string map [list %perms% $perms] {
332f42884c3Sdan  blue.txt/ 16877 1000000000 {} 0
333b5a4a705Smistachkin  h.txt %perms% 1000000004 aaaaaaaaaabbbbbbbbbb 8
334f42884c3Sdan  i.txt 33188 4 zxcvb 0
335b5a4a705Smistachkin}]
33615daa6b5Sdan
33715daa6b5Sdando_execsql_test 1.6.9 {
338b5a4a705Smistachkin  UPDATE zz SET data = '' WHERE name='i.txt';
339b5a4a705Smistachkin  SELECT name,mode,mtime,data,method from zipfile('test.zip');
340b5a4a705Smistachkin} [string map [list %perms% $perms] {
341b5a4a705Smistachkin  blue.txt/ 16877 1000000000 {} 0
342b5a4a705Smistachkin  h.txt %perms% 1000000004 aaaaaaaaaabbbbbbbbbb 8
343b5a4a705Smistachkin  i.txt 33188 4 {} 0
344b5a4a705Smistachkin}]
345b5a4a705Smistachkin
346b5a4a705Smistachkindo_execsql_test 1.6.10 {
34715daa6b5Sdan  SELECT a.name, a.data
34815daa6b5Sdan  FROM zz AS a, zz AS b
34915daa6b5Sdan  WHERE a.name=+b.name AND +a.mode=b.mode
35015daa6b5Sdan} {
35115daa6b5Sdan  blue.txt/ {}
35215daa6b5Sdan  h.txt aaaaaaaaaabbbbbbbbbb
35315daa6b5Sdan  i.txt {}
35415daa6b5Sdan}
35515daa6b5Sdan
356b5a4a705Smistachkindo_execsql_test 1.6.11 {
35715daa6b5Sdan  SELECT name, data FROM zz WHERE name LIKE '%txt'
35815daa6b5Sdan} {
35915daa6b5Sdan  h.txt aaaaaaaaaabbbbbbbbbb
36015daa6b5Sdan  i.txt {}
36115daa6b5Sdan}
36215daa6b5Sdan
36315daa6b5Sdando_execsql_test 1.7 {
36415daa6b5Sdan  DELETE FROM zz;
36515daa6b5Sdan  SELECT * FROM zz;
36615daa6b5Sdan} {}
36715daa6b5Sdan
368128011a2Sdan#-------------------------------------------------------------------------
369128011a2Sdandb close
370128011a2Sdanforcedelete test.zip
371128011a2Sdanreset_db
372ea4125bbSdanload_static_extension db fileio
373128011a2Sdanload_static_extension db zipfile
374128011a2Sdando_execsql_test 2.1 {
375128011a2Sdan  CREATE VIRTUAL TABLE zzz USING zipfile('test.zip');
376128011a2Sdan  INSERT INTO zzz(name, mode) VALUES('dirname', 'drwxr-xr-x');
377128011a2Sdan  SELECT name, mode, data FROM zzz;
378f2ed70e4Sdan} {dirname/ 16877 {}}
379128011a2Sdando_execsql_test 2.2 {
380128011a2Sdan  INSERT INTO zzz(name, data) VALUES('dirname2', NULL);
381128011a2Sdan  INSERT INTO zzz(name, data) VALUES('dirname2/file1.txt', 'abcdefghijklmnop');
382128011a2Sdan  SELECT name, mode, data FROM zzz;
383128011a2Sdan} {
384f2ed70e4Sdan  dirname/ 16877 {}
385f2ed70e4Sdan  dirname2/ 16877 {}
386128011a2Sdan  dirname2/file1.txt 33188 abcdefghijklmnop
387128011a2Sdan}
388128011a2Sdan
3892c4df975Sdando_catchsql_test 2.3 {
390f2ed70e4Sdan  UPDATE zzz SET name = 'dirname3' WHERE name = 'dirname/';
391f42884c3Sdan} {0 {}}
3922c4df975Sdando_execsql_test 2.4 {
3932c4df975Sdan  SELECT name, mode, data FROM zzz;
3942c4df975Sdan} {
395f42884c3Sdan  dirname3/ 16877 {}
396f2ed70e4Sdan  dirname2/ 16877 {}
3972c4df975Sdan  dirname2/file1.txt 33188 abcdefghijklmnop
3982c4df975Sdan}
399ea4125bbSdando_zip_tests 2.4a test.zip
400128011a2Sdan
401b5a4a705Smistachkin# Check that the [unzip] utility can unpack our archive.
402f2ed70e4Sdan#
403b5a4a705Smistachkinif {[info exists ::UNZIP]} {
404f2ed70e4Sdan  do_test 2.5.1 {
405f2ed70e4Sdan    forcedelete dirname
406f2ed70e4Sdan    forcedelete dirname2
407b5a4a705Smistachkin    if {$::tcl_platform(platform)=="unix"} {
408b5a4a705Smistachkin      set null /dev/null
409b5a4a705Smistachkin    } else {
410b5a4a705Smistachkin      set null NUL
411b5a4a705Smistachkin    }
412b5a4a705Smistachkin    set rc [catch { exec $::UNZIP test.zip > $null } msg]
413f2ed70e4Sdan    list $rc $msg
414f2ed70e4Sdan  } {0 {}}
415f42884c3Sdan  do_test 2.5.2 { file isdir dirname3 } 1
416f2ed70e4Sdan  do_test 2.5.3 { file isdir dirname2 } 1
417f2ed70e4Sdan  do_test 2.5.4 { file isdir dirname2/file1.txt } 0
418f2ed70e4Sdan  do_test 2.5.5 {
419f2ed70e4Sdan    set fd [open dirname2/file1.txt]
420f2ed70e4Sdan    set data [read $fd]
421f2ed70e4Sdan    close $fd
422f2ed70e4Sdan    set data
423f2ed70e4Sdan  } {abcdefghijklmnop}
424f2ed70e4Sdan}
425128011a2Sdan
4264bfd1829Sdan#-------------------------------------------------------------------------
4274bfd1829Sdanreset_db
4284bfd1829Sdanforcedelete test.zip
4294bfd1829Sdanload_static_extension db zipfile
430b5a4a705Smistachkinload_static_extension db fileio
4314bfd1829Sdan
4324bfd1829Sdando_execsql_test 3.0 {
4334bfd1829Sdan  CREATE VIRTUAL TABLE temp.x1 USING zipfile('test.zip');
4344bfd1829Sdan  INSERT INTO x1(name, data) VALUES('dir1/', NULL);
4354bfd1829Sdan  INSERT INTO x1(name, data) VALUES('file1', '1234');
4364bfd1829Sdan  INSERT INTO x1(name, data) VALUES('dir1/file2', '5678');
4374bfd1829Sdan}
4384bfd1829Sdanforeach {tn fname} {
4394bfd1829Sdan  1 dir1
4404bfd1829Sdan  2 file1
4414bfd1829Sdan  3 dir1/file2
4424bfd1829Sdan} {
4434bfd1829Sdan  do_catchsql_test 3.1.$tn.0 {
4444bfd1829Sdan    INSERT INTO x1(name, data) VALUES($fname, NULL);
44541a6f2cbSdrh  } [list 1 "duplicate name: \"$fname/\""]
4464bfd1829Sdan  do_catchsql_test 3.1.$tn.1 {
4474bfd1829Sdan    INSERT INTO x1(name, data) VALUES($fname || '/', NULL);
44841a6f2cbSdrh  } [list 1 "duplicate name: \"$fname/\""]
4494bfd1829Sdan  do_catchsql_test 3.1.$tn.2 {
4504bfd1829Sdan    INSERT INTO x1(name, data) VALUES($fname, 'abcd');
45141a6f2cbSdrh  } [list 1 "duplicate name: \"$fname\""]
4524bfd1829Sdan}
4534bfd1829Sdan
45466a3a91aSdando_catchsql_test 3.2 {
45566a3a91aSdan  SELECT rowid FROM x1
45666a3a91aSdan} {1 {no such column: rowid}}
45766a3a91aSdan
45826333ee3Sdan#-------------------------------------------------------------------------
459fdcd9d4eSdan# Test some error conditions.
460fdcd9d4eSdan#
461fdcd9d4eSdando_catchsql_test 4.1 {
462fdcd9d4eSdan  CREATE VIRTUAL TABLE yyy USING zipfile();
463fdcd9d4eSdan} {1 {zipfile constructor requires one argument}}
464fdcd9d4eSdando_catchsql_test 4.2 {
465fdcd9d4eSdan  CREATE VIRTUAL TABLE yyy USING zipfile('test.zip', 'test.zip');
466fdcd9d4eSdan} {1 {zipfile constructor requires one argument}}
46726333ee3Sdan
46815daa6b5Sdando_catchsql_test 4.3 {
46915daa6b5Sdan  SELECT * FROM zipfile()
47015daa6b5Sdan} {1 {zipfile() function requires an argument}}
47115daa6b5Sdan
47215daa6b5Sdando_catchsql_test 4.4 {
47315daa6b5Sdan  SELECT * FROM zipfile('/path/that/does/not/exist')
47415daa6b5Sdan} {1 {cannot open file: /path/that/does/not/exist}}
47515daa6b5Sdan
47615daa6b5Sdanforeach {tn mode} {
47715daa6b5Sdan  1 abcd
47815daa6b5Sdan  2 brwxrwxrwx
47915daa6b5Sdan  3 lrwxrrxrwx
48015daa6b5Sdan} {
48115daa6b5Sdan  do_catchsql_test 4.5.$tn {
48215daa6b5Sdan    WITH m(m) AS ( SELECT $mode)
48315daa6b5Sdan    SELECT zipfile('a.txt', m, 1000, 'xyz') FROM m
48415daa6b5Sdan  } [list 1 "zipfile: parse error in mode: $mode"]
48515daa6b5Sdan}
48615daa6b5Sdan
487668845bbSdando_catchsql_test 4.6 {
488668845bbSdan  WITH c(name,data) AS ( SELECT 'a.txt', 'abc')
489668845bbSdan  SELECT zipfile(name) FROM c
490668845bbSdan} {1 {wrong number of arguments to function zipfile()}}
491668845bbSdan
492668845bbSdando_catchsql_test 4.7 {
493668845bbSdan  WITH c(name,data) AS (
494668845bbSdan    SELECT 'a.txt', 'abc' UNION ALL
495668845bbSdan    SELECT NULL, 'def'
496668845bbSdan  )
497668845bbSdan  SELECT zipfile(name,data) FROM c
498668845bbSdan} {1 {first argument to zipfile() must be non-NULL}}
499668845bbSdan
500b5a4a705Smistachkindo_catchsql_test 4.8 {
501668845bbSdan  WITH c(name,data,method) AS (
502668845bbSdan    SELECT 'a.txt', 'abc', 0
503668845bbSdan    UNION SELECT 'b.txt', 'def', 8
504668845bbSdan    UNION SELECT 'c.txt', 'ghi', 16
505668845bbSdan  )
506668845bbSdan  SELECT zipfile(name,NULL,NULL,data,method) FROM c
507668845bbSdan} {1 {illegal method value: 16}}
508668845bbSdan
509b5a4a705Smistachkindo_catchsql_test 4.9 {
510668845bbSdan  WITH c(name,data) AS (
511668845bbSdan    SELECT 'a.txt', 'abc'
512668845bbSdan    UNION SELECT 'b.txt', 'def'
513668845bbSdan    UNION SELECT 'c.txt/', 'ghi'
514668845bbSdan  )
515668845bbSdan  SELECT zipfile(name,NULL,NULL,data) FROM c
516668845bbSdan} {1 {non-directory name must not end with /}}
517668845bbSdan
51844091ed3Sdan#--------------------------------------------------------------------------
51944091ed3Sdan
52044091ed3Sdandb func rt remove_timestamps
52144091ed3Sdando_execsql_test 5.0 {
52244091ed3Sdan  WITH c(name,mtime,data) AS (
52344091ed3Sdan    SELECT 'a.txt', 946684800, 'abc'
52444091ed3Sdan  )
52544091ed3Sdan  SELECT name,mtime,data FROM zipfile(
526668845bbSdan    ( SELECT rt( zipfile(name,NULL,mtime,data,NULL) ) FROM c )
52744091ed3Sdan  )
52844091ed3Sdan} {
52944091ed3Sdan  a.txt 946684800 abc
53044091ed3Sdan}
53144091ed3Sdan
532b5a4a705Smistachkinif {[info exists ::UNZIP]} {
533cfaffad6Sdanifcapable datetime {
534cfaffad6Sdan  forcedelete test1.zip test2.zip
53544091ed3Sdan  do_test 6.0 {
53644091ed3Sdan    execsql {
53744091ed3Sdan      WITH c(name,mtime,data) AS (
53844091ed3Sdan        SELECT 'a.txt', 946684800, 'abc' UNION ALL
53944091ed3Sdan        SELECT 'b.txt', 1000000000, 'abc' UNION ALL
54044091ed3Sdan        SELECT 'c.txt', 1111111000, 'abc'
54144091ed3Sdan      )
542cfaffad6Sdan      SELECT writefile('test1.zip', rt( zipfile(name, NULL, mtime, data) ) ),
543cfaffad6Sdan             writefile('test2.zip',   ( zipfile(name, NULL, mtime, data) ) )
544cfaffad6Sdan      FROM c;
54544091ed3Sdan    }
54644091ed3Sdan    forcedelete test_unzip
54744091ed3Sdan    file mkdir test_unzip
548b5a4a705Smistachkin    exec $::UNZIP -d test_unzip test1.zip
54944091ed3Sdan
55044091ed3Sdan    db eval {
551cfaffad6Sdan      SELECT name, strftime('%s', mtime, 'unixepoch', 'localtime')
552cfaffad6Sdan      FROM fsdir('test_unzip') WHERE name!='test_unzip'
55344091ed3Sdan      ORDER BY name
55444091ed3Sdan    }
55544091ed3Sdan  } [list {*}{
55644091ed3Sdan    test_unzip/a.txt 946684800
55744091ed3Sdan    test_unzip/b.txt 1000000000
55844091ed3Sdan    test_unzip/c.txt 1111111000
55944091ed3Sdan  }]
560cfaffad6Sdan
5613571e7bfSdrh  # fsdir() issue reported on the mailing list on 2018-03-14 by Jack Thaw.
5623571e7bfSdrh  do_test 6.0b {
5633571e7bfSdrh    db eval {
5643571e7bfSdrh      SELECT sum(name LIKE '%/a.txt')
5653571e7bfSdrh      FROM (VALUES(1),(2),(3)) CROSS JOIN fsdir('test_unzip')
5663571e7bfSdrh    }
5673571e7bfSdrh  } {3}
5683571e7bfSdrh
569c3ef23a1Sdan  do_execsql_test 6.1 {
570c3ef23a1Sdan    SELECT name, mtime, data FROM zipfile('test1.zip')
571c3ef23a1Sdan  } {
572c3ef23a1Sdan    a.txt 946684800   abc
573c3ef23a1Sdan    b.txt 1000000000  abc
574c3ef23a1Sdan    c.txt 1111111000  abc
575c3ef23a1Sdan  }
576c3ef23a1Sdan
577c3ef23a1Sdan  do_test 6.2 {
578cfaffad6Sdan    forcedelete test_unzip
579cfaffad6Sdan    file mkdir test_unzip
580b5a4a705Smistachkin    exec $::UNZIP -d test_unzip test2.zip
581cfaffad6Sdan
582cfaffad6Sdan    db eval {
583cfaffad6Sdan      SELECT name, mtime
584cfaffad6Sdan      FROM fsdir('test_unzip') WHERE name!='test_unzip'
585cfaffad6Sdan      ORDER BY name
586cfaffad6Sdan    }
587cfaffad6Sdan  } [list {*}{
588cfaffad6Sdan    test_unzip/a.txt 946684800
589cfaffad6Sdan    test_unzip/b.txt 1000000000
590cfaffad6Sdan    test_unzip/c.txt 1111111000
591cfaffad6Sdan  }]
592c3ef23a1Sdan
593c3ef23a1Sdan  do_execsql_test 6.3 {
59415daa6b5Sdan    SELECT name, mtime, sz, rawdata, data FROM zipfile('test2.zip')
595c3ef23a1Sdan  } {
59615daa6b5Sdan    a.txt 946684800   3 abc abc
59715daa6b5Sdan    b.txt 1000000000  3 abc abc
59815daa6b5Sdan    c.txt 1111111000  3 abc abc
599cfaffad6Sdan  }
60044091ed3Sdan}
601c3ef23a1Sdan}
602c3ef23a1Sdan
603c3ef23a1Sdan#-------------------------------------------------------------------------
60415daa6b5Sdan# Force an IO error by truncating the zip archive to zero bytes in size
60515daa6b5Sdan# while it is being read.
606c3ef23a1Sdanforcedelete test.zip
607c3ef23a1Sdando_test 7.0 {
608c3ef23a1Sdan  execsql {
609c3ef23a1Sdan    WITH c(name,data) AS (
610c3ef23a1Sdan        SELECT '1', randomblob(1000000) UNION ALL
611c3ef23a1Sdan        SELECT '2', randomblob(1000000) UNION ALL
612c3ef23a1Sdan        SELECT '3', randomblob(1000000)
613c3ef23a1Sdan    )
614c3ef23a1Sdan    SELECT writefile('test.zip', zipfile(name, data) ) FROM c;
615c3ef23a1Sdan  }
616c3ef23a1Sdan
617c3ef23a1Sdan  list [catch {
618c3ef23a1Sdan    db eval { SELECT name, data FROM zipfile('test.zip') } {
619c3ef23a1Sdan      if {$name==2} { close [open test.zip w+] }
620c3ef23a1Sdan    }
621c3ef23a1Sdan  } msg] $msg
622c3ef23a1Sdan} {1 {error in fread()}}
62326333ee3Sdan
62415daa6b5Sdanforcedelete test.zip
62515daa6b5Sdando_execsql_test 8.0.1 {
62615daa6b5Sdan  CREATE VIRTUAL TABLE zz USING zipfile('test.zip');
62715daa6b5Sdan  BEGIN;
62815daa6b5Sdan    INSERT INTO zz(name, data) VALUES('a.txt', '1');
62915daa6b5Sdan    INSERT INTO zz(name, data) VALUES('b.txt', '2');
63015daa6b5Sdan    INSERT INTO zz(name, data) VALUES('c.txt', '1');
63115daa6b5Sdan    INSERT INTO zz(name, data) VALUES('d.txt', '2');
63215daa6b5Sdan    SELECT name, data FROM zz;
63315daa6b5Sdan} {
63415daa6b5Sdan  a.txt 1 b.txt 2 c.txt 1 d.txt 2
63515daa6b5Sdan}
63615daa6b5Sdando_test 8.0.2 {
63715daa6b5Sdan  db eval { SELECT name, data FROM zz } {
63815daa6b5Sdan    if { $data=="2" } { db eval { DELETE FROM zz WHERE name=$name } }
63915daa6b5Sdan  }
64015daa6b5Sdan  execsql { SELECT name, data FROM zz }
64115daa6b5Sdan} {a.txt 1 c.txt 1}
64215daa6b5Sdando_test 8.0.3 {
64315daa6b5Sdan  db eval { SELECT name, data FROM zz } {
64415daa6b5Sdan    db eval { DELETE FROM zz WHERE name=$name }
64515daa6b5Sdan  }
64615daa6b5Sdan  execsql { SELECT name, data FROM zz }
64715daa6b5Sdan} {}
64815daa6b5Sdanexecsql COMMIT
64915daa6b5Sdan
650d99f49fcSdancatch { forcedelete test_unzip }
651d99f49fcSdancatch { file mkdir test_unzip }
65215daa6b5Sdando_execsql_test 8.1.1 {
65315daa6b5Sdan  CREATE VIRTUAL TABLE nogood USING zipfile('test_unzip');
65415daa6b5Sdan}
65515daa6b5Sdando_catchsql_test 8.1.2 {
65615daa6b5Sdan  INSERT INTO nogood(name, data) VALUES('abc', 'def');
65715daa6b5Sdan} {1 {zipfile: failed to open file test_unzip for writing}}
65815daa6b5Sdan
65915daa6b5Sdando_execsql_test 8.2.1 {
66015daa6b5Sdan  DROP TABLE nogood;
66115daa6b5Sdan  BEGIN;
66215daa6b5Sdan    CREATE VIRTUAL TABLE nogood USING zipfile('test_unzip');
66315daa6b5Sdan}
66415daa6b5Sdando_catchsql_test 8.2.2 {
66515daa6b5Sdan    INSERT INTO nogood(name, data) VALUES('abc', 'def');
66615daa6b5Sdan} {1 {zipfile: failed to open file test_unzip for writing}}
66715daa6b5Sdando_execsql_test 8.2.3 {
66815daa6b5Sdan  COMMIT;
66915daa6b5Sdan}
67015daa6b5Sdan
67115daa6b5Sdanforcedelete test.zip
67215daa6b5Sdando_execsql_test 8.3.1 {
67315daa6b5Sdan  BEGIN;
67415daa6b5Sdan    CREATE VIRTUAL TABLE ok USING zipfile('test.zip');
67515daa6b5Sdan    INSERT INTO ok(name, data) VALUES ('sqlite3', 'elf');
67615daa6b5Sdan  COMMIT;
67715daa6b5Sdan}
6784bfd1829Sdan
679668845bbSdan#-------------------------------------------------------------------------
680668845bbSdan# Test that the zipfile aggregate correctly adds and removes "/" from
681668845bbSdan# the ends of directory file names.
682668845bbSdando_execsql_test 9.0 {
683668845bbSdan  WITH src(nm) AS (
684668845bbSdan    VALUES('dir1') UNION ALL
685668845bbSdan    VALUES('dir2/') UNION ALL
686668845bbSdan    VALUES('dir3//') UNION ALL
687668845bbSdan    VALUES('dir4///') UNION ALL
688668845bbSdan    VALUES('/')
689668845bbSdan  )
690668845bbSdan  SELECT name FROM zipfile((SELECT zipfile(nm, NULL) FROM src))
691668845bbSdan} {dir1/ dir2/ dir3/ dir4/ /}
69242f3c5ffSdrh
69342f3c5ffSdrh#-------------------------------------------------------------------------
69442f3c5ffSdrh# INSERT OR REPLACE and INSERT OR IGNORE
69542f3c5ffSdrh#
69642f3c5ffSdrhcatch {db close}
69742f3c5ffSdrhforcedelete test.zip test.db
69842f3c5ffSdrhsqlite3 db :memory:
69942f3c5ffSdrhload_static_extension db zipfile
700b5a4a705Smistachkinload_static_extension db fileio
701b5a4a705Smistachkin
70242f3c5ffSdrhdo_execsql_test 10.0 {
70342f3c5ffSdrh  CREATE VIRTUAL TABLE z USING zipfile('test.zip');
70442f3c5ffSdrh} {}
70542f3c5ffSdrhdo_catchsql_test 10.1 {
70642f3c5ffSdrh  INSERT INTO z(name,data) VALUES('a0','one'),('a0','two');
70742f3c5ffSdrh} {1 {duplicate name: "a0"}}
70842f3c5ffSdrhdo_execsql_test 10.2 {
70942f3c5ffSdrh  SELECT name, data FROM z;
71042f3c5ffSdrh} {a0 one}
71142f3c5ffSdrhdo_execsql_test 10.3 {
71242f3c5ffSdrh  REPLACE INTO z(name,data) VALUES('a0','three'),('a0','four');
71342f3c5ffSdrh} {}
71442f3c5ffSdrhdo_execsql_test 10.4 {
71542f3c5ffSdrh  SELECT name, data FROM z;
71642f3c5ffSdrh} {a0 four}
71742f3c5ffSdrhdo_execsql_test 10.5 {
71842f3c5ffSdrh  INSERT OR IGNORE INTO z(name,data) VALUES('a0','five'),('a0','six');
71942f3c5ffSdrh} {}
72042f3c5ffSdrhdo_execsql_test 10.6 {
72142f3c5ffSdrh  SELECT name, data FROM z;
72242f3c5ffSdrh} {a0 four}
72342f3c5ffSdrh
7242cc8f483Smistachkindo_execsql_test 11.1 {
7252cc8f483Smistachkin  DELETE FROM z;
7262cc8f483Smistachkin} {}
7272cc8f483Smistachkindo_execsql_test 11.2 {
7282cc8f483Smistachkin  SELECT name, data FROM z;
7292cc8f483Smistachkin} {}
7302cc8f483Smistachkindo_execsql_test 11.3 {
7312cc8f483Smistachkin  INSERT INTO z (name,data) VALUES ('b0','one');
7322cc8f483Smistachkin  SELECT name, data FROM z;
7332cc8f483Smistachkin} {b0 one}
7342cc8f483Smistachkindo_execsql_test 11.4 {
7352cc8f483Smistachkin  UPDATE z SET name = 'b1' WHERE name = 'b0';
7362cc8f483Smistachkin  SELECT name, data FROM z;
7372cc8f483Smistachkin} {b1 one}
7382cc8f483Smistachkindo_execsql_test 11.5 {
7392cc8f483Smistachkin  INSERT INTO z (name,data) VALUES ('b0','one');
7402cc8f483Smistachkin  SELECT name, data FROM z ORDER BY name;
7412cc8f483Smistachkin} {b0 one b1 one}
7422cc8f483Smistachkindo_catchsql_test 11.6 {
7432cc8f483Smistachkin  UPDATE z SET name = 'b1' WHERE name = 'b0';
7442cc8f483Smistachkin} {1 {duplicate name: "b1"}}
7452cc8f483Smistachkindo_execsql_test 11.7 {
7462cc8f483Smistachkin  UPDATE z SET data = 'two' WHERE name = 'b0';
7472cc8f483Smistachkin  SELECT name, data FROM z ORDER BY name;
7482cc8f483Smistachkin} {b0 two b1 one}
7492cc8f483Smistachkindo_catchsql_test 11.8 {
7502cc8f483Smistachkin  UPDATE z SET name = 'b1';
7512cc8f483Smistachkin} {1 {duplicate name: "b1"}}
7522cc8f483Smistachkindo_catchsql_test 11.9 {
7532cc8f483Smistachkin  UPDATE z SET name = 'b2';
7542cc8f483Smistachkin} {1 {duplicate name: "b2"}}
7552cc8f483Smistachkindo_execsql_test 11.10 {
7562cc8f483Smistachkin  UPDATE z SET name = name;
7572cc8f483Smistachkin  SELECT name, data FROM z ORDER BY name;
7582cc8f483Smistachkin} {b0 two b2 one}
7592cc8f483Smistachkindo_execsql_test 11.11 {
7602cc8f483Smistachkin  UPDATE z SET name = name || 'suffix';
7612cc8f483Smistachkin  SELECT name, data FROM z ORDER BY name;
7622cc8f483Smistachkin} {b0suffix two b2suffix one}
76342f3c5ffSdrh
764cbfaa076Sdan
765cbfaa076Sdanif {$tcl_platform(platform)!="windows"} {
766cbfaa076Sdan  do_test 12.0 {
767cbfaa076Sdan    catch { file delete -force subdir }
768cbfaa076Sdan    foreach {path sz} {
769cbfaa076Sdan      subdir/x1.txt     143
770cbfaa076Sdan      subdir/x2.txt     153
771cbfaa076Sdan    } {
772cbfaa076Sdan      set dir [file dirname $path]
773cbfaa076Sdan      catch { file mkdir $dir }
774cbfaa076Sdan      set fd [open $path w]
775cbfaa076Sdan      puts -nonewline $fd [string repeat 1 $sz]
776cbfaa076Sdan      close $fd
777cbfaa076Sdan    }
778cbfaa076Sdan  } {}
779cbfaa076Sdan
780cbfaa076Sdan  do_execsql_test 12.1 {
781cbfaa076Sdan    SELECT name FROM fsdir('subdir') ORDER BY 1;
782cbfaa076Sdan  } {subdir subdir/x1.txt subdir/x2.txt}
783cbfaa076Sdan
784cbfaa076Sdan  do_execsql_test 12.2 {
785cbfaa076Sdan    CREATE TABLE d AS SELECT 'subdir' d;
786cbfaa076Sdan    CREATE TABLE x AS SELECT 1 x;
787cbfaa076Sdan  }
788cbfaa076Sdan
789cbfaa076Sdan  do_execsql_test 12.4 {
790cbfaa076Sdan    SELECT name FROM d JOIN x JOIN fsdir(d) ORDER BY 1;
791cbfaa076Sdan  } {subdir subdir/x1.txt subdir/x2.txt}
792cbfaa076Sdan
793cbfaa076Sdan  do_execsql_test 12.5 {
794cbfaa076Sdan    SELECT name FROM d JOIN x JOIN fsdir('.', d) ORDER BY 1;
795cbfaa076Sdan  } {. ./x1.txt ./x2.txt}
796cbfaa076Sdan}
797cbfaa076Sdan
79854d50109Sdrh# 2019-12-18 Yongheng and Rui fuzzer
79954d50109Sdrh#
80054d50109Sdrhdo_execsql_test 13.10 {
80154d50109Sdrh  DROP TABLE IF EXISTS t0;
80254d50109Sdrh  DROP TABLE IF EXISTS t1;
80354d50109Sdrh  CREATE TABLE t0(a,b,c,d,e,f,g);
80454d50109Sdrh  REPLACE INTO t0(c,b,f) VALUES(10,10,10);
80554d50109Sdrh  CREATE VIRTUAL TABLE t1 USING zipfile('h.zip');
80654d50109Sdrh  REPLACE INTO t1 SELECT * FROM t0;
80754d50109Sdrh  SELECT quote(name),quote(mode),quote(mtime),quote(sz),quote(rawdata),
80854d50109Sdrh         quote(data),quote(method) FROM t1;
80954d50109Sdrh} {'' 10 10 2 X'3130' X'3130' 0}
81054d50109Sdrh
8111e490c4cSdrh# 2019-12-23 Yongheng and Rui fuzzer
8121e490c4cSdrh# Run using valgrind to see the problem.
8131e490c4cSdrh#
8141e490c4cSdrhdo_execsql_test 14.10 {
8151e490c4cSdrh  DROP TABLE t1;
8161e490c4cSdrh  CREATE TABLE t1(x char);
8171e490c4cSdrh  INSERT INTO t1(x) VALUES('1');
8181e490c4cSdrh  INSERT INTO t1(x) SELECT zipfile(x, 'xyz') FROM t1;
8191e490c4cSdrh  INSERT INTO t1(x) SELECT zipfile(x, 'uvw') FROM t1;
8201e490c4cSdrh  SELECT count(*) FROM t1;
8211e490c4cSdrh  PRAGMA integrity_check;
8221e490c4cSdrh} {3 ok}
82354d50109Sdrh
8248d7f44c0Sdrh# 2019-12-26 More problems in zipfile from the Yongheng and Rui fuzzer
8258d7f44c0Sdrh#
8268d7f44c0Sdrhdo_execsql_test 15.10 {
8278d7f44c0Sdrh  DROP TABLE IF EXISTS t1;
8288d7f44c0Sdrh  CREATE VIRTUAL TABLE t1 USING zipfile(null);
8298d7f44c0Sdrh  REPLACE INTO t1 VALUES(null,null,0,null,null,null,null);
8308d7f44c0Sdrh} {}
8318d7f44c0Sdrhdo_execsql_test 15.20 {
8328d7f44c0Sdrh  DROP TABLE IF EXISTS t2;
8338d7f44c0Sdrh  CREATE VIRTUAL TABLE t2 USING zipfile(null);
8348d7f44c0Sdrh  REPLACE INTO t2 values(null,null,null,null,null,10,null);
8358d7f44c0Sdrh} {}
8368d7f44c0Sdrh
8370c4f8205Sdrh# 2020-01-02 Yongheng fuzzer discovery
8380c4f8205Sdrh#
8390c4f8205Sdrhdo_catchsql_test 16.10 {
8400c4f8205Sdrh  DELETE FROM zipfile;
8410d21eae0Sdrh} {1 {zipfile: missing filename}}
8420d21eae0Sdrhdo_catchsql_test 16.20 {
8430d21eae0Sdrh  REPLACE INTO zipfile VALUES(null,null,null,null,null,123,null);
8440d21eae0Sdrh} {1 {zipfile: missing filename}}
8458d7f44c0Sdrh
846*68b63c01Sdrh# 2021-04-22 forum https://sqlite.org/forum/forumpost/d82289d69f
847*68b63c01Sdrhdo_execsql_test 17.1 {
848*68b63c01Sdrh  WITH vlist(x) AS (
849*68b63c01Sdrh     VALUES(9223372036854775807),
850*68b63c01Sdrh           (-9223372036854775808),
851*68b63c01Sdrh           (9223372036854775806),
852*68b63c01Sdrh           (-9223372036854775807)
853*68b63c01Sdrh  )
854*68b63c01Sdrh  SELECT DISTINCT typeof(zipfile(0,0,x,0)) FROM vlist;
855*68b63c01Sdrh} {blob}
856*68b63c01Sdrh
857*68b63c01Sdrh
858373dc3bbSdanfinish_test
859