mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-05 15:55:57 +03:00
Improve some of the error messages emitted by fts5 when it encounters corruption.
FossilOrigin-Name: 48044a6b57c0a16cb75139c103ad88ca4ab64d74f70a3dee0d8b817fbfbec3c6
This commit is contained in:
@@ -554,6 +554,36 @@ struct Fts5SegIter {
|
|||||||
u8 bDel; /* True if the delete flag is set */
|
u8 bDel; /* True if the delete flag is set */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int fts5IndexCorruptRowid(Fts5Index *pIdx, i64 iRowid){
|
||||||
|
pIdx->rc = FTS5_CORRUPT;
|
||||||
|
sqlite3Fts5ConfigErrmsg(pIdx->pConfig,
|
||||||
|
"fts5: corruption found reading blob %lld from table \"%s\"",
|
||||||
|
iRowid, pIdx->pConfig->zName
|
||||||
|
);
|
||||||
|
return SQLITE_CORRUPT_VTAB;
|
||||||
|
}
|
||||||
|
#define FTS5_CORRUPT_ROWID(pIdx, iRowid) fts5IndexCorruptRowid(pIdx, iRowid)
|
||||||
|
|
||||||
|
static int fts5IndexCorruptIter(Fts5Index *pIdx, Fts5SegIter *pIter){
|
||||||
|
pIdx->rc = FTS5_CORRUPT;
|
||||||
|
sqlite3Fts5ConfigErrmsg(pIdx->pConfig,
|
||||||
|
"fts5: corruption on page %d, segment %d, table \"%s\"",
|
||||||
|
pIter->iLeafPgno, pIter->pSeg->iSegid, pIdx->pConfig->zName
|
||||||
|
);
|
||||||
|
return SQLITE_CORRUPT_VTAB;
|
||||||
|
}
|
||||||
|
#define FTS5_CORRUPT_ITER(pIdx, pIter) fts5IndexCorruptIter(pIdx, pIter)
|
||||||
|
|
||||||
|
static int fts5IndexCorruptIdx(Fts5Index *pIdx){
|
||||||
|
pIdx->rc = FTS5_CORRUPT;
|
||||||
|
sqlite3Fts5ConfigErrmsg(pIdx->pConfig,
|
||||||
|
"fts5: corruption in table \"%s\"", pIdx->pConfig->zName
|
||||||
|
);
|
||||||
|
return SQLITE_CORRUPT_VTAB;
|
||||||
|
}
|
||||||
|
#define FTS5_CORRUPT_IDX(pIdx) fts5IndexCorruptIdx(pIdx)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Array of tombstone pages. Reference counted.
|
** Array of tombstone pages. Reference counted.
|
||||||
*/
|
*/
|
||||||
@@ -843,7 +873,7 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){
|
|||||||
** All the reasons those functions might return SQLITE_ERROR - missing
|
** All the reasons those functions might return SQLITE_ERROR - missing
|
||||||
** table, missing row, non-blob/text in block column - indicate
|
** table, missing row, non-blob/text in block column - indicate
|
||||||
** backing store corruption. */
|
** backing store corruption. */
|
||||||
if( rc==SQLITE_ERROR ) rc = FTS5_CORRUPT;
|
if( rc==SQLITE_ERROR ) rc = FTS5_CORRUPT_ROWID(p, iRowid);
|
||||||
|
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
u8 *aOut = 0; /* Read blob data into this buffer */
|
u8 *aOut = 0; /* Read blob data into this buffer */
|
||||||
@@ -893,7 +923,7 @@ static Fts5Data *fts5LeafRead(Fts5Index *p, i64 iRowid){
|
|||||||
Fts5Data *pRet = fts5DataRead(p, iRowid);
|
Fts5Data *pRet = fts5DataRead(p, iRowid);
|
||||||
if( pRet ){
|
if( pRet ){
|
||||||
if( pRet->nn<4 || pRet->szLeaf>pRet->nn ){
|
if( pRet->nn<4 || pRet->szLeaf>pRet->nn ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ROWID(p, iRowid);
|
||||||
fts5DataRelease(pRet);
|
fts5DataRelease(pRet);
|
||||||
pRet = 0;
|
pRet = 0;
|
||||||
}
|
}
|
||||||
@@ -1252,8 +1282,14 @@ static Fts5Structure *fts5StructureReadUncached(Fts5Index *p){
|
|||||||
/* TODO: Do we need this if the leaf-index is appended? Probably... */
|
/* TODO: Do we need this if the leaf-index is appended? Probably... */
|
||||||
memset(&pData->p[pData->nn], 0, FTS5_DATA_PADDING);
|
memset(&pData->p[pData->nn], 0, FTS5_DATA_PADDING);
|
||||||
p->rc = fts5StructureDecode(pData->p, pData->nn, &iCookie, &pRet);
|
p->rc = fts5StructureDecode(pData->p, pData->nn, &iCookie, &pRet);
|
||||||
if( p->rc==SQLITE_OK && (pConfig->pgsz==0 || pConfig->iCookie!=iCookie) ){
|
if( p->rc==SQLITE_OK ){
|
||||||
p->rc = sqlite3Fts5ConfigLoad(pConfig, iCookie);
|
if( (pConfig->pgsz==0 || pConfig->iCookie!=iCookie) ){
|
||||||
|
p->rc = sqlite3Fts5ConfigLoad(pConfig, iCookie);
|
||||||
|
}
|
||||||
|
}else if( p->rc==SQLITE_CORRUPT_VTAB ){
|
||||||
|
sqlite3Fts5ConfigErrmsg(p->pConfig,
|
||||||
|
"fts5: corrupt structure record for table \"%s\"", p->pConfig->zName
|
||||||
|
);
|
||||||
}
|
}
|
||||||
fts5DataRelease(pData);
|
fts5DataRelease(pData);
|
||||||
if( p->rc!=SQLITE_OK ){
|
if( p->rc!=SQLITE_OK ){
|
||||||
@@ -1876,7 +1912,7 @@ static void fts5SegIterLoadRowid(Fts5Index *p, Fts5SegIter *pIter){
|
|||||||
while( iOff>=pIter->pLeaf->szLeaf ){
|
while( iOff>=pIter->pLeaf->szLeaf ){
|
||||||
fts5SegIterNextPage(p, pIter);
|
fts5SegIterNextPage(p, pIter);
|
||||||
if( pIter->pLeaf==0 ){
|
if( pIter->pLeaf==0 ){
|
||||||
if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT;
|
if( p->rc==SQLITE_OK ) FTS5_CORRUPT_ITER(p, pIter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
iOff = 4;
|
iOff = 4;
|
||||||
@@ -1908,7 +1944,7 @@ static void fts5SegIterLoadTerm(Fts5Index *p, Fts5SegIter *pIter, int nKeep){
|
|||||||
|
|
||||||
iOff += fts5GetVarint32(&a[iOff], nNew);
|
iOff += fts5GetVarint32(&a[iOff], nNew);
|
||||||
if( iOff+nNew>pIter->pLeaf->szLeaf || nKeep>pIter->term.n || nNew==0 ){
|
if( iOff+nNew>pIter->pLeaf->szLeaf || nKeep>pIter->term.n || nNew==0 ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ITER(p, pIter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pIter->term.n = nKeep;
|
pIter->term.n = nKeep;
|
||||||
@@ -2103,7 +2139,7 @@ static void fts5SegIterReverseNewPage(Fts5Index *p, Fts5SegIter *pIter){
|
|||||||
iRowidOff = fts5LeafFirstRowidOff(pNew);
|
iRowidOff = fts5LeafFirstRowidOff(pNew);
|
||||||
if( iRowidOff ){
|
if( iRowidOff ){
|
||||||
if( iRowidOff>=pNew->szLeaf ){
|
if( iRowidOff>=pNew->szLeaf ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ITER(p, pIter);
|
||||||
}else{
|
}else{
|
||||||
pIter->pLeaf = pNew;
|
pIter->pLeaf = pNew;
|
||||||
pIter->iLeafOffset = iRowidOff;
|
pIter->iLeafOffset = iRowidOff;
|
||||||
@@ -2337,7 +2373,7 @@ static void fts5SegIterNext(
|
|||||||
}
|
}
|
||||||
assert_nc( iOff<pLeaf->szLeaf );
|
assert_nc( iOff<pLeaf->szLeaf );
|
||||||
if( iOff>pLeaf->szLeaf ){
|
if( iOff>pLeaf->szLeaf ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ITER(p, pIter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2447,7 +2483,7 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){
|
|||||||
pIter->iLeafPgno = pgnoLast;
|
pIter->iLeafPgno = pgnoLast;
|
||||||
iOff = fts5LeafFirstRowidOff(pLast);
|
iOff = fts5LeafFirstRowidOff(pLast);
|
||||||
if( iOff>pLast->szLeaf ){
|
if( iOff>pLast->szLeaf ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ITER(p, pIter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
iOff += fts5GetVarint(&pLast->p[iOff], (u64*)&pIter->iRowid);
|
iOff += fts5GetVarint(&pLast->p[iOff], (u64*)&pIter->iRowid);
|
||||||
@@ -2526,7 +2562,7 @@ static void fts5LeafSeek(
|
|||||||
iPgidx += fts5GetVarint32(&a[iPgidx], iTermOff);
|
iPgidx += fts5GetVarint32(&a[iPgidx], iTermOff);
|
||||||
iOff = iTermOff;
|
iOff = iTermOff;
|
||||||
if( iOff>n ){
|
if( iOff>n ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ITER(p, pIter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2569,7 +2605,7 @@ static void fts5LeafSeek(
|
|||||||
iOff = iTermOff;
|
iOff = iTermOff;
|
||||||
|
|
||||||
if( iOff>=n ){
|
if( iOff>=n ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ITER(p, pIter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2591,7 +2627,7 @@ static void fts5LeafSeek(
|
|||||||
iPgidx = (u32)pIter->pLeaf->szLeaf;
|
iPgidx = (u32)pIter->pLeaf->szLeaf;
|
||||||
iPgidx += fts5GetVarint32(&pIter->pLeaf->p[iPgidx], iOff);
|
iPgidx += fts5GetVarint32(&pIter->pLeaf->p[iPgidx], iOff);
|
||||||
if( iOff<4 || (i64)iOff>=pIter->pLeaf->szLeaf ){
|
if( iOff<4 || (i64)iOff>=pIter->pLeaf->szLeaf ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ITER(p, pIter);
|
||||||
return;
|
return;
|
||||||
}else{
|
}else{
|
||||||
nKeep = 0;
|
nKeep = 0;
|
||||||
@@ -2606,7 +2642,7 @@ static void fts5LeafSeek(
|
|||||||
|
|
||||||
search_success:
|
search_success:
|
||||||
if( (i64)iOff+nNew>n || nNew<1 ){
|
if( (i64)iOff+nNew>n || nNew<1 ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ITER(p, pIter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pIter->iLeafOffset = iOff + nNew;
|
pIter->iLeafOffset = iOff + nNew;
|
||||||
@@ -3071,7 +3107,7 @@ static void fts5SegIterGotoPage(
|
|||||||
assert( iLeafPgno>pIter->iLeafPgno );
|
assert( iLeafPgno>pIter->iLeafPgno );
|
||||||
|
|
||||||
if( iLeafPgno>pIter->pSeg->pgnoLast ){
|
if( iLeafPgno>pIter->pSeg->pgnoLast ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_IDX(p);
|
||||||
}else{
|
}else{
|
||||||
fts5DataRelease(pIter->pNextLeaf);
|
fts5DataRelease(pIter->pNextLeaf);
|
||||||
pIter->pNextLeaf = 0;
|
pIter->pNextLeaf = 0;
|
||||||
@@ -3086,7 +3122,7 @@ static void fts5SegIterGotoPage(
|
|||||||
u8 *a = pIter->pLeaf->p;
|
u8 *a = pIter->pLeaf->p;
|
||||||
int n = pIter->pLeaf->szLeaf;
|
int n = pIter->pLeaf->szLeaf;
|
||||||
if( iOff<4 || iOff>=n ){
|
if( iOff<4 || iOff>=n ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_IDX(p);
|
||||||
}else{
|
}else{
|
||||||
iOff += fts5GetVarint(&a[iOff], (u64*)&pIter->iRowid);
|
iOff += fts5GetVarint(&a[iOff], (u64*)&pIter->iRowid);
|
||||||
pIter->iLeafOffset = iOff;
|
pIter->iLeafOffset = iOff;
|
||||||
@@ -3565,7 +3601,7 @@ static void fts5ChunkIterate(
|
|||||||
if( nRem<=0 ){
|
if( nRem<=0 ){
|
||||||
break;
|
break;
|
||||||
}else if( pSeg->pSeg==0 ){
|
}else if( pSeg->pSeg==0 ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_IDX(p);
|
||||||
return;
|
return;
|
||||||
}else{
|
}else{
|
||||||
pgno++;
|
pgno++;
|
||||||
@@ -4668,7 +4704,7 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){
|
|||||||
** a single page has been assigned to more than one segment. In
|
** a single page has been assigned to more than one segment. In
|
||||||
** this case a prior iteration of this loop may have corrupted the
|
** this case a prior iteration of this loop may have corrupted the
|
||||||
** segment currently being trimmed. */
|
** segment currently being trimmed. */
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ROWID(p, iLeafRowid);
|
||||||
}else{
|
}else{
|
||||||
fts5BufferZero(&buf);
|
fts5BufferZero(&buf);
|
||||||
fts5BufferGrow(&p->rc, &buf, pData->nn);
|
fts5BufferGrow(&p->rc, &buf, pData->nn);
|
||||||
@@ -5135,7 +5171,7 @@ static void fts5SecureDeleteOverflow(
|
|||||||
}else if( bDetailNone ){
|
}else if( bDetailNone ){
|
||||||
break;
|
break;
|
||||||
}else if( iNext>=pLeaf->szLeaf || pLeaf->nn<pLeaf->szLeaf || iNext<4 ){
|
}else if( iNext>=pLeaf->szLeaf || pLeaf->nn<pLeaf->szLeaf || iNext<4 ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ROWID(p, iRowid);
|
||||||
break;
|
break;
|
||||||
}else{
|
}else{
|
||||||
int nShift = iNext - 4;
|
int nShift = iNext - 4;
|
||||||
@@ -5155,7 +5191,7 @@ static void fts5SecureDeleteOverflow(
|
|||||||
|
|
||||||
i1 += fts5GetVarint32(&aPg[i1], iFirst);
|
i1 += fts5GetVarint32(&aPg[i1], iFirst);
|
||||||
if( iFirst<iNext ){
|
if( iFirst<iNext ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ROWID(p, iRowid);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
aIdx = sqlite3Fts5MallocZero(&p->rc, (pLeaf->nn-pLeaf->szLeaf)+2);
|
aIdx = sqlite3Fts5MallocZero(&p->rc, (pLeaf->nn-pLeaf->szLeaf)+2);
|
||||||
@@ -5378,14 +5414,14 @@ static void fts5DoSecureDelete(
|
|||||||
nSuffix = (nPrefix2 + nSuffix2) - nPrefix;
|
nSuffix = (nPrefix2 + nSuffix2) - nPrefix;
|
||||||
|
|
||||||
if( (iKeyOff+nSuffix)>iPgIdx || (iNextOff+nSuffix2)>iPgIdx ){
|
if( (iKeyOff+nSuffix)>iPgIdx || (iNextOff+nSuffix2)>iPgIdx ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_IDX(p);
|
||||||
}else{
|
}else{
|
||||||
if( iKey!=1 ){
|
if( iKey!=1 ){
|
||||||
iOff += sqlite3Fts5PutVarint(&aPg[iOff], nPrefix);
|
iOff += sqlite3Fts5PutVarint(&aPg[iOff], nPrefix);
|
||||||
}
|
}
|
||||||
iOff += sqlite3Fts5PutVarint(&aPg[iOff], nSuffix);
|
iOff += sqlite3Fts5PutVarint(&aPg[iOff], nSuffix);
|
||||||
if( nPrefix2>pSeg->term.n ){
|
if( nPrefix2>pSeg->term.n ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_IDX(p);
|
||||||
}else if( nPrefix2>nPrefix ){
|
}else if( nPrefix2>nPrefix ){
|
||||||
memcpy(&aPg[iOff], &pSeg->term.p[nPrefix], nPrefix2-nPrefix);
|
memcpy(&aPg[iOff], &pSeg->term.p[nPrefix], nPrefix2-nPrefix);
|
||||||
iOff += (nPrefix2-nPrefix);
|
iOff += (nPrefix2-nPrefix);
|
||||||
@@ -6178,7 +6214,7 @@ static void fts5MergePrefixLists(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( pHead==0 || pHead->pNext==0 ){
|
if( pHead==0 || pHead->pNext==0 ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_IDX(p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6215,7 +6251,7 @@ static void fts5MergePrefixLists(
|
|||||||
assert_nc( tmp.n+nTail<=nTmp );
|
assert_nc( tmp.n+nTail<=nTmp );
|
||||||
assert( tmp.n+nTail<=nTmp+nMerge*10 );
|
assert( tmp.n+nTail<=nTmp+nMerge*10 );
|
||||||
if( tmp.n+nTail>nTmp-FTS5_DATA_ZERO_PADDING ){
|
if( tmp.n+nTail>nTmp-FTS5_DATA_ZERO_PADDING ){
|
||||||
if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT;
|
if( p->rc==SQLITE_OK ) FTS5_CORRUPT_IDX(p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fts5BufferSafeAppendVarint(&out, (tmp.n+nTail) * 2);
|
fts5BufferSafeAppendVarint(&out, (tmp.n+nTail) * 2);
|
||||||
@@ -8344,14 +8380,17 @@ static void fts5IndexIntegrityCheckEmpty(
|
|||||||
for(i=iFirst; p->rc==SQLITE_OK && i<=iLast; i++){
|
for(i=iFirst; p->rc==SQLITE_OK && i<=iLast; i++){
|
||||||
Fts5Data *pLeaf = fts5DataRead(p, FTS5_SEGMENT_ROWID(pSeg->iSegid, i));
|
Fts5Data *pLeaf = fts5DataRead(p, FTS5_SEGMENT_ROWID(pSeg->iSegid, i));
|
||||||
if( pLeaf ){
|
if( pLeaf ){
|
||||||
if( !fts5LeafIsTermless(pLeaf) ) p->rc = FTS5_CORRUPT;
|
if( !fts5LeafIsTermless(pLeaf)
|
||||||
if( i>=iNoRowid && 0!=fts5LeafFirstRowidOff(pLeaf) ) p->rc = FTS5_CORRUPT;
|
|| (i>=iNoRowid && 0!=fts5LeafFirstRowidOff(pLeaf))
|
||||||
|
){
|
||||||
|
FTS5_CORRUPT_ROWID(p, FTS5_SEGMENT_ROWID(pSeg->iSegid, i));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fts5DataRelease(pLeaf);
|
fts5DataRelease(pLeaf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fts5IntegrityCheckPgidx(Fts5Index *p, Fts5Data *pLeaf){
|
static void fts5IntegrityCheckPgidx(Fts5Index *p, i64 iRowid, Fts5Data *pLeaf){
|
||||||
i64 iTermOff = 0;
|
i64 iTermOff = 0;
|
||||||
int ii;
|
int ii;
|
||||||
|
|
||||||
@@ -8369,12 +8408,12 @@ static void fts5IntegrityCheckPgidx(Fts5Index *p, Fts5Data *pLeaf){
|
|||||||
iOff = iTermOff;
|
iOff = iTermOff;
|
||||||
|
|
||||||
if( iOff>=pLeaf->szLeaf ){
|
if( iOff>=pLeaf->szLeaf ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ROWID(p, iRowid);
|
||||||
}else if( iTermOff==nIncr ){
|
}else if( iTermOff==nIncr ){
|
||||||
int nByte;
|
int nByte;
|
||||||
iOff += fts5GetVarint32(&pLeaf->p[iOff], nByte);
|
iOff += fts5GetVarint32(&pLeaf->p[iOff], nByte);
|
||||||
if( (iOff+nByte)>pLeaf->szLeaf ){
|
if( (iOff+nByte)>pLeaf->szLeaf ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ROWID(p, iRowid);
|
||||||
}else{
|
}else{
|
||||||
fts5BufferSet(&p->rc, &buf1, nByte, &pLeaf->p[iOff]);
|
fts5BufferSet(&p->rc, &buf1, nByte, &pLeaf->p[iOff]);
|
||||||
}
|
}
|
||||||
@@ -8383,7 +8422,7 @@ static void fts5IntegrityCheckPgidx(Fts5Index *p, Fts5Data *pLeaf){
|
|||||||
iOff += fts5GetVarint32(&pLeaf->p[iOff], nKeep);
|
iOff += fts5GetVarint32(&pLeaf->p[iOff], nKeep);
|
||||||
iOff += fts5GetVarint32(&pLeaf->p[iOff], nByte);
|
iOff += fts5GetVarint32(&pLeaf->p[iOff], nByte);
|
||||||
if( nKeep>buf1.n || (iOff+nByte)>pLeaf->szLeaf ){
|
if( nKeep>buf1.n || (iOff+nByte)>pLeaf->szLeaf ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ROWID(p, iRowid);
|
||||||
}else{
|
}else{
|
||||||
buf1.n = nKeep;
|
buf1.n = nKeep;
|
||||||
fts5BufferAppendBlob(&p->rc, &buf1, nByte, &pLeaf->p[iOff]);
|
fts5BufferAppendBlob(&p->rc, &buf1, nByte, &pLeaf->p[iOff]);
|
||||||
@@ -8391,7 +8430,7 @@ static void fts5IntegrityCheckPgidx(Fts5Index *p, Fts5Data *pLeaf){
|
|||||||
|
|
||||||
if( p->rc==SQLITE_OK ){
|
if( p->rc==SQLITE_OK ){
|
||||||
res = fts5BufferCompare(&buf1, &buf2);
|
res = fts5BufferCompare(&buf1, &buf2);
|
||||||
if( res<=0 ) p->rc = FTS5_CORRUPT;
|
if( res<=0 ) FTS5_CORRUPT_ROWID(p, iRowid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fts5BufferSet(&p->rc, &buf2, buf1.n, buf1.p);
|
fts5BufferSet(&p->rc, &buf2, buf1.n, buf1.p);
|
||||||
@@ -8452,7 +8491,7 @@ static void fts5IndexIntegrityCheckSegment(
|
|||||||
** entry even if all the terms are removed from it by secure-delete
|
** entry even if all the terms are removed from it by secure-delete
|
||||||
** operations. */
|
** operations. */
|
||||||
}else{
|
}else{
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ROWID(p, iRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
@@ -8464,15 +8503,15 @@ static void fts5IndexIntegrityCheckSegment(
|
|||||||
iOff = fts5LeafFirstTermOff(pLeaf);
|
iOff = fts5LeafFirstTermOff(pLeaf);
|
||||||
iRowidOff = fts5LeafFirstRowidOff(pLeaf);
|
iRowidOff = fts5LeafFirstRowidOff(pLeaf);
|
||||||
if( iRowidOff>=iOff || iOff>=pLeaf->szLeaf ){
|
if( iRowidOff>=iOff || iOff>=pLeaf->szLeaf ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ROWID(p, iRow);
|
||||||
}else{
|
}else{
|
||||||
iOff += fts5GetVarint32(&pLeaf->p[iOff], nTerm);
|
iOff += fts5GetVarint32(&pLeaf->p[iOff], nTerm);
|
||||||
res = fts5Memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm));
|
res = fts5Memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm));
|
||||||
if( res==0 ) res = nTerm - nIdxTerm;
|
if( res==0 ) res = nTerm - nIdxTerm;
|
||||||
if( res<0 ) p->rc = FTS5_CORRUPT;
|
if( res<0 ) FTS5_CORRUPT_ROWID(p, iRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
fts5IntegrityCheckPgidx(p, pLeaf);
|
fts5IntegrityCheckPgidx(p, iRow, pLeaf);
|
||||||
}
|
}
|
||||||
fts5DataRelease(pLeaf);
|
fts5DataRelease(pLeaf);
|
||||||
if( p->rc ) break;
|
if( p->rc ) break;
|
||||||
@@ -8502,7 +8541,7 @@ static void fts5IndexIntegrityCheckSegment(
|
|||||||
iKey = FTS5_SEGMENT_ROWID(iSegid, iPg);
|
iKey = FTS5_SEGMENT_ROWID(iSegid, iPg);
|
||||||
pLeaf = fts5DataRead(p, iKey);
|
pLeaf = fts5DataRead(p, iKey);
|
||||||
if( pLeaf ){
|
if( pLeaf ){
|
||||||
if( fts5LeafFirstRowidOff(pLeaf)!=0 ) p->rc = FTS5_CORRUPT;
|
if( fts5LeafFirstRowidOff(pLeaf)!=0 ) FTS5_CORRUPT_ROWID(p, iKey);
|
||||||
fts5DataRelease(pLeaf);
|
fts5DataRelease(pLeaf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8517,12 +8556,12 @@ static void fts5IndexIntegrityCheckSegment(
|
|||||||
int iRowidOff = fts5LeafFirstRowidOff(pLeaf);
|
int iRowidOff = fts5LeafFirstRowidOff(pLeaf);
|
||||||
ASSERT_SZLEAF_OK(pLeaf);
|
ASSERT_SZLEAF_OK(pLeaf);
|
||||||
if( iRowidOff>=pLeaf->szLeaf ){
|
if( iRowidOff>=pLeaf->szLeaf ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ROWID(p, iKey);
|
||||||
}else if( bSecureDelete==0 || iRowidOff>0 ){
|
}else if( bSecureDelete==0 || iRowidOff>0 ){
|
||||||
i64 iDlRowid = fts5DlidxIterRowid(pDlidx);
|
i64 iDlRowid = fts5DlidxIterRowid(pDlidx);
|
||||||
fts5GetVarint(&pLeaf->p[iRowidOff], (u64*)&iRowid);
|
fts5GetVarint(&pLeaf->p[iRowidOff], (u64*)&iRowid);
|
||||||
if( iRowid<iDlRowid || (bSecureDelete==0 && iRowid!=iDlRowid) ){
|
if( iRowid<iDlRowid || (bSecureDelete==0 && iRowid!=iDlRowid) ){
|
||||||
p->rc = FTS5_CORRUPT;
|
FTS5_CORRUPT_ROWID(p, iKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fts5DataRelease(pLeaf);
|
fts5DataRelease(pLeaf);
|
||||||
@@ -8637,7 +8676,12 @@ int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum, int bUseCksum){
|
|||||||
fts5TestTerm(p, &term, 0, 0, cksum2, &cksum3);
|
fts5TestTerm(p, &term, 0, 0, cksum2, &cksum3);
|
||||||
|
|
||||||
fts5MultiIterFree(pIter);
|
fts5MultiIterFree(pIter);
|
||||||
if( p->rc==SQLITE_OK && bUseCksum && cksum!=cksum2 ) p->rc = FTS5_CORRUPT;
|
if( p->rc==SQLITE_OK && bUseCksum && cksum!=cksum2 ){
|
||||||
|
p->rc = FTS5_CORRUPT;
|
||||||
|
sqlite3Fts5ConfigErrmsg(p->pConfig,
|
||||||
|
"fts5: checksum mismatch for table \"%s\"", p->pConfig->zName
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
fts5StructureRelease(pStruct);
|
fts5StructureRelease(pStruct);
|
||||||
#ifdef SQLITE_DEBUG
|
#ifdef SQLITE_DEBUG
|
||||||
|
@@ -3701,8 +3701,9 @@ static int fts5IntegrityMethod(
|
|||||||
" FTS5 table %s.%s: %s",
|
" FTS5 table %s.%s: %s",
|
||||||
zSchema, zTabname, sqlite3_errstr(rc));
|
zSchema, zTabname, sqlite3_errstr(rc));
|
||||||
}
|
}
|
||||||
|
}else if( (rc&0xff)==SQLITE_CORRUPT ){
|
||||||
|
rc = SQLITE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
sqlite3Fts5IndexCloseReader(pTab->p.pIndex);
|
sqlite3Fts5IndexCloseReader(pTab->p.pIndex);
|
||||||
pTab->p.pConfig->pzErrmsg = 0;
|
pTab->p.pConfig->pzErrmsg = 0;
|
||||||
|
|
||||||
|
@@ -428,7 +428,7 @@ do_execsql_test 15.1 {
|
|||||||
}
|
}
|
||||||
do_catchsql_test 15.2 {
|
do_catchsql_test 15.2 {
|
||||||
INSERT INTO t1(t1) VALUES('integrity-check');
|
INSERT INTO t1(t1) VALUES('integrity-check');
|
||||||
} {1 {database disk image is malformed}}
|
} {1 {fts5: checksum mismatch for table "t1"}}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
|
@@ -47,11 +47,10 @@ do_test 1.3 {
|
|||||||
DELETE FROM t1_data WHERE rowid = fts5_rowid('segment', $segid, 4);
|
DELETE FROM t1_data WHERE rowid = fts5_rowid('segment', $segid, 4);
|
||||||
}
|
}
|
||||||
catchsql { INSERT INTO t1(t1) VALUES('integrity-check') }
|
catchsql { INSERT INTO t1(t1) VALUES('integrity-check') }
|
||||||
} {1 {database disk image is malformed}}
|
} {1 {fts5: corruption found reading blob 137438953476 from table "t1"}}
|
||||||
do_execsql_test 1.3b {
|
do_execsql_test 1.3b {
|
||||||
PRAGMA integrity_check(t1);
|
PRAGMA integrity_check(t1);
|
||||||
} {{malformed inverted index for FTS5 table main.t1}}
|
} {{fts5: corruption found reading blob 137438953476 from table "t1"}}
|
||||||
|
|
||||||
|
|
||||||
do_test 1.4 {
|
do_test 1.4 {
|
||||||
db_restore_and_reopen
|
db_restore_and_reopen
|
||||||
@@ -61,7 +60,7 @@ do_test 1.4 {
|
|||||||
rowid = fts5_rowid('segment', $segid, 4);
|
rowid = fts5_rowid('segment', $segid, 4);
|
||||||
}
|
}
|
||||||
catchsql { INSERT INTO t1(t1) VALUES('integrity-check') }
|
catchsql { INSERT INTO t1(t1) VALUES('integrity-check') }
|
||||||
} {1 {database disk image is malformed}}
|
} {1 {fts5: corruption found reading blob 137438953476 from table "t1"}}
|
||||||
|
|
||||||
db_restore_and_reopen
|
db_restore_and_reopen
|
||||||
#db eval {SELECT rowid, fts5_decode(rowid, block) aS r FROM t1_data} {puts $r}
|
#db eval {SELECT rowid, fts5_decode(rowid, block) aS r FROM t1_data} {puts $r}
|
||||||
|
@@ -109,12 +109,12 @@ for {set i [expr $nbyte-2]} {$i>=0} {incr i -1} {
|
|||||||
|
|
||||||
do_catchsql_test 2.$i.2 {
|
do_catchsql_test 2.$i.2 {
|
||||||
INSERT INTO t1(t1) VALUES('integrity-check');
|
INSERT INTO t1(t1) VALUES('integrity-check');
|
||||||
} {1 {database disk image is malformed}}
|
} {/1.*fts5: corruption.*/}
|
||||||
|
|
||||||
do_test 2.$i.3 {
|
do_test 2.$i.3 {
|
||||||
set res [catchsql {SELECT rowid FROM t1 WHERE t1 MATCH 'x*'}]
|
set res [catchsql {SELECT rowid FROM t1 WHERE t1 MATCH 'x*'}]
|
||||||
expr {
|
expr {
|
||||||
$res=="1 {database disk image is malformed}"
|
[string match {*fts5: corruption*} $res]
|
||||||
|| $res=="0 {$all}"
|
|| $res=="0 {$all}"
|
||||||
}
|
}
|
||||||
} 1
|
} 1
|
||||||
@@ -160,17 +160,17 @@ foreach {tn hdr} {
|
|||||||
close $fd
|
close $fd
|
||||||
|
|
||||||
set res [catchsql {SELECT rowid FROM x3 WHERE x3 MATCH 'x AND a'}]
|
set res [catchsql {SELECT rowid FROM x3 WHERE x3 MATCH 'x AND a'}]
|
||||||
if {$res == "1 {database disk image is malformed}"} {incr nCorrupt}
|
if {[string match {*fts5: corruption*} $res]} {incr nCorrupt}
|
||||||
set {} 1
|
set {} 1
|
||||||
} {1}
|
} {1}
|
||||||
|
|
||||||
if {($tn2 % 10)==0 && $existing != $hdr} {
|
if {($tn2 % 10)==0 && $existing != $hdr} {
|
||||||
do_test 3.$tn.$tn2.2 {
|
do_test 3.$tn.$tn2.2 {
|
||||||
catchsql { INSERT INTO x3(x3) VALUES('integrity-check') }
|
catchsql { INSERT INTO x3(x3) VALUES('integrity-check') }
|
||||||
} {1 {database disk image is malformed}}
|
} {/.*fts5: corruption.*/}
|
||||||
do_execsql_test 3.$tn.$tn2.3 {
|
do_execsql_test 3.$tn.$tn2.3 {
|
||||||
PRAGMA integrity_check(x3);
|
PRAGMA integrity_check(x3);
|
||||||
} {{malformed inverted index for FTS5 table main.x3}}
|
} {/.*fts5: corruption.*/}
|
||||||
}
|
}
|
||||||
|
|
||||||
execsql ROLLBACK
|
execsql ROLLBACK
|
||||||
@@ -209,7 +209,7 @@ foreach {tn nCut} {
|
|||||||
set res [catchsql {
|
set res [catchsql {
|
||||||
SELECT rowid FROM x4 WHERE x4 MATCH 'a' ORDER BY 1 DESC
|
SELECT rowid FROM x4 WHERE x4 MATCH 'a' ORDER BY 1 DESC
|
||||||
}]
|
}]
|
||||||
if {$res == "1 {database disk image is malformed}"} {incr nCorrupt}
|
if {[string match {*fts5: corruption*} $res]} {incr nCorrupt}
|
||||||
set {} 1
|
set {} 1
|
||||||
} {1}
|
} {1}
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -237,7 +237,7 @@ do_test 1.0 {
|
|||||||
|
|
||||||
do_catchsql_test 1.1 {
|
do_catchsql_test 1.1 {
|
||||||
SELECT * FROM t1('R*') WHERE (a,b)<=(current_date,0) ORDER BY rowid DESC;
|
SELECT * FROM t1('R*') WHERE (a,b)<=(current_date,0) ORDER BY rowid DESC;
|
||||||
} {1 {database disk image is malformed}}
|
} {/.*fts5: corrupt.*/}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@@ -450,7 +450,7 @@ do_test 2.0 {
|
|||||||
|
|
||||||
do_catchsql_test 2.1 {
|
do_catchsql_test 2.1 {
|
||||||
SELECT * FROM t1('R*R*R*R*') WHERE (a,b)<=(current_date,0) ORDER BY rowid DESC;
|
SELECT * FROM t1('R*R*R*R*') WHERE (a,b)<=(current_date,0) ORDER BY rowid DESC;
|
||||||
} {1 {database disk image is malformed}}
|
} {/.*fts5: corrupt.*/}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
reset_db
|
reset_db
|
||||||
@@ -569,7 +569,7 @@ do_test 3.0 {
|
|||||||
|
|
||||||
do_catchsql_test 3.1 {
|
do_catchsql_test 3.1 {
|
||||||
UPDATE t1 SET b=quote(zeroblob(200)) WHERE a MATCH 'thra*T';
|
UPDATE t1 SET b=quote(zeroblob(200)) WHERE a MATCH 'thra*T';
|
||||||
} {1 {database disk image is malformed}}
|
} {/.*fts5: corrupt.*/}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
reset_db
|
reset_db
|
||||||
@@ -878,7 +878,7 @@ do_execsql_test 5.1 {
|
|||||||
}
|
}
|
||||||
do_catchsql_test 5.4 {
|
do_catchsql_test 5.4 {
|
||||||
UPDATE t1 SET content=randomblob(500);
|
UPDATE t1 SET content=randomblob(500);
|
||||||
} {1 {database disk image is malformed}}
|
} {/.*fts5: corrupt.*/}
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
reset_db
|
reset_db
|
||||||
|
@@ -123,6 +123,6 @@ do_execsql_test 2.2 {
|
|||||||
|
|
||||||
do_catchsql_test 2.3 {
|
do_catchsql_test 2.3 {
|
||||||
DELETE FROM t1 WHERE rowid = 1
|
DELETE FROM t1 WHERE rowid = 1
|
||||||
} {1 {database disk image is malformed}}
|
} {/.*fts5: corrupt.*/}
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
@@ -32,7 +32,7 @@ sqlite3 db test.db
|
|||||||
|
|
||||||
do_catchsql_test 1.2 {
|
do_catchsql_test 1.2 {
|
||||||
SELECT * FROM t1
|
SELECT * FROM t1
|
||||||
} {1 {database disk image is malformed}}
|
} {1 {fts5: corrupt structure record for table "t1"}}
|
||||||
do_catchsql_test 1.3 {
|
do_catchsql_test 1.3 {
|
||||||
DROP TABLE t1
|
DROP TABLE t1
|
||||||
} {0 {}}
|
} {0 {}}
|
||||||
|
@@ -46,7 +46,7 @@ do_execsql_test 1.5 {
|
|||||||
|
|
||||||
do_catchsql_test 1.6 {
|
do_catchsql_test 1.6 {
|
||||||
INSERT INTO f1(f1) VALUES('integrity-check');
|
INSERT INTO f1(f1) VALUES('integrity-check');
|
||||||
} {1 {database disk image is malformed}}
|
} {/.*fts5: corrupt.*/}
|
||||||
|
|
||||||
do_execsql_test 1.7 {
|
do_execsql_test 1.7 {
|
||||||
INSERT INTO f1(f1) VALUES('rebuild');
|
INSERT INTO f1(f1) VALUES('rebuild');
|
||||||
|
32
manifest
32
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Fix\san\sSQL\stypo\sintroduced\sby\sthe\sprevious\scheck-in.
|
C Improve\ssome\sof\sthe\serror\smessages\semitted\sby\sfts5\swhen\sit\sencounters\scorruption.
|
||||||
D 2025-06-23T19:00:30.447
|
D 2025-06-23T19:38:22.382
|
||||||
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
|
||||||
@@ -113,8 +113,8 @@ F ext/fts5/fts5_buffer.c f1e6d0324d7c55329d340673befc26681a372a4d36086caa8d1ec7d
|
|||||||
F ext/fts5/fts5_config.c e7d8dd062b44a66cd77e5a0f74f23a2354cd1f3f8575afb967b2773c3384f7f8
|
F ext/fts5/fts5_config.c e7d8dd062b44a66cd77e5a0f74f23a2354cd1f3f8575afb967b2773c3384f7f8
|
||||||
F ext/fts5/fts5_expr.c be9e5f7f11d87e7bd3680832c93c13050fe351994b5052b0215c2ef40312c23a
|
F ext/fts5/fts5_expr.c be9e5f7f11d87e7bd3680832c93c13050fe351994b5052b0215c2ef40312c23a
|
||||||
F ext/fts5/fts5_hash.c a6266cedd801ab7964fa9e74ebcdda6d30ec6a96107fa24148ec6b7b5b80f6e0
|
F ext/fts5/fts5_hash.c a6266cedd801ab7964fa9e74ebcdda6d30ec6a96107fa24148ec6b7b5b80f6e0
|
||||||
F ext/fts5/fts5_index.c d171f2a507abccb3d524bf461b01f0d3971a9bf221be622ac7c671a991cb62ee
|
F ext/fts5/fts5_index.c 1906bb292b65121aa7d88cabb2a486bea58de75c600271e5011fb86ccc2e427a
|
||||||
F ext/fts5/fts5_main.c 57933c18efe1058d8871199875c7a59744dabc3904f3aefbf9ff4a4e11fc79e2
|
F ext/fts5/fts5_main.c e558225168845dc708abeb2ad10415696e5a3249bcba1810ba3c7ef80764962e
|
||||||
F ext/fts5/fts5_storage.c 19bc7c4cbe1e6a2dd9849ef7d84b5ca1fcbf194cefc3e386b901e00e08bf05c2
|
F ext/fts5/fts5_storage.c 19bc7c4cbe1e6a2dd9849ef7d84b5ca1fcbf194cefc3e386b901e00e08bf05c2
|
||||||
F ext/fts5/fts5_tcl.c 7fb5a3d3404099075aaa2457307cb459bbc257c0de3dbd52b1e80a5b503e0329
|
F ext/fts5/fts5_tcl.c 7fb5a3d3404099075aaa2457307cb459bbc257c0de3dbd52b1e80a5b503e0329
|
||||||
F ext/fts5/fts5_test_mi.c 4308d5658cb1f5eee5998dcbaac7d5bdf7a2ef43c8192ca6e0c843f856ccee26
|
F ext/fts5/fts5_test_mi.c 4308d5658cb1f5eee5998dcbaac7d5bdf7a2ef43c8192ca6e0c843f856ccee26
|
||||||
@@ -126,7 +126,7 @@ F ext/fts5/fts5_vocab.c ff0441c4ea165081e8152dec6d29056faa0cdc281a9f218a00e3d7aa
|
|||||||
F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05
|
F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05
|
||||||
F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
|
F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
|
||||||
F ext/fts5/test/fts5_common.tcl c5aa7cf7148b6dcffb5b61520ae18212baf169936af734ab265143f59db328fe
|
F ext/fts5/test/fts5_common.tcl c5aa7cf7148b6dcffb5b61520ae18212baf169936af734ab265143f59db328fe
|
||||||
F ext/fts5/test/fts5aa.test 015c81b84d53bfcedd77d624202c8b02e9f0cbbb4b51688e3a9c9f90bccbb4ac
|
F ext/fts5/test/fts5aa.test cf4ff6180873bbc131666ba846ddd90148fcb61c20aad089711d3511cce24300
|
||||||
F ext/fts5/test/fts5ab.test 4bdb619fee409e11417e8827e320b857e42e926a01a0408fc9f143ec870a6ced
|
F ext/fts5/test/fts5ab.test 4bdb619fee409e11417e8827e320b857e42e926a01a0408fc9f143ec870a6ced
|
||||||
F ext/fts5/test/fts5ac.test 4a73626de86f3d17c95738034880c4f0de8d54741fb943d819b528373657e59b
|
F ext/fts5/test/fts5ac.test 4a73626de86f3d17c95738034880c4f0de8d54741fb943d819b528373657e59b
|
||||||
F ext/fts5/test/fts5ad.test 058e616612964e61d19f70295f0e6eaedceb4b29b1fbf4f859615ef7e779dc22
|
F ext/fts5/test/fts5ad.test 058e616612964e61d19f70295f0e6eaedceb4b29b1fbf4f859615ef7e779dc22
|
||||||
@@ -160,14 +160,14 @@ F ext/fts5/test/fts5contentless2.test 70ffe6c611d8f278240da56734df8a77948f04e273
|
|||||||
F ext/fts5/test/fts5contentless3.test 75eaae5ad6b284ee447788943974d323228f27cc35a1681da997135cff95bc6a
|
F ext/fts5/test/fts5contentless3.test 75eaae5ad6b284ee447788943974d323228f27cc35a1681da997135cff95bc6a
|
||||||
F ext/fts5/test/fts5contentless4.test ec34dc69ef474ca9997dae6d91e072906e0e9a5a4b05ea89964c863833b6eff8
|
F ext/fts5/test/fts5contentless4.test ec34dc69ef474ca9997dae6d91e072906e0e9a5a4b05ea89964c863833b6eff8
|
||||||
F ext/fts5/test/fts5contentless5.test 38cd0392c730dc7090c550321ce3c24ba4c392bc97308b51a4180e9959dca7b5
|
F ext/fts5/test/fts5contentless5.test 38cd0392c730dc7090c550321ce3c24ba4c392bc97308b51a4180e9959dca7b5
|
||||||
F ext/fts5/test/fts5corrupt.test 6485f721b88ba355ca5d701e7ee87a4efa3ea578d8e6adb26f51ef956c8328bd
|
F ext/fts5/test/fts5corrupt.test 237fce1c3261bb3a5bec333b0f0dbf5b105ec32627ef14cccbda3cfe13833193
|
||||||
F ext/fts5/test/fts5corrupt2.test 335911e3f68b9625d850325f9e29a128db3f4276a8c9d4e32134580da8f924c4
|
F ext/fts5/test/fts5corrupt2.test 4a03a158c2cb617c9f76d26b35c1ef2534124bc0bbddcea38dfd5b170ebea27b
|
||||||
F ext/fts5/test/fts5corrupt3.test 3420ad30bf9e9bbdbd43b3224c582431744899530a65b11b60ddacdf14200e19
|
F ext/fts5/test/fts5corrupt3.test e4852b2472dd25556431fd48fe88e4d0c8cf3e18e010c5ea308345e1cdf97bd5
|
||||||
F ext/fts5/test/fts5corrupt4.test dc08d19f5b8943e95a7778a7d8da592042504faf18dd93f68f7d7a0d7d7dd733
|
F ext/fts5/test/fts5corrupt4.test dc08d19f5b8943e95a7778a7d8da592042504faf18dd93f68f7d7a0d7d7dd733
|
||||||
F ext/fts5/test/fts5corrupt5.test bcf0801b0c991eadae3cb8e978e82b4bf01412cb4df41874a90d5aa279c7cc96
|
F ext/fts5/test/fts5corrupt5.test 73985d4fe6d8f0d5d5c7bcf79ae7c6522c376cd6ad710a0ff2f26e0c2e222abe
|
||||||
F ext/fts5/test/fts5corrupt6.test 2d72db743db7b5d9c9a6d0cfef24d799ed1aa5e8192b66c40e871a37ed9eed06
|
F ext/fts5/test/fts5corrupt6.test 2d72db743db7b5d9c9a6d0cfef24d799ed1aa5e8192b66c40e871a37ed9eed06
|
||||||
F ext/fts5/test/fts5corrupt7.test 4e830875c33b9ea3c4cf1ba71e692b63893cbb4faae8c69b1071889dc26e211c
|
F ext/fts5/test/fts5corrupt7.test 814aab492d7a09abb5bfdd81cc66fc206d7f3868f9a3bae91876e02efc466fb3
|
||||||
F ext/fts5/test/fts5corrupt8.test b81d802e41631e98100f49a1aadeeffef860e30a62d6ed7d743c2797c477239e
|
F ext/fts5/test/fts5corrupt8.test 7618b102b9b3a5a3494271f4975ab5837e2fb3f61f5adfcdeeb31772c859e6df
|
||||||
F ext/fts5/test/fts5delete.test 2a5008f8b1174ef41d1974e606928c20e4f9da77d9f8347aed818994d89cced4
|
F ext/fts5/test/fts5delete.test 2a5008f8b1174ef41d1974e606928c20e4f9da77d9f8347aed818994d89cced4
|
||||||
F ext/fts5/test/fts5detail.test 54015e9c43ec4ba542cfb93268abdf280e0300f350efd08ee411284b03595cc4
|
F ext/fts5/test/fts5detail.test 54015e9c43ec4ba542cfb93268abdf280e0300f350efd08ee411284b03595cc4
|
||||||
F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11
|
F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11
|
||||||
@@ -229,7 +229,7 @@ F ext/fts5/test/fts5prefix.test c0b7842f1a2d830c0b146cd438a95ea4c5a25635719ed0d9
|
|||||||
F ext/fts5/test/fts5prefix2.test a5bb43b8a2687efafa7ac4e5ccff6812015cf8cf18e3086bb0eb3126f30fbbf6
|
F ext/fts5/test/fts5prefix2.test a5bb43b8a2687efafa7ac4e5ccff6812015cf8cf18e3086bb0eb3126f30fbbf6
|
||||||
F ext/fts5/test/fts5query.test 0320a7a4b58a6e3e50ec8910b301649da90ace675001f9e0bf6392750ad4591d
|
F ext/fts5/test/fts5query.test 0320a7a4b58a6e3e50ec8910b301649da90ace675001f9e0bf6392750ad4591d
|
||||||
F ext/fts5/test/fts5rank.test 47c1e8e5d84754ff18e012fdd629776088b5a15de41bdd24957581cf084d8a00
|
F ext/fts5/test/fts5rank.test 47c1e8e5d84754ff18e012fdd629776088b5a15de41bdd24957581cf084d8a00
|
||||||
F ext/fts5/test/fts5rebuild.test 83e72d77636378833233fadc7cb7517a2fa446ea7d1f94dd526ba3e7e104b9f5
|
F ext/fts5/test/fts5rebuild.test dc09779fbbe151ab68206a0931c10a611912a7a12c7a85d71c5e48453f2375a5
|
||||||
F ext/fts5/test/fts5restart.test 9af2084b8e065130037b95f05f3f220bb7973903a7701e2c5fb916dff7cf80c5
|
F ext/fts5/test/fts5restart.test 9af2084b8e065130037b95f05f3f220bb7973903a7701e2c5fb916dff7cf80c5
|
||||||
F ext/fts5/test/fts5rowid.test 8632829fec04996832a4cfb4f0bd89721ba65b7e398c1731741bdb63f070e1a3
|
F ext/fts5/test/fts5rowid.test 8632829fec04996832a4cfb4f0bd89721ba65b7e398c1731741bdb63f070e1a3
|
||||||
F ext/fts5/test/fts5savepoint.test 1447758d7900afe903cef08b4524c5331fb60c1126ae6fba7f4d8704268013c5
|
F ext/fts5/test/fts5savepoint.test 1447758d7900afe903cef08b4524c5331fb60c1126ae6fba7f4d8704268013c5
|
||||||
@@ -2208,8 +2208,8 @@ 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 cf61cd359e666c66b6bba4407a653c799f7f07e1f5ee6b837ad467029c461a6a
|
P 72a81d247bc74a21d077d311969ac585d0f26bffbd210ec60f03c38bf138790e
|
||||||
R cbcb5d211cfd95577fe766819842e2f0
|
R 8005785ee7a277c0bee6af972fca198c
|
||||||
U drh
|
U dan
|
||||||
Z a38ea3896b09b90d9dc6b4c357b430c4
|
Z 2f2e74f7d25f28ab4247f802934dfc04
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@@ -1 +1 @@
|
|||||||
72a81d247bc74a21d077d311969ac585d0f26bffbd210ec60f03c38bf138790e
|
48044a6b57c0a16cb75139c103ad88ca4ab64d74f70a3dee0d8b817fbfbec3c6
|
||||||
|
Reference in New Issue
Block a user