System.Data.SQLite
Check-in [37be32bdd4]
Not logged in

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

Overview
Comment:Merge updates from trunk.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | vs2017
Files: files | file ages | folders
SHA1: 37be32bdd4931fda8839d6938d652e17c202fb79
User & Date: mistachkin 2017-09-28 18:14:54
Context
2017-09-28
18:21
Update version history docs. check-in: b60b6e8290 user: mistachkin tags: vs2017
18:14
Merge updates from trunk. check-in: 37be32bdd4 user: mistachkin tags: vs2017
2017-09-16
06:21
Update several tests for ticket [b167206ad3] to use the 'DECIMALTEXT' and 'NUMERICTEXT' type mappings. check-in: 5032831744 user: mistachkin tags: trunk
2017-08-07
20:50
Maintainability improvements to registry handling in the design-time components installer. check-in: 7529b275e1 user: mistachkin tags: vs2017
Changes
Hide Diffs Side-by-Side Diffs Ignore Whitespace Patch

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

    39     39             </td>
    40     40           </tr>
    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         -    <p><b>1.0.106.0 - August XX, 2017 <font color="red">(release scheduled)</font></b></p>
           46  +    <p><b>1.0.106.0 - September XX, 2017 <font color="red">(release scheduled)</font></b></p>
    47     47       <ul>
    48         -      <li>Updated to <a href="https://www.sqlite.org/draft/releaselog/3_20_0.html">SQLite 3.20.0</a>.</li>
           48  +      <li>Updated to <a href="https://www.sqlite.org/releaselog/3_20_1.html">SQLite 3.20.1</a>.</li>
           49  +      <li>Add BindDecimalAsText and GetDecimalAsText connection flags to force binding and returning of decimal values as text. Pursuant to <a href="https://system.data.sqlite.org/index.html/info/b167206ad3">[b167206ad3]</a>.</li>
    49     50         <li>Add preliminary support for Visual Studio 2017 and the .NET Framework 4.7.</li>
    50     51       </ul>
    51     52       <p><b>1.0.105.2 - June 12, 2017</b></p>
    52     53       <ul>
    53     54         <li>Updated to <a href="https://www.sqlite.org/releaselog/3_19_3.html">SQLite 3.19.3</a>.</li>
    54     55         <li>Fix issues that prevented SQLiteBlob creation from succeeding for tables that did not have an integer primary key.</li>
    55     56       </ul>

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.20.0.0</SQLITE_MANIFEST_VERSION>
    13         -    <SQLITE_RC_VERSION>3,20,0,0</SQLITE_RC_VERSION>
           12  +    <SQLITE_MANIFEST_VERSION>3.20.1.0</SQLITE_MANIFEST_VERSION>
           13  +    <SQLITE_RC_VERSION>3,20,1,0</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_ENABLE_API_ARMOR=1;SQLITE_ENABLE_DBSTAT_VTAB=1;SQLITE_ENABLE_STMTVTAB=1</SQLITE_COMMON_DEFINES>
    15     15       <SQLITE_EXTRA_DEFINES>SQLITE_PLACEHOLDER=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.20.0.0"
           17  +		Value="3.20.1.0"
    18     18   		PerformEnvironmentSet="true"
    19     19   	/>
    20     20   	<UserMacro
    21     21   		Name="SQLITE_RC_VERSION"
    22         -		Value="3,20,0,0"
           22  +		Value="3,20,1,0"
    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;SQLITE_ENABLE_API_ARMOR=1;SQLITE_ENABLE_DBSTAT_VTAB=1;SQLITE_ENABLE_STMTVTAB=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.20.0.  By combining all the individual C code files into this
            3  +** version 3.20.1.  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
................................................................................
  1146   1146   ** string contains the date and time of the check-in (UTC) and a SHA1
  1147   1147   ** or SHA3-256 hash of the entire source tree.
  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         -#define SQLITE_VERSION        "3.20.0"
  1154         -#define SQLITE_VERSION_NUMBER 3020000
  1155         -#define SQLITE_SOURCE_ID      "2017-08-01 13:24:15 9501e22dfeebdcefa783575e47c60b514d7c2e0cad73b2a496c0bc4b680900a8"
         1153  +#define SQLITE_VERSION        "3.20.1"
         1154  +#define SQLITE_VERSION_NUMBER 3020001
         1155  +#define SQLITE_SOURCE_ID      "2017-08-24 16:21:36 8d3a7ea6c5690d6b7c3767558f4f01b511c55463e3f9e64506801fe9b74dce34"
  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
................................................................................
 77118  77118     sqlite3_context *pCtx,
 77119  77119     void *pPtr,
 77120  77120     const char *zPType,
 77121  77121     void (*xDestructor)(void*)
 77122  77122   ){
 77123  77123     Mem *pOut = pCtx->pOut;
 77124  77124     assert( sqlite3_mutex_held(pOut->db->mutex) );
 77125         -  sqlite3VdbeMemSetNull(pOut);
        77125  +  sqlite3VdbeMemRelease(pOut);
        77126  +  pOut->flags = MEM_Null;
 77126  77127     sqlite3VdbeMemSetPointer(pOut, pPtr, zPType, xDestructor);
 77127  77128   }
 77128  77129   SQLITE_API void sqlite3_result_subtype(sqlite3_context *pCtx, unsigned int eSubtype){
 77129  77130     Mem *pOut = pCtx->pOut;
 77130  77131     assert( sqlite3_mutex_held(pOut->db->mutex) );
 77131  77132     pOut->eSubtype = eSubtype & 0xff;
 77132  77133     pOut->flags |= MEM_Subtype;
................................................................................
200271 200272   static void fts5SourceIdFunc(
200272 200273     sqlite3_context *pCtx,          /* Function call context */
200273 200274     int nArg,                       /* Number of args */
200274 200275     sqlite3_value **apUnused        /* Function arguments */
200275 200276   ){
200276 200277     assert( nArg==0 );
200277 200278     UNUSED_PARAM2(nArg, apUnused);
200278         -  sqlite3_result_text(pCtx, "fts5: 2017-08-01 13:24:15 9501e22dfeebdcefa783575e47c60b514d7c2e0cad73b2a496c0bc4b680900a8", -1, SQLITE_TRANSIENT);
       200279  +  sqlite3_result_text(pCtx, "fts5: 2017-08-24 16:21:36 8d3a7ea6c5690d6b7c3767558f4f01b511c55463e3f9e64506801fe9b74dce34", -1, SQLITE_TRANSIENT);
200279 200280   }
200280 200281   
200281 200282   static int fts5Init(sqlite3 *db){
200282 200283     static const sqlite3_module fts5Mod = {
200283 200284       /* iVersion      */ 2,
200284 200285       /* xCreate       */ fts5CreateMethod,
200285 200286       /* xConnect      */ fts5ConnectMethod,

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

   117    117   ** string contains the date and time of the check-in (UTC) and a SHA1
   118    118   ** or SHA3-256 hash of the entire source tree.
   119    119   **
   120    120   ** See also: [sqlite3_libversion()],
   121    121   ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
   122    122   ** [sqlite_version()] and [sqlite_source_id()].
   123    123   */
   124         -#define SQLITE_VERSION        "3.20.0"
   125         -#define SQLITE_VERSION_NUMBER 3020000
   126         -#define SQLITE_SOURCE_ID      "2017-08-01 13:24:15 9501e22dfeebdcefa783575e47c60b514d7c2e0cad73b2a496c0bc4b680900a8"
          124  +#define SQLITE_VERSION        "3.20.1"
          125  +#define SQLITE_VERSION_NUMBER 3020001
          126  +#define SQLITE_SOURCE_ID      "2017-08-24 16:21:36 8d3a7ea6c5690d6b7c3767558f4f01b511c55463e3f9e64506801fe9b74dce34"
   127    127   
   128    128   /*
   129    129   ** CAPI3REF: Run-Time Library Version Numbers
   130    130   ** KEYWORDS: sqlite3_version sqlite3_sourceid
   131    131   **
   132    132   ** These interfaces provide the same information as the [SQLITE_VERSION],
   133    133   ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros

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

 17314  17314   static void fts5SourceIdFunc(
 17315  17315     sqlite3_context *pCtx,          /* Function call context */
 17316  17316     int nArg,                       /* Number of args */
 17317  17317     sqlite3_value **apUnused        /* Function arguments */
 17318  17318   ){
 17319  17319     assert( nArg==0 );
 17320  17320     UNUSED_PARAM2(nArg, apUnused);
 17321         -  sqlite3_result_text(pCtx, "fts5: 2017-08-01 13:24:15 9501e22dfeebdcefa783575e47c60b514d7c2e0cad73b2a496c0bc4b680900a8", -1, SQLITE_TRANSIENT);
        17321  +  sqlite3_result_text(pCtx, "fts5: 2017-08-24 16:21:36 8d3a7ea6c5690d6b7c3767558f4f01b511c55463e3f9e64506801fe9b74dce34", -1, SQLITE_TRANSIENT);
 17322  17322   }
 17323  17323   
 17324  17324   static int fts5Init(sqlite3 *db){
 17325  17325     static const sqlite3_module fts5Mod = {
 17326  17326       /* iVersion      */ 2,
 17327  17327       /* xCreate       */ fts5CreateMethod,
 17328  17328       /* xConnect      */ fts5ConnectMethod,

Changes to System.Data.SQLite/SQLite3.cs.

  3263   3263         TypeAffinity aff = typ.Affinity;
  3264   3264         if (aff == TypeAffinity.Null) return DBNull.Value;
  3265   3265         Type t = null;
  3266   3266   
  3267   3267         if (typ.Type != DbType.Object)
  3268   3268         {
  3269   3269           t = SQLiteConvert.SQLiteTypeToType(typ);
  3270         -        aff = TypeToAffinity(t);
         3270  +        aff = TypeToAffinity(t, flags);
  3271   3271         }
  3272   3272   
  3273   3273         if ((flags & SQLiteConnectionFlags.GetAllAsText) == SQLiteConnectionFlags.GetAllAsText)
  3274   3274             return GetText(stmt, index);
  3275   3275   
  3276   3276         switch (aff)
  3277   3277         {

Changes to System.Data.SQLite/SQLiteBase.cs.

  1241   1241         /// Allow transactions to be nested.  The outermost transaction still
  1242   1242         /// controls whether or not any changes are ultimately committed or
  1243   1243         /// rolled back.  All non-outermost transactions are implemented using
  1244   1244         /// the SAVEPOINT construct.
  1245   1245         /// </summary>
  1246   1246         AllowNestedTransactions = 0x8000000000,
  1247   1247   
         1248  +      /// <summary>
         1249  +      /// When binding parameter values, always bind <see cref="Decimal" />
         1250  +      /// values as though they were plain text (i.e. not <see cref="Decimal" />,
         1251  +      /// which is the legacy behavior).
         1252  +      /// </summary>
         1253  +      BindDecimalAsText = 0x10000000000,
         1254  +
         1255  +      /// <summary>
         1256  +      /// When returning column values, always return <see cref="Decimal" />
         1257  +      /// values as though they were plain text (i.e. not <see cref="Double" />,
         1258  +      /// which is the legacy behavior).
         1259  +      /// </summary>
         1260  +      GetDecimalAsText = 0x20000000000,
         1261  +
  1248   1262         /// <summary>
  1249   1263         /// When binding parameter values or returning column values, always
  1250   1264         /// treat them as though they were plain text (i.e. no numeric,
  1251   1265         /// date/time, or other conversions should be attempted).
  1252   1266         /// </summary>
  1253   1267         BindAndGetAllAsText = BindAllAsText | GetAllAsText,
  1254   1268   

Changes to System.Data.SQLite/SQLiteConvert.cs.

  1621   1621         typeof(string),   // Xml (25)
  1622   1622       };
  1623   1623   
  1624   1624       /// <summary>
  1625   1625       /// For a given type, return the closest-match SQLite TypeAffinity, which only understands a very limited subset of types.
  1626   1626       /// </summary>
  1627   1627       /// <param name="typ">The type to evaluate</param>
         1628  +    /// <param name="flags">The flags associated with the connection.</param>
  1628   1629       /// <returns>The SQLite type affinity for that type.</returns>
  1629         -    internal static TypeAffinity TypeToAffinity(Type typ)
         1630  +    internal static TypeAffinity TypeToAffinity(
         1631  +        Type typ,
         1632  +        SQLiteConnectionFlags flags
         1633  +        )
  1630   1634       {
  1631   1635         TypeCode tc = Type.GetTypeCode(typ);
  1632   1636         if (tc == TypeCode.Object)
  1633   1637         {
  1634   1638           if (typ == typeof(byte[]) || typ == typeof(Guid))
  1635   1639             return TypeAffinity.Blob;
  1636   1640           else
         1641  +          return TypeAffinity.Text;
         1642  +      }
         1643  +      if ((tc == TypeCode.Decimal) &&
         1644  +          ((flags & SQLiteConnectionFlags.GetDecimalAsText) == SQLiteConnectionFlags.GetDecimalAsText))
         1645  +      {
  1637   1646             return TypeAffinity.Text;
  1638   1647         }
  1639   1648         return _typecodeAffinities[(int)tc];
  1640   1649       }
  1641   1650   
  1642   1651       private static TypeAffinity[] _typecodeAffinities = {
  1643   1652         TypeAffinity.Null,     // Empty (0)
................................................................................
  1682   1691               new SQLiteDbTypeMapping("CHAR", DbType.AnsiStringFixedLength, true),
  1683   1692               new SQLiteDbTypeMapping("CLOB", DbType.String, false),
  1684   1693               new SQLiteDbTypeMapping("COUNTER", DbType.Int64, false),
  1685   1694               new SQLiteDbTypeMapping("CURRENCY", DbType.Decimal, false),
  1686   1695               new SQLiteDbTypeMapping("DATE", DbType.DateTime, false),
  1687   1696               new SQLiteDbTypeMapping("DATETIME", DbType.DateTime, true),
  1688   1697               new SQLiteDbTypeMapping("DECIMAL", DbType.Decimal, true),
         1698  +            new SQLiteDbTypeMapping("DECIMALTEXT", DbType.Decimal, false),
  1689   1699               new SQLiteDbTypeMapping("DOUBLE", DbType.Double, false),
  1690   1700               new SQLiteDbTypeMapping("FLOAT", DbType.Double, false),
  1691   1701               new SQLiteDbTypeMapping("GENERAL", DbType.Binary, false),
  1692   1702               new SQLiteDbTypeMapping("GUID", DbType.Guid, false),
  1693   1703               new SQLiteDbTypeMapping("IDENTITY", DbType.Int64, false),
  1694   1704               new SQLiteDbTypeMapping("IMAGE", DbType.Binary, false),
  1695   1705               new SQLiteDbTypeMapping("INT", DbType.Int32, true),
................................................................................
  1710   1720               new SQLiteDbTypeMapping("MEMO", DbType.String, false),
  1711   1721               new SQLiteDbTypeMapping("MONEY", DbType.Decimal, false),
  1712   1722               new SQLiteDbTypeMapping("NCHAR", DbType.StringFixedLength, true),
  1713   1723               new SQLiteDbTypeMapping("NOTE", DbType.String, false),
  1714   1724               new SQLiteDbTypeMapping("NTEXT", DbType.String, false),
  1715   1725               new SQLiteDbTypeMapping("NUMBER", DbType.Decimal, false),
  1716   1726               new SQLiteDbTypeMapping("NUMERIC", DbType.Decimal, false),
         1727  +            new SQLiteDbTypeMapping("NUMERICTEXT", DbType.Decimal, false),
  1717   1728               new SQLiteDbTypeMapping("NVARCHAR", DbType.String, true),
  1718   1729               new SQLiteDbTypeMapping("OLEOBJECT", DbType.Binary, false),
  1719   1730               new SQLiteDbTypeMapping("RAW", DbType.Binary, false),
  1720   1731               new SQLiteDbTypeMapping("REAL", DbType.Double, true),
  1721   1732               new SQLiteDbTypeMapping("SINGLE", DbType.Single, true),
  1722   1733               new SQLiteDbTypeMapping("SMALLDATE", DbType.DateTime, false),
  1723   1734               new SQLiteDbTypeMapping("SMALLINT", DbType.Int16, true),

Changes to System.Data.SQLite/SQLiteFunction.cs.

   373    373           if (r != null)
   374    374           {
   375    375             _base.ReturnError(context, r.Message);
   376    376             return;
   377    377           }
   378    378         }
   379    379   
   380         -      switch (SQLiteConvert.TypeToAffinity(t))
          380  +      switch (SQLiteConvert.TypeToAffinity(t, _flags))
   381    381         {
   382    382           case TypeAffinity.Null:
   383    383             _base.ReturnNull(context);
   384    384             return;
   385    385           case TypeAffinity.Int64:
   386    386             _base.ReturnInt64(context, Convert.ToInt64(returnValue, CultureInfo.CurrentCulture));
   387    387             return;

Changes to System.Data.SQLite/SQLiteStatement.cs.

   430    430                 _sql.Bind_Text(this, _flags, index, invariantText ?
   431    431                     SQLiteConvert.ToStringWithProvider(obj, invariantCultureInfo) :
   432    432                     obj.ToString());
   433    433             }
   434    434   
   435    435             return;
   436    436         }
          437  +
          438  +      if ((_flags & SQLiteConnectionFlags.BindDecimalAsText) == SQLiteConnectionFlags.BindDecimalAsText)
          439  +      {
          440  +          if (obj is Decimal)
          441  +          {
          442  +              _sql.Bind_Text(this, _flags, index, invariantText ?
          443  +                  SQLiteConvert.ToStringWithProvider(obj, invariantCultureInfo) :
          444  +                  obj.ToString());
          445  +
          446  +              return;
          447  +          }
          448  +      }
   437    449   
   438    450         CultureInfo cultureInfo = CultureInfo.CurrentCulture;
   439    451   
   440    452         if ((_flags & SQLiteConnectionFlags.ConvertInvariantText) == SQLiteConnectionFlags.ConvertInvariantText)
   441    453             cultureInfo = invariantCultureInfo;
   442    454   
   443    455         switch (objType)

Changes to Tests/tkt-56b42d99c1.eagle.

    95     95         [expr {$code eq "Ok" ? [catch {
    96     96           object invoke _Dynamic${id}.Test${id} TryEnlistInTransaction
    97     97         } result] : [set result ""]}] $result
    98     98   } -cleanup {
    99     99     cleanupDb $fileName
   100    100   
   101    101     unset -nocomplain result results errors code dataSource id db fileName
   102         -} -constraints {eagle command.object monoBug211 monoBug46 command.sql\
          102  +} -constraints {eagle command.object monoBug211 monoBug50 command.sql\
   103    103   compile.DATA SQLite System.Data.SQLite compileCSharp} -match regexp -result \
   104    104   {^Ok System#CodeDom#Compiler#CompilerResults#\d+ \{\} 0 True$}}
   105    105   
   106    106   ###############################################################################
   107    107   
   108    108   runTest {test tkt-56b42d99c1-1.2 {enlisted transaction isolation} -setup {
   109    109     setupDb [set fileName tkt-56b42d99c1-1.2.db]
................................................................................
   172    172         [expr {$code eq "Ok" ? [catch {
   173    173           object invoke _Dynamic${id}.Test${id} Main
   174    174         } result] : [set result ""]}] $result
   175    175   } -cleanup {
   176    176     cleanupDb $fileName
   177    177   
   178    178     unset -nocomplain result results errors code sql dataSource id db fileName
   179         -} -constraints {eagle command.object monoBug211 monoBug46 command.sql\
          179  +} -constraints {eagle command.object monoBug211 monoBug50 command.sql\
   180    180   compile.DATA SQLite System.Data.SQLite compileCSharp} -match regexp -result \
   181    181   {^Ok System#CodeDom#Compiler#CompilerResults#\d+ \{\} 0 0$}}
   182    182   
   183    183   ###############################################################################
   184    184   
   185    185   runTest {test tkt-56b42d99c1-1.3 {enlisted transaction isolation} -setup {
   186    186     setupDb [set fileName tkt-56b42d99c1-1.3.db]
................................................................................
   403    403         [expr {$code eq "Ok" ? [catch {
   404    404           object invoke _Dynamic${id}.Test${id} Main
   405    405         } result] : [set result ""]}] $result
   406    406   } -cleanup {
   407    407     cleanupDb $fileName
   408    408   
   409    409     unset -nocomplain result results errors code sql dataSource id db fileName
   410         -} -constraints {eagle command.object monoBug211 monoBug46 command.sql\
          410  +} -constraints {eagle command.object monoBug211 monoBug50 command.sql\
   411    411   compile.DATA SQLite System.Data.SQLite compileCSharp} -match regexp -result \
   412    412   {^Ok System#CodeDom#Compiler#CompilerResults#\d+ \{\} 0 1$}}
   413    413   
   414    414   ###############################################################################
   415    415   
   416    416   set flags MapIsolationLevels
   417    417   
................................................................................
   492    492         [expr {$code eq "Ok" ? [catch {
   493    493           object invoke _Dynamic${id}.Test${id} TryEnlistInTransaction
   494    494         } result] : [set result ""]}] $result
   495    495   } -cleanup {
   496    496     cleanupDb $fileName
   497    497   
   498    498     unset -nocomplain result results errors code dataSource id db fileName
   499         -} -constraints {eagle command.object monoBug28 monoBug211 monoBug46 command.sql\
          499  +} -constraints {eagle command.object monoBug28 monoBug211 monoBug50 command.sql\
   500    500   compile.DATA SQLite System.Data.SQLite compileCSharp} -match regexp -result \
   501    501   {^Ok System#CodeDom#Compiler#CompilerResults#\d+ \{\} 0 True$}}
   502    502   
   503    503   ###############################################################################
   504    504   
   505    505   runTest {test tkt-56b42d99c1-1.7 {enlisted transaction isolation} -setup {
   506    506     setupDb [set fileName tkt-56b42d99c1-1.7.db]
................................................................................
   569    569         [expr {$code eq "Ok" ? [catch {
   570    570           object invoke _Dynamic${id}.Test${id} Main
   571    571         } result] : [set result ""]}] $result
   572    572   } -cleanup {
   573    573     cleanupDb $fileName
   574    574   
   575    575     unset -nocomplain result results errors code sql dataSource id db fileName
   576         -} -constraints {eagle command.object monoBug28 monoBug211 monoBug46 command.sql\
          576  +} -constraints {eagle command.object monoBug28 monoBug211 monoBug50 command.sql\
   577    577   compile.DATA SQLite System.Data.SQLite compileCSharp} -match regexp -result \
   578    578   {^Ok System#CodeDom#Compiler#CompilerResults#\d+ \{\} 0 0$}}
   579    579   
   580    580   ###############################################################################
   581    581   
   582    582   runTest {test tkt-56b42d99c1-1.8 {enlisted transaction isolation} -setup {
   583    583     setupDb [set fileName tkt-56b42d99c1-1.8.db]
................................................................................
   800    800         [expr {$code eq "Ok" ? [catch {
   801    801           object invoke _Dynamic${id}.Test${id} Main
   802    802         } result] : [set result ""]}] $result
   803    803   } -cleanup {
   804    804     cleanupDb $fileName
   805    805   
   806    806     unset -nocomplain result results errors code sql dataSource id db fileName
   807         -} -constraints {eagle command.object monoBug28 monoBug211 monoBug46 command.sql\
          807  +} -constraints {eagle command.object monoBug28 monoBug211 monoBug50 command.sql\
   808    808   compile.DATA SQLite System.Data.SQLite compileCSharp} -match regexp -result \
   809    809   {^Ok System#CodeDom#Compiler#CompilerResults#\d+ \{\} 0 1$}}
   810    810   
   811    811   ###############################################################################
   812    812   
   813    813   unset -nocomplain flags
   814    814   
   815    815   ###############################################################################
   816    816   
   817    817   runSQLiteTestEpilogue
   818    818   runTestEpilogue

Added Tests/tkt-b167206ad3.eagle.

            1  +###############################################################################
            2  +#
            3  +# tkt-b167206ad3.eagle --
            4  +#
            5  +# Written by Joe Mistachkin.
            6  +# Released to the public domain, use at your own risk!
            7  +#
            8  +###############################################################################
            9  +
           10  +package require Eagle
           11  +package require Eagle.Library
           12  +package require Eagle.Test
           13  +
           14  +runTestPrologue
           15  +
           16  +###############################################################################
           17  +
           18  +package require System.Data.SQLite.Test
           19  +runSQLiteTestPrologue
           20  +
           21  +###############################################################################
           22  +
           23  +runTest {test tkt-b167206ad3-1.1 {type affinity for DECIMAL} -setup {
           24  +  setupDb [set fileName tkt-b167206ad3-1.1.db]
           25  +} -body {
           26  +  sql execute $db {
           27  +    CREATE TABLE t1(x INTEGER, y DECIMAL(38,9));
           28  +    INSERT INTO t1 (x, y) VALUES(1, 123456789123456780);
           29  +    INSERT INTO t1 (x, y) VALUES(2, '123456789123456780');
           30  +  }
           31  +
           32  +  set dataReader [sql execute \
           33  +      -execute reader -format datareader \
           34  +      -alias $db "SELECT x, y FROM t1 ORDER BY x;"]
           35  +
           36  +  set result [list]
           37  +
           38  +  while {[$dataReader Read]} {
           39  +    set x [$dataReader -create -alias GetValue 0]
           40  +    set y1 [$dataReader -create -alias GetDecimal 1]
           41  +    set y2 [$dataReader -create -alias GetValue 1]
           42  +
           43  +    lappend result [list [$x ToString] [$y1 ToString] [$y2 ToString]]
           44  +  }
           45  +
           46  +  set result
           47  +} -cleanup {
           48  +  unset -nocomplain dataReader
           49  +
           50  +  cleanupDb $fileName
           51  +
           52  +  unset -nocomplain y2 y1 x result db fileName
           53  +} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
           54  +System.Data.SQLite} -result {{1 123456789123456780 123456789123457000} {2\
           55  +123456789123456780 123456789123457000}}}
           56  +
           57  +###############################################################################
           58  +
           59  +runTest {test tkt-b167206ad3-1.2 {type affinity for DECIMAL} -setup {
           60  +  setupDb [set fileName tkt-b167206ad3-1.2.db] "" "" "" GetDecimalAsText
           61  +} -body {
           62  +  sql execute $db {
           63  +    CREATE TABLE t1(x INTEGER, y DECIMAL(38,9));
           64  +    INSERT INTO t1 (x, y) VALUES(1, 123456789123456780);
           65  +    INSERT INTO t1 (x, y) VALUES(2, '123456789123456780');
           66  +  }
           67  +
           68  +  set dataReader [sql execute \
           69  +      -execute reader -format datareader \
           70  +      -alias $db "SELECT x, y FROM t1 ORDER BY x;"]
           71  +
           72  +  set result [list]
           73  +
           74  +  while {[$dataReader Read]} {
           75  +    set x [$dataReader -create -alias GetValue 0]
           76  +    set y1 [$dataReader -create -alias GetDecimal 1]
           77  +    set y2 [$dataReader -create -alias GetValue 1]
           78  +
           79  +    lappend result [list [$x ToString] [$y1 ToString] [$y2 ToString]]
           80  +  }
           81  +
           82  +  set result
           83  +} -cleanup {
           84  +  unset -nocomplain dataReader
           85  +
           86  +  cleanupDb $fileName
           87  +
           88  +  unset -nocomplain y2 y1 x result db fileName
           89  +} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
           90  +System.Data.SQLite} -result {{1 123456789123456780 123456789123456780} {2\
           91  +123456789123456780 123456789123456780}}}
           92  +
           93  +###############################################################################
           94  +
           95  +runTest {test tkt-b167206ad3-1.3 {type affinity for NUMERIC} -setup {
           96  +  setupDb [set fileName tkt-b167206ad3-1.3.db]
           97  +} -body {
           98  +  sql execute $db {
           99  +    CREATE TABLE t1(x INTEGER, y NUMERIC);
          100  +    INSERT INTO t1 (x, y) VALUES(1, 123456789123456780);
          101  +    INSERT INTO t1 (x, y) VALUES(2, '123456789123456780');
          102  +  }
          103  +
          104  +  set dataReader [sql execute \
          105  +      -execute reader -format datareader \
          106  +      -alias $db "SELECT x, y FROM t1 ORDER BY x;"]
          107  +
          108  +  set result [list]
          109  +
          110  +  while {[$dataReader Read]} {
          111  +    set x [$dataReader -create -alias GetValue 0]
          112  +    set y1 [$dataReader -create -alias GetDecimal 1]
          113  +    set y2 [$dataReader -create -alias GetValue 1]
          114  +
          115  +    lappend result [list [$x ToString] [$y1 ToString] [$y2 ToString]]
          116  +  }
          117  +
          118  +  set result
          119  +} -cleanup {
          120  +  unset -nocomplain dataReader
          121  +
          122  +  cleanupDb $fileName
          123  +
          124  +  unset -nocomplain y2 y1 x result db fileName
          125  +} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
          126  +System.Data.SQLite} -result {{1 123456789123456780 123456789123457000} {2\
          127  +123456789123456780 123456789123457000}}}
          128  +
          129  +###############################################################################
          130  +
          131  +runTest {test tkt-b167206ad3-1.4 {type affinity for NUMERIC} -setup {
          132  +  setupDb [set fileName tkt-b167206ad3-1.4.db] "" "" "" GetDecimalAsText
          133  +} -body {
          134  +  sql execute $db {
          135  +    CREATE TABLE t1(x INTEGER, y NUMERIC);
          136  +    INSERT INTO t1 (x, y) VALUES(1, 123456789123456780);
          137  +    INSERT INTO t1 (x, y) VALUES(2, '123456789123456780');
          138  +  }
          139  +
          140  +  set dataReader [sql execute \
          141  +      -execute reader -format datareader \
          142  +      -alias $db "SELECT x, y FROM t1 ORDER BY x;"]
          143  +
          144  +  set result [list]
          145  +
          146  +  while {[$dataReader Read]} {
          147  +    set x [$dataReader -create -alias GetValue 0]
          148  +    set y1 [$dataReader -create -alias GetDecimal 1]
          149  +    set y2 [$dataReader -create -alias GetValue 1]
          150  +
          151  +    lappend result [list [$x ToString] [$y1 ToString] [$y2 ToString]]
          152  +  }
          153  +
          154  +  set result
          155  +} -cleanup {
          156  +  unset -nocomplain dataReader
          157  +
          158  +  cleanupDb $fileName
          159  +
          160  +  unset -nocomplain y2 y1 x result db fileName
          161  +} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
          162  +System.Data.SQLite} -result {{1 123456789123456780 123456789123456780} {2\
          163  +123456789123456780 123456789123456780}}}
          164  +
          165  +###############################################################################
          166  +
          167  +runTest {test tkt-b167206ad3-2.1 {bind type for DECIMALTEXT} -setup {
          168  +  setupDb [set fileName tkt-b167206ad3-2.1.db]
          169  +} -body {
          170  +  sql execute $db {
          171  +    CREATE TABLE t1(x INTEGER, y DECIMALTEXT(38,9));
          172  +  }
          173  +
          174  +  set d(1) [object invoke -create Decimal Parse 123456789123456780]
          175  +  set d(2) [object invoke -create Decimal Parse 12345678912345.1556346]
          176  +
          177  +  sql execute $db "INSERT INTO t1 (x, y) VALUES(1, ?);" \
          178  +      [list param1 Decimal $d(1)]
          179  +
          180  +  sql execute $db "INSERT INTO t1 (x, y) VALUES(2, ?);" \
          181  +      [list param1 Decimal $d(2)]
          182  +
          183  +  set dataReader [sql execute \
          184  +      -execute reader -format datareader \
          185  +      -alias $db "SELECT x, y FROM t1 ORDER BY x;"]
          186  +
          187  +  set result [list]
          188  +
          189  +  while {[$dataReader Read]} {
          190  +    set x [$dataReader -create -alias GetValue 0]
          191  +    set y1 [$dataReader -create -alias GetDecimal 1]
          192  +    set y2 [$dataReader -create -alias GetValue 1]
          193  +
          194  +    lappend result [list [$x ToString] [$y1 ToString] [$y2 ToString]]
          195  +  }
          196  +
          197  +  set result
          198  +} -cleanup {
          199  +  unset -nocomplain dataReader
          200  +
          201  +  cleanupDb $fileName
          202  +
          203  +  unset -nocomplain y2 y1 x d result db fileName
          204  +} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
          205  +System.Data.SQLite} -result {{1 123456789123456780 123456789123457000} {2\
          206  +12345678912345.1556346 12345678912345.2}}}
          207  +
          208  +###############################################################################
          209  +
          210  +runTest {test tkt-b167206ad3-2.2 {bind type for DECIMALTEXT} -setup {
          211  +  setupDb [set fileName tkt-b167206ad3-2.2.db] "" "" "" \
          212  +      "BindDecimalAsText GetAllAsText"
          213  +} -body {
          214  +  sql execute $db {
          215  +    CREATE TABLE t1(x INTEGER, y DECIMALTEXT(38,9));
          216  +  }
          217  +
          218  +  set d(1) [object invoke -create Decimal Parse 123456789123456780]
          219  +  set d(2) [object invoke -create Decimal Parse 12345678912345.1556346]
          220  +
          221  +  sql execute $db "INSERT INTO t1 (x, y) VALUES(1, ?);" \
          222  +      [list param1 Decimal $d(1)]
          223  +
          224  +  sql execute $db "INSERT INTO t1 (x, y) VALUES(2, ?);" \
          225  +      [list param1 Decimal $d(2)]
          226  +
          227  +  set dataReader [sql execute \
          228  +      -execute reader -format datareader \
          229  +      -alias $db "SELECT x, y FROM t1 ORDER BY x;"]
          230  +
          231  +  set result [list]
          232  +
          233  +  while {[$dataReader Read]} {
          234  +    set x [$dataReader -create -alias GetValue 0]
          235  +    set y1 [$dataReader -create -alias GetDecimal 1]
          236  +    set y2 [$dataReader -create -alias GetValue 1]
          237  +
          238  +    lappend result [list [$x ToString] [$y1 ToString] [$y2 ToString]]
          239  +  }
          240  +
          241  +  set result
          242  +} -cleanup {
          243  +  unset -nocomplain dataReader
          244  +
          245  +  cleanupDb $fileName
          246  +
          247  +  unset -nocomplain y2 y1 x d result db fileName
          248  +} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
          249  +System.Data.SQLite} -result {{1 123456789123456780 123456789123456780} {2\
          250  +12345678912345.1556346 12345678912345.1556346}}}
          251  +
          252  +###############################################################################
          253  +
          254  +runTest {test tkt-b167206ad3-2.3 {bind type for NUMERICTEXT} -setup {
          255  +  setupDb [set fileName tkt-b167206ad3-2.3.db]
          256  +} -body {
          257  +  sql execute $db {
          258  +    CREATE TABLE t1(x INTEGER, y NUMERICTEXT);
          259  +  }
          260  +
          261  +  set d(1) [object invoke -create Decimal Parse 123456789123456780]
          262  +  set d(2) [object invoke -create Decimal Parse 12345678912345.1556346]
          263  +
          264  +  sql execute $db "INSERT INTO t1 (x, y) VALUES(1, ?);" \
          265  +      [list param1 Decimal $d(1)]
          266  +
          267  +  sql execute $db "INSERT INTO t1 (x, y) VALUES(2, ?);" \
          268  +      [list param1 Decimal $d(2)]
          269  +
          270  +  set dataReader [sql execute \
          271  +      -execute reader -format datareader \
          272  +      -alias $db "SELECT x, y FROM t1 ORDER BY x;"]
          273  +
          274  +  set result [list]
          275  +
          276  +  while {[$dataReader Read]} {
          277  +    set x [$dataReader -create -alias GetValue 0]
          278  +    set y1 [$dataReader -create -alias GetDecimal 1]
          279  +    set y2 [$dataReader -create -alias GetValue 1]
          280  +
          281  +    lappend result [list [$x ToString] [$y1 ToString] [$y2 ToString]]
          282  +  }
          283  +
          284  +  set result
          285  +} -cleanup {
          286  +  unset -nocomplain dataReader
          287  +
          288  +  cleanupDb $fileName
          289  +
          290  +  unset -nocomplain y2 y1 x d result db fileName
          291  +} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
          292  +System.Data.SQLite} -result {{1 123456789123456780 123456789123457000} {2\
          293  +12345678912345.1556346 12345678912345.2}}}
          294  +
          295  +###############################################################################
          296  +
          297  +runTest {test tkt-b167206ad3-2.4 {bind type for NUMERICTEXT} -setup {
          298  +  setupDb [set fileName tkt-b167206ad3-2.4.db] "" "" "" \
          299  +      "BindDecimalAsText GetAllAsText"
          300  +} -body {
          301  +  sql execute $db {
          302  +    CREATE TABLE t1(x INTEGER, y NUMERICTEXT);
          303  +  }
          304  +
          305  +  set d(1) [object invoke -create Decimal Parse 123456789123456780]
          306  +  set d(2) [object invoke -create Decimal Parse 12345678912345.1556346]
          307  +
          308  +  sql execute $db "INSERT INTO t1 (x, y) VALUES(1, ?);" \
          309  +      [list param1 Decimal $d(1)]
          310  +
          311  +  sql execute $db "INSERT INTO t1 (x, y) VALUES(2, ?);" \
          312  +      [list param1 Decimal $d(2)]
          313  +
          314  +  set dataReader [sql execute \
          315  +      -execute reader -format datareader \
          316  +      -alias $db "SELECT x, y FROM t1 ORDER BY x;"]
          317  +
          318  +  set result [list]
          319  +
          320  +  while {[$dataReader Read]} {
          321  +    set x [$dataReader -create -alias GetValue 0]
          322  +    set y1 [$dataReader -create -alias GetDecimal 1]
          323  +    set y2 [$dataReader -create -alias GetValue 1]
          324  +
          325  +    lappend result [list [$x ToString] [$y1 ToString] [$y2 ToString]]
          326  +  }
          327  +
          328  +  set result
          329  +} -cleanup {
          330  +  unset -nocomplain dataReader
          331  +
          332  +  cleanupDb $fileName
          333  +
          334  +  unset -nocomplain y2 y1 x d result db fileName
          335  +} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
          336  +System.Data.SQLite} -result {{1 123456789123456780 123456789123456780} {2\
          337  +12345678912345.1556346 12345678912345.1556346}}}
          338  +
          339  +###############################################################################
          340  +
          341  +runSQLiteTestEpilogue
          342  +runTestEpilogue

Changes to lib/System.Data.SQLite/common.eagle.

  1679   1679   
  1680   1680               return true
  1681   1681             } else {
  1682   1682               tputs $channel [appendArgs "yes (" $platform ")\n"]
  1683   1683             }
  1684   1684           } else {
  1685   1685             tputs $channel no\n
         1686  +
         1687  +          if {![file exists $directory] || \
         1688  +              ![file isdirectory $directory]} then {
         1689  +            tputs $channel [appendArgs \
         1690  +                "---- environment variable \"System.Data.SQLite\" is an " \
         1691  +                "invalid directory, skipping check for releases...\n"]
         1692  +
         1693  +            return false
         1694  +          }
  1686   1695   
  1687   1696             foreach path [lsort -decreasing [file list $directory *]] {
  1688   1697               if {[file exists $path] && [file isdirectory $path]} then {
  1689   1698                 tputs $channel [appendArgs \
  1690   1699                     "---- checking for System.Data.SQLite release \"" \
  1691   1700                     $path "\"... "]
  1692   1701   

Changes to readme.htm.

     1      1   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     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         -Version 1.0.106.0 - August XX, 2017 <font color="red">(release scheduled)</font><br />
     9         -Using <a href="https://www.sqlite.org/draft/releaselog/3_20_0.html">SQLite 3.20.0</a><br />Originally written by Robert Simpson<br />
            8  +Version 1.0.106.0 - September XX, 2017 <font color="red">(release scheduled)</font><br />
            9  +Using <a href="https://www.sqlite.org/releaselog/3_20_1.html">SQLite 3.20.1</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 />
................................................................................
   204    204   designed for robustness and maximum backward compatibility with previously
   205    205   released versions of System.Data.SQLite.
   206    206   </p>
   207    207   
   208    208   <h2><b>Version History</b></h2>
   209    209   
   210    210   <p>
   211         -    <b>1.0.106.0 - August XX, 2017 <font color="red">(release scheduled)</font></b>
          211  +    <b>1.0.106.0 - September XX, 2017 <font color="red">(release scheduled)</font></b>
   212    212   </p>
   213    213   <ul>
   214         -    <li>Updated to <a href="https://www.sqlite.org/draft/releaselog/3_20_0.html">SQLite 3.20.0</a>.</li>
          214  +    <li>Updated to <a href="https://www.sqlite.org/releaselog/3_20_1.html">SQLite 3.20.1</a>.</li>
          215  +    <li>Add BindDecimalAsText and GetDecimalAsText connection flags to force binding and returning of decimal values as text. Pursuant to [b167206ad3].</li>
   215    216       <li>Add preliminary support for Visual Studio 2017 and the .NET Framework 4.7.</li>
   216    217   </ul>
   217    218   <p>
   218    219       <b>1.0.105.2 - June 12, 2017</b>
   219    220   </p>
   220    221   <ul>
   221    222       <li>Updated to <a href="https://www.sqlite.org/releaselog/3_19_3.html">SQLite 3.19.3</a>.</li>

Changes to www/news.wiki.

    41     41       Access to archived release packages will be granted on a case-by-case basis.
    42     42     </li>
    43     43   </ul>
    44     44   
    45     45   <div align="center"><h2><b>Version History</b></h2></div>
    46     46   
    47     47   <p>
    48         -    <b>1.0.106.0 - August XX, 2017 <font color="red">(release scheduled)</font></b>
           48  +    <b>1.0.106.0 - September XX, 2017 <font color="red">(release scheduled)</font></b>
    49     49   </p>
    50     50   <ul>
    51         -    <li>Updated to [https://www.sqlite.org/draft/releaselog/3_20_0.html|SQLite 3.20.0].</li>
           51  +    <li>Updated to [https://www.sqlite.org/releaselog/3_20_1.html|SQLite 3.20.1].</li>
           52  +    <li>Add BindDecimalAsText and GetDecimalAsText connection flags to force binding and returning of decimal values as text. Pursuant to [b167206ad3].</li>
    52     53       <li>Add preliminary support for Visual Studio 2017 and the .NET Framework 4.7.</li>
    53     54   </ul>
    54     55   <p>
    55     56       <b>1.0.105.2 - June 12, 2017</b>
    56     57   </p>
    57     58   <ul>
    58     59       <li>Updated to [https://www.sqlite.org/releaselog/3_19_3.html|SQLite 3.19.3].</li>