Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a problem triggered when a zipfile virtual table is created and written to within the same transaction. And add other zipfile tests. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
48f1c556994d7f8f359c649a1da81eec |
User & Date: | dan 2018-02-01 19:41:23.066 |
Original Comment: | Fix a problem triggered when a zipfile virtual table is created and written to within the same transaction. And add other zipfile test. |
Context
2018-02-01
| ||
20:42 | Add a few more zipfile tests. No changes to code. (check-in: 3f62154587 user: dan tags: trunk) | |
19:41 | Fix a problem triggered when a zipfile virtual table is created and written to within the same transaction. And add other zipfile tests. (check-in: 48f1c55699 user: dan tags: trunk) | |
15:57 | New assert() statements to help ensure that no other errors similar to [343634942dd54ab57b7] ever appear in the code. (check-in: 5a70af1e9c user: drh tags: trunk) | |
Changes
Changes to ext/misc/zipfile.c.
︙ | ︙ | |||
1069 1070 1071 1072 1073 1074 1075 | } } break; } case 6: /* method */ sqlite3_result_int(ctx, pCDS->iCompression); break; | | > | 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 | } } break; } case 6: /* method */ sqlite3_result_int(ctx, pCDS->iCompression); break; default: /* z */ assert( i==7 ); sqlite3_result_int64(ctx, pCsr->iId); break; } return rc; } |
︙ | ︙ | |||
1213 1214 1215 1216 1217 1218 1219 | static int zipfileFilter( sqlite3_vtab_cursor *cur, int idxNum, const char *idxStr, int argc, sqlite3_value **argv ){ ZipfileTab *pTab = (ZipfileTab*)cur->pVtab; ZipfileCsr *pCsr = (ZipfileCsr*)cur; | | | > | 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 | static int zipfileFilter( sqlite3_vtab_cursor *cur, int idxNum, const char *idxStr, int argc, sqlite3_value **argv ){ ZipfileTab *pTab = (ZipfileTab*)cur->pVtab; ZipfileCsr *pCsr = (ZipfileCsr*)cur; const char *zFile = 0; /* Zip file to scan */ int rc = SQLITE_OK; /* Return Code */ int bInMemory = 0; /* True for an in-memory zipfile */ zipfileResetCursor(pCsr); if( pTab->zFile ){ zFile = pTab->zFile; }else if( idxNum==0 ){ zipfileSetErrmsg(pCsr, "zipfile() function requires an argument"); return SQLITE_ERROR; }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){ const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]); int nBlob = sqlite3_value_bytes(argv[0]); assert( pTab->pFirstEntry==0 ); rc = zipfileLoadDirectory(pTab, aBlob, nBlob); pCsr->pFreeEntry = pTab->pFirstEntry; pTab->pFirstEntry = pTab->pLastEntry = 0; |
︙ | ︙ | |||
1291 1292 1293 1294 1295 1296 1297 | pIdxInfo->estimatedCost = (double)(((sqlite3_int64)1) << 50); pIdxInfo->idxNum = 0; } return SQLITE_OK; } | | | < < < | 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 | pIdxInfo->estimatedCost = (double)(((sqlite3_int64)1) << 50); pIdxInfo->idxNum = 0; } return SQLITE_OK; } static ZipfileEntry *zipfileNewEntry(const char *zPath){ ZipfileEntry *pNew; pNew = sqlite3_malloc(sizeof(ZipfileEntry)); if( pNew ){ memset(pNew, 0, sizeof(ZipfileEntry)); pNew->cds.zFile = sqlite3_mprintf("%s", zPath); if( pNew->cds.zFile==0 ){ sqlite3_free(pNew); pNew = 0; } } return pNew; |
︙ | ︙ | |||
1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 | u8 *aBuf = pTab->aBuffer; int nBuf; int rc; nBuf = zipfileSerializeLFH(pEntry, aBuf); rc = zipfileAppendData(pTab, aBuf, nBuf); if( rc==SQLITE_OK ){ rc = zipfileAppendData(pTab, pData, nData); } return rc; } static int zipfileGetMode( | > | 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 | u8 *aBuf = pTab->aBuffer; int nBuf; int rc; nBuf = zipfileSerializeLFH(pEntry, aBuf); rc = zipfileAppendData(pTab, aBuf, nBuf); if( rc==SQLITE_OK ){ pEntry->iDataOff = pTab->szCurrent; rc = zipfileAppendData(pTab, pData, nData); } return rc; } static int zipfileGetMode( |
︙ | ︙ | |||
1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 | static int zipfileComparePath(const char *zA, const char *zB, int nB){ int nA = (int)strlen(zA); if( zA[nA-1]=='/' ) nA--; if( zB[nB-1]=='/' ) nB--; if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0; return 1; } /* ** xUpdate method. */ static int zipfileUpdate( sqlite3_vtab *pVtab, int nVal, | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 | static int zipfileComparePath(const char *zA, const char *zB, int nB){ int nA = (int)strlen(zA); if( zA[nA-1]=='/' ) nA--; if( zB[nB-1]=='/' ) nB--; if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0; return 1; } static int zipfileBegin(sqlite3_vtab *pVtab){ ZipfileTab *pTab = (ZipfileTab*)pVtab; int rc = SQLITE_OK; assert( pTab->pWriteFd==0 ); /* Open a write fd on the file. Also load the entire central directory ** structure into memory. During the transaction any new file data is ** appended to the archive file, but the central directory is accumulated ** in main-memory until the transaction is committed. */ pTab->pWriteFd = fopen(pTab->zFile, "ab+"); if( pTab->pWriteFd==0 ){ pTab->base.zErrMsg = sqlite3_mprintf( "zipfile: failed to open file %s for writing", pTab->zFile ); rc = SQLITE_ERROR; }else{ fseek(pTab->pWriteFd, 0, SEEK_END); pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd); rc = zipfileLoadDirectory(pTab, 0, 0); } if( rc!=SQLITE_OK ){ zipfileCleanupTransaction(pTab); } return rc; } /* ** xUpdate method. */ static int zipfileUpdate( sqlite3_vtab *pVtab, int nVal, |
︙ | ︙ | |||
1441 1442 1443 1444 1445 1446 1447 | int iMethod = 0; /* Compression method for new entry */ u8 *pFree = 0; /* Free this */ char *zFree = 0; /* Also free this */ ZipfileEntry *pOld = 0; int bIsDir = 0; u32 iCrc32 = 0; | | > > > | 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 | int iMethod = 0; /* Compression method for new entry */ u8 *pFree = 0; /* Free this */ char *zFree = 0; /* Also free this */ ZipfileEntry *pOld = 0; int bIsDir = 0; u32 iCrc32 = 0; if( pTab->pWriteFd==0 ){ rc = zipfileBegin(pVtab); if( rc!=SQLITE_OK ) return rc; } /* If this is a DELETE or UPDATE, find the archive entry to delete. */ if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ const char *zDelete = (const char*)sqlite3_value_text(apVal[0]); int nDelete = (int)strlen(zDelete); for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){ if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){ |
︙ | ︙ | |||
1537 1538 1539 1540 1541 1542 1543 | break; } } } if( rc==SQLITE_OK ){ /* Create the new CDS record. */ | | < | < < < | 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 | break; } } } if( rc==SQLITE_OK ){ /* Create the new CDS record. */ pNew = zipfileNewEntry(zPath); if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY; pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED; pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS; pNew->cds.iCompression = (u16)iMethod; zipfileMtimeToDos(&pNew->cds, (u32)mTime); pNew->cds.crc32 = iCrc32; pNew->cds.szCompressed = nData; pNew->cds.szUncompressed = (u32)sz; pNew->cds.iExternalAttr = (mode<<16); pNew->cds.iOffset = (u32)pTab->szCurrent; pNew->cds.nFile = nPath; pNew->mUnixTime = (u32)mTime; rc = zipfileAppendEntry(pTab, pNew, pData, nData); zipfileAddEntry(pTab, pOld, pNew); } } } if( rc==SQLITE_OK && pOld ){ ZipfileEntry **pp; |
︙ | ︙ | |||
1602 1603 1604 1605 1606 1607 1608 | static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){ int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer); assert( nBuf==ZIPFILE_EOCD_FIXED_SZ ); return zipfileAppendData(pTab, pTab->aBuffer, nBuf); } | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 | static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){ int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer); assert( nBuf==ZIPFILE_EOCD_FIXED_SZ ); return zipfileAppendData(pTab, pTab->aBuffer, nBuf); } /* ** Serialize the CDS structure into buffer aBuf[]. Return the number ** of bytes written. */ static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){ u8 *a = aBuf; ZipfileCDS *pCDS = &pEntry->cds; |
︙ | ︙ | |||
1781 1782 1783 1784 1785 1786 1787 | static int zipfileFindFunction( sqlite3_vtab *pVtab, /* Virtual table handle */ int nArg, /* Number of SQL function arguments */ const char *zName, /* Name of SQL function */ void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ void **ppArg /* OUT: User data for *pxFunc */ ){ | < | | | | | < < | 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 | static int zipfileFindFunction( sqlite3_vtab *pVtab, /* Virtual table handle */ int nArg, /* Number of SQL function arguments */ const char *zName, /* Name of SQL function */ void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ void **ppArg /* OUT: User data for *pxFunc */ ){ if( sqlite3_stricmp("zipfile_cds", zName)==0 ){ *pxFunc = zipfileFunctionCds; *ppArg = (void*)pVtab; return 1; } return 0; } typedef struct ZipfileBuffer ZipfileBuffer; struct ZipfileBuffer { u8 *a; /* Pointer to buffer */ int n; /* Size of buffer in bytes */ |
︙ | ︙ |
Changes to test/zipfile.test.
︙ | ︙ | |||
147 148 149 150 151 152 153 | 6 method {} 0 {} 0 } do_catchsql_test 1.1.0.1 { INSERT INTO zz(name, mode, mtime, sz, rawdata, method) VALUES('f.txt', '-rw-r--r--', 1000000000, 5, 'abcde', 0); } {1 {constraint failed}} | | | > > > > > > > > | 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | 6 method {} 0 {} 0 } do_catchsql_test 1.1.0.1 { INSERT INTO zz(name, mode, mtime, sz, rawdata, method) VALUES('f.txt', '-rw-r--r--', 1000000000, 5, 'abcde', 0); } {1 {constraint failed}} do_catchsql_test 1.1.0.2 { INSERT INTO zz(name, mtime, sz, data, method) VALUES('g.txt', 1000000002, 5, '12345', 0); } {1 {constraint failed}} do_catchsql_test 1.1.0.3 { INSERT INTO zz(name, mtime, rawdata, method) VALUES('g.txt', 1000000002, '12345', 0); } {1 {constraint failed}} do_catchsql_test 1.1.0.4 { INSERT INTO zz(name, data, method) VALUES('g.txt', '12345', 7); } {1 {constraint failed}} do_execsql_test 1.1.1 { INSERT INTO zz(name, mode, mtime, data, method) VALUES('f.txt', '-rw-r--r--', 1000000000, 'abcde', 0); } do_execsql_test 1.1.2 { INSERT INTO zz(name, mode, mtime, data, method) |
︙ | ︙ | |||
194 195 196 197 198 199 200 201 202 203 204 205 206 207 | FROM zipfile('test.zip'); } { f.txt 1 g.txt 1 h.txt 1 } } do_execsql_test 1.5.1 { BEGIN; INSERT INTO zz(name, mode, mtime, data, method) VALUES('i.txt', '-rw-r--r--', 1000000006, 'zxcvb', 0); SELECT name FROM zz; COMMIT; | > > > | 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 | FROM zipfile('test.zip'); } { f.txt 1 g.txt 1 h.txt 1 } } do_catchsql_test 1.4.2 { SELECT zipfile_cds(mode) FROM zipfile('test.zip'); } {0 {{} {} {}}} do_execsql_test 1.5.1 { BEGIN; INSERT INTO zz(name, mode, mtime, data, method) VALUES('i.txt', '-rw-r--r--', 1000000006, 'zxcvb', 0); SELECT name FROM zz; COMMIT; |
︙ | ︙ | |||
280 281 282 283 284 285 286 287 288 289 290 291 292 293 | do_execsql_test 1.6.8 { SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); } { blue.txt/ 16877 1000000000 {} 0 h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8 i.txt 33188 4 zxcvb 0 } #------------------------------------------------------------------------- db close forcedelete test.zip reset_db load_static_extension db fileio load_static_extension db zipfile | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 | do_execsql_test 1.6.8 { SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); } { blue.txt/ 16877 1000000000 {} 0 h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8 i.txt 33188 4 zxcvb 0 } do_execsql_test 1.6.8 { UPDATE zz SET data = '' WHERE name='i.txt'; SELECT name,mode,mtime,data,method from zipfile('test.zip'); } { blue.txt/ 16877 1000000000 {} 0 h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8 i.txt 33188 4 {} 0 } do_execsql_test 1.6.9 { SELECT a.name, a.data FROM zz AS a, zz AS b WHERE a.name=+b.name AND +a.mode=b.mode } { blue.txt/ {} h.txt aaaaaaaaaabbbbbbbbbb i.txt {} } do_execsql_test 1.6.10 { SELECT name, data FROM zz WHERE name LIKE '%txt' } { h.txt aaaaaaaaaabbbbbbbbbb i.txt {} } do_execsql_test 1.7 { DELETE FROM zz; SELECT * FROM zz; } {} #------------------------------------------------------------------------- db close forcedelete test.zip reset_db load_static_extension db fileio load_static_extension db zipfile |
︙ | ︙ | |||
374 375 376 377 378 379 380 381 382 383 384 385 386 387 | # do_catchsql_test 4.1 { CREATE VIRTUAL TABLE yyy USING zipfile(); } {1 {zipfile constructor requires one argument}} do_catchsql_test 4.2 { CREATE VIRTUAL TABLE yyy USING zipfile('test.zip', 'test.zip'); } {1 {zipfile constructor requires one argument}} #-------------------------------------------------------------------------- db func rt remove_timestamps do_execsql_test 5.0 { WITH c(name,mtime,data) AS ( SELECT 'a.txt', 946684800, 'abc' | > > > > > > > > > > > > > > > > > > > | 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 | # do_catchsql_test 4.1 { CREATE VIRTUAL TABLE yyy USING zipfile(); } {1 {zipfile constructor requires one argument}} do_catchsql_test 4.2 { CREATE VIRTUAL TABLE yyy USING zipfile('test.zip', 'test.zip'); } {1 {zipfile constructor requires one argument}} do_catchsql_test 4.3 { SELECT * FROM zipfile() } {1 {zipfile() function requires an argument}} do_catchsql_test 4.4 { SELECT * FROM zipfile('/path/that/does/not/exist') } {1 {cannot open file: /path/that/does/not/exist}} foreach {tn mode} { 1 abcd 2 brwxrwxrwx 3 lrwxrrxrwx } { do_catchsql_test 4.5.$tn { WITH m(m) AS ( SELECT $mode) SELECT zipfile('a.txt', m, 1000, 'xyz') FROM m } [list 1 "zipfile: parse error in mode: $mode"] } #-------------------------------------------------------------------------- db func rt remove_timestamps do_execsql_test 5.0 { WITH c(name,mtime,data) AS ( SELECT 'a.txt', 946684800, 'abc' |
︙ | ︙ | |||
444 445 446 447 448 449 450 | } [list {*}{ test_unzip/a.txt 946684800 test_unzip/b.txt 1000000000 test_unzip/c.txt 1111111000 }] do_execsql_test 6.3 { | | | | | > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 | } [list {*}{ test_unzip/a.txt 946684800 test_unzip/b.txt 1000000000 test_unzip/c.txt 1111111000 }] do_execsql_test 6.3 { SELECT name, mtime, sz, rawdata, data FROM zipfile('test2.zip') } { a.txt 946684800 3 abc abc b.txt 1000000000 3 abc abc c.txt 1111111000 3 abc abc } } } #------------------------------------------------------------------------- # Force an IO error by truncating the zip archive to zero bytes in size # while it is being read. forcedelete test.zip do_test 7.0 { execsql { WITH c(name,data) AS ( SELECT '1', randomblob(1000000) UNION ALL SELECT '2', randomblob(1000000) UNION ALL SELECT '3', randomblob(1000000) ) SELECT writefile('test.zip', zipfile(name, data) ) FROM c; } list [catch { db eval { SELECT name, data FROM zipfile('test.zip') } { if {$name==2} { close [open test.zip w+] } } } msg] $msg } {1 {error in fread()}} forcedelete test.zip do_execsql_test 8.0.1 { CREATE VIRTUAL TABLE zz USING zipfile('test.zip'); BEGIN; INSERT INTO zz(name, data) VALUES('a.txt', '1'); INSERT INTO zz(name, data) VALUES('b.txt', '2'); INSERT INTO zz(name, data) VALUES('c.txt', '1'); INSERT INTO zz(name, data) VALUES('d.txt', '2'); SELECT name, data FROM zz; } { a.txt 1 b.txt 2 c.txt 1 d.txt 2 } do_test 8.0.2 { db eval { SELECT name, data FROM zz } { if { $data=="2" } { db eval { DELETE FROM zz WHERE name=$name } } } execsql { SELECT name, data FROM zz } } {a.txt 1 c.txt 1} do_test 8.0.3 { db eval { SELECT name, data FROM zz } { db eval { DELETE FROM zz WHERE name=$name } } execsql { SELECT name, data FROM zz } } {} execsql COMMIT do_execsql_test 8.1.1 { CREATE VIRTUAL TABLE nogood USING zipfile('test_unzip'); } do_catchsql_test 8.1.2 { INSERT INTO nogood(name, data) VALUES('abc', 'def'); } {1 {zipfile: failed to open file test_unzip for writing}} do_execsql_test 8.2.1 { DROP TABLE nogood; BEGIN; CREATE VIRTUAL TABLE nogood USING zipfile('test_unzip'); } do_catchsql_test 8.2.2 { INSERT INTO nogood(name, data) VALUES('abc', 'def'); } {1 {zipfile: failed to open file test_unzip for writing}} do_execsql_test 8.2.3 { COMMIT; } forcedelete test.zip do_execsql_test 8.3.1 { BEGIN; CREATE VIRTUAL TABLE ok USING zipfile('test.zip'); INSERT INTO ok(name, data) VALUES ('sqlite3', 'elf'); COMMIT; } finish_test |
Changes to test/zipfile2.test.
︙ | ︙ | |||
160 161 162 163 164 165 166 167 168 169 170 | set a $archive2 foreach i $L { set a [string replace $a $i [expr $i+7] 16000000] } set blob [blob $a] do_catchsql_test 4.1 { SELECT name,mtime,data,method FROM zipfile($blob) } {1 {inflate() failed (0)}} finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | set a $archive2 foreach i $L { set a [string replace $a $i [expr $i+7] 16000000] } set blob [blob $a] do_catchsql_test 4.1 { SELECT name,mtime,data,method FROM zipfile($blob) } {1 {inflate() failed (0)}} # Check the response to an unknown compression method (set data to NULL). set blob [blob [string map {0800 0900} $archive2]] do_execsql_test 4.2 { SELECT name,mtime,data IS NULL,method FROM zipfile($blob) } {a.txt 1000000 1 9} # Corrupt the EOCDS signature bytes in various ways. foreach {tn sub} { 1 {504B0500} 2 {504B0006} 3 {50000506} 4 {004B0506} } { set blob [blob [string map [list 504B0506 $sub] $archive2]] do_catchsql_test 4.3.$tn { SELECT * FROM zipfile($blob) } {1 {cannot find end of central directory record}} } #------------------------------------------------------------------------- # Test that a zero-length file with a '/' at the end is treated as # a directory (data IS NULL). Even if the mode doesn't indicate # that it is a directory. do_test 5.0 { set blob [db one { WITH c(n, d) AS ( SELECT 'notadir', '' ) SELECT zipfile(n, d) FROM c }] set hex [binary encode hex $blob] set hex [string map {6e6f7461646972 6e6f746164692f} $hex] set blob2 [binary decode hex $hex] execsql { SELECT name, data IS NULL FROM zipfile($blob2) } } {notadi/ 1} finish_test |
Changes to test/zipfilefault.test.
︙ | ︙ | |||
38 39 40 41 42 43 44 | sqlite3 db test.db load_static_extension db zipfile do_execsql_test 2.0 { CREATE VIRTUAL TABLE setup USING zipfile('test.zip'); INSERT INTO setup(name, data) VALUES('a.txt', '1234567890'); } | | > > > > > > > > | 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | sqlite3 db test.db load_static_extension db zipfile do_execsql_test 2.0 { CREATE VIRTUAL TABLE setup USING zipfile('test.zip'); INSERT INTO setup(name, data) VALUES('a.txt', '1234567890'); } do_faultsim_test 2.1 -faults oom* -body { execsql { SELECT name,data FROM zipfile('test.zip') } } -test { faultsim_test_result {0 {a.txt 1234567890}} } do_faultsim_test 2.2 -faults oom* -body { execsql { SELECT json_extract( zipfile_cds(z), '$.version-made-by' ) FROM zipfile('test.zip') } } -test { faultsim_test_result {0 798} } forcedelete test.zip reset_db load_static_extension db zipfile do_execsql_test 3.0 { CREATE VIRTUAL TABLE setup USING zipfile('test.zip'); |
︙ | ︙ | |||
70 71 72 73 74 75 76 77 78 79 80 | SELECT name, data FROM zipfile( (SELECT zipfile(n, d) FROM c) ); } } -test { faultsim_test_result {0 {1 aaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbb}} } finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | SELECT name, data FROM zipfile( (SELECT zipfile(n, d) FROM c) ); } } -test { faultsim_test_result {0 {1 aaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbb}} } reset_db load_static_extension db zipfile do_execsql_test 5.0 { CREATE VIRTUAL TABLE setup USING zipfile('test.zip') } do_faultsim_test 5.1 -faults oom* -prep { forcedelete test.zip } -body { execsql { INSERT INTO setup(name, data) VALUES('a.txt', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa'); } } -test { faultsim_test_result {0 {}} } do_faultsim_test 5.2 -faults oom* -prep { forcedelete test.zip } -body { execsql { INSERT INTO setup(name, data) VALUES('dir', NULL) } } -test { faultsim_test_result {0 {}} } do_faultsim_test 5.3 -faults oom* -prep { forcedelete test.zip execsql { DROP TABLE IF EXISTS setup; BEGIN; CREATE VIRTUAL TABLE setup USING zipfile('test.zip') } } -body { execsql { INSERT INTO setup(name, data) VALUES('dir', NULL) } } -test { catchsql { COMMIT } faultsim_test_result {0 {}} } finish_test |