@@ -5198,80 +5198,79 @@ static void fts5DoSecureDelete(
51985198 }
51995199 }
52005200 }else if ( iStart == 4 ){
5201- int iPgno ;
5202-
5203- assert_nc ( pSeg -> iLeafPgno > pSeg -> iTermLeafPgno );
5204- /* The entry being removed may be the only position list in
5205- ** its doclist. */
5206- for (iPgno = pSeg -> iLeafPgno - 1 ; iPgno > pSeg -> iTermLeafPgno ; iPgno -- ){
5207- Fts5Data * pPg = fts5DataRead (p , FTS5_SEGMENT_ROWID (iSegid , iPgno ));
5208- int bEmpty = (pPg && pPg -> nn == 4 );
5209- fts5DataRelease (pPg );
5210- if ( bEmpty == 0 ) break ;
5211- }
5212-
5213- if ( iPgno == pSeg -> iTermLeafPgno ){
5214- i64 iId = FTS5_SEGMENT_ROWID (iSegid , pSeg -> iTermLeafPgno );
5215- Fts5Data * pTerm = fts5DataRead (p , iId );
5216- if ( pTerm && pTerm -> szLeaf == pSeg -> iTermLeafOffset ){
5217- u8 * aTermIdx = & pTerm -> p [pTerm -> szLeaf ];
5218- int nTermIdx = pTerm -> nn - pTerm -> szLeaf ;
5219- int iTermIdx = 0 ;
5220- int iTermOff = 0 ;
5221-
5222- while ( 1 ){
5223- u32 iVal = 0 ;
5224- int nByte = fts5GetVarint32 (& aTermIdx [iTermIdx ], iVal );
5225- iTermOff += iVal ;
5226- if ( (iTermIdx + nByte )>=nTermIdx ) break ;
5227- iTermIdx += nByte ;
5228- }
5229- nTermIdx = iTermIdx ;
5201+ int iPgno ;
5202+
5203+ assert_nc ( pSeg -> iLeafPgno > pSeg -> iTermLeafPgno );
5204+ /* The entry being removed may be the only position list in
5205+ ** its doclist. */
5206+ for (iPgno = pSeg -> iLeafPgno - 1 ; iPgno > pSeg -> iTermLeafPgno ; iPgno -- ){
5207+ Fts5Data * pPg = fts5DataRead (p , FTS5_SEGMENT_ROWID (iSegid , iPgno ));
5208+ int bEmpty = (pPg && pPg -> nn == 4 );
5209+ fts5DataRelease (pPg );
5210+ if ( bEmpty == 0 ) break ;
5211+ }
5212+
5213+ if ( iPgno == pSeg -> iTermLeafPgno ){
5214+ i64 iId = FTS5_SEGMENT_ROWID (iSegid , pSeg -> iTermLeafPgno );
5215+ Fts5Data * pTerm = fts5DataRead (p , iId );
5216+ if ( pTerm && pTerm -> szLeaf == pSeg -> iTermLeafOffset ){
5217+ u8 * aTermIdx = & pTerm -> p [pTerm -> szLeaf ];
5218+ int nTermIdx = pTerm -> nn - pTerm -> szLeaf ;
5219+ int iTermIdx = 0 ;
5220+ int iTermOff = 0 ;
5221+
5222+ while ( 1 ){
5223+ u32 iVal = 0 ;
5224+ int nByte = fts5GetVarint32 (& aTermIdx [iTermIdx ], iVal );
5225+ iTermOff += iVal ;
5226+ if ( (iTermIdx + nByte )>=nTermIdx ) break ;
5227+ iTermIdx += nByte ;
5228+ }
5229+ nTermIdx = iTermIdx ;
52305230
5231- memmove (& pTerm -> p [iTermOff ], & pTerm -> p [pTerm -> szLeaf ], nTermIdx );
5232- fts5PutU16 (& pTerm -> p [2 ], iTermOff );
5231+ memmove (& pTerm -> p [iTermOff ], & pTerm -> p [pTerm -> szLeaf ], nTermIdx );
5232+ fts5PutU16 (& pTerm -> p [2 ], iTermOff );
52335233
5234- fts5DataWrite (p , iId , pTerm -> p , iTermOff + nTermIdx );
5235- if ( nTermIdx == 0 ){
5236- fts5SecureDeleteIdxEntry (p , iSegid , pSeg -> iTermLeafPgno );
5237- }
5234+ fts5DataWrite (p , iId , pTerm -> p , iTermOff + nTermIdx );
5235+ if ( nTermIdx == 0 ){
5236+ fts5SecureDeleteIdxEntry (p , iSegid , pSeg -> iTermLeafPgno );
52385237 }
5239- fts5DataRelease (pTerm );
52405238 }
5239+ fts5DataRelease (pTerm );
52415240 }
5241+ }
52425242
5243- if ( p -> rc == SQLITE_OK ){
5244- const int nMove = nPg - iNextOff ;
5245- int nShift = 0 ;
5246-
5247- memmove (& aPg [iOff ], & aPg [iNextOff ], nMove );
5248- iPgIdx -= (iNextOff - iOff );
5249- nPg = iPgIdx ;
5250- fts5PutU16 (& aPg [2 ], iPgIdx );
5251-
5252- nShift = iNextOff - iOff ;
5253- for (iIdx = 0 , iKeyOff = 0 , iPrevKeyOff = 0 ; iIdx < nIdx ; /* no-op */ ){
5254- u32 iVal = 0 ;
5255- iIdx += fts5GetVarint32 (& aIdx [iIdx ], iVal );
5256- iKeyOff += iVal ;
5257- if ( iKeyOff != iDelKeyOff ){
5258- if ( iKeyOff > iOff ){
5259- iKeyOff -= nShift ;
5260- nShift = 0 ;
5261- }
5262- nPg += sqlite3Fts5PutVarint (& aPg [nPg ], iKeyOff - iPrevKeyOff );
5263- iPrevKeyOff = iKeyOff ;
5264- }
5265- }
5243+ if ( p -> rc == SQLITE_OK ){
5244+ const int nMove = nPg - iNextOff ; /* Number of bytes to move */
5245+ int nShift = iNextOff - iOff ; /* Distance to move them */
5246+
5247+ int iPrevKeyOut = 0 ;
5248+ int iKeyIn = 0 ;
52665249
5267- if ( iPgIdx == nPg && nIdx > 0 && pSeg -> iLeafPgno != 1 ){
5268- fts5SecureDeleteIdxEntry (p , iSegid , pSeg -> iLeafPgno );
5250+ memmove (& aPg [iOff ], & aPg [iNextOff ], nMove );
5251+ iPgIdx -= nShift ;
5252+ nPg = iPgIdx ;
5253+ fts5PutU16 (& aPg [2 ], iPgIdx );
5254+
5255+ for (iIdx = 0 ; iIdx < nIdx ; /* no-op */ ){
5256+ u32 iVal = 0 ;
5257+ iIdx += fts5GetVarint32 (& aIdx [iIdx ], iVal );
5258+ iKeyIn += iVal ;
5259+ if ( iKeyIn != iDelKeyOff ){
5260+ int iKeyOut = (iKeyIn - (iKeyIn > iOff ? nShift : 0 ));
5261+ nPg += sqlite3Fts5PutVarint (& aPg [nPg ], iKeyOut - iPrevKeyOut );
5262+ iPrevKeyOut = iKeyOut ;
52695263 }
5264+ }
52705265
5271- assert_nc ( nPg > 4 || fts5GetU16 ( aPg ) == 0 );
5272- fts5DataWrite (p , FTS5_SEGMENT_ROWID ( iSegid ,pSeg -> iLeafPgno ), aPg , nPg );
5266+ if ( iPgIdx == nPg && nIdx > 0 && pSeg -> iLeafPgno != 1 ){
5267+ fts5SecureDeleteIdxEntry (p , iSegid , pSeg -> iLeafPgno );
52735268 }
5274- sqlite3_free (aIdx );
5269+
5270+ assert_nc ( nPg > 4 || fts5GetU16 (aPg )== 0 );
5271+ fts5DataWrite (p , FTS5_SEGMENT_ROWID (iSegid ,pSeg -> iLeafPgno ), aPg , nPg );
5272+ }
5273+ sqlite3_free (aIdx );
52755274}
52765275
52775276/*
0 commit comments