System.Data.SQLite
Check-in [86ab62421b]
Not logged in

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

Overview
Comment:Update SQLite core library to the 3.24.0 release.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 86ab62421ba2c7ca65f4f4f87d60fa6ea6510e09
User & Date: mistachkin 2018-06-04 23:49:27
Context
2018-06-05
00:00
Pickup the SQLite core library 3.24.0 docs from upstream. check-in: f487954dc6 user: mistachkin tags: trunk
2018-06-04
23:49
Update SQLite core library to the 3.24.0 release. check-in: 86ab62421b user: mistachkin tags: trunk
2018-05-29
02:45
Update the embedded resource file for .NET Core. check-in: f991b0ecee 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.109.0 - June XX, 2018 <font color="red">(release scheduled)</font></b></p>
    47     47       <ul>
    48         -      <li>Updated to <a href="https://www.sqlite.org/draft/releaselog/3_24_0.html">SQLite 3.24.0</a>.</li>
           48  +      <li>Updated to <a href="https://www.sqlite.org/releaselog/3_24_0.html">SQLite 3.24.0</a>.</li>
    49     49         <li>Prevent GetSchemaTable from throwing InvalidCastException. Fix for <a href="https://system.data.sqlite.org/index.html/info/baf42ee135">[baf42ee135]</a>.</li>
    50     50         <li>Add preliminary support for the .NET Framework 4.7.2.</li>
    51     51         <li>Add preliminary support for .NET Core 2.0 and the .NET Standard 2.0. Pursuant to <a href="https://system.data.sqlite.org/index.html/info/5c89cecd1b">[5c89cecd1b]</a>.</li>
    52     52         <li>Add simpler overload for the SQLiteBlob.Create method. Pursuant to <a href="https://system.data.sqlite.org/index.html/info/dfc8133ba2">[dfc8133ba2]</a>.</li>
    53     53         <li>Add GetFieldAffinity method to the SQLiteDataReader class.</li>
    54     54       </ul>
    55     55       <p><b>1.0.108.0 - March 2, 2018</b></p>

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

  1148   1148   **
  1149   1149   ** See also: [sqlite3_libversion()],
  1150   1150   ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
  1151   1151   ** [sqlite_version()] and [sqlite_source_id()].
  1152   1152   */
  1153   1153   #define SQLITE_VERSION        "3.24.0"
  1154   1154   #define SQLITE_VERSION_NUMBER 3024000
  1155         -#define SQLITE_SOURCE_ID      "2018-05-28 18:29:46 469a62ca33081854e54f3af6d93ab5a350484b149c8c8c4ee8be0ae5418382d9"
         1155  +#define SQLITE_SOURCE_ID      "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca"
  1156   1156   
  1157   1157   /*
  1158   1158   ** CAPI3REF: Run-Time Library Version Numbers
  1159   1159   ** KEYWORDS: sqlite3_version sqlite3_sourceid
  1160   1160   **
  1161   1161   ** These interfaces provide the same information as the [SQLITE_VERSION],
  1162   1162   ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros
................................................................................
 10061  10061   ** to the contiguous memory representation of the database that SQLite
 10062  10062   ** is currently using for that database, or NULL if the no such contiguous
 10063  10063   ** memory representation of the database exists.  A contiguous memory
 10064  10064   ** representation of the database will usually only exist if there has
 10065  10065   ** been a prior call to [sqlite3_deserialize(D,S,...)] with the same
 10066  10066   ** values of D and S.
 10067  10067   ** The size of the database is written into *P even if the 
 10068         -** SQLITE_SERIALIZE_NOCOPY bit is set but no contigious copy
        10068  +** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy
 10069  10069   ** of the database exists.
 10070  10070   **
 10071  10071   ** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the
 10072  10072   ** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory
 10073  10073   ** allocation error occurs.
 10074  10074   **
 10075  10075   ** This interface is only available if SQLite is compiled with the
................................................................................
 27572  27572   /*
 27573  27573   ** This singleton is an sqlite3_str object that is returned if
 27574  27574   ** sqlite3_malloc() fails to provide space for a real one.  This
 27575  27575   ** sqlite3_str object accepts no new text and always returns
 27576  27576   ** an SQLITE_NOMEM error.
 27577  27577   */
 27578  27578   static sqlite3_str sqlite3OomStr = {
 27579         -   0, 0, 0, 0, 0, SQLITE_NOMEM
        27579  +   0, 0, 0, 0, 0, SQLITE_NOMEM, 0
 27580  27580   };
 27581  27581   
 27582  27582   /* Finalize a string created using sqlite3_str_new().
 27583  27583   */
 27584  27584   SQLITE_API char *sqlite3_str_finish(sqlite3_str *p){
 27585  27585     char *z;
 27586  27586     if( p!=0 && p!=&sqlite3OomStr ){
................................................................................
 35435  35435         /* The code below is handling the return value of osFallocate() 
 35436  35436         ** correctly. posix_fallocate() is defined to "returns zero on success, 
 35437  35437         ** or an error number on  failure". See the manpage for details. */
 35438  35438         int err;
 35439  35439         do{
 35440  35440           err = osFallocate(pFile->h, buf.st_size, nSize-buf.st_size);
 35441  35441         }while( err==EINTR );
 35442         -      if( err ) return SQLITE_IOERR_WRITE;
        35442  +      if( err && err!=EINVAL ) return SQLITE_IOERR_WRITE;
 35443  35443   #else
 35444  35444         /* If the OS does not have posix_fallocate(), fake it. Write a 
 35445  35445         ** single byte to the last byte in each block that falls entirely
 35446  35446         ** within the extended region. Then, if required, a single byte
 35447  35447         ** at offset (nSize-1), to set the size of the file correctly.
 35448  35448         ** This is a similar technique to that used by glibc on systems
 35449  35449         ** that do not have a real fallocate() call.
................................................................................
 62891  62891   **
 62892  62892   ** Calling this routine with a NULL cursor pointer returns false.
 62893  62893   **
 62894  62894   ** Use the separate sqlite3BtreeCursorRestore() routine to restore a cursor
 62895  62895   ** back to where it ought to be if this routine returns true.
 62896  62896   */
 62897  62897   SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor *pCur){
 62898         -  return pCur->eState!=CURSOR_VALID;
        62898  +  assert( EIGHT_BYTE_ALIGNMENT(pCur)
        62899  +       || pCur==sqlite3BtreeFakeValidCursor() );
        62900  +  assert( offsetof(BtCursor, eState)==0 );
        62901  +  assert( sizeof(pCur->eState)==1 );
        62902  +  return CURSOR_VALID != *(u8*)pCur;
 62899  62903   }
 62900  62904   
 62901  62905   /*
 62902  62906   ** Return a pointer to a fake BtCursor object that will always answer
 62903  62907   ** false to the sqlite3BtreeCursorHasMoved() routine above.  The fake
 62904  62908   ** cursor returned must not be used with any other Btree interface.
 62905  62909   */
................................................................................
 86662  86666   **
 86663  86667   ** If cursor P1 is an index, then the content is the key of the row.
 86664  86668   ** If cursor P2 is a table, then the content extracted is the data.
 86665  86669   **
 86666  86670   ** If the P1 cursor must be pointing to a valid row (not a NULL row)
 86667  86671   ** of a real table, not a pseudo-table.
 86668  86672   **
 86669         -** If P3!=0 then this opcode is allowed to make an ephermeral pointer
        86673  +** If P3!=0 then this opcode is allowed to make an ephemeral pointer
 86670  86674   ** into the database page.  That means that the content of the output
 86671  86675   ** register will be invalidated as soon as the cursor moves - including
 86672         -** moves caused by other cursors that "save" the the current cursors
        86676  +** moves caused by other cursors that "save" the current cursors
 86673  86677   ** position in order that they can write to the same table.  If P3==0
 86674  86678   ** then a copy of the data is made into memory.  P3!=0 is faster, but
 86675  86679   ** P3==0 is safer.
 86676  86680   **
 86677  86681   ** If P3!=0 then the content of the P2 register is unsuitable for use
 86678  86682   ** in OP_Result and any OP_Result will invalidate the P2 register content.
 86679  86683   ** The P2 register content is invalidated by opcodes like OP_Function or
................................................................................
 87482  87486   
 87483  87487   /* Opcode: CreateBtree P1 P2 P3 * *
 87484  87488   ** Synopsis: r[P2]=root iDb=P1 flags=P3
 87485  87489   **
 87486  87490   ** Allocate a new b-tree in the main database file if P1==0 or in the
 87487  87491   ** TEMP database file if P1==1 or in an attached database if
 87488  87492   ** P1>1.  The P3 argument must be 1 (BTREE_INTKEY) for a rowid table
 87489         -** it must be 2 (BTREE_BLOBKEY) for a index or WITHOUT ROWID table.
        87493  +** it must be 2 (BTREE_BLOBKEY) for an index or WITHOUT ROWID table.
 87490  87494   ** The root page number of the new b-tree is stored in register P2.
 87491  87495   */
 87492  87496   case OP_CreateBtree: {          /* out2 */
 87493  87497     int pgno;
 87494  87498     Db *pDb;
 87495  87499   
 87496  87500     sqlite3VdbeIncrWriteCounter(p, 0);
................................................................................
 93229  93233     sqlite3 *db;           /* The database connection */
 93230  93234   
 93231  93235     assert( iCol>=0 && iCol<pEList->nExpr );
 93232  93236     pOrig = pEList->a[iCol].pExpr;
 93233  93237     assert( pOrig!=0 );
 93234  93238     db = pParse->db;
 93235  93239     pDup = sqlite3ExprDup(db, pOrig, 0);
 93236         -  if( pDup==0 ) return;
 93237         -  if( zType[0]!='G' ) incrAggFunctionDepth(pDup, nSubquery);
 93238         -  if( pExpr->op==TK_COLLATE ){
 93239         -    pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken);
 93240         -  }
 93241         -  ExprSetProperty(pDup, EP_Alias);
 93242         -
 93243         -  /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This 
 93244         -  ** prevents ExprDelete() from deleting the Expr structure itself,
 93245         -  ** allowing it to be repopulated by the memcpy() on the following line.
 93246         -  ** The pExpr->u.zToken might point into memory that will be freed by the
 93247         -  ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to
 93248         -  ** make a copy of the token before doing the sqlite3DbFree().
 93249         -  */
 93250         -  ExprSetProperty(pExpr, EP_Static);
 93251         -  sqlite3ExprDelete(db, pExpr);
 93252         -  memcpy(pExpr, pDup, sizeof(*pExpr));
 93253         -  if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){
 93254         -    assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 );
 93255         -    pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken);
 93256         -    pExpr->flags |= EP_MemToken;
 93257         -  }
 93258         -  sqlite3DbFree(db, pDup);
        93240  +  if( pDup!=0 ){
        93241  +    if( zType[0]!='G' ) incrAggFunctionDepth(pDup, nSubquery);
        93242  +    if( pExpr->op==TK_COLLATE ){
        93243  +      pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken);
        93244  +    }
        93245  +    ExprSetProperty(pDup, EP_Alias);
        93246  +
        93247  +    /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This 
        93248  +    ** prevents ExprDelete() from deleting the Expr structure itself,
        93249  +    ** allowing it to be repopulated by the memcpy() on the following line.
        93250  +    ** The pExpr->u.zToken might point into memory that will be freed by the
        93251  +    ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to
        93252  +    ** make a copy of the token before doing the sqlite3DbFree().
        93253  +    */
        93254  +    ExprSetProperty(pExpr, EP_Static);
        93255  +    sqlite3ExprDelete(db, pExpr);
        93256  +    memcpy(pExpr, pDup, sizeof(*pExpr));
        93257  +    if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){
        93258  +      assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 );
        93259  +      pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken);
        93260  +      pExpr->flags |= EP_MemToken;
        93261  +    }
        93262  +    sqlite3DbFree(db, pDup);
        93263  +  }
        93264  +  ExprSetProperty(pExpr, EP_Alias);
 93259  93265   }
 93260  93266   
 93261  93267   
 93262  93268   /*
 93263  93269   ** Return TRUE if the name zCol occurs anywhere in the USING clause.
 93264  93270   **
 93265  93271   ** Return FALSE if the USING clause is NULL or if it does not contain
................................................................................
 93503  93509           if( iCol<pTab->nCol ){
 93504  93510             cnt++;
 93505  93511   #ifndef SQLITE_OMIT_UPSERT
 93506  93512             if( pExpr->iTable==2 ){
 93507  93513               testcase( iCol==(-1) );
 93508  93514               pExpr->iTable = pNC->uNC.pUpsert->regData + iCol;
 93509  93515               eNewExprOp = TK_REGISTER;
        93516  +            ExprSetProperty(pExpr, EP_Alias);
 93510  93517             }else
 93511  93518   #endif /* SQLITE_OMIT_UPSERT */
 93512  93519             {
 93513  93520   #ifndef SQLITE_OMIT_TRIGGER
 93514  93521               if( iCol<0 ){
 93515  93522                 pExpr->affinity = SQLITE_AFF_INTEGER;
 93516  93523               }else if( pExpr->iTable==0 ){
................................................................................
 98730  98737         exprCodeBetween(pParse, pExpr, target, 0, 0);
 98731  98738         return target;
 98732  98739       }
 98733  98740       case TK_SPAN:
 98734  98741       case TK_COLLATE: 
 98735  98742       case TK_UPLUS: {
 98736  98743         pExpr = pExpr->pLeft;
 98737         -      goto expr_code_doover;
        98744  +      goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. OSSFuzz. */
 98738  98745       }
 98739  98746   
 98740  98747       case TK_TRIGGER: {
 98741  98748         /* If the opcode is TK_TRIGGER, then the expression is a reference
 98742  98749         ** to a column in the new.* or old.* pseudo-tables available to
 98743  98750         ** trigger programs. In this case Expr.iTable is set to 1 for the
 98744  98751         ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn
................................................................................
103786 103793     sqlite3 *db = pParse->db;
103787 103794     Table *pTab = 0;      /* The table being read */
103788 103795     const char *zCol;     /* Name of the column of the table */
103789 103796     int iSrc;             /* Index in pTabList->a[] of table being read */
103790 103797     int iDb;              /* The index of the database the expression refers to */
103791 103798     int iCol;             /* Index of column in table */
103792 103799   
       103800  +  assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER );
103793 103801     if( db->xAuth==0 ) return;
103794 103802     iDb = sqlite3SchemaToIndex(pParse->db, pSchema);
103795 103803     if( iDb<0 ){
103796 103804       /* An attempt to read a column out of a subquery or other
103797 103805       ** temporary table. */
103798 103806       return;
103799 103807     }
103800 103808   
103801         -  assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER );
103802 103809     if( pExpr->op==TK_TRIGGER ){
103803 103810       pTab = pParse->pTriggerTab;
103804 103811     }else{
103805 103812       assert( pTabList );
103806 103813       for(iSrc=0; ALWAYS(iSrc<pTabList->nSrc); iSrc++){
103807 103814         if( pExpr->iTable==pTabList->a[iSrc].iCursor ){
103808 103815           pTab = pTabList->a[iSrc].pTab;
................................................................................
122102 122109     int nDefer = 0;
122103 122110     ExprList *pExtra = 0;
122104 122111     for(i=0; i<pEList->nExpr; i++){
122105 122112       struct ExprList_item *pItem = &pEList->a[i];
122106 122113       if( pItem->u.x.iOrderByCol==0 ){
122107 122114         Expr *pExpr = pItem->pExpr;
122108 122115         Table *pTab = pExpr->pTab;
122109         -      if( pExpr->op==TK_COLUMN && pTab && !IsVirtual(pTab)
       122116  +      if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 && pTab && !IsVirtual(pTab)
122110 122117          && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF)
122111 122118         ){
122112 122119           int j;
122113 122120           for(j=0; j<nDefer; j++){
122114 122121             if( pSort->aDefer[j].iCsr==pExpr->iTable ) break;
122115 122122           }
122116 122123           if( j==nDefer ){
................................................................................
207574 207581   static void fts5SourceIdFunc(
207575 207582     sqlite3_context *pCtx,          /* Function call context */
207576 207583     int nArg,                       /* Number of args */
207577 207584     sqlite3_value **apUnused        /* Function arguments */
207578 207585   ){
207579 207586     assert( nArg==0 );
207580 207587     UNUSED_PARAM2(nArg, apUnused);
207581         -  sqlite3_result_text(pCtx, "fts5: 2018-05-28 18:29:46 469a62ca33081854e54f3af6d93ab5a350484b149c8c8c4ee8be0ae5418382d9", -1, SQLITE_TRANSIENT);
       207588  +  sqlite3_result_text(pCtx, "fts5: 2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca", -1, SQLITE_TRANSIENT);
207582 207589   }
207583 207590   
207584 207591   static int fts5Init(sqlite3 *db){
207585 207592     static const sqlite3_module fts5Mod = {
207586 207593       /* iVersion      */ 2,
207587 207594       /* xCreate       */ fts5CreateMethod,
207588 207595       /* xConnect      */ fts5ConnectMethod,
................................................................................
211844 211851   #endif
211845 211852     return rc;
211846 211853   }
211847 211854   #endif /* SQLITE_CORE */
211848 211855   #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
211849 211856   
211850 211857   /************** End of stmt.c ************************************************/
211851         -#if __LINE__!=211851
       211858  +#if __LINE__!=211858
211852 211859   #undef SQLITE_SOURCE_ID
211853         -#define SQLITE_SOURCE_ID      "2018-05-28 18:29:46 469a62ca33081854e54f3af6d93ab5a350484b149c8c8c4ee8be0ae54183alt2"
       211860  +#define SQLITE_SOURCE_ID      "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199aalt2"
211854 211861   #endif
211855 211862   /* Return the source-id for this library */
211856 211863   SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
211857 211864   /************************** End of sqlite3.c ******************************/

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

   121    121   **
   122    122   ** See also: [sqlite3_libversion()],
   123    123   ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
   124    124   ** [sqlite_version()] and [sqlite_source_id()].
   125    125   */
   126    126   #define SQLITE_VERSION        "3.24.0"
   127    127   #define SQLITE_VERSION_NUMBER 3024000
   128         -#define SQLITE_SOURCE_ID      "2018-05-28 18:29:46 469a62ca33081854e54f3af6d93ab5a350484b149c8c8c4ee8be0ae5418382d9"
          128  +#define SQLITE_SOURCE_ID      "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca"
   129    129   
   130    130   /*
   131    131   ** CAPI3REF: Run-Time Library Version Numbers
   132    132   ** KEYWORDS: sqlite3_version sqlite3_sourceid
   133    133   **
   134    134   ** These interfaces provide the same information as the [SQLITE_VERSION],
   135    135   ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros
................................................................................
  9034   9034   ** to the contiguous memory representation of the database that SQLite
  9035   9035   ** is currently using for that database, or NULL if the no such contiguous
  9036   9036   ** memory representation of the database exists.  A contiguous memory
  9037   9037   ** representation of the database will usually only exist if there has
  9038   9038   ** been a prior call to [sqlite3_deserialize(D,S,...)] with the same
  9039   9039   ** values of D and S.
  9040   9040   ** The size of the database is written into *P even if the 
  9041         -** SQLITE_SERIALIZE_NOCOPY bit is set but no contigious copy
         9041  +** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy
  9042   9042   ** of the database exists.
  9043   9043   **
  9044   9044   ** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the
  9045   9045   ** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory
  9046   9046   ** allocation error occurs.
  9047   9047   **
  9048   9048   ** This interface is only available if SQLite is compiled with the

Changes to SQLite.Interop/src/ext/fts5.c.

 17496  17496   static void fts5SourceIdFunc(
 17497  17497     sqlite3_context *pCtx,          /* Function call context */
 17498  17498     int nArg,                       /* Number of args */
 17499  17499     sqlite3_value **apUnused        /* Function arguments */
 17500  17500   ){
 17501  17501     assert( nArg==0 );
 17502  17502     UNUSED_PARAM2(nArg, apUnused);
 17503         -  sqlite3_result_text(pCtx, "fts5: 2018-05-28 18:29:46 469a62ca33081854e54f3af6d93ab5a350484b149c8c8c4ee8be0ae5418382d9", -1, SQLITE_TRANSIENT);
        17503  +  sqlite3_result_text(pCtx, "fts5: 2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca", -1, SQLITE_TRANSIENT);
 17504  17504   }
 17505  17505   
 17506  17506   static int fts5Init(sqlite3 *db){
 17507  17507     static const sqlite3_module fts5Mod = {
 17508  17508       /* iVersion      */ 2,
 17509  17509       /* xCreate       */ fts5CreateMethod,
 17510  17510       /* xConnect      */ fts5ConnectMethod,

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.109.0 - June XX, 2018 <font color="red">(release scheduled)</font><br />
     9         -Using <a href="https://www.sqlite.org/draft/releaselog/3_24_0.html">SQLite 3.24.0</a><br />Originally written by Robert Simpson<br />
            9  +Using <a href="https://www.sqlite.org/releaselog/3_24_0.html">SQLite 3.24.0</a><br />Originally written by Robert Simpson<br />
    10     10   Released to the public domain, use at your own risk!<br />
    11     11   Official provider website:&nbsp;<a href="https://system.data.sqlite.org/">https://system.data.sqlite.org/</a><br />
    12     12   Legacy versions:&nbsp;<a href="https://sourceforge.net/projects/sqlite-dotnet2/">https://sourceforge.net/projects/sqlite-dotnet2/</a><br />
    13     13   <br />
    14     14   The current development version can be downloaded from <a href="https://system.data.sqlite.org/index.html/timeline?y=ci">
    15     15   https://system.data.sqlite.org/index.html/timeline?y=ci</a>
    16     16   <br />
................................................................................
   207    207   
   208    208   <h2><b>Version History</b></h2>
   209    209   
   210    210   <p>
   211    211       <b>1.0.109.0 - June XX, 2018 <font color="red">(release scheduled)</font></b>
   212    212   </p>
   213    213   <ul>
   214         -    <li>Updated to <a href="https://www.sqlite.org/releaselog/3_23_2.html">SQLite 3.23.2</a>.</li>
          214  +    <li>Updated to <a href="https://www.sqlite.org/releaselog/3_24_0.html">SQLite 3.24.0</a>.</li>
   215    215       <li>Prevent GetSchemaTable from throwing InvalidCastException. Fix for [baf42ee135].</li>
   216    216       <li>Add preliminary support for the .NET Framework 4.7.2.</li>
   217    217       <li>Add preliminary support for .NET Core 2.0 and the .NET Standard 2.0. Pursuant to [5c89cecd1b].</li>
   218    218       <li>Add simpler overload for the SQLiteBlob.Create method. Pursuant to [dfc8133ba2].</li>
   219    219       <li>Add GetFieldAffinity method to the SQLiteDataReader class.</li>
   220    220   </ul>
   221    221   <p>

Changes to www/news.wiki.

    44     44   
    45     45   <div align="center"><h2><b>Version History</b></h2></div>
    46     46   
    47     47   <p>
    48     48       <b>1.0.109.0 - June XX, 2018 <font color="red">(release scheduled)</font></b>
    49     49   </p>
    50     50   <ul>
    51         -    <li>Updated to [https://www.sqlite.org/draft/releaselog/3_24_0.html|SQLite 3.24.0].</li>
           51  +    <li>Updated to [https://www.sqlite.org/releaselog/3_24_0.html|SQLite 3.24.0].</li>
    52     52       <li>Prevent GetSchemaTable from throwing InvalidCastException. Fix for [baf42ee135].</li>
    53     53       <li>Add preliminary support for the .NET Framework 4.7.2.</li>
    54     54       <li>Add preliminary support for .NET Core 2.0 and the .NET Standard 2.0. Pursuant to [5c89cecd1b].</li>
    55     55       <li>Add simpler overload for the SQLiteBlob.Create method. Pursuant to [dfc8133ba2].</li>
    56     56       <li>Add GetFieldAffinity method to the SQLiteDataReader class.</li>
    57     57   </ul>
    58     58   <p>