Fix some problems with handling corrupt database in the recovery extension.
FossilOrigin-Name: ed318be8241981ef96334ba13d3201a717cc812a59aed64e3dc67f7e7e71854b
This commit is contained in:
parent
aede9b5bd3
commit
5ca0b38605
@ -44,19 +44,14 @@ do_execsql_test 1.0 {
|
||||
INSERT INTO t1 VALUES(1, 2, 3);
|
||||
INSERT INTO t1 VALUES(2, hex(randomblob(1000)), randomblob(2000));
|
||||
CREATE INDEX i1 ON t1(b, c);
|
||||
CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c);
|
||||
INSERT INTO t2 VALUES(1, 2, 3);
|
||||
INSERT INTO t2 VALUES(2, hex(randomblob(1000)), randomblob(2000));
|
||||
ANALYZE;
|
||||
PRAGMA writable_schema = 1;
|
||||
DELETE FROM sqlite_schema WHERE name='t2';
|
||||
}
|
||||
faultsim_save_and_close
|
||||
|
||||
do_faultsim_test 1 -faults oom* -prep {
|
||||
faultsim_restore_and_reopen
|
||||
} -body {
|
||||
set R [sqlite3_recover_init db main test.db2]
|
||||
$R config lostandfound lost_and_found
|
||||
$R step
|
||||
$R finish
|
||||
} -test {
|
||||
@ -68,5 +63,25 @@ do_faultsim_test 1 -faults oom* -prep {
|
||||
}
|
||||
}
|
||||
|
||||
faultsim_restore_and_reopen
|
||||
do_execsql_test 2.0 {
|
||||
CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c);
|
||||
INSERT INTO t2 VALUES(1, 2, 3);
|
||||
INSERT INTO t2 VALUES(2, hex(randomblob(1000)), hex(randomblob(2000)));
|
||||
PRAGMA writable_schema = 1;
|
||||
DELETE FROM sqlite_schema WHERE name='t2';
|
||||
}
|
||||
|
||||
do_faultsim_test 2 -faults oom* -prep {
|
||||
faultsim_restore_and_reopen
|
||||
} -body {
|
||||
set R [sqlite3_recover_init db main test.db2]
|
||||
$R config lostandfound lost_and_found
|
||||
$R step
|
||||
$R finish
|
||||
} -test {
|
||||
faultsim_test_result {0 {}} {1 {}}
|
||||
}
|
||||
|
||||
finish_test
|
||||
|
||||
|
@ -406,6 +406,18 @@ static int recoverExec(sqlite3_recover *p, sqlite3 *db, const char *zSql){
|
||||
return p->errCode;
|
||||
}
|
||||
|
||||
static void recoverBindValue(
|
||||
sqlite3_recover *p,
|
||||
sqlite3_stmt *pStmt,
|
||||
int iBind,
|
||||
sqlite3_value *pVal
|
||||
){
|
||||
if( p->errCode==SQLITE_OK ){
|
||||
int rc = sqlite3_bind_value(pStmt, iBind, pVal);
|
||||
if( rc ) recoverError(p, rc, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** This function is a no-op if recover handle p already contains an error
|
||||
** (if p->errCode!=SQLITE_OK). NULL is returned in this case.
|
||||
@ -1305,7 +1317,7 @@ static void recoverLostAndFoundPopulate(
|
||||
sqlite3_bind_int64(pInsert, 4, iRowid); /* id */
|
||||
}
|
||||
for(ii=0; ii<nVal; ii++){
|
||||
sqlite3_bind_value(pInsert, 5+ii, apVal[ii]);
|
||||
recoverBindValue(p, pInsert, 5+ii, apVal[ii]);
|
||||
}
|
||||
if( sqlite3_step(pInsert)==SQLITE_ROW && p->xSql ){
|
||||
recoverSqlCallback(p, sqlite3_column_text(pInsert, 0));
|
||||
@ -1332,6 +1344,9 @@ static void recoverLostAndFoundPopulate(
|
||||
apVal[iField] = sqlite3_value_dup(pVal);
|
||||
assert( iField==nVal || (nVal==-1 && iField==0) );
|
||||
nVal = iField+1;
|
||||
if( apVal[iField]==0 ){
|
||||
recoverError(p, SQLITE_NOMEM, 0);
|
||||
}
|
||||
}
|
||||
|
||||
iPrevRoot = iRoot;
|
||||
@ -1553,7 +1568,7 @@ static int recoverWriteData(sqlite3_recover *p){
|
||||
if( pCol->bIPK ){
|
||||
sqlite3_bind_int64(pInsert, iBind, iRowid);
|
||||
}else if( pCol->iField<nVal ){
|
||||
sqlite3_bind_value(pInsert, iBind, apVal[pCol->iField]);
|
||||
recoverBindValue(p, pInsert, iBind, apVal[pCol->iField]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
18
manifest
18
manifest
@ -1,5 +1,5 @@
|
||||
C More\stests\sfor\sthe\srecover\smodule.
|
||||
D 2022-09-12T19:23:50.588
|
||||
C Fix\ssome\sproblems\swith\shandling\scorrupt\sdatabase\sin\sthe\srecovery\sextension.
|
||||
D 2022-09-12T20:02:33.923
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||
@ -391,10 +391,10 @@ F ext/recover/recover1.test 942016356f9098ca36933536b194b5878827a3a749e0bf41a83d
|
||||
F ext/recover/recover_common.tcl 6679af7dffc858e345053a91c9b0a897595b4a13007aceffafca75304ccb137c
|
||||
F ext/recover/recoverclobber.test e6537ebf99f57bfff6cca59550b5f4278319b57a89865abb98d755a8fd561d84
|
||||
F ext/recover/recovercorrupt.test 115cdb67ac29b4e8ec786cee9190ced674f62388f126b20deea22fa5fd11b814
|
||||
F ext/recover/recoverfault.test 30e3d1b423b33b4c57f4a97f9754b2d493a411d858b2672ab369d65199bc2420
|
||||
F ext/recover/recoverfault.test db6b0ba5a993c38ec885867a12556fa7c5d73948b168b0b59e7d3053c0787f29
|
||||
F ext/recover/recoverold.test f368a6ae2db12b6017257b332a19ab5df527f4061e43f12f5c85d8e2b236f074
|
||||
F ext/recover/recoverrowid.test ec4436cd69e6cdacb48dd2963ff6dd9dbd5fe648376de5e7c0c2f4f6cbacb417
|
||||
F ext/recover/sqlite3recover.c d40d7c68a118e01d2b06c96325bbe3b85701f3add2ab5aeec289eeafd5e36d6c
|
||||
F ext/recover/sqlite3recover.c 0154617e73430b594f3d8b94eb2847bd5dc3dc3cd6ff6f0511dc6db5d116621d
|
||||
F ext/recover/sqlite3recover.h 81108efb8c4618d3d9c6da4df785212b0e4501aa0d25edfc463405fe839a6640
|
||||
F ext/recover/test_recover.c 8f5ef0c9b7523c41a393f65e44d727c23cda8f44d5180fff5b698ee068ba538d
|
||||
F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15
|
||||
@ -546,7 +546,7 @@ F src/callback.c 4cd7225b26a97f7de5fee5ae10464bed5a78f2adefe19534cc2095b3a8ca484
|
||||
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
||||
F src/ctime.c 93e4b5f4faf6d3f688988a116773259a4fbfb4ddac0e9bf9d0ae0429390c2543
|
||||
F src/date.c 94ce83b4cd848a387680a5f920c9018c16655db778c4d36525af0a0f34679ac5
|
||||
F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec
|
||||
F src/dbpage.c dc1e8e7ba880009986b2f2050213157d2328b6d8cd4df6cf0f48883734510558
|
||||
F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d
|
||||
F src/delete.c 86573edae75e3d3e9a8b590d87db8e47222103029df4f3e11fa56044459b514e
|
||||
F src/expr.c 24e828db6b2fab8aabfb5d2c0d83dbdfc5a1972b1147fa893350e317ab7e282f
|
||||
@ -599,7 +599,7 @@ F src/random.c 546d6feb15ec69c1aafe9bb351a277cbb498fd5410e646add673acb805714960
|
||||
F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633
|
||||
F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
|
||||
F src/select.c ccce37e7fbe71089cf6aec91e7134c9c0c1d4840cff9f02587bbc71240d914a5
|
||||
F src/shell.c.in a805e05f3ed90e0236eb4eb5bdec327bf735d12e754b83ac037cbc22e45ecc09
|
||||
F src/shell.c.in 36d5792e35515f2389f175b41486b78b1ad6e571799e3c9b211f47c3629f96e5
|
||||
F src/sqlite.h.in b9b7fd73239d94db20332bb6e504688001e5564b655e1318a4427a1caef4b99e
|
||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||
F src/sqlite3ext.h a988810c9b21c0dc36dc7a62735012339dc76fc7ab448fb0792721d30eacb69d
|
||||
@ -2009,8 +2009,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P 1a2540960e40e3c8c622448fd3862e249bd463c29ae4ce5e39942e942533f60a
|
||||
R 91d8f87cd1493a401d98e4544c1e3f6e
|
||||
P 37fb093b95c6b7d7ad07a275697df73b69f9fb5c5549aea8544b26e38f24833f
|
||||
R 4bca180a2c79c76d0affba5c0d731d37
|
||||
U dan
|
||||
Z d3a21f62871d8e066c6c2bd48e5f7060
|
||||
Z 8bfc7241f27e2d2e9de40f4a070a3e2c
|
||||
# Remove this line to create a well-formed Fossil manifest.
|
||||
|
@ -1 +1 @@
|
||||
37fb093b95c6b7d7ad07a275697df73b69f9fb5c5549aea8544b26e38f24833f
|
||||
ed318be8241981ef96334ba13d3201a717cc812a59aed64e3dc67f7e7e71854b
|
@ -288,7 +288,7 @@ static int dbpageColumn(
|
||||
break;
|
||||
}
|
||||
}
|
||||
return SQLITE_OK;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int dbpageRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
|
||||
|
@ -7309,7 +7309,7 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
|
||||
pState->db, "main", recoverSqlCb, (void*)pState
|
||||
);
|
||||
|
||||
sqlite3_recover_config(p, SQLITE_RECOVER_TESTDB, (void*)zRecoveryDb);
|
||||
sqlite3_recover_config(p, 789, (void*)zRecoveryDb);
|
||||
sqlite3_recover_config(p, SQLITE_RECOVER_LOST_AND_FOUND, (void*)zLAF);
|
||||
sqlite3_recover_config(p, SQLITE_RECOVER_ROWIDS, (void*)&bRowids);
|
||||
sqlite3_recover_config(p, SQLITE_RECOVER_FREELIST_CORRUPT,(void*)&bFreelist);
|
||||
|
Loading…
x
Reference in New Issue
Block a user