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