System.Data.SQLite

Login
This project makes use of Eagle, provided by Mistachkin Systems.
Eagle: Secure Software Automation

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

Overview
Comment:Add the AggressiveDisposal connection flag. Other pre-release fixes.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 8d439ebddedfbcdeace9218f8391199e642bee7b
User & Date: mistachkin 2024-07-02 05:10:27
Context
2024-07-02
14:37
Add some comments. check-in: 3e72cd9da8 user: mistachkin tags: trunk
05:10
Add the AggressiveDisposal connection flag. Other pre-release fixes. check-in: 8d439ebdde user: mistachkin tags: trunk
03:02
More test enhancments. check-in: 943172a587 user: mistachkin tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

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

47
48
49
50
51
52
53

54
55
56
57
58
59
60
    <ul>
      <li>Updated to <a href="https://www.sqlite.org/releaselog/3_46_0.html">SQLite 3.46.0</a>.</li>
      <li>Update internal resource list of reserved SQL words.</li>
      <li>Add experimental support for using NuGet runtime identifiers to help locate the interop assembly. Pursuant to forum post <a href="https://www.sqlite.org/forum/forumpost/3757f4365b">[3757f4365b]</a>.</li>
      <li>Avoid NullReferenceException from Path.Combine method when the PublishSingleFile property is enabled for a project. Pursuant to forum post <a href="https://www.sqlite.org/forum/forumpost/66a0d2716a">[66a0d2716a]</a>.</li>
      <li>Avoid setting up for the Changed event when it will not be fired. Pursuant to forum post <a href="https://www.sqlite.org/forum/forumpost/25cafb35e5">[25cafb35e5]</a>.</li>
      <li>Add the VfsName connection string property.</li>

      <li>Add the &quot;compress&quot; and &quot;zipfile&quot; extensions to the interop assembly.</li>
      <li>Add the GetPasswordCallback property to the SQLiteConnection class for use with <a href="https://www.sqlite.org/see">SEE</a>.</li>
      <li>Add the NoCase property to the SQLiteParameterCollection class.</li>
      <li>Fix rarely seen NullReferenceException in the StaticWeakConnectionPool.Add method.</li>
      <li>Revise the calculation used to bind DateTime values. Fix for <a href="https://system.data.sqlite.org/index.html/info/bbddfeb773">[bbddfeb773]</a>.</li>
      <li>Fix support for unnamed parameters using the ?NNN syntax. Pursuant to forum post <a href="https://www.sqlite.org/forum/forumpost/76cb35b58d">[76cb35b58d]</a>.</li>
    </ul>







>







47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
    <ul>
      <li>Updated to <a href="https://www.sqlite.org/releaselog/3_46_0.html">SQLite 3.46.0</a>.</li>
      <li>Update internal resource list of reserved SQL words.</li>
      <li>Add experimental support for using NuGet runtime identifiers to help locate the interop assembly. Pursuant to forum post <a href="https://www.sqlite.org/forum/forumpost/3757f4365b">[3757f4365b]</a>.</li>
      <li>Avoid NullReferenceException from Path.Combine method when the PublishSingleFile property is enabled for a project. Pursuant to forum post <a href="https://www.sqlite.org/forum/forumpost/66a0d2716a">[66a0d2716a]</a>.</li>
      <li>Avoid setting up for the Changed event when it will not be fired. Pursuant to forum post <a href="https://www.sqlite.org/forum/forumpost/25cafb35e5">[25cafb35e5]</a>.</li>
      <li>Add the VfsName connection string property.</li>
      <li>Add the ConnectionPoolOnly and AggressiveDisposal connection flags.&nbsp;<b>** Potentially Incompatible Change **</b></li>
      <li>Add the &quot;compress&quot; and &quot;zipfile&quot; extensions to the interop assembly.</li>
      <li>Add the GetPasswordCallback property to the SQLiteConnection class for use with <a href="https://www.sqlite.org/see">SEE</a>.</li>
      <li>Add the NoCase property to the SQLiteParameterCollection class.</li>
      <li>Fix rarely seen NullReferenceException in the StaticWeakConnectionPool.Add method.</li>
      <li>Revise the calculation used to bind DateTime values. Fix for <a href="https://system.data.sqlite.org/index.html/info/bbddfeb773">[bbddfeb773]</a>.</li>
      <li>Fix support for unnamed parameters using the ?NNN syntax. Pursuant to forum post <a href="https://www.sqlite.org/forum/forumpost/76cb35b58d">[76cb35b58d]</a>.</li>
    </ul>

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

1559
1560
1561
1562
1563
1564
1565






1566
1567
1568
1569
1570
1571
1572
      /// <summary>
      /// If a connection cannot be opened using the connection pool, throw
      /// an exception instead of default behavior of falling back to using
      /// a non-pooled connection.
      /// </summary>
      ConnectionPoolOnly = 0x10000000000000,







      /// <summary>
      /// When binding parameter values or returning column values, always
      /// treat them as though they were plain text (i.e. no numeric,
      /// date/time, or other conversions should be attempted).
      /// </summary>
      BindAndGetAllAsText = BindAllAsText | GetAllAsText,








>
>
>
>
>
>







1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
      /// <summary>
      /// If a connection cannot be opened using the connection pool, throw
      /// an exception instead of default behavior of falling back to using
      /// a non-pooled connection.
      /// </summary>
      ConnectionPoolOnly = 0x10000000000000,

      /// <summary>
      /// Be more aggressive about disposing of unused native resources,
      /// e.g. connections, transactions, commands, data readers, etc.
      /// </summary>
      AggressiveDisposal = 0x20000000000000,

      /// <summary>
      /// When binding parameter values or returning column values, always
      /// treat them as though they were plain text (i.e. no numeric,
      /// date/time, or other conversions should be attempted).
      /// </summary>
      BindAndGetAllAsText = BindAllAsText | GetAllAsText,

1627
1628
1629
1630
1631
1632
1633
1634

1635
1636
1637
1638
1639
1640
1641
#else
      LogDefault = LogCallbackException,
#endif

      /// <summary>
      /// The default extra flags for new connections.
      /// </summary>
      Default = LogDefault | BindInvariantDecimal | GetInvariantDecimal,


      /// <summary>
      /// The default extra flags for new connections with all logging enabled.
      /// </summary>
      DefaultAndLogAll = Default | LogAll
  }








|
>







1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
#else
      LogDefault = LogCallbackException,
#endif

      /// <summary>
      /// The default extra flags for new connections.
      /// </summary>
      Default = LogDefault | BindInvariantDecimal | GetInvariantDecimal |
                AggressiveDisposal,

      /// <summary>
      /// The default extra flags for new connections with all logging enabled.
      /// </summary>
      DefaultAndLogAll = Default | LogAll
  }

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

250
251
252
253
254
255
256



257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274

275
276
277
278
279
280
281
                        }
                    }

                    if (reader != null)
                    {
                        reader._disposeCommand = true;




                        //
                        // HACK: Copy the statement list to our active reader,
                        //       after adding a reference to each one of the
                        //       valid statements.
                        //
                        if (_statementList != null)
                        {
                            foreach (SQLiteStatement statement in _statementList)
                            {
                                if (statement == null) continue;
                                statement.AddReference();
                            }

                            reader._statementList = _statementList;
                        }
                        else
                        {
                            reader._statementList = null;

                        }

                        _activeReader = null;
                        skippedDispose = true;
                        return;
                    }








>
>
>
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
>







250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
                        }
                    }

                    if (reader != null)
                    {
                        reader._disposeCommand = true;

                        if (HelperMethods.HasFlags(reader._flags,
                                SQLiteConnectionFlags.AggressiveDisposal))
                        {
                            //
                            // HACK: Copy the statement list to our active reader,
                            //       after adding a reference to each one of the
                            //       valid statements.
                            //
                            if (_statementList != null)
                            {
                                foreach (SQLiteStatement statement in _statementList)
                                {
                                    if (statement == null) continue;
                                    statement.AddReference();
                                }

                                reader._statementList = _statementList;
                            }
                            else
                            {
                                reader._statementList = null;
                            }
                        }

                        _activeReader = null;
                        skippedDispose = true;
                        return;
                    }

516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554


555
556

557




558
559
560

561
562
563
564
565
566
567
568
569
570
571
572
    }

    /// <summary>
    /// Builds an array of prepared statements for each complete SQL statement in the command text
    /// </summary>
    internal SQLiteStatement BuildNextCommand()
    {
      SQLiteStatement stmt = null;

      try
      {
        if ((_cnn != null) && (_cnn._sql != null))
        {
          if (_statementList == null)
            _remainingText = _commandText;

          stmt = _cnn._sql.Prepare(_cnn, this, _remainingText, (_statementList == null) ? null : _statementList[_statementList.Count - 1], (uint)(_commandTimeout * 1000), ref _remainingText);

          if (stmt != null)
          {
            stmt.AddReference();
            stmt._command = this;

            if (_statementList == null)
              _statementList = new List<SQLiteStatement>();

            _statementList.Add(stmt);

            _parameterCollection.MapParameters(stmt);
            stmt.BindParameters();
          }
        }
        return stmt;
      }
      catch (Exception)
      {
        if (stmt != null)
        {
          if ((_statementList != null) && _statementList.Contains(stmt))


            _statementList.Remove(stmt);


          if (stmt.RemoveReference() <= 0)




            stmt.Dispose();
        }


        // If we threw an error compiling the statement, we cannot continue on so set the remaining text to null.
        _remainingText = null;

        throw;
      }
    }

    internal SQLiteStatement GetStatement(int index)
    {
      // Haven't built any statements yet
      if (_statementList == null) return BuildNextCommand();








|

|
|
|
|
|
|

|

|
|
|
|

|
|

|

|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
>
|
>
>
>
>
|
|
|
>
|
|

|
|







520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
    }

    /// <summary>
    /// Builds an array of prepared statements for each complete SQL statement in the command text
    /// </summary>
    internal SQLiteStatement BuildNextCommand()
    {
        SQLiteStatement stmt = null;

        try
        {
            if ((_cnn != null) && (_cnn._sql != null))
            {
                if (_statementList == null)
                    _remainingText = _commandText;

                stmt = _cnn._sql.Prepare(_cnn, this, _remainingText, (_statementList == null) ? null : _statementList[_statementList.Count - 1], (uint)(_commandTimeout * 1000), ref _remainingText);

                if (stmt != null)
                {
                    stmt.AddReference();
                    stmt._command = this;

                    if (_statementList == null)
                        _statementList = new List<SQLiteStatement>();

                    _statementList.Add(stmt);

                    _parameterCollection.MapParameters(stmt);
                    stmt.BindParameters();
                }
            }
            return stmt;
        }
        catch (Exception)
        {
            if (stmt != null)
            {
                if ((_statementList != null) &&
                    _statementList.Contains(stmt))
                {
                    _statementList.Remove(stmt);
                }

                if ((stmt.RemoveReference() <= 0) ||
                    !HelperMethods.HasFlags(
                        SQLiteConnection.GetFlags(_cnn),
                        SQLiteConnectionFlags.AggressiveDisposal))
                {
                    stmt.Dispose();
                }
            }

            // If we threw an error compiling the statement, we cannot continue on so set the remaining text to null.
            _remainingText = null;

            throw;
        }
    }

    internal SQLiteStatement GetStatement(int index)
    {
      // Haven't built any statements yet
      if (_statementList == null) return BuildNextCommand();

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

5294
5295
5296
5297
5298
5299
5300



5301
5302
5303
5304
5305
5306
5307

                                    _sql.SetPassword(passwordBytes, true);
                                    _passwordWasText = true;
                                    _passwordWasHex = true;
                                    break;
                                }
                        }



                    }

                    password = null; /* IMMUTABLE */
                }

                hexPassword = null; /* IMMUTABLE */
            }







>
>
>







5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310

                                    _sql.SetPassword(passwordBytes, true);
                                    _passwordWasText = true;
                                    _passwordWasHex = true;
                                    break;
                                }
                        }

                        Array.Clear(passwordBytes, 0, passwordBytes.Length);
                        passwordBytes = null;
                    }

                    password = null; /* IMMUTABLE */
                }

                hexPassword = null; /* IMMUTABLE */
            }
5322
5323
5324
5325
5326
5327
5328

5329
5330
5331
5332
5333
5334
5335

            if (opts.ContainsKey("Password"))
                opts["Password"] = String.Empty;

            _connectionString = BuildConnectionString(opts);
        }
#else

        if (FindKey(opts, "TextHexPassword", null) != null)
        {
            throw new SQLiteException(SQLiteErrorCode.Error,
                "Cannot use \"TextHexPassword\" connection string property: " +
                "library was not built with encryption support, please " +
                "see \"https://www.sqlite.org/see\" for more information");
        }







>







5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339

            if (opts.ContainsKey("Password"))
                opts["Password"] = String.Empty;

            _connectionString = BuildConnectionString(opts);
        }
#else

        if (FindKey(opts, "TextHexPassword", null) != null)
        {
            throw new SQLiteException(SQLiteErrorCode.Error,
                "Cannot use \"TextHexPassword\" connection string property: " +
                "library was not built with encryption support, please " +
                "see \"https://www.sqlite.org/see\" for more information");
        }

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

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    /// <summary>
    /// Underlying command this reader is attached to
    /// </summary>
    private SQLiteCommand _command;
    /// <summary>
    /// The flags pertaining to the associated connection (via the command).
    /// </summary>
    private SQLiteConnectionFlags _flags;
    /// <summary>
    /// Index of the current statement in the command being processed
    /// </summary>
    private int _activeStatementIndex;
    /// <summary>
    /// Current statement being Read()
    /// </summary>







|







22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    /// <summary>
    /// Underlying command this reader is attached to
    /// </summary>
    private SQLiteCommand _command;
    /// <summary>
    /// The flags pertaining to the associated connection (via the command).
    /// </summary>
    internal SQLiteConnectionFlags _flags;
    /// <summary>
    /// Index of the current statement in the command being processed
    /// </summary>
    private int _activeStatementIndex;
    /// <summary>
    /// Current statement being Read()
    /// </summary>
200
201
202
203
204
205
206



207
208

209
210
211
212
213
214
215
            {
                if (disposing)
                {
                    ////////////////////////////////////
                    // dispose managed resources here...
                    ////////////////////////////////////




                    SQLiteCommand.DisposeStatements(
                        false, ref _statementList);

                }

                //////////////////////////////////////
                // release unmanaged resources here...
                //////////////////////////////////////

                //







>
>
>
|
|
>







200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
            {
                if (disposing)
                {
                    ////////////////////////////////////
                    // dispose managed resources here...
                    ////////////////////////////////////

                    if (HelperMethods.HasFlags(_flags,
                            SQLiteConnectionFlags.AggressiveDisposal))
                    {
                        SQLiteCommand.DisposeStatements(
                            false, ref _statementList);
                    }
                }

                //////////////////////////////////////
                // release unmanaged resources here...
                //////////////////////////////////////

                //

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

798
799
800
801
802
803
804





805
806
807
808
809
810
811
      /// Data read from the file system appears to be incorrect.
      /// </summary>
      IoErr_Data = (IoErr | (32 << 8)),
      /// <summary>
      /// File system corruption was detected during a read or write.
      /// </summary>
      IoErr_CorruptFs = (IoErr | (33 << 8)),





      /// <summary>
      /// A database table is locked in shared-cache mode.
      /// </summary>
      Locked_SharedCache = (Locked | (1 << 8)),
      /// <summary>
      /// A virtual table in the database is locked.
      /// </summary>







>
>
>
>
>







798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
      /// Data read from the file system appears to be incorrect.
      /// </summary>
      IoErr_Data = (IoErr | (32 << 8)),
      /// <summary>
      /// File system corruption was detected during a read or write.
      /// </summary>
      IoErr_CorruptFs = (IoErr | (33 << 8)),
      /// <summary>
      /// An exception was caught during use of mapped memory.
      /// In general, this applies only to the WAL journal mode.
      /// </summary>
      IoErr_In_Page = (IoErr | (34 << 8)),
      /// <summary>
      /// A database table is locked in shared-cache mode.
      /// </summary>
      Locked_SharedCache = (Locked | (1 << 8)),
      /// <summary>
      /// A virtual table in the database is locked.
      /// </summary>

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

95
96
97
98
99
100
101
102












103
104
105
106
107
108
109
    /// clauses, expression indexes, partial indexes, and generated columns unless
    /// the function is tagged with SQLITE_INNOCUOUS. Most built-in functions are
    /// innocuous. Developers are advised to avoid using the SQLITE_INNOCUOUS flag
    /// for application-defined functions unless the function has been carefully
    /// audited and found to be free of potentially security-adverse side-effects
    /// and information-leaks.
    /// </summary>
    SQLITE_INNOCUOUS = 0x200000












  }

  /// <summary>
  /// This abstract class is designed to handle user-defined functions easily.  An instance of the derived class is made for each
  /// connection to the database.
  /// </summary>
  /// <remarks>







|
>
>
>
>
>
>
>
>
>
>
>
>







95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
    /// clauses, expression indexes, partial indexes, and generated columns unless
    /// the function is tagged with SQLITE_INNOCUOUS. Most built-in functions are
    /// innocuous. Developers are advised to avoid using the SQLITE_INNOCUOUS flag
    /// for application-defined functions unless the function has been carefully
    /// audited and found to be free of potentially security-adverse side-effects
    /// and information-leaks.
    /// </summary>
    SQLITE_INNOCUOUS = 0x200000,
    /// <summary>
    /// The SQLITE_RESULT_SUBTYPE flag indicates to SQLite that a function
    /// might call sqlite3_result_subtype() to cause a sub-type to be
    /// associated with its result.  Every function that invokes
    /// sqlite3_result_subtype() should have this property.  If it does not,
    /// then the call to sqlite3_result_subtype() might become a no-op if the
    /// function is used as term in an expression index.  On the other hand,
    /// SQL functions that never invoke sqlite3_result_subtype() should avoid
    /// setting this property, as the purpose of this property is to disable
    /// certain optimizations that are incompatible with subtypes.
    /// </summary>
    SQLITE_RESULT_SUBTYPE = 0x1000000
  }

  /// <summary>
  /// This abstract class is designed to handle user-defined functions easily.  An instance of the derived class is made for each
  /// connection to the database.
  /// </summary>
  /// <remarks>

Changes to Tests/tkt-71bedaca19.eagle.

96
97
98
99
100
101
102

103
104
105
106
107
108
109
IoErr_Delete 2570
IoErr_Delete_NoEnt 5898
IoErr_Dir_Close 4362
IoErr_Dir_Fsync 1290
IoErr_Fstat 1802
IoErr_Fsync 1034
IoErr_GetTempPath 6410

IoErr_Lock 3850
IoErr_Mmap 6154
IoErr_NoMem 3082
IoErr_RdLock 2314
IoErr_Read 266
IoErr_Rollback_Atomic 7946
IoErr_Seek 5642







>







96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
IoErr_Delete 2570
IoErr_Delete_NoEnt 5898
IoErr_Dir_Close 4362
IoErr_Dir_Fsync 1290
IoErr_Fstat 1802
IoErr_Fsync 1034
IoErr_GetTempPath 6410
IoErr_In_Page 8714
IoErr_Lock 3850
IoErr_Mmap 6154
IoErr_NoMem 3082
IoErr_RdLock 2314
IoErr_Read 266
IoErr_Rollback_Atomic 7946
IoErr_Seek 5642

Changes to readme.htm.

213
214
215
216
217
218
219

220
221
222
223
224
225
226
<ul>
    <li>Updated to <a href="https://www.sqlite.org/releaselog/3_46_0.html">SQLite 3.46.0</a>.</li>
    <li>Update internal resource list of reserved SQL words.</li>
    <li>Add experimental support for using NuGet runtime identifiers to help locate the interop assembly. Pursuant to forum post [3757f4365b].</li>
    <li>Avoid NullReferenceException from Path.Combine method when the PublishSingleFile property is enabled for a project. Pursuant to forum post [66a0d2716a].</li>
    <li>Avoid setting up for the Changed event when it will not be fired. Pursuant to forum post [25cafb35e5].</li>
    <li>Add the VfsName connection string property.</li>

    <li>Add the &quot;compress&quot; and &quot;zipfile&quot; extensions to the interop assembly.</li>
    <li>Add the GetPasswordCallback property to the SQLiteConnection class for use with <a href="https://www.sqlite.org/see">SEE</a>.</li>
    <li>Add the NoCase property to the SQLiteParameterCollection class.</li>
    <li>Fix rarely seen NullReferenceException in the StaticWeakConnectionPool.Add method.</li>
    <li>Revise the calculation used to bind DateTime values. Fix for [bbddfeb773].</li>
    <li>Fix support for unnamed parameters using the ?NNN syntax. Pursuant to forum post [76cb35b58d].</li>
</ul>







>







213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
<ul>
    <li>Updated to <a href="https://www.sqlite.org/releaselog/3_46_0.html">SQLite 3.46.0</a>.</li>
    <li>Update internal resource list of reserved SQL words.</li>
    <li>Add experimental support for using NuGet runtime identifiers to help locate the interop assembly. Pursuant to forum post [3757f4365b].</li>
    <li>Avoid NullReferenceException from Path.Combine method when the PublishSingleFile property is enabled for a project. Pursuant to forum post [66a0d2716a].</li>
    <li>Avoid setting up for the Changed event when it will not be fired. Pursuant to forum post [25cafb35e5].</li>
    <li>Add the VfsName connection string property.</li>
    <li>Add the ConnectionPoolOnly and AggressiveDisposal connection flags.&nbsp;<b>** Potentially Incompatible Change **</b></li>
    <li>Add the &quot;compress&quot; and &quot;zipfile&quot; extensions to the interop assembly.</li>
    <li>Add the GetPasswordCallback property to the SQLiteConnection class for use with <a href="https://www.sqlite.org/see">SEE</a>.</li>
    <li>Add the NoCase property to the SQLiteParameterCollection class.</li>
    <li>Fix rarely seen NullReferenceException in the StaticWeakConnectionPool.Add method.</li>
    <li>Revise the calculation used to bind DateTime values. Fix for [bbddfeb773].</li>
    <li>Fix support for unnamed parameters using the ?NNN syntax. Pursuant to forum post [76cb35b58d].</li>
</ul>

Changes to www/news.wiki.

60
61
62
63
64
65
66

67
68
69
70
71
72
73
<ul>
    <li>Updated to [https://www.sqlite.org/releaselog/3_46_0.html|SQLite 3.46.0].</li>
    <li>Update internal resource list of reserved SQL words.</li>
    <li>Add experimental support for using NuGet runtime identifiers to help locate the interop assembly. Pursuant to forum post [https://www.sqlite.org/forum/forumpost/3757f4365b|3757f4365b].</li>
    <li>Avoid NullReferenceException from Path.Combine method when the PublishSingleFile property is enabled for a project. Pursuant to forum post [https://www.sqlite.org/forum/forumpost/66a0d2716a|66a0d2716a].</li>
    <li>Avoid setting up for the Changed event when it will not be fired. Pursuant to forum post [https://www.sqlite.org/forum/forumpost/25cafb35e5|25cafb35e5]</a>.</li>
    <li>Add the VfsName connection string property.</li>

    <li>Add the &quot;compress&quot; and &quot;zipfile&quot; extensions to the interop assembly.</li>
    <li>Add the GetPasswordCallback property to the SQLiteConnection class for use with [https://www.sqlite.org/see|SEE].</li>
    <li>Add the NoCase property to the SQLiteParameterCollection class.</li>
    <li>Fix rarely seen NullReferenceException in the StaticWeakConnectionPool.Add method.</li>
    <li>Revise the calculation used to bind DateTime values. Fix for [bbddfeb773].</li>
    <li>Fix support for unnamed parameters using the ?NNN syntax. Pursuant to forum post [https://www.sqlite.org/forum/forumpost/76cb35b58d|76cb35b58d].</li>
</ul>







>







60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<ul>
    <li>Updated to [https://www.sqlite.org/releaselog/3_46_0.html|SQLite 3.46.0].</li>
    <li>Update internal resource list of reserved SQL words.</li>
    <li>Add experimental support for using NuGet runtime identifiers to help locate the interop assembly. Pursuant to forum post [https://www.sqlite.org/forum/forumpost/3757f4365b|3757f4365b].</li>
    <li>Avoid NullReferenceException from Path.Combine method when the PublishSingleFile property is enabled for a project. Pursuant to forum post [https://www.sqlite.org/forum/forumpost/66a0d2716a|66a0d2716a].</li>
    <li>Avoid setting up for the Changed event when it will not be fired. Pursuant to forum post [https://www.sqlite.org/forum/forumpost/25cafb35e5|25cafb35e5]</a>.</li>
    <li>Add the VfsName connection string property.</li>
    <li>Add the ConnectionPoolOnly and AggressiveDisposal connection flags.&nbsp;<b>** Potentially Incompatible Change **</b></li>
    <li>Add the &quot;compress&quot; and &quot;zipfile&quot; extensions to the interop assembly.</li>
    <li>Add the GetPasswordCallback property to the SQLiteConnection class for use with [https://www.sqlite.org/see|SEE].</li>
    <li>Add the NoCase property to the SQLiteParameterCollection class.</li>
    <li>Fix rarely seen NullReferenceException in the StaticWeakConnectionPool.Add method.</li>
    <li>Revise the calculation used to bind DateTime values. Fix for [bbddfeb773].</li>
    <li>Fix support for unnamed parameters using the ?NNN syntax. Pursuant to forum post [https://www.sqlite.org/forum/forumpost/76cb35b58d|76cb35b58d].</li>
</ul>