diff --git a/main.mk b/main.mk index 629d470e2e..b6916c2e85 100644 --- 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. diff --git a/manifest b/manifest index 35c554c0b9..fd35b17d9a 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index 4665624774..513952cd5d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fab341c8295545739cdce8b71e38ead68cb80a6f836f7ec0540b387f17b6cbe2 +dc74bd8915a9e1a915fb4ff3229a7b5e8f89486fe1df812a7738f6627d379648 diff --git a/src/test_config.c b/src/test_config.c index cc233532f3..7167aaad3b 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -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 diff --git a/src/wal.c b/src/wal.c index fc0a24510f..0f4150cd97 100644 --- 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; } diff --git a/test/wal2recover2.test b/test/wal2recover2.test index 50a2fcf083..6807612c95 100644 --- a/test/wal2recover2.test +++ b/test/wal2recover2.test @@ -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 {