System.Data.SQLite
Check-in [5f6b2d34a1]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Update SQLite core library to the 3.8.8.3 release.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 5f6b2d34a1710535c02efb24942711f9820393ac
User & Date: mistachkin 2015-02-26 20:34:02
Context
2015-02-28
05:14
Add connection string property documentation for PrepareRetries. check-in: b90035f692 user: mistachkin tags: trunk
2015-02-26
20:34
Update SQLite core library to the 3.8.8.3 release. check-in: 5f6b2d34a1 user: mistachkin tags: trunk
2015-02-24
18:30
Update the estimated release date for 1.0.95.0. check-in: 2c806f38a5 user: mistachkin tags: trunk
Changes
Hide Diffs Side-by-Side Diffs Ignore Whitespace Patch

Changes to Doc/Extra/Provider/version.html.

    41     41         </table>
    42     42       </div>
    43     43       <div id="mainSection">
    44     44       <div id="mainBody">
    45     45       <h1 class="heading">Version History</h1>
    46     46       <p><b>1.0.95.0 - March XX, 2015 <font color="red">(release scheduled)</font></b></p>
    47     47       <ul>
    48         -      <li>Updated to <a href="https://www.sqlite.org/releaselog/3_8_8_2.html">SQLite 3.8.8.2</a>.</li>
           48  +      <li>Updated to <a href="https://www.sqlite.org/releaselog/3_8_8_3.html">SQLite 3.8.8.3</a>.</li>
    49     49         <li>Updated to <a href="https://www.nuget.org/packages/EntityFramework/6.1.2">Entity Framework 6.1.2</a>.</li>
    50     50         <li>Modify configuration file transforms performed by the NuGet packages to allow Entity Framework 6 design-time integration to work automatically. Fix for <a href="https://system.data.sqlite.org/index.html/info/2be4298631">[2be4298631]</a>, <a href="https://system.data.sqlite.org/index.html/info/abad7c577d">[abad7c577d]</a>, and <a href="https://system.data.sqlite.org/index.html/info/417d669435">[417d669435]</a>.</li>
    51     51         <li>The &quot;System.Data.SQLite.EF6*&quot; and &quot;System.Data.SQLite.Linq*&quot; NuGet packages no longer depend on the &quot;System.Data.SQLite.Core*&quot; packages.&nbsp;<b>** Potentially Incompatible Change **</b></li>
    52     52         <li>The &quot;System.Data.SQLite.MSIL*&quot; NuGet packages no longer directly include any files; they are now meta-packages.&nbsp;<b>** Potentially Incompatible Change **</b></li>
    53     53         <li>The &quot;System.Data.SQLite.x86*&quot; and &quot;System.Data.SQLite.x64*&quot; NuGet packages now depend on the &quot;System.Data.SQLite.Linq&quot; and &quot;System.Data.SQLite.EF6&quot; NuGet packages.&nbsp;<b>** Potentially Incompatible Change **</b></li>
    54     54         <li>Make sure SQL statements generated for DbUpdateCommandTree objects are properly delimited.</li>
    55     55         <li>Make sure SQLiteIndexOutputs.ConstraintUsages instances are created prior to calling ISQLiteManagedModule.BestIndex. Fix for <a href="https://system.data.sqlite.org/index.html/info/56f511d268">[56f511d268]</a>.</li>

Changes to SQLite.Interop/props/sqlite3.props.

     5      5    *
     6      6    * Written by Joe Mistachkin.
     7      7    * Released to the public domain, use at your own risk!
     8      8    *
     9      9   -->
    10     10   <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
    11     11     <PropertyGroup Label="UserMacros">
    12         -    <SQLITE_MANIFEST_VERSION>3.8.8.2</SQLITE_MANIFEST_VERSION>
    13         -    <SQLITE_RC_VERSION>3,8,8,2</SQLITE_RC_VERSION>
           12  +    <SQLITE_MANIFEST_VERSION>3.8.8.3</SQLITE_MANIFEST_VERSION>
           13  +    <SQLITE_RC_VERSION>3,8,8,3</SQLITE_RC_VERSION>
    14     14       <SQLITE_COMMON_DEFINES>_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;SQLITE_THREADSAFE=1;SQLITE_USE_URI=1;SQLITE_ENABLE_COLUMN_METADATA=1;SQLITE_ENABLE_STAT4=1;SQLITE_ENABLE_FTS3=1;SQLITE_ENABLE_LOAD_EXTENSION=1;SQLITE_ENABLE_RTREE=1;SQLITE_SOUNDEX=1;SQLITE_ENABLE_MEMORY_MANAGEMENT=1</SQLITE_COMMON_DEFINES>
    15     15       <SQLITE_EXTRA_DEFINES>SQLITE_HAS_CODEC=1</SQLITE_EXTRA_DEFINES>
    16     16       <SQLITE_WINCE_200X_DEFINES>SQLITE_OMIT_WAL=1</SQLITE_WINCE_200X_DEFINES>
    17     17       <SQLITE_WINCE_2013_DEFINES>HAVE_ERRNO_H=1;SQLITE_MSVC_LOCALTIME_API=1</SQLITE_WINCE_2013_DEFINES>
    18     18       <SQLITE_DEBUG_DEFINES>SQLITE_DEBUG=1;SQLITE_MEMDEBUG=1;SQLITE_ENABLE_EXPENSIVE_ASSERT=1</SQLITE_DEBUG_DEFINES>
    19     19       <SQLITE_RELEASE_DEFINES>SQLITE_WIN32_MALLOC=1</SQLITE_RELEASE_DEFINES>
    20     20       <SQLITE_DISABLE_WARNINGS>4055;4100;4127;4146;4210;4232;4244;4245;4267;4306;4389;4701;4703;4706</SQLITE_DISABLE_WARNINGS>

Changes to SQLite.Interop/props/sqlite3.vsprops.

    10     10   <VisualStudioPropertySheet
    11     11   	ProjectType="Visual C++"
    12     12   	Version="8.00"
    13     13   	Name="sqlite3"
    14     14   	>
    15     15   	<UserMacro
    16     16   		Name="SQLITE_MANIFEST_VERSION"
    17         -		Value="3.8.8.2"
           17  +		Value="3.8.8.3"
    18     18   		PerformEnvironmentSet="true"
    19     19   	/>
    20     20   	<UserMacro
    21     21   		Name="SQLITE_RC_VERSION"
    22         -		Value="3,8,8,2"
           22  +		Value="3,8,8,3"
    23     23   		PerformEnvironmentSet="true"
    24     24   	/>
    25     25   	<UserMacro
    26     26   		Name="SQLITE_COMMON_DEFINES"
    27     27   		Value="_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;SQLITE_THREADSAFE=1;SQLITE_USE_URI=1;SQLITE_ENABLE_COLUMN_METADATA=1;SQLITE_ENABLE_STAT4=1;SQLITE_ENABLE_FTS3=1;SQLITE_ENABLE_LOAD_EXTENSION=1;SQLITE_ENABLE_RTREE=1;SQLITE_SOUNDEX=1;SQLITE_ENABLE_MEMORY_MANAGEMENT=1"
    28     28   		PerformEnvironmentSet="true"
    29     29   	/>

Changes to SQLite.Interop/src/core/sqlite3.c.

     1      1   /******************************************************************************
     2      2   ** This file is an amalgamation of many separate C source files from SQLite
     3         -** version 3.8.8.2.  By combining all the individual C code files into this 
            3  +** version 3.8.8.3.  By combining all the individual C code files into this 
     4      4   ** single large file, the entire code can be compiled as a single translation
     5      5   ** unit.  This allows many compilers to do optimizations that would not be
     6      6   ** possible if the files were compiled separately.  Performance improvements
     7      7   ** of 5% or more are commonly seen when SQLite is compiled as a single
     8      8   ** translation unit.
     9      9   **
    10     10   ** This file is all you need to compile SQLite.  To use SQLite in other
................................................................................
   274    274   ** string contains the date and time of the check-in (UTC) and an SHA1
   275    275   ** hash of the entire source tree.
   276    276   **
   277    277   ** See also: [sqlite3_libversion()],
   278    278   ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
   279    279   ** [sqlite_version()] and [sqlite_source_id()].
   280    280   */
   281         -#define SQLITE_VERSION        "3.8.8.2"
          281  +#define SQLITE_VERSION        "3.8.8.3"
   282    282   #define SQLITE_VERSION_NUMBER 3008008
   283         -#define SQLITE_SOURCE_ID      "2015-01-30 14:30:45 7757fc721220e136620a89c9d28247f28bbbc098"
          283  +#define SQLITE_SOURCE_ID      "2015-02-25 13:29:11 9d6c1880fb75660bbabd693175579529785f8a6b"
   284    284   
   285    285   /*
   286    286   ** CAPI3REF: Run-Time Library Version Numbers
   287    287   ** KEYWORDS: sqlite3_version, sqlite3_sourceid
   288    288   **
   289    289   ** These interfaces provide the same information as the [SQLITE_VERSION],
   290    290   ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros
................................................................................
116547 116547     pTable = pSrc->pTab;
116548 116548     pWCEnd = &pWC->a[pWC->nTerm];
116549 116549     pLoop = pLevel->pWLoop;
116550 116550     idxCols = 0;
116551 116551     for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){
116552 116552       if( pLoop->prereq==0
116553 116553        && (pTerm->wtFlags & TERM_VIRTUAL)==0
       116554  +     && !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
116554 116555        && sqlite3ExprIsTableConstant(pTerm->pExpr, pSrc->iCursor) ){
116555 116556         pPartial = sqlite3ExprAnd(pParse->db, pPartial,
116556 116557                                   sqlite3ExprDup(pParse->db, pTerm->pExpr, 0));
116557 116558       }
116558 116559       if( termCanDriveIndex(pTerm, pSrc, notReady) ){
116559 116560         int iCol = pTerm->u.leftColumn;
116560 116561         Bitmask cMask = iCol>=BMS ? MASKBIT(BMS-1) : MASKBIT(iCol);
................................................................................
119627 119628   /* Check to see if a partial index with pPartIndexWhere can be used
119628 119629   ** in the current query.  Return true if it can be and false if not.
119629 119630   */
119630 119631   static int whereUsablePartialIndex(int iTab, WhereClause *pWC, Expr *pWhere){
119631 119632     int i;
119632 119633     WhereTerm *pTerm;
119633 119634     for(i=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
119634         -    if( sqlite3ExprImpliesExpr(pTerm->pExpr, pWhere, iTab) ) return 1;
       119635  +    if( sqlite3ExprImpliesExpr(pTerm->pExpr, pWhere, iTab)
       119636  +     && !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
       119637  +    ){
       119638  +      return 1;
       119639  +    }
119635 119640     }
119636 119641     return 0;
119637 119642   }
119638 119643   
119639 119644   /*
119640 119645   ** Add all WhereLoop objects for a single table of the join where the table
119641 119646   ** is idenfied by pBuilder->pNew->iTab.  That table is guaranteed to be
................................................................................
131382 131387   };
131383 131388   
131384 131389   struct Fts3Phrase {
131385 131390     /* Cache of doclist for this phrase. */
131386 131391     Fts3Doclist doclist;
131387 131392     int bIncr;                 /* True if doclist is loaded incrementally */
131388 131393     int iDoclistToken;
       131394  +
       131395  +  /* Used by sqlite3Fts3EvalPhrasePoslist() if this is a descendent of an
       131396  +  ** OR condition.  */
       131397  +  char *pOrPoslist;
       131398  +  i64 iOrDocid;
131389 131399   
131390 131400     /* Variables below this point are populated by fts3_expr.c when parsing 
131391 131401     ** a MATCH expression. Everything above is part of the evaluation phase. 
131392 131402     */
131393 131403     int nToken;                /* Number of tokens in the phrase */
131394 131404     int iColumn;               /* Index of column this phrase must match */
131395 131405     Fts3PhraseToken aToken[1]; /* One entry for each token in the phrase */
................................................................................
136333 136343                 fts3EvalNextRow(pCsr, pLeft, pRc);
136334 136344               }else{
136335 136345                 fts3EvalNextRow(pCsr, pRight, pRc);
136336 136346               }
136337 136347             }
136338 136348             pExpr->iDocid = pLeft->iDocid;
136339 136349             pExpr->bEof = (pLeft->bEof || pRight->bEof);
       136350  +          if( pExpr->eType==FTSQUERY_NEAR && pExpr->bEof ){
       136351  +            if( pRight->pPhrase && pRight->pPhrase->doclist.aAll ){
       136352  +              Fts3Doclist *pDl = &pRight->pPhrase->doclist;
       136353  +              while( *pRc==SQLITE_OK && pRight->bEof==0 ){
       136354  +                memset(pDl->pList, 0, pDl->nList);
       136355  +                fts3EvalNextRow(pCsr, pRight, pRc);
       136356  +              }
       136357  +            }
       136358  +            if( pLeft->pPhrase && pLeft->pPhrase->doclist.aAll ){
       136359  +              Fts3Doclist *pDl = &pLeft->pPhrase->doclist;
       136360  +              while( *pRc==SQLITE_OK && pLeft->bEof==0 ){
       136361  +                memset(pDl->pList, 0, pDl->nList);
       136362  +                fts3EvalNextRow(pCsr, pLeft, pRc);
       136363  +              }
       136364  +            }
       136365  +          }
136340 136366           }
136341 136367           break;
136342 136368         }
136343 136369     
136344 136370         case FTSQUERY_OR: {
136345 136371           Fts3Expr *pLeft = pExpr->pLeft;
136346 136372           Fts3Expr *pRight = pExpr->pRight;
................................................................................
136705 136731               sqlite3Fts3MsrIncrRestart(pToken->pSegcsr);
136706 136732             }
136707 136733           }
136708 136734           *pRc = fts3EvalPhraseStart(pCsr, 0, pPhrase);
136709 136735         }
136710 136736         pPhrase->doclist.pNextDocid = 0;
136711 136737         pPhrase->doclist.iDocid = 0;
       136738  +      pPhrase->pOrPoslist = 0;
136712 136739       }
136713 136740   
136714 136741       pExpr->iDocid = 0;
136715 136742       pExpr->bEof = 0;
136716 136743       pExpr->bStart = 0;
136717 136744   
136718 136745       fts3EvalRestart(pCsr, pExpr->pLeft, pRc);
................................................................................
136950 136977     if( (pPhrase->iColumn<pTab->nColumn && pPhrase->iColumn!=iCol) ){
136951 136978       return SQLITE_OK;
136952 136979     }
136953 136980   
136954 136981     iDocid = pExpr->iDocid;
136955 136982     pIter = pPhrase->doclist.pList;
136956 136983     if( iDocid!=pCsr->iPrevId || pExpr->bEof ){
       136984  +    int rc = SQLITE_OK;
136957 136985       int bDescDoclist = pTab->bDescIdx;      /* For DOCID_CMP macro */
136958 136986       int iMul;                     /* +1 if csr dir matches index dir, else -1 */
136959 136987       int bOr = 0;
136960 136988       u8 bEof = 0;
136961 136989       u8 bTreeEof = 0;
136962 136990       Fts3Expr *p;                  /* Used to iterate from pExpr to root */
136963 136991       Fts3Expr *pNear;              /* Most senior NEAR ancestor (or pExpr) */
................................................................................
136975 137003       }
136976 137004       if( bOr==0 ) return SQLITE_OK;
136977 137005   
136978 137006       /* This is the descendent of an OR node. In this case we cannot use
136979 137007       ** an incremental phrase. Load the entire doclist for the phrase
136980 137008       ** into memory in this case.  */
136981 137009       if( pPhrase->bIncr ){
136982         -      int rc = SQLITE_OK;
136983         -      int bEofSave = pExpr->bEof;
136984         -      fts3EvalRestart(pCsr, pExpr, &rc);
136985         -      while( rc==SQLITE_OK && !pExpr->bEof ){
136986         -        fts3EvalNextRow(pCsr, pExpr, &rc);
136987         -        if( bEofSave==0 && pExpr->iDocid==iDocid ) break;
       137010  +      int bEofSave = pNear->bEof;
       137011  +      fts3EvalRestart(pCsr, pNear, &rc);
       137012  +      while( rc==SQLITE_OK && !pNear->bEof ){
       137013  +        fts3EvalNextRow(pCsr, pNear, &rc);
       137014  +        if( bEofSave==0 && pNear->iDocid==iDocid ) break;
136988 137015         }
136989         -      pIter = pPhrase->doclist.pList;
136990 137016         assert( rc!=SQLITE_OK || pPhrase->bIncr==0 );
136991         -      if( rc!=SQLITE_OK ) return rc;
136992         -    }
136993         -    
136994         -    iMul = ((pCsr->bDesc==bDescDoclist) ? 1 : -1);
136995         -    while( bTreeEof==1 
136996         -        && pNear->bEof==0
136997         -        && (DOCID_CMP(pNear->iDocid, pCsr->iPrevId) * iMul)<0
136998         -    ){
136999         -      int rc = SQLITE_OK;
137000         -      fts3EvalNextRow(pCsr, pExpr, &rc);
137001         -      if( rc!=SQLITE_OK ) return rc;
137002         -      iDocid = pExpr->iDocid;
137003         -      pIter = pPhrase->doclist.pList;
137004         -    }
137005         -
137006         -    bEof = (pPhrase->doclist.nAll==0);
137007         -    assert( bDescDoclist==0 || bDescDoclist==1 );
137008         -    assert( pCsr->bDesc==0 || pCsr->bDesc==1 );
137009         -
137010         -    if( bEof==0 ){
137011         -      if( pCsr->bDesc==bDescDoclist ){
       137017  +    }
       137018  +    if( bTreeEof ){
       137019  +      while( rc==SQLITE_OK && !pNear->bEof ){
       137020  +        fts3EvalNextRow(pCsr, pNear, &rc);
       137021  +      }
       137022  +    }
       137023  +    if( rc!=SQLITE_OK ) return rc;
       137024  +
       137025  +    pIter = pPhrase->pOrPoslist;
       137026  +    iDocid = pPhrase->iOrDocid;
       137027  +    if( pCsr->bDesc==bDescDoclist ){
       137028  +      bEof = (pIter >= (pPhrase->doclist.aAll + pPhrase->doclist.nAll));
       137029  +      while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)<0 ) && bEof==0 ){
       137030  +        sqlite3Fts3DoclistNext(
       137031  +            bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll, 
       137032  +            &pIter, &iDocid, &bEof
       137033  +        );
       137034  +      }
       137035  +    }else{
       137036  +      bEof = !pPhrase->doclist.nAll || (pIter && pIter<=pPhrase->doclist.aAll);
       137037  +      while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)>0 ) && bEof==0 ){
137012 137038           int dummy;
137013         -        if( pNear->bEof ){
137014         -          /* This expression is already at EOF. So position it to point to the
137015         -          ** last entry in the doclist at pPhrase->doclist.aAll[]. Variable
137016         -          ** iDocid is already set for this entry, so all that is required is
137017         -          ** to set pIter to point to the first byte of the last position-list
137018         -          ** in the doclist. 
137019         -          **
137020         -          ** It would also be correct to set pIter and iDocid to zero. In
137021         -          ** this case, the first call to sqltie3Fts4DoclistPrev() below
137022         -          ** would also move the iterator to point to the last entry in the 
137023         -          ** doclist. However, this is expensive, as to do so it has to 
137024         -          ** iterate through the entire doclist from start to finish (since
137025         -          ** it does not know the docid for the last entry).  */
137026         -          pIter = &pPhrase->doclist.aAll[pPhrase->doclist.nAll-1];
137027         -          fts3ReversePoslist(pPhrase->doclist.aAll, &pIter);
137028         -        }
137029         -        while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)>0 ) && bEof==0 ){
137030         -          sqlite3Fts3DoclistPrev(
137031         -              bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll, 
137032         -              &pIter, &iDocid, &dummy, &bEof
137033         -          );
137034         -        }
137035         -      }else{
137036         -        if( pNear->bEof ){
137037         -          pIter = 0;
137038         -          iDocid = 0;
137039         -        }
137040         -        while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)<0 ) && bEof==0 ){
137041         -          sqlite3Fts3DoclistNext(
137042         -              bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll, 
137043         -              &pIter, &iDocid, &bEof
137044         -          );
137045         -        }
       137039  +        sqlite3Fts3DoclistPrev(
       137040  +            bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll, 
       137041  +            &pIter, &iDocid, &dummy, &bEof
       137042  +        );
137046 137043         }
137047 137044       }
       137045  +    pPhrase->pOrPoslist = pIter;
       137046  +    pPhrase->iOrDocid = iDocid;
137048 137047   
137049 137048       if( bEof || iDocid!=pCsr->iPrevId ) pIter = 0;
137050 137049     }
137051 137050     if( pIter==0 ) return SQLITE_OK;
137052 137051   
137053 137052     if( *pIter==0x01 ){
137054 137053       pIter++;
137055 137054       pIter += fts3GetVarint32(pIter, &iThis);
137056 137055     }else{
137057 137056       iThis = 0;
137058 137057     }
137059 137058     while( iThis<iCol ){
137060 137059       fts3ColumnlistCopy(0, &pIter);
137061         -    if( *pIter==0x00 ) return 0;
       137060  +    if( *pIter==0x00 ) return SQLITE_OK;
137062 137061       pIter++;
137063 137062       pIter += fts3GetVarint32(pIter, &iThis);
       137063  +  }
       137064  +  if( *pIter==0x00 ){
       137065  +    pIter = 0;
137064 137066     }
137065 137067   
137066 137068     *ppOut = ((iCol==iThis)?pIter:0);
137067 137069     return SQLITE_OK;
137068 137070   }
137069 137071   
137070 137072   /*
................................................................................
147284 147286     ** the set of phrases in the expression to populate the aPhrase[] array.
147285 147287     */
147286 147288     sIter.pCsr = pCsr;
147287 147289     sIter.iCol = iCol;
147288 147290     sIter.nSnippet = nSnippet;
147289 147291     sIter.nPhrase = nList;
147290 147292     sIter.iCurrent = -1;
147291         -  (void)fts3ExprIterate(pCsr->pExpr, fts3SnippetFindPositions, (void *)&sIter);
147292         -
147293         -  /* Set the *pmSeen output variable. */
147294         -  for(i=0; i<nList; i++){
147295         -    if( sIter.aPhrase[i].pHead ){
147296         -      *pmSeen |= (u64)1 << i;
147297         -    }
147298         -  }
147299         -
147300         -  /* Loop through all candidate snippets. Store the best snippet in 
147301         -  ** *pFragment. Store its associated 'score' in iBestScore.
147302         -  */
147303         -  pFragment->iCol = iCol;
147304         -  while( !fts3SnippetNextCandidate(&sIter) ){
147305         -    int iPos;
147306         -    int iScore;
147307         -    u64 mCover;
147308         -    u64 mHighlight;
147309         -    fts3SnippetDetails(&sIter, mCovered, &iPos, &iScore, &mCover, &mHighlight);
147310         -    assert( iScore>=0 );
147311         -    if( iScore>iBestScore ){
147312         -      pFragment->iPos = iPos;
147313         -      pFragment->hlmask = mHighlight;
147314         -      pFragment->covered = mCover;
147315         -      iBestScore = iScore;
147316         -    }
147317         -  }
147318         -
       147293  +  rc = fts3ExprIterate(pCsr->pExpr, fts3SnippetFindPositions, (void *)&sIter);
       147294  +  if( rc==SQLITE_OK ){
       147295  +
       147296  +    /* Set the *pmSeen output variable. */
       147297  +    for(i=0; i<nList; i++){
       147298  +      if( sIter.aPhrase[i].pHead ){
       147299  +        *pmSeen |= (u64)1 << i;
       147300  +      }
       147301  +    }
       147302  +
       147303  +    /* Loop through all candidate snippets. Store the best snippet in 
       147304  +     ** *pFragment. Store its associated 'score' in iBestScore.
       147305  +     */
       147306  +    pFragment->iCol = iCol;
       147307  +    while( !fts3SnippetNextCandidate(&sIter) ){
       147308  +      int iPos;
       147309  +      int iScore;
       147310  +      u64 mCover;
       147311  +      u64 mHighlite;
       147312  +      fts3SnippetDetails(&sIter, mCovered, &iPos, &iScore, &mCover,&mHighlite);
       147313  +      assert( iScore>=0 );
       147314  +      if( iScore>iBestScore ){
       147315  +        pFragment->iPos = iPos;
       147316  +        pFragment->hlmask = mHighlite;
       147317  +        pFragment->covered = mCover;
       147318  +        iBestScore = iScore;
       147319  +      }
       147320  +    }
       147321  +
       147322  +    *piScore = iBestScore;
       147323  +  }
147319 147324     sqlite3_free(sIter.aPhrase);
147320         -  *piScore = iBestScore;
147321         -  return SQLITE_OK;
       147325  +  return rc;
147322 147326   }
147323 147327   
147324 147328   
147325 147329   /*
147326 147330   ** Append a string to the string-buffer passed as the first argument.
147327 147331   **
147328 147332   ** If nAppend is negative, then the length of the string zAppend is

Changes to SQLite.Interop/src/core/sqlite3.h.

   103    103   ** string contains the date and time of the check-in (UTC) and an SHA1
   104    104   ** hash of the entire source tree.
   105    105   **
   106    106   ** See also: [sqlite3_libversion()],
   107    107   ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
   108    108   ** [sqlite_version()] and [sqlite_source_id()].
   109    109   */
   110         -#define SQLITE_VERSION        "3.8.8.2"
          110  +#define SQLITE_VERSION        "3.8.8.3"
   111    111   #define SQLITE_VERSION_NUMBER 3008008
   112         -#define SQLITE_SOURCE_ID      "2015-01-30 14:30:45 7757fc721220e136620a89c9d28247f28bbbc098"
          112  +#define SQLITE_SOURCE_ID      "2015-02-25 13:29:11 9d6c1880fb75660bbabd693175579529785f8a6b"
   113    113   
   114    114   /*
   115    115   ** CAPI3REF: Run-Time Library Version Numbers
   116    116   ** KEYWORDS: sqlite3_version, sqlite3_sourceid
   117    117   **
   118    118   ** These interfaces provide the same information as the [SQLITE_VERSION],
   119    119   ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros

Changes to readme.htm.

     2      2   <html>
     3      3   <head>
     4      4   <title></title>
     5      5   </head>
     6      6   <body>
     7      7   ADO.NET SQLite Data Provider<br />
     8      8   Version 1.0.95.0 - March XX, 2015 <font color="red">(release scheduled)</font><br />
     9         -Using <a href="https://www.sqlite.org/releaselog/3_8_8_2.html">SQLite 3.8.8.2</a><br />
            9  +Using <a href="https://www.sqlite.org/releaselog/3_8_8_3.html">SQLite 3.8.8.3</a><br />
    10     10   Originally written by Robert Simpson<br />
    11     11   Released to the public domain, use at your own risk!<br />
    12     12   Official provider website:&nbsp;<a href="https://system.data.sqlite.org/">https://system.data.sqlite.org/</a><br />
    13     13   Legacy versions:&nbsp;<a href="http://sqlite.phxsoftware.com/">http://sqlite.phxsoftware.com/</a><br />
    14     14   <br />
    15     15   The current development version can be downloaded from <a href="https://system.data.sqlite.org/index.html/timeline?y=ci">
    16     16   https://system.data.sqlite.org/index.html/timeline?y=ci</a>
................................................................................
   208    208   
   209    209   <h2><b>Version History</b></h2>
   210    210   
   211    211   <p>
   212    212       <b>1.0.95.0 - March XX, 2015 <font color="red">(release scheduled)</font></b>
   213    213   </p>
   214    214   <ul>
   215         -    <li>Updated to <a href="https://www.sqlite.org/releaselog/3_8_8_2.html">SQLite 3.8.8.2</a>.</li>
          215  +    <li>Updated to <a href="https://www.sqlite.org/releaselog/3_8_8_3.html">SQLite 3.8.8.3</a>.</li>
   216    216       <li>Updated to <a href="https://www.nuget.org/packages/EntityFramework/6.1.2">Entity Framework 6.1.2</a>.</li>
   217    217       <li>Modify configuration file transforms performed by the NuGet packages to allow Entity Framework 6 design-time integration to work automatically. Fix for [2be4298631], [abad7c577d], and [417d669435].</li>
   218    218       <li>The &quot;System.Data.SQLite.EF6*&quot; and &quot;System.Data.SQLite.Linq*&quot; NuGet packages no longer depend on the &quot;System.Data.SQLite.Core*&quot; packages.&nbsp;<b>** Potentially Incompatible Change **</b></li>
   219    219       <li>The &quot;System.Data.SQLite.MSIL*&quot; NuGet packages no longer directly include any files; they are now meta-packages.&nbsp;<b>** Potentially Incompatible Change **</b></li>
   220    220       <li>The &quot;System.Data.SQLite.x86*&quot; and &quot;System.Data.SQLite.x64*&quot; NuGet packages now depend on the &quot;System.Data.SQLite.Linq&quot; and &quot;System.Data.SQLite.EF6&quot; NuGet packages.&nbsp;<b>** Potentially Incompatible Change **</b></li>
   221    221       <li>Make sure SQL statements generated for DbUpdateCommandTree objects are properly delimited.</li>
   222    222       <li>Make sure SQLiteIndexOutputs.ConstraintUsages instances are created prior to calling ISQLiteManagedModule.BestIndex. Fix for [56f511d268].</li>

Changes to www/news.wiki.

     2      2   
     3      3   <b>Version History</b>
     4      4   
     5      5   <p>
     6      6       <b>1.0.95.0 - March XX, 2015 <font color="red">(release scheduled)</font></b>
     7      7   </p>
     8      8   <ul>
     9         -    <li>Updated to [https://www.sqlite.org/releaselog/3_8_8_2.html|SQLite 3.8.8.2].</li>
            9  +    <li>Updated to [https://www.sqlite.org/releaselog/3_8_8_3.html|SQLite 3.8.8.3].</li>
    10     10       <li>Updated to [https://www.nuget.org/packages/EntityFramework/6.1.2|Entity Framework 6.1.2].</li>
    11     11       <li>Modify configuration file transforms performed by the NuGet packages to allow Entity Framework 6 design-time integration to work automatically. Fix for [2be4298631], [abad7c577d], and [417d669435].</li>
    12     12       <li>The &quot;System.Data.SQLite.EF6*&quot; and &quot;System.Data.SQLite.Linq*&quot; NuGet packages no longer depend on the &quot;System.Data.SQLite.Core*&quot; packages.&nbsp;<b>** Potentially Incompatible Change **</b></li>
    13     13       <li>The &quot;System.Data.SQLite.MSIL*&quot; NuGet packages no longer directly include any files; they are now meta-packages.&nbsp;<b>** Potentially Incompatible Change **</b></li>
    14     14       <li>The &quot;System.Data.SQLite.x86*&quot; and &quot;System.Data.SQLite.x64*&quot; NuGet packages now depend on the &quot;System.Data.SQLite.Linq&quot; and &quot;System.Data.SQLite.EF6&quot; NuGet packages.&nbsp;<b>** Potentially Incompatible Change **</b></li>
    15     15       <li>Make sure SQL statements generated for DbUpdateCommandTree objects are properly delimited.</li>
    16     16       <li>Make sure SQLiteIndexOutputs.ConstraintUsages instances are created prior to calling ISQLiteManagedModule.BestIndex. Fix for [56f511d268].</li>