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:
parent
cdad8c0034
commit
092d92dd24
2 changed files with 97 additions and 93 deletions
130
sqlite3.c
130
sqlite3.c
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if( rc!=SQLITE_OK ) return rc;
|
||||||
|
|
||||||
bEof = (pPhrase->doclist.nAll==0);
|
pIter = pPhrase->pOrPoslist;
|
||||||
assert( bDescDoclist==0 || bDescDoclist==1 );
|
iDocid = pPhrase->iOrDocid;
|
||||||
assert( pCsr->bDesc==0 || pCsr->bDesc==1 );
|
|
||||||
|
|
||||||
if( bEof==0 ){
|
|
||||||
if( pCsr->bDesc==bDescDoclist ){
|
if( pCsr->bDesc==bDescDoclist ){
|
||||||
int dummy;
|
bEof = (pIter >= (pPhrase->doclist.aAll + pPhrase->doclist.nAll));
|
||||||
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 ){
|
while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)<0 ) && bEof==0 ){
|
||||||
sqlite3Fts3DoclistNext(
|
sqlite3Fts3DoclistNext(
|
||||||
bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll,
|
bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll,
|
||||||
&pIter, &iDocid, &bEof
|
&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,7 +147290,8 @@ 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++){
|
||||||
|
@ -147305,20 +147308,21 @@ static int fts3BestSnippet(
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sqlite3_free(sIter.aPhrase);
|
|
||||||
*piScore = iBestScore;
|
*piScore = iBestScore;
|
||||||
return SQLITE_OK;
|
}
|
||||||
|
sqlite3_free(sIter.aPhrase);
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue