diff options
author | dan <Dan Kennedy> | 2025-05-22 18:04:48 +0000 |
---|---|---|
committer | dan <Dan Kennedy> | 2025-05-22 18:04:48 +0000 |
commit | 96e16194b8c6eda98e7b1a33f042233da7b7c64a (patch) | |
tree | 9ea2293cc465ed9fb7b397bfeb7c7e84fc0d40b3 /ext/session/sqlite3session.c | |
parent | 4a0b7a332f3aeb27814cfa12dc0ebdbbd994a928 (diff) | |
download | sqlite-96e16194b8c6eda98e7b1a33f042233da7b7c64a.tar.gz sqlite-96e16194b8c6eda98e7b1a33f042233da7b7c64a.zip |
Fix a problem with using streaming iterators with sqlite3changegroup_add_change().
FossilOrigin-Name: 3dbde727146d28c316df47c7b5116be7f2476a0a0c893207c2a4ca3ab285cb5e
Diffstat (limited to 'ext/session/sqlite3session.c')
-rw-r--r-- | ext/session/sqlite3session.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index a8dd1d9be..175cacbe8 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -3396,14 +3396,15 @@ int sqlite3changeset_start_v2_strm( ** object and the buffer is full, discard some data to free up space. */ static void sessionDiscardData(SessionInput *pIn){ - if( pIn->xInput && pIn->iNext>=sessions_strm_chunk_size ){ - int nMove = pIn->buf.nBuf - pIn->iNext; + if( pIn->xInput && pIn->iCurrent>=sessions_strm_chunk_size ){ + int nMove = pIn->buf.nBuf - pIn->iCurrent; assert( nMove>=0 ); if( nMove>0 ){ - memmove(pIn->buf.aBuf, &pIn->buf.aBuf[pIn->iNext], nMove); + memmove(pIn->buf.aBuf, &pIn->buf.aBuf[pIn->iCurrent], nMove); } - pIn->buf.nBuf -= pIn->iNext; - pIn->iNext = 0; + pIn->buf.nBuf -= pIn->iCurrent; + pIn->iNext -= pIn->iCurrent; + pIn->iCurrent = 0; pIn->nData = pIn->buf.nBuf; } } @@ -3757,8 +3758,8 @@ static int sessionChangesetNextOne( p->rc = sessionInputBuffer(&p->in, 2); if( p->rc!=SQLITE_OK ) return p->rc; - sessionDiscardData(&p->in); p->in.iCurrent = p->in.iNext; + sessionDiscardData(&p->in); /* If the iterator is already at the end of the changeset, return DONE. */ if( p->in.iNext>=p->in.nData ){ @@ -6117,14 +6118,19 @@ int sqlite3changegroup_add_change( sqlite3_changegroup *pGrp, sqlite3_changeset_iter *pIter ){ + int rc = SQLITE_OK; + if( pIter->in.iCurrent==pIter->in.iNext || pIter->rc!=SQLITE_OK || pIter->bInvert ){ /* Iterator does not point to any valid entry or is an INVERT iterator. */ - return SQLITE_ERROR; + rc = SQLITE_ERROR; + }else{ + pIter->in.bNoDiscard = 1; + rc = sessionOneChangeToHash(pGrp, pIter, 0); } - return sessionOneChangeToHash(pGrp, pIter, 0); + return rc; } /* |