]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
In cksumvfs, do not write checksums to the wal file, as this prevents recovery from... cksumvfs-wal-fix
authordan <Dan Kennedy>
Wed, 13 Aug 2025 18:37:41 +0000 (18:37 +0000)
committerdan <Dan Kennedy>
Wed, 13 Aug 2025 18:37:41 +0000 (18:37 +0000)
FossilOrigin-Name: 5bf48c7e31904f1f7048499c630801846df89f262b32ea1e49fb6e039eaad11a

ext/misc/cksumvfs.c
manifest
manifest.uuid
test/cksumvfs.test

index 75b59f7998eea82fdac7fca136918256332d24fa..6491e85cde526aa3358ea93e8df3a26143e28574 100644 (file)
@@ -197,8 +197,6 @@ struct CksmFile {
   char computeCksm;     /* True to compute checksums.
                         ** Always true if reserve size is 8. */
   char verifyCksm;      /* True to verify checksums */
-  char isWal;           /* True if processing a WAL file */
-  char inCkpt;          /* Currently doing a checkpoint */
   CksmFile *pPartner;   /* Ptr from WAL to main-db, or from main-db to WAL */
 };
 
@@ -433,7 +431,6 @@ static int cksmRead(
   pFile = ORIGFILE(pFile);
   rc = pFile->pMethods->xRead(pFile, zBuf, iAmt, iOfst);
   if( rc==SQLITE_OK ){
-    assert( iAmt==100 || (iAmt & (iAmt-1))==0 );
     if( iOfst==0 && iAmt>=100 && (
           memcmp(zBuf,"SQLite format 3",16)==0 || memcmp(zBuf,"ZV-",3)==0 
     )){
@@ -445,11 +442,9 @@ static int cksmRead(
     **    (1) the size indicates that we are dealing with a complete
     **        database page
     **    (2) checksum verification is enabled
-    **    (3) we are not in the middle of checkpoint
     */
-    if( iAmt>=512                           /* (1) */
+    if( iAmt>=512 && (iAmt & (iAmt-1))==0   /* (1) */
      && p->verifyCksm                       /* (2) */
-     && !p->inCkpt                          /* (3) */
     ){
       u8 cksum[8];
       cksmCompute((u8*)zBuf, iAmt-8, cksum);
@@ -490,7 +485,6 @@ static int cksmWrite(
   */
   if( iAmt>=512
    && p->computeCksm
-   && !p->inCkpt
   ){
     cksmCompute((u8*)zBuf, iAmt-8, ((u8*)zBuf)+iAmt-8);
   }
@@ -577,21 +571,6 @@ static int cksmFileControl(sqlite3_file *pFile, int op, void *pArg){
       /* Do not allow page size changes on a checksum database */
       return SQLITE_OK;
     }
-  }else if( op==SQLITE_FCNTL_CKPT_START || op==SQLITE_FCNTL_CKPT_DONE ){
-    p->inCkpt = op==SQLITE_FCNTL_CKPT_START;
-    if( p->pPartner ) p->pPartner->inCkpt = p->inCkpt;
-  }else if( op==SQLITE_FCNTL_CKSM_FILE ){
-    /* This VFS needs to obtain a pointer to the corresponding database
-    ** file handle from within xOpen() calls to open wal files. To do this,
-    ** it uses the sqlite3_database_file_object() API to obtain a pointer
-    ** to the file-handle used by SQLite to access the db file. This is
-    ** fine if cksmvfs happens to be the top-level VFS, but not if there
-    ** are one or more wrapper VFS. To handle this case, this file-control
-    ** is used to extract the cksmvfs file-handle from any wrapper file 
-    ** handle.  */
-    sqlite3_file **ppFile = (sqlite3_file**)pArg;
-    *ppFile = (sqlite3_file*)p;
-    return SQLITE_OK;
   }
   rc = pFile->pMethods->xFileControl(pFile, op, pArg);
   if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
@@ -692,7 +671,7 @@ static int cksmOpen(
   sqlite3_vfs *pSubVfs;
   int rc;
   pSubVfs = ORIGVFS(pVfs);
-  if( (flags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_WAL))==0 ){
+  if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
     return pSubVfs->xOpen(pSubVfs, zName, pFile, flags, pOutFlags);
   }
   p = (CksmFile*)pFile;
@@ -701,19 +680,6 @@ static int cksmOpen(
   pFile->pMethods = &cksm_io_methods;
   rc = pSubVfs->xOpen(pSubVfs, zName, pSubFile, flags, pOutFlags);
   if( rc ) goto cksm_open_done;
-  if( flags & SQLITE_OPEN_WAL ){
-    sqlite3_file *pDb = sqlite3_database_file_object(zName);
-    rc = pDb->pMethods->xFileControl(pDb, SQLITE_FCNTL_CKSM_FILE, (void*)&pDb);
-    assert( rc==SQLITE_OK );
-    p->pPartner = (CksmFile*)pDb;
-    assert( p->pPartner->pPartner==0 );
-    p->pPartner->pPartner = p;
-    p->isWal = 1;
-    p->computeCksm = p->pPartner->computeCksm;
-  }else{
-    p->isWal = 0;
-    p->computeCksm = 0;
-  }
   p->zFName = zName;
 cksm_open_done:
   if( rc ) pFile->pMethods = 0;
@@ -823,9 +789,7 @@ static int cksmRegisterFunc(
 */
 static int cksmRegisterVfs(void){
   int rc = SQLITE_OK;
-  sqlite3_vfs *pOrig;
-  if( sqlite3_vfs_find("cksmvfs")!=0 ) return SQLITE_OK;
-  pOrig = sqlite3_vfs_find(0);
+  sqlite3_vfs *pOrig = sqlite3_vfs_find(0);
   if( pOrig==0 ) return SQLITE_ERROR;
   cksm_vfs.iVersion = pOrig->iVersion;
   cksm_vfs.pAppData = pOrig;
index 2678cc8bc671394fe95c375a7017bff0c741a298..87695d8d7b29f8af59f9883fc2791db66188d206 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Minor\sautosetup/README.md\stweaks.
-D 2025-08-13T18:30:42.027
+C In\scksumvfs,\sdo\snot\swrite\schecksums\sto\sthe\swal\sfile,\sas\sthis\sprevents\srecovery\sfrom\sworking.
+D 2025-08-13T18:37:41.105
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -363,7 +363,7 @@ F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0e
 F ext/misc/btreeinfo.c 8f5e6da2c82ec2f06ee0216e922370a436dafdbb06ffa7a552203515ff9e7ddf
 F ext/misc/carray.c 34fac63770971611c5285de0a9f0ac67d504eaf66be891f637add9290f1c76a5
 F ext/misc/carray.h 503209952ccf2431c7fd899ebb92bf46bf7635b38aace42ec8aa1b8d7b6e98a5
-F ext/misc/cksumvfs.c 077e7a556c2c79a0b4db3a5dc449cdf25541860f669f359e5bd965b6f5950649
+F ext/misc/cksumvfs.c 9d7d0cf1a8893ac5d48922bfe9f3f217b4a61a6265f559263a02bb2001259913
 F ext/misc/closure.c 5559daf1daf742228431db929d1aa86dd535a4224cc634a81d2fd0d1e6ad7839
 F ext/misc/completion.c c3c8b3cc1293c34f04f8746a3adfbfedb43f00d113f8c984a1ed09433317e507
 F ext/misc/compress.c 2c79a74330e0e0ba6cb3f7397f8ba5af12d46377ef5d3ee075e12dd8a6ed57f0
@@ -962,7 +962,7 @@ F test/changes2.test 07949edcc732af28cb54276bfb7d99723bccc1e905a423648bf57ac5cb0
 F test/check.test 3a7972ccbaad80d496833da8714d69d9d5d4ce9e7211af1cd2a06ae488a7de12
 F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014
 F test/chunksize.test faea11c5d6df9d392252a8dd879e1b1d68c9d3e8b7909cbed8bcec3b60c706f1
-F test/cksumvfs.test ec349149fbda923feb93e61a16674b6355b9ff6997f70c9e8f3b7843c51ea2af
+F test/cksumvfs.test c2eed4708fae44777607425ba369b642401c3771cc354d5af296ce6aab21c1c9
 F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c
 F test/closure01.test 9905883f1b171a4638f98fc764879f154e214a306d3d8daf412a15e7f3a9b1e0
 F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91
@@ -2169,8 +2169,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 3b06d1c9b6c03f38029a8b98fef6253647878c0f8b05447ec0c8122f189c90dc
-R 48d5cc70c03a653161ab38251c85b829
-U stephan
-Z 136f0cc4707441ee6428a1013d4e4c6d
+P bd7530bf6afdad391b223651632e1b4d59ab5ec806c7a94daadc7f09091321f4
+R 4b1ff55a2a7c8f094813855173a6bb4c
+T *branch * cksumvfs-wal-fix
+T *sym-cksumvfs-wal-fix *
+T -sym-trunk *
+U dan
+Z 27676fcaac1fda11b5c8129e0f7f8f20
 # Remove this line to create a well-formed Fossil manifest.
index d8a82a5427e6c4c0dc7f05ec32f10bcb5cfd92d5..45ee437a89efbd8a35434fb8994eaa8ba5a3ce17 100644 (file)
@@ -1 +1 @@
-bd7530bf6afdad391b223651632e1b4d59ab5ec806c7a94daadc7f09091321f4
+5bf48c7e31904f1f7048499c630801846df89f262b32ea1e49fb6e039eaad11a
index 7b1f007e93b6e1400cc8ad23b82a9199d659ead2..270b5db386d209031358e61299812a5e5e60c3e4 100644 (file)
@@ -14,8 +14,17 @@ set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 set testprefix cksumvfs
 
-sqlite3_register_cksumvfs
+
 db close
+sqlite3_shutdown
+#test_sqlite3_log logfunc
+sqlite3_initialize
+
+proc logfunc {args} {
+  puts "LOG: $args"
+}
+
+sqlite3_register_cksumvfs
 sqlite3 db test.db
 
 file_control_reservebytes db 8
@@ -50,5 +59,29 @@ do_execsql_test 1.4 {
   SELECT count(b) FROM t1
 } {8500}
 
+do_execsql_test 1.5 {
+  PRAGMA journal_mode = wal;
+  DELETE FROM t1;
+} {wal}
+
+do_execsql_test 1.6 {
+  PRAGMA wal_checkpoint;
+} {0 26 26}
+
+do_execsql_test 1.7 {
+  WITH s(i) AS (
+    VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<100
+  )
+  INSERT INTO t1 SELECT NULL, randomblob(5000), randomblob(i) FROM s;
+  SELECT count(*) FROM t1;
+} {100}
+
+db_save_and_close
+db_restore_and_reopen
+
+do_execsql_test 1.8 {
+  SELECT count(*) FROM t1;
+} {100}
+
 finish_test