mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Avoid writing frames with no checksums into the wal file if a savepoint is rolled back after dirty pages have already been spilled into the wal file. Possible fix for [forum:/forumpost/b490f726db | forum post b490f726db].
FossilOrigin-Name: 3a3269fe8e925a522d5df9f011220a842fb15a9f56e785884e32d2e15abda5bb
This commit is contained in:
19
manifest
19
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Fix\san\sissue\sgoing\sback\sto\sversion\s3.39.0\swith\stransitive\sIS\sconstraints\nin\squeries\sthat\smake\suse\sof\sRIGHT\sJOIN.\s\sProblem\sreported\sby\n[forum:/forumpost/68f29a2005|forum\spost\s68f29a2005].
|
C Avoid\swriting\sframes\swith\sno\schecksums\sinto\sthe\swal\sfile\sif\sa\ssavepoint\sis\srolled\sback\safter\sdirty\spages\shave\salready\sbeen\sspilled\sinto\sthe\swal\sfile.\sPossible\sfix\sfor\s[forum:/forumpost/b490f726db\s|\sforum\spost\sb490f726db].
|
||||||
D 2025-06-16T17:36:11.335
|
D 2025-06-17T11:36:39.164
|
||||||
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
|
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
@@ -864,7 +864,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8
|
|||||||
F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3
|
F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3
|
||||||
F src/vtab.c 828221bdbeaaa6d62126ee6d07fd4ec0d09dcaea846f87ad01944d8b7e548859
|
F src/vtab.c 828221bdbeaaa6d62126ee6d07fd4ec0d09dcaea846f87ad01944d8b7e548859
|
||||||
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
|
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
|
||||||
F src/wal.c b0f848cfba8dd057f77073493cdd542f9125b4cf87941f53e9d0db21604155c8
|
F src/wal.c 20be6f0a25a80b7897cf2a5369bfd37ef198e6f0b6cdef16d83eee856056b159
|
||||||
F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452
|
F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452
|
||||||
F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014
|
F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014
|
||||||
F src/where.c a99fa3061a0155d2cb0e2c91df76dbf834750272a8d79ec5e2dce3ed4e6abad6
|
F src/where.c a99fa3061a0155d2cb0e2c91df76dbf834750272a8d79ec5e2dce3ed4e6abad6
|
||||||
@@ -2014,7 +2014,7 @@ F test/wal_common.tcl 204d1721ac13c5e0c7fae6380315b5ab7f4e8423f580d826c5e9df1995
|
|||||||
F test/walbak.test 018d4e5a3d45c6298d11b99f09a8ef6876527946
|
F test/walbak.test 018d4e5a3d45c6298d11b99f09a8ef6876527946
|
||||||
F test/walbig.test f437473a16cfb314867c6b5d1dbcd519e73e3434
|
F test/walbig.test f437473a16cfb314867c6b5d1dbcd519e73e3434
|
||||||
F test/walblock.test 6bb472e82730e7e4e81395e907a01d8cfc2bd9e1f01f8a9184ca572e2955a4bf
|
F test/walblock.test 6bb472e82730e7e4e81395e907a01d8cfc2bd9e1f01f8a9184ca572e2955a4bf
|
||||||
F test/walcksum.test ba02b4fe6d22cb42e57a323003cbae62f77a740983e1355b2b520e019ae261c7
|
F test/walcksum.test 158598ad68d9ea84e67eabbbb9043f6cb9304d58fae53929fea628333ddaf4c4
|
||||||
F test/walcrash.test 21038858cc552077b0522f50b0fa87e38139306a
|
F test/walcrash.test 21038858cc552077b0522f50b0fa87e38139306a
|
||||||
F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36
|
F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36
|
||||||
F test/walcrash3.test e426aa58122d20f2b9fbe9a507f9eb8cab85b8af
|
F test/walcrash3.test e426aa58122d20f2b9fbe9a507f9eb8cab85b8af
|
||||||
@@ -2208,8 +2208,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
|
|||||||
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
|
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
|
||||||
F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
|
F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
|
||||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||||
P 94b53c20e9bc8687c44272419aa7a93076eebdeae9a4f50b95b96a49993f9c0d
|
P 9441fff52cc4e19c44df1a77ffe474f409d519b270c7166ce17f99e6ea48fc1e
|
||||||
R 9792eecd1b6591bc063a59b87986da50
|
R 93b4b43fd06afdd1b9668d9d2f8541cf
|
||||||
U drh
|
T *branch * forum-b490f726db-fix
|
||||||
Z 7fae65e62acbc3e4e5d9b145df615a7d
|
T *sym-forum-b490f726db-fix *
|
||||||
|
T -sym-trunk *
|
||||||
|
U dan
|
||||||
|
Z d6bf754839869813fcea9434feef2ab0
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@@ -1 +1 @@
|
|||||||
9441fff52cc4e19c44df1a77ffe474f409d519b270c7166ce17f99e6ea48fc1e
|
3a3269fe8e925a522d5df9f011220a842fb15a9f56e785884e32d2e15abda5bb
|
||||||
|
@@ -3781,6 +3781,7 @@ int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){
|
|||||||
if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal);
|
if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal);
|
||||||
}
|
}
|
||||||
SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; )
|
SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; )
|
||||||
|
pWal->iReCksum = 0;
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -3828,6 +3829,9 @@ int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){
|
|||||||
walCleanupHash(pWal);
|
walCleanupHash(pWal);
|
||||||
}
|
}
|
||||||
SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; )
|
SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; )
|
||||||
|
if( pWal->iReCksum>pWal->hdr.mxFrame ){
|
||||||
|
pWal->iReCksum = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
@@ -16,6 +16,7 @@ source $testdir/lock_common.tcl
|
|||||||
source $testdir/wal_common.tcl
|
source $testdir/wal_common.tcl
|
||||||
|
|
||||||
ifcapable !wal {finish_test ; return }
|
ifcapable !wal {finish_test ; return }
|
||||||
|
set testprefix walcksum
|
||||||
|
|
||||||
# Read and return the contents of file $filename. Treat the content as
|
# Read and return the contents of file $filename. Treat the content as
|
||||||
# binary data.
|
# binary data.
|
||||||
@@ -331,5 +332,149 @@ do_test walcksum-2.1 {
|
|||||||
catch { db close }
|
catch { db close }
|
||||||
catch { db2 close }
|
catch { db2 close }
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
# Test cases based on the bug reported at:
|
||||||
|
#
|
||||||
|
# <https://sqlite.org/forum/forumpost/b490f726db>
|
||||||
|
#
|
||||||
|
reset_db
|
||||||
|
|
||||||
|
do_execsql_test 3.0 {
|
||||||
|
PRAGMA synchronous = NORMAL;
|
||||||
|
PRAGMA journal_mode = WAL;
|
||||||
|
PRAGMA cache_size = 1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INTEGER PRIMARY KEY, b BLOB, t TEXT);
|
||||||
|
PRAGMA wal_checkpoint;
|
||||||
|
INSERT INTO t1 VALUES(1, randomblob(2048), 'one');
|
||||||
|
} {wal 0 2 2}
|
||||||
|
|
||||||
|
do_execsql_test 3.1 {
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO t1 VALUES(2, randomblob(2048), 'two');
|
||||||
|
SAVEPOINT one;
|
||||||
|
INSERT INTO t1 VALUES(3, randomblob(2048), 'three');
|
||||||
|
INSERT INTO t1 VALUES(4, randomblob(2048), 'four');
|
||||||
|
INSERT INTO t1 VALUES(5, randomblob(2048), 'five');
|
||||||
|
INSERT INTO t1 VALUES(6, randomblob(2048), 'six');
|
||||||
|
INSERT INTO t1 VALUES(7, randomblob(2048), 'seven');
|
||||||
|
|
||||||
|
UPDATE t1 SET b=randomblob(2048) WHERE i=5;
|
||||||
|
UPDATE t1 SET b=randomblob(2048) WHERE i=6;
|
||||||
|
UPDATE t1 SET b=randomblob(2048) WHERE i=7;
|
||||||
|
ROLLBACK TO one;
|
||||||
|
INSERT INTO t1 VALUES(8, NULL, 'eight');
|
||||||
|
COMMIT;
|
||||||
|
} {}
|
||||||
|
|
||||||
|
do_execsql_test 3.2 {
|
||||||
|
SELECT i, t FROM t1
|
||||||
|
} {1 one 2 two 8 eight}
|
||||||
|
|
||||||
|
forcecopy test.db test2.db
|
||||||
|
forcecopy test.db-wal test2.db-wal
|
||||||
|
|
||||||
|
sqlite3 db2 test2.db
|
||||||
|
do_test 1.3 {
|
||||||
|
execsql {
|
||||||
|
SELECT i, t FROM t1
|
||||||
|
} db2
|
||||||
|
} {1 one 2 two 8 eight}
|
||||||
|
|
||||||
|
catch { db2 close }
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
reset_db
|
||||||
|
|
||||||
|
do_execsql_test 4.0 {
|
||||||
|
PRAGMA synchronous = NORMAL;
|
||||||
|
PRAGMA journal_mode = WAL;
|
||||||
|
PRAGMA cache_size = 1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INTEGER PRIMARY KEY, b BLOB, t TEXT);
|
||||||
|
PRAGMA wal_checkpoint;
|
||||||
|
INSERT INTO t1 VALUES(1, randomblob(2048), 'one');
|
||||||
|
} {wal 0 2 2}
|
||||||
|
|
||||||
|
do_execsql_test 4.1.1 {
|
||||||
|
SAVEPOINT one;
|
||||||
|
INSERT INTO t1 VALUES(2, randomblob(2048), 'two');
|
||||||
|
INSERT INTO t1 VALUES(3, randomblob(2048), 'three');
|
||||||
|
INSERT INTO t1 VALUES(4, randomblob(2048), 'four');
|
||||||
|
INSERT INTO t1 VALUES(5, randomblob(2048), 'five');
|
||||||
|
INSERT INTO t1 VALUES(6, randomblob(2048), 'six');
|
||||||
|
INSERT INTO t1 VALUES(7, randomblob(2048), 'seven');
|
||||||
|
|
||||||
|
UPDATE t1 SET b=randomblob(2048) WHERE i=5;
|
||||||
|
UPDATE t1 SET b=randomblob(2048) WHERE i=6;
|
||||||
|
UPDATE t1 SET b=randomblob(2048) WHERE i=7;
|
||||||
|
}
|
||||||
|
|
||||||
|
do_execsql_test 4.1.2 {
|
||||||
|
ROLLBACK TO one;
|
||||||
|
INSERT INTO t1 VALUES(8, NULL, 'eight');
|
||||||
|
RELEASE one;
|
||||||
|
} {}
|
||||||
|
|
||||||
|
do_execsql_test 4.2 {
|
||||||
|
SELECT i, t FROM t1
|
||||||
|
} {1 one 8 eight}
|
||||||
|
|
||||||
|
forcecopy test.db test2.db
|
||||||
|
forcecopy test.db-wal test2.db-wal
|
||||||
|
|
||||||
|
sqlite3 db2 test2.db
|
||||||
|
do_test 4.3 {
|
||||||
|
execsql {
|
||||||
|
SELECT i, t FROM t1
|
||||||
|
} db2
|
||||||
|
} {1 one 8 eight}
|
||||||
|
|
||||||
|
catch { db2 close }
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
reset_db
|
||||||
|
|
||||||
|
do_execsql_test 5.0 {
|
||||||
|
PRAGMA synchronous = NORMAL;
|
||||||
|
PRAGMA journal_mode = WAL;
|
||||||
|
PRAGMA cache_size = 1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INTEGER PRIMARY KEY, b BLOB, t TEXT);
|
||||||
|
INSERT INTO t1 VALUES(1, randomblob(2048), 'one');
|
||||||
|
INSERT INTO t1 VALUES(2, randomblob(2048), 'two');
|
||||||
|
INSERT INTO t1 VALUES(3, randomblob(2048), 'three');
|
||||||
|
PRAGMA wal_checkpoint;
|
||||||
|
} {wal 0 14 14}
|
||||||
|
|
||||||
|
do_execsql_test 5.1 {
|
||||||
|
BEGIN;
|
||||||
|
SELECT count(*) FROM t1;
|
||||||
|
SAVEPOINT one;
|
||||||
|
INSERT INTO t1 VALUES(4, randomblob(2048), 'four');
|
||||||
|
INSERT INTO t1 VALUES(5, randomblob(2048), 'five');
|
||||||
|
INSERT INTO t1 VALUES(6, randomblob(2048), 'six');
|
||||||
|
INSERT INTO t1 VALUES(7, randomblob(2048), 'seven');
|
||||||
|
ROLLBACK TO one;
|
||||||
|
INSERT INTO t1 VALUES(8, randomblob(2048), 'eight');
|
||||||
|
INSERT INTO t1 VALUES(9, randomblob(2048), 'nine');
|
||||||
|
COMMIT;
|
||||||
|
} {3}
|
||||||
|
|
||||||
|
forcecopy test.db test2.db
|
||||||
|
forcecopy test.db-wal test2.db-wal
|
||||||
|
|
||||||
|
sqlite3 db2 test2.db
|
||||||
|
do_test 5.2 {
|
||||||
|
execsql {
|
||||||
|
SELECT i, t FROM t1
|
||||||
|
} db2
|
||||||
|
} {1 one 2 two 3 three 8 eight 9 nine}
|
||||||
|
db2 close
|
||||||
|
|
||||||
|
do_execsql_test 5.3 {
|
||||||
|
SELECT i, t FROM t1
|
||||||
|
} {1 one 2 two 3 three 8 eight 9 nine}
|
||||||
|
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
Reference in New Issue
Block a user