]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
If SQLITE_ENABLE_WAL2NOCKSUM is defined, then SQLite calculates the frame checksums...
authordan <Dan Kennedy>
Wed, 29 Jan 2025 15:11:07 +0000 (15:11 +0000)
committerdan <Dan Kennedy>
Wed, 29 Jan 2025 15:11:07 +0000 (15:11 +0000)
FossilOrigin-Name: dc74bd8915a9e1a915fb4ff3229a7b5e8f89486fe1df812a7738f6627d379648

main.mk
manifest
manifest.uuid
src/test_config.c
src/wal.c
test/wal2recover2.test

diff --git a/main.mk b/main.mk
index 629d470e2e914f084af58b64a82009f5fe679a2d..b6916c2e8546149896f6302204c34815008e6e5f 100644 (file)
--- a/main.mk
+++ b/main.mk
@@ -836,8 +836,6 @@ TESTSRC2 = \
   $(TOP)/ext/fts3/fts3_write.c \
   $(TOP)/ext/misc/stmt.c \
   $(TOP)/ext/session/sqlite3session.c \
-  $(TOP)/ext/session/sqlite3changebatch.c \
-  $(TOP)/ext/session/test_session.c \
   fts5.c
 
 # Header files used by all library source files.
index 35c554c0b953cd0717c989687def02ee2e9b4489..fd35b17d9aef1664abc3be0104aa79361636169b 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Version\s3.48.0\sfor\sthe\sbedrock\sbranch
-D 2025-01-14T12:28:43.665
+C If\sSQLITE_ENABLE_WAL2NOCKSUM\sis\sdefined,\sthen\sSQLite\scalculates\sthe\sframe\schecksums\sused\sin\swal2\smode\sbased\son\sthe\sprevious\schecksum\sand\sthe\sframe\sheader\sonly,\snot\sthe\sframe\sbody\sonly.\sThis\srisks\scorruption\sfollowing\sa\sOS\scrash\sor\spower\sfailure,\sbut\salso\sspeeds\sup\swrites\sin\swal2\smode.
+D 2025-01-29T15:11:07.802
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@ -708,7 +708,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a
 F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2
 F ext/wasm/wasmfs.make bc8bb227f35d5bd3863a7bd2233437c37472a0d81585979f058f9b9b503bef35
 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0
-F main.mk 8220d7e38f112841a908cc4a00a5e8ddbbe901cfc76dfd3e5ea3d63ca846d87e
+F main.mk 246580165715eefcb0b063bd58d58e05f179a2c05009caa542f17b222b91fb78
 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271
 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504
 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421
@@ -810,7 +810,7 @@ F src/test_backup.c bd901e3c116c7f3b3bbbd4aae4ce87d99b400c9cbb0a9e7b4610af451d97
 F src/test_bestindex.c 3401bee51665cbf7f9ed2552b5795452a8b86365e4c9ece745b54155a55670c6
 F src/test_blob.c bcdf6a6c22d0bcc13c41479d63692ef413add2a4d30e1e26b9f74ab85b9fb4d5
 F src/test_btree.c 28283787d32b8fa953eb77412ad0de2c9895260e4e5bd5a94b3c7411664f90d5
-F src/test_config.c 872eb3cab4573b8b9512454bf11bc68092a2b61cffd9b16465414c70a3357d8a
+F src/test_config.c a684b7c4b6fdf0da87dcd052bb93fa499e7859120b5963972923abd98f31a2e1
 F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f
 F src/test_demovfs.c 3efa2adf4f21e10d95521721687d5ca047aea91fa62dd8cc22ac9e5a9c942383
 F src/test_devsym.c 649434ed34d0b03fbd5a6b42df80f0f9a7e53f94dd1710aad5dd8831e91c4e86
@@ -867,7 +867,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8
 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3
 F src/vtab.c 316cd48e9320660db3047cd306cd056e4361180cebb4d0f10a39244e10c11422
 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
-F src/wal.c 964c785ac8324de1ae742c44aa72ddd4401d4abab11ef6999aec21d7221b3e67
+F src/wal.c f552156ce5f8392b224d56fe99a49e1667cab8429c2b430eed9deaa23abd1542
 F src/wal.h 8d02ab8c2a93a941f5898eb3345bf711c1d3f8f86f4be8d5428fb6c074962d8a
 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014
 F src/where.c 604f17baed46f4997ffe79f25c07c4b51a4165a5938cc27fe165c7e1ca485d11
@@ -2020,7 +2020,7 @@ F test/wal2fault.test 2e8e60cacd5bcd451618aeffd05f676894d17202d3e2986e288d36e2c5
 F test/wal2lock.test 0ef98d72dc6bcf7711dedd684760488400d9a9a6eec0dc5d3822060437793552
 F test/wal2openclose.test 2b26be723ea7f4263c8d5d70b37efd1c359561a0526e39466c45fe8e6478daee
 F test/wal2recover.test 348a3f2a4c79359790f70fd692dcd0c8f04e42a85365e688778c945e10bae02b
-F test/wal2recover2.test a7eece9892b125ef92343bba9e06edd5f6ad20c548dcbf79e3f2ab759f31ef84
+F test/wal2recover2.test e849fc5a202ae49dc561a3d47270accf159227c9e7663594fab0eac212480d28
 F test/wal2recover3.test 4a91689e165a38bc401736e6518188c2b0ff4fa1566d1810b8867536db128177
 F test/wal2rewrite.test 6ca6f631ffcf871240beab5f02608913fd075c6d0d31310b026c8383c65c9f9c
 F test/wal2rollback.test 23adc4a099b23f6aaea8b04fdca1c35861d887dd80f8be7da2d5273eb777e428
@@ -2242,8 +2242,9 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 4b9497cffa3397f6dd498b9a9145ebee6fcfcc175c75aa6f922ad635619f3e24 ef970ef037ed2271324593a46342547979ce31bcfbc8ca65930f0e51083a9e6a
-R 512162a74cf573fb37124d22bab2f3c1
-U drh
-Z dd3562b4e97e09b9d7d50446541cf947
+P fab341c8295545739cdce8b71e38ead68cb80a6f836f7ec0540b387f17b6cbe2
+Q +4d3706727005397c3c9006b9ad9a2645b09533b02735ea68974c4f2df4c2e853
+R 474ce037ad8c9757d8c8e66f75356bf2
+U dan
+Z 363c756be7599a910bd16bdd6751a132
 # Remove this line to create a well-formed Fossil manifest.
index 4665624774fd7654442fa431b2057c36e16539ec..513952cd5de2b67b64b1e806dd1b7f95ac71b24b 100644 (file)
@@ -1 +1 @@
-fab341c8295545739cdce8b71e38ead68cb80a6f836f7ec0540b387f17b6cbe2
+dc74bd8915a9e1a915fb4ff3229a7b5e8f89486fe1df812a7738f6627d379648
index cc233532f37934d7d11d6bfca55647f1af0eb115..7167aaad3bbe57ce28eeb24032407e1c8c963e90 100644 (file)
@@ -781,6 +781,12 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY);
   Tcl_SetVar2(interp, "sqlite_options", "normalize", "0", TCL_GLOBAL_ONLY);
 #endif
 
+#ifdef SQLITE_ENABLE_WAL2NOCKSUM
+  Tcl_SetVar2(interp, "sqlite_options", "wal2nocksum", "1", TCL_GLOBAL_ONLY);
+#else
+  Tcl_SetVar2(interp, "sqlite_options", "wal2nocksum", "0", TCL_GLOBAL_ONLY);
+#endif
+
 #ifdef SQLITE_OMIT_WINDOWFUNC
   Tcl_SetVar2(interp, "sqlite_options", "windowfunc", "0", TCL_GLOBAL_ONLY);
 #else
index fc0a24510f3867c194b502008eaa6985d775d3ac..0f4150cd9718568d624da74af2c46408dd075955 100644 (file)
--- a/src/wal.c
+++ b/src/wal.c
@@ -461,6 +461,17 @@ int sqlite3WalTrace = 0;
 #define WAL_VERSION1 3007000      /* For "journal_mode=wal" */
 #define WAL_VERSION2 3021000      /* For "journal_mode=wal2" */
 
+#ifdef SQLITE_ENABLE_WAL2NOCKSUM
+# undef WAL_VERSION2
+# define WAL_VERSION2 3048000     /* For "journal_mode=wal2" sans checksums */
+
+# define isNocksum(pWal) isWalMode2(pWal)
+#else
+# define isNocksum(pWal) 0
+#endif
+
+
+
 
 /*
 ** Index numbers for various locking bytes.   WAL_NREADER is the number
@@ -1240,10 +1251,13 @@ static void walEncodeFrame(
 
     nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN);
     walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum);
-    walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum);
+    if( isNocksum(pWal)==0 ){
+      walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum);
+    }
 
     sqlite3Put4byte(&aFrame[16], aCksum[0]);
     sqlite3Put4byte(&aFrame[20], aCksum[1]);
+
   }else{
     memset(&aFrame[8], 0, 16);
   }
@@ -1287,7 +1301,9 @@ static int walDecodeFrame(
   */
   nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN);
   walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum);
-  walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum);
+  if( isNocksum(pWal)==0 ){
+    walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum);
+  }
   if( aCksum[0]!=sqlite3Get4byte(&aFrame[16])
    || aCksum[1]!=sqlite3Get4byte(&aFrame[20])
   ){
@@ -5110,10 +5126,21 @@ static int walWriteOneFrame(
 
   pData = pPage->pData;
   walEncodeFrame(p->pWal, pPage->pgno, nTruncate, pData, aFrame);
-  rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset);
-  if( rc ) return rc;
+
+  if( isNocksum(p->pWal)==0 ){
+    /* Write the header in normal mode */
+    rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset);
+    if( rc ) return rc;
+  }
+
   /* Write the page data */
   rc = walWriteToLog(p, pData, p->szPage, iOffset+sizeof(aFrame));
+
+  if( isNocksum(p->pWal) ){
+    /* Write the header in no-checksum mode */
+    if( rc ) return rc;
+    rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset);
+  }
   return rc;
 }
 
index 50a2fcf0833b15194569f8f5bc755b44d078a132..6807612c954a16f174130da7393b0b2e3587d3de 100644 (file)
@@ -85,8 +85,10 @@ proc fix_wal_cksums {file} {
     set e [hexio_read $file $off 8]
     set cksum [cksum $cksum $e]
 
-    set p [hexio_read $file [expr $off+24] $pgsz]
-    set cksum [cksum $cksum $p]
+    ifcapable !wal2nocksum {
+      set p [hexio_read $file [expr $off+24] $pgsz]
+      set cksum [cksum $cksum $p]
+    }
 
     hexio_write $file [expr $off+8] $salt
     hexio_write $file [expr $off+16] $cksum
@@ -129,6 +131,11 @@ proc wal_set_follow {file prevfile} {
   fix_wal_cksums $file
 }
 
+do_execsql_test 1.3.0 {
+  SELECT sum(x) FROM t1;
+  SELECT sum(x) FROM t2;
+} [list $H $M]
+
 foreach {tn file field} {
   1 test.db2-wal    salt0
   2 test.db2-wal    salt1
@@ -296,7 +303,15 @@ do_test 2.1 {
   forcecopy test.db-wal2 test.db2-wal
   forcecopy test.db-wal test.db2-wal2
   
-  hexio_write test.db2-wal 5000 1234567890
+  ifcapable wal2nocksum {
+    # With wal2nocksum set, each frame checksum is calculated based on the
+    # previous checksum and the contents of the first 8 bytes of the frame
+    # header. So to get the behaviour the test requires we need to mess up
+    # the frame header, not the body. Hence 4224 instead of 5000.
+    hexio_write test.db2-wal 4224 1234567890
+  } else {
+    hexio_write test.db2-wal 5000 1234567890
+  }
 } {5}
 
 do_test 2.2 {