1
0
Fork 0
mirror of https://github.com/DBD-SQLite/DBD-SQLite synced 2025-06-08 22:58:17 -04:00

updated SQLite to 3.8.8.3

This commit is contained in:
Kenichi Ishigaki 2015-03-18 11:36:58 +09:00
parent cdad8c0034
commit 092d92dd24
2 changed files with 97 additions and 93 deletions

186
sqlite3.c
View file

@ -1,6 +1,6 @@
/****************************************************************************** /******************************************************************************
** This file is an amalgamation of many separate C source files from SQLite ** This file is an amalgamation of many separate C source files from SQLite
** version 3.8.8.2. By combining all the individual C code files into this ** version 3.8.8.3. By combining all the individual C code files into this
** single large file, the entire code can be compiled as a single translation ** single large file, the entire code can be compiled as a single translation
** unit. This allows many compilers to do optimizations that would not be ** unit. This allows many compilers to do optimizations that would not be
** possible if the files were compiled separately. Performance improvements ** possible if the files were compiled separately. Performance improvements
@ -278,9 +278,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()]. ** [sqlite_version()] and [sqlite_source_id()].
*/ */
#define SQLITE_VERSION "3.8.8.2" #define SQLITE_VERSION "3.8.8.3"
#define SQLITE_VERSION_NUMBER 3008008 #define SQLITE_VERSION_NUMBER 3008008
#define SQLITE_SOURCE_ID "2015-01-30 14:30:45 7757fc721220e136620a89c9d28247f28bbbc098" #define SQLITE_SOURCE_ID "2015-02-25 13:29:11 9d6c1880fb75660bbabd693175579529785f8a6b"
/* /*
** CAPI3REF: Run-Time Library Version Numbers ** CAPI3REF: Run-Time Library Version Numbers
@ -116551,6 +116551,7 @@ static void constructAutomaticIndex(
for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){ for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){
if( pLoop->prereq==0 if( pLoop->prereq==0
&& (pTerm->wtFlags & TERM_VIRTUAL)==0 && (pTerm->wtFlags & TERM_VIRTUAL)==0
&& !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
&& sqlite3ExprIsTableConstant(pTerm->pExpr, pSrc->iCursor) ){ && sqlite3ExprIsTableConstant(pTerm->pExpr, pSrc->iCursor) ){
pPartial = sqlite3ExprAnd(pParse->db, pPartial, pPartial = sqlite3ExprAnd(pParse->db, pPartial,
sqlite3ExprDup(pParse->db, pTerm->pExpr, 0)); sqlite3ExprDup(pParse->db, pTerm->pExpr, 0));
@ -119631,7 +119632,11 @@ static int whereUsablePartialIndex(int iTab, WhereClause *pWC, Expr *pWhere){
int i; int i;
WhereTerm *pTerm; WhereTerm *pTerm;
for(i=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){ for(i=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
if( sqlite3ExprImpliesExpr(pTerm->pExpr, pWhere, iTab) ) return 1; if( sqlite3ExprImpliesExpr(pTerm->pExpr, pWhere, iTab)
&& !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
){
return 1;
}
} }
return 0; return 0;
} }
@ -131387,6 +131392,11 @@ struct Fts3Phrase {
int bIncr; /* True if doclist is loaded incrementally */ int bIncr; /* True if doclist is loaded incrementally */
int iDoclistToken; int iDoclistToken;
/* Used by sqlite3Fts3EvalPhrasePoslist() if this is a descendent of an
** OR condition. */
char *pOrPoslist;
i64 iOrDocid;
/* Variables below this point are populated by fts3_expr.c when parsing /* Variables below this point are populated by fts3_expr.c when parsing
** a MATCH expression. Everything above is part of the evaluation phase. ** a MATCH expression. Everything above is part of the evaluation phase.
*/ */
@ -136337,6 +136347,22 @@ static void fts3EvalNextRow(
} }
pExpr->iDocid = pLeft->iDocid; pExpr->iDocid = pLeft->iDocid;
pExpr->bEof = (pLeft->bEof || pRight->bEof); pExpr->bEof = (pLeft->bEof || pRight->bEof);
if( pExpr->eType==FTSQUERY_NEAR && pExpr->bEof ){
if( pRight->pPhrase && pRight->pPhrase->doclist.aAll ){
Fts3Doclist *pDl = &pRight->pPhrase->doclist;
while( *pRc==SQLITE_OK && pRight->bEof==0 ){
memset(pDl->pList, 0, pDl->nList);
fts3EvalNextRow(pCsr, pRight, pRc);
}
}
if( pLeft->pPhrase && pLeft->pPhrase->doclist.aAll ){
Fts3Doclist *pDl = &pLeft->pPhrase->doclist;
while( *pRc==SQLITE_OK && pLeft->bEof==0 ){
memset(pDl->pList, 0, pDl->nList);
fts3EvalNextRow(pCsr, pLeft, pRc);
}
}
}
} }
break; break;
} }
@ -136709,6 +136735,7 @@ static void fts3EvalRestart(
} }
pPhrase->doclist.pNextDocid = 0; pPhrase->doclist.pNextDocid = 0;
pPhrase->doclist.iDocid = 0; pPhrase->doclist.iDocid = 0;
pPhrase->pOrPoslist = 0;
} }
pExpr->iDocid = 0; pExpr->iDocid = 0;
@ -136954,6 +136981,7 @@ SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist(
iDocid = pExpr->iDocid; iDocid = pExpr->iDocid;
pIter = pPhrase->doclist.pList; pIter = pPhrase->doclist.pList;
if( iDocid!=pCsr->iPrevId || pExpr->bEof ){ if( iDocid!=pCsr->iPrevId || pExpr->bEof ){
int rc = SQLITE_OK;
int bDescDoclist = pTab->bDescIdx; /* For DOCID_CMP macro */ int bDescDoclist = pTab->bDescIdx; /* For DOCID_CMP macro */
int iMul; /* +1 if csr dir matches index dir, else -1 */ int iMul; /* +1 if csr dir matches index dir, else -1 */
int bOr = 0; int bOr = 0;
@ -136979,72 +137007,43 @@ SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist(
** an incremental phrase. Load the entire doclist for the phrase ** an incremental phrase. Load the entire doclist for the phrase
** into memory in this case. */ ** into memory in this case. */
if( pPhrase->bIncr ){ if( pPhrase->bIncr ){
int rc = SQLITE_OK; int bEofSave = pNear->bEof;
int bEofSave = pExpr->bEof; fts3EvalRestart(pCsr, pNear, &rc);
fts3EvalRestart(pCsr, pExpr, &rc); while( rc==SQLITE_OK && !pNear->bEof ){
while( rc==SQLITE_OK && !pExpr->bEof ){ fts3EvalNextRow(pCsr, pNear, &rc);
fts3EvalNextRow(pCsr, pExpr, &rc); if( bEofSave==0 && pNear->iDocid==iDocid ) break;
if( bEofSave==0 && pExpr->iDocid==iDocid ) break;
} }
pIter = pPhrase->doclist.pList;
assert( rc!=SQLITE_OK || pPhrase->bIncr==0 ); assert( rc!=SQLITE_OK || pPhrase->bIncr==0 );
if( rc!=SQLITE_OK ) return rc;
} }
if( bTreeEof ){
iMul = ((pCsr->bDesc==bDescDoclist) ? 1 : -1); while( rc==SQLITE_OK && !pNear->bEof ){
while( bTreeEof==1 fts3EvalNextRow(pCsr, pNear, &rc);
&& pNear->bEof==0
&& (DOCID_CMP(pNear->iDocid, pCsr->iPrevId) * iMul)<0
){
int rc = SQLITE_OK;
fts3EvalNextRow(pCsr, pExpr, &rc);
if( rc!=SQLITE_OK ) return rc;
iDocid = pExpr->iDocid;
pIter = pPhrase->doclist.pList;
}
bEof = (pPhrase->doclist.nAll==0);
assert( bDescDoclist==0 || bDescDoclist==1 );
assert( pCsr->bDesc==0 || pCsr->bDesc==1 );
if( bEof==0 ){
if( pCsr->bDesc==bDescDoclist ){
int dummy;
if( pNear->bEof ){
/* This expression is already at EOF. So position it to point to the
** last entry in the doclist at pPhrase->doclist.aAll[]. Variable
** iDocid is already set for this entry, so all that is required is
** to set pIter to point to the first byte of the last position-list
** in the doclist.
**
** It would also be correct to set pIter and iDocid to zero. In
** this case, the first call to sqltie3Fts4DoclistPrev() below
** would also move the iterator to point to the last entry in the
** doclist. However, this is expensive, as to do so it has to
** iterate through the entire doclist from start to finish (since
** it does not know the docid for the last entry). */
pIter = &pPhrase->doclist.aAll[pPhrase->doclist.nAll-1];
fts3ReversePoslist(pPhrase->doclist.aAll, &pIter);
}
while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)>0 ) && bEof==0 ){
sqlite3Fts3DoclistPrev(
bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll,
&pIter, &iDocid, &dummy, &bEof
);
}
}else{
if( pNear->bEof ){
pIter = 0;
iDocid = 0;
}
while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)<0 ) && bEof==0 ){
sqlite3Fts3DoclistNext(
bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll,
&pIter, &iDocid, &bEof
);
}
} }
} }
if( rc!=SQLITE_OK ) return rc;
pIter = pPhrase->pOrPoslist;
iDocid = pPhrase->iOrDocid;
if( pCsr->bDesc==bDescDoclist ){
bEof = (pIter >= (pPhrase->doclist.aAll + pPhrase->doclist.nAll));
while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)<0 ) && bEof==0 ){
sqlite3Fts3DoclistNext(
bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll,
&pIter, &iDocid, &bEof
);
}
}else{
bEof = !pPhrase->doclist.nAll || (pIter && pIter<=pPhrase->doclist.aAll);
while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)>0 ) && bEof==0 ){
int dummy;
sqlite3Fts3DoclistPrev(
bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll,
&pIter, &iDocid, &dummy, &bEof
);
}
}
pPhrase->pOrPoslist = pIter;
pPhrase->iOrDocid = iDocid;
if( bEof || iDocid!=pCsr->iPrevId ) pIter = 0; if( bEof || iDocid!=pCsr->iPrevId ) pIter = 0;
} }
@ -137058,10 +137057,13 @@ SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist(
} }
while( iThis<iCol ){ while( iThis<iCol ){
fts3ColumnlistCopy(0, &pIter); fts3ColumnlistCopy(0, &pIter);
if( *pIter==0x00 ) return 0; if( *pIter==0x00 ) return SQLITE_OK;
pIter++; pIter++;
pIter += fts3GetVarint32(pIter, &iThis); pIter += fts3GetVarint32(pIter, &iThis);
} }
if( *pIter==0x00 ){
pIter = 0;
}
*ppOut = ((iCol==iThis)?pIter:0); *ppOut = ((iCol==iThis)?pIter:0);
return SQLITE_OK; return SQLITE_OK;
@ -147288,37 +147290,39 @@ static int fts3BestSnippet(
sIter.nSnippet = nSnippet; sIter.nSnippet = nSnippet;
sIter.nPhrase = nList; sIter.nPhrase = nList;
sIter.iCurrent = -1; sIter.iCurrent = -1;
(void)fts3ExprIterate(pCsr->pExpr, fts3SnippetFindPositions, (void *)&sIter); rc = fts3ExprIterate(pCsr->pExpr, fts3SnippetFindPositions, (void *)&sIter);
if( rc==SQLITE_OK ){
/* Set the *pmSeen output variable. */ /* Set the *pmSeen output variable. */
for(i=0; i<nList; i++){ for(i=0; i<nList; i++){
if( sIter.aPhrase[i].pHead ){ if( sIter.aPhrase[i].pHead ){
*pmSeen |= (u64)1 << i; *pmSeen |= (u64)1 << i;
}
} }
}
/* Loop through all candidate snippets. Store the best snippet in /* Loop through all candidate snippets. Store the best snippet in
** *pFragment. Store its associated 'score' in iBestScore. ** *pFragment. Store its associated 'score' in iBestScore.
*/ */
pFragment->iCol = iCol; pFragment->iCol = iCol;
while( !fts3SnippetNextCandidate(&sIter) ){ while( !fts3SnippetNextCandidate(&sIter) ){
int iPos; int iPos;
int iScore; int iScore;
u64 mCover; u64 mCover;
u64 mHighlight; u64 mHighlite;
fts3SnippetDetails(&sIter, mCovered, &iPos, &iScore, &mCover, &mHighlight); fts3SnippetDetails(&sIter, mCovered, &iPos, &iScore, &mCover,&mHighlite);
assert( iScore>=0 ); assert( iScore>=0 );
if( iScore>iBestScore ){ if( iScore>iBestScore ){
pFragment->iPos = iPos; pFragment->iPos = iPos;
pFragment->hlmask = mHighlight; pFragment->hlmask = mHighlite;
pFragment->covered = mCover; pFragment->covered = mCover;
iBestScore = iScore; iBestScore = iScore;
}
} }
}
*piScore = iBestScore;
}
sqlite3_free(sIter.aPhrase); sqlite3_free(sIter.aPhrase);
*piScore = iBestScore; return rc;
return SQLITE_OK;
} }

View file

@ -107,9 +107,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()]. ** [sqlite_version()] and [sqlite_source_id()].
*/ */
#define SQLITE_VERSION "3.8.8.2" #define SQLITE_VERSION "3.8.8.3"
#define SQLITE_VERSION_NUMBER 3008008 #define SQLITE_VERSION_NUMBER 3008008
#define SQLITE_SOURCE_ID "2015-01-30 14:30:45 7757fc721220e136620a89c9d28247f28bbbc098" #define SQLITE_SOURCE_ID "2015-02-25 13:29:11 9d6c1880fb75660bbabd693175579529785f8a6b"
/* /*
** CAPI3REF: Run-Time Library Version Numbers ** CAPI3REF: Run-Time Library Version Numbers