Index: Doc/Extra/version.html ================================================================== --- Doc/Extra/version.html +++ Doc/Extra/version.html @@ -46,10 +46,12 @@

1.0.87.0 - June XX, 2013 (release scheduled)

Index: System.Data.SQLite/SQLite3.cs ================================================================== --- System.Data.SQLite/SQLite3.cs +++ System.Data.SQLite/SQLite3.cs @@ -234,10 +234,14 @@ } } /////////////////////////////////////////////////////////////////////////////////////////////// + /// + /// Attempts to interrupt the query currently executing on the associated + /// native database connection. + /// internal override void Cancel() { UnsafeNativeMethods.sqlite3_interrupt(_sql); } @@ -411,10 +415,16 @@ { SQLiteErrorCode rc = UnsafeNativeMethods.sqlite3_shutdown(); return rc; } + /// + /// Determines if the associated native connection handle is open. + /// + /// + /// Non-zero if the associated native connection handle is open. + /// internal override bool IsOpen() { return (_sql != null) && !_sql.IsInvalid && !_sql.IsClosed; } @@ -476,13 +486,16 @@ if (n != SQLiteErrorCode.Ok) throw new SQLiteException(n, null); _sql = new SQLiteConnectionHandle(db, true); } lock (_sql) { /* HACK: Force the SyncBlock to be "created" now. */ } } + // Bind functions to this connection. If any previous functions of the same name // were already bound, then the new bindings replace the old. - _functionsArray = SQLiteFunction.BindFunctions(this, connectionFlags); + if ((connectionFlags & SQLiteConnectionFlags.NoFunctions) != SQLiteConnectionFlags.NoFunctions) + _functionsArray = SQLiteFunction.BindFunctions(this, connectionFlags); + SetTimeout(0); GC.KeepAlive(_sql); } internal override void ClearPool() Index: System.Data.SQLite/SQLite3_UTF16.cs ================================================================== --- System.Data.SQLite/SQLite3_UTF16.cs +++ System.Data.SQLite/SQLite3_UTF16.cs @@ -191,11 +191,16 @@ if (n != SQLiteErrorCode.Ok) throw new SQLiteException(n, null); _sql = new SQLiteConnectionHandle(db, true); } lock (_sql) { /* HACK: Force the SyncBlock to be "created" now. */ } } - _functionsArray = SQLiteFunction.BindFunctions(this, connectionFlags); + + // Bind functions to this connection. If any previous functions of the same name + // were already bound, then the new bindings replace the old. + if ((connectionFlags & SQLiteConnectionFlags.NoFunctions) != SQLiteConnectionFlags.NoFunctions) + _functionsArray = SQLiteFunction.BindFunctions(this, connectionFlags); + SetTimeout(0); GC.KeepAlive(_sql); } internal override void Bind_DateTime(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, DateTime dt) Index: System.Data.SQLite/SQLiteBase.cs ================================================================== --- System.Data.SQLite/SQLiteBase.cs +++ System.Data.SQLite/SQLiteBase.cs @@ -74,13 +74,15 @@ /// Shutdown the SQLite engine so that it can be restarted with different config options. /// We depend on auto initialization to recover. /// internal abstract SQLiteErrorCode Shutdown(); /// - /// Returns non-zero if a database connection is open. + /// Determines if the associated native connection handle is open. /// - /// + /// + /// Non-zero if a database connection is open. + /// internal abstract bool IsOpen(); /// /// Opens a database. /// /// @@ -147,10 +149,15 @@ /// transparently attempt to rebuild the SQL statement and throw an error if that was not possible. /// /// The statement to reset /// Returns -1 if the schema changed while resetting, 0 if the reset was sucessful or 6 (SQLITE_LOCKED) if the reset failed due to a lock internal abstract SQLiteErrorCode Reset(SQLiteStatement stmt); + + /// + /// Attempts to interrupt the query currently executing on the associated + /// native database connection. + /// internal abstract void Cancel(); internal abstract void Bind_Double(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, double value); internal abstract void Bind_Int32(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, Int32 value); internal abstract void Bind_UInt32(SQLiteStatement stmt, SQLiteConnectionFlags flags, int index, UInt32 value); @@ -896,10 +903,16 @@ /// Prevent this object instance from /// creating virtual table modules. /// NoCreateModule = 0x400, + /// + /// Skip adding the any functions provided by other managed assemblies + /// when opening the connection. + /// + NoFunctions = 0x800, + /// /// When binding and returning column values, always treat them as though /// they were plain text (i.e. no numeric, date/time, or other conversions /// should be attempted). /// Index: System.Data.SQLite/SQLiteConvert.cs ================================================================== --- System.Data.SQLite/SQLiteConvert.cs +++ System.Data.SQLite/SQLiteConvert.cs @@ -1086,10 +1086,11 @@ new SQLiteDbTypeMapping("BIT", DbType.Boolean, true), new SQLiteDbTypeMapping("BLOB", DbType.Binary, true), new SQLiteDbTypeMapping("BOOL", DbType.Boolean, false), new SQLiteDbTypeMapping("BOOLEAN", DbType.Boolean, false), new SQLiteDbTypeMapping("CHAR", DbType.AnsiStringFixedLength, true), + new SQLiteDbTypeMapping("CLOB", DbType.String, false), new SQLiteDbTypeMapping("COUNTER", DbType.Int64, false), new SQLiteDbTypeMapping("CURRENCY", DbType.Decimal, false), new SQLiteDbTypeMapping("DATE", DbType.DateTime, false), new SQLiteDbTypeMapping("DATETIME", DbType.DateTime, true), new SQLiteDbTypeMapping("DECIMAL", DbType.Decimal, true), @@ -1117,13 +1118,15 @@ new SQLiteDbTypeMapping("MEMO", DbType.String, false), new SQLiteDbTypeMapping("MONEY", DbType.Decimal, false), new SQLiteDbTypeMapping("NCHAR", DbType.StringFixedLength, true), new SQLiteDbTypeMapping("NOTE", DbType.String, false), new SQLiteDbTypeMapping("NTEXT", DbType.String, false), + new SQLiteDbTypeMapping("NUMBER", DbType.Decimal, false), new SQLiteDbTypeMapping("NUMERIC", DbType.Decimal, false), new SQLiteDbTypeMapping("NVARCHAR", DbType.String, true), new SQLiteDbTypeMapping("OLEOBJECT", DbType.Binary, false), + new SQLiteDbTypeMapping("RAW", DbType.Binary, false), new SQLiteDbTypeMapping("REAL", DbType.Double, true), new SQLiteDbTypeMapping("SINGLE", DbType.Single, true), new SQLiteDbTypeMapping("SMALLDATE", DbType.DateTime, false), new SQLiteDbTypeMapping("SMALLINT", DbType.Int16, true), new SQLiteDbTypeMapping("SMALLUINT", DbType.UInt16, true), @@ -1145,10 +1148,11 @@ new SQLiteDbTypeMapping("UNSIGNEDINTEGER16", DbType.UInt16, false), new SQLiteDbTypeMapping("UNSIGNEDINTEGER32", DbType.UInt32, false), new SQLiteDbTypeMapping("UNSIGNEDINTEGER64", DbType.UInt64, false), new SQLiteDbTypeMapping("VARBINARY", DbType.Binary, false), new SQLiteDbTypeMapping("VARCHAR", DbType.AnsiString, true), + new SQLiteDbTypeMapping("VARCHAR2", DbType.AnsiString, false), new SQLiteDbTypeMapping("YESNO", DbType.Boolean, false) }); } /// Index: System.Data.SQLite/SQLiteFunction.cs ================================================================== --- System.Data.SQLite/SQLiteFunction.cs +++ System.Data.SQLite/SQLiteFunction.cs @@ -466,11 +466,11 @@ // // NOTE: This must be done to prevent the core SQLite library from // using our (invalid) result. // - if (_base != null) + if ((_base != null) && _base.IsOpen()) _base.Cancel(); return 0; } @@ -513,11 +513,11 @@ // // NOTE: This must be done to prevent the core SQLite library from // using our (invalid) result. // - if (_base != null) + if ((_base != null) && _base.IsOpen()) _base.Cancel(); return 0; } Index: System.Data.SQLite/SQLiteModule.cs ================================================================== --- System.Data.SQLite/SQLiteModule.cs +++ System.Data.SQLite/SQLiteModule.cs @@ -5878,10 +5878,34 @@ #endregion /////////////////////////////////////////////////////////////////////// #region Function Declaration Helper Methods + /// + /// Calls the native SQLite core library in order to declare a virtual + /// table function in response to a call into the + /// + /// or virtual table + /// methods. + /// + /// + /// The object instance to use when + /// declaring the schema of the virtual table. + /// + /// + /// The number of arguments to the function being declared. + /// + /// + /// The name of the function being declared. + /// + /// + /// Upon success, the contents of this parameter are undefined. Upon + /// failure, it should contain an appropriate error message. + /// + /// + /// A standard SQLite return code. + /// protected virtual SQLiteErrorCode DeclareFunction( SQLiteConnection connection, int argumentCount, string name, ref string error Index: Tests/basic.eagle ================================================================== --- Tests/basic.eagle +++ Tests/basic.eagle @@ -1459,17 +1459,17 @@ ############################################################################### runTest {test data-1.27 {VARCHAR / NVARCHAR types with spaces} -body { list [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ - TypeNameToDbType "VARCHAR"] \ + TypeNameToDbType VARCHAR] \ + [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ + TypeNameToDbType NVARCHAR] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ - TypeNameToDbType "NVARCHAR"] \ + TypeNameToDbType VARCHAR(1)] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ - TypeNameToDbType "VARCHAR(1)"] \ - [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ - TypeNameToDbType "NVARCHAR(1)"] \ + TypeNameToDbType NVARCHAR(1)] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ TypeNameToDbType "VARCHAR (1)"] \ [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ TypeNameToDbType "NVARCHAR (1)"] \ } -constraints {eagle System.Data.SQLite} -result \ ADDED Tests/tkt-fe50b8c2e8.eagle Index: Tests/tkt-fe50b8c2e8.eagle ================================================================== --- /dev/null +++ Tests/tkt-fe50b8c2e8.eagle @@ -0,0 +1,46 @@ +############################################################################### +# +# tkt-fe50b8c2e8.eagle -- +# +# Written by Joe Mistachkin. +# Released to the public domain, use at your own risk! +# +############################################################################### + +package require Eagle +package require Eagle.Library +package require Eagle.Test + +runTestPrologue + +############################################################################### + +package require System.Data.SQLite.Test +runSQLiteTestPrologue + +############################################################################### + +runTest {test tkt-fe50b8c2e8-1.1 {compatibility data types} -body { + list [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ + TypeNameToDbType VARCHAR2] \ + [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ + TypeNameToDbType CLOB] \ + [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ + TypeNameToDbType NUMBER] \ + [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ + TypeNameToDbType RAW] \ + [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ + DbTypeToTypeName AnsiString] \ + [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ + DbTypeToTypeName String] \ + [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ + DbTypeToTypeName Decimal] \ + [object invoke -flags +NonPublic System.Data.SQLite.SQLiteConvert \ + DbTypeToTypeName Binary] +} -constraints {eagle System.Data.SQLite} -result \ +{AnsiString String Decimal Binary VARCHAR NVARCHAR DECIMAL BLOB}} + +############################################################################### + +runSQLiteTestEpilogue +runTestEpilogue Index: Tests/vtab.eagle ================================================================== --- Tests/vtab.eagle +++ Tests/vtab.eagle @@ -19,11 +19,11 @@ runSQLiteTestPrologue ############################################################################### runTest {test vtab-1.1 {basic virtual table support} -setup { - setupDb [set fileName vtab-1.1.db] + set fileName vtab-1.1.db } -body { set id [object invoke Interpreter.GetActive NextId] set dataSource [file join [getDatabaseDirectory] $fileName] set sql { \ @@ -98,20 +98,20 @@ object invoke _Dynamic${id}.Test${id} Main } result] : [set result ""]}] $result } -cleanup { cleanupDb $fileName - unset -nocomplain result code results errors sql dataSource id db fileName + unset -nocomplain result code results errors sql dataSource id fileName } -constraints \ {eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite\ defineConstant.System.Data.SQLite.INTEROP_VIRTUAL_TABLE} -match regexp -result \ {^Ok System#CodeDom#Compiler#CompilerResults#\d+ \{\} 0 \{\}$}} ############################################################################### runTest {test vtab-1.2 {IEnumerable virtual table} -setup { - setupDb [set fileName vtab-1.2.db] + set fileName vtab-1.2.db } -body { set id [object invoke Interpreter.GetActive NextId] set dataSource [file join [getDatabaseDirectory] $fileName] set sql(1) { \ @@ -203,11 +203,11 @@ object invoke _Dynamic${id}.Test${id} GetList one two three 4 5.0 } result] : [set result ""]}] $result } -cleanup { cleanupDb $fileName - unset -nocomplain result code results errors sql dataSource id db fileName + unset -nocomplain result code results errors sql dataSource id fileName } -constraints \ {eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite\ defineConstant.System.Data.SQLite.INTEROP_VIRTUAL_TABLE} -match regexp -result \ [string map [list \n \r\n] {^Ok System#CodeDom#Compiler#CompilerResults#\d+\ \{\} 0 \{one two three 4 5.0 Error \{SQL logic error or missing database @@ -214,11 +214,11 @@ virtual table "t\d+" is read-only\}\}$}]} ############################################################################### runTest {test vtab-1.3 {IEnumerable virtual table} -setup { - setupDb [set fileName vtab-1.3.db] + set fileName vtab-1.3.db } -body { set id [object invoke Interpreter.GetActive NextId] set dataSource [file join [getDatabaseDirectory] $fileName] set sql(1) { \ @@ -311,11 +311,11 @@ object invoke _Dynamic${id}.Test${id} GetList 1 2 3 4 5 } result] : [set result ""]}] $result } -cleanup { cleanupDb $fileName - unset -nocomplain result code results errors sql dataSource id db fileName + unset -nocomplain result code results errors sql dataSource id fileName } -constraints \ {eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite\ defineConstant.System.Data.SQLite.INTEROP_VIRTUAL_TABLE} -match regexp -result \ [string map [list \n \r\n] {^Ok System#CodeDom#Compiler#CompilerResults#\d+\ \{\} 0 \{1 2 3 4 5 Error \{SQL logic error or missing database @@ -322,11 +322,264 @@ virtual table "t\d+" is read-only\}\}$}]} ############################################################################### runTest {test vtab-1.4 {virtual table function support} -setup { - setupDb [set fileName vtab-1.4.db] + set fileName vtab-1.4.db +} -body { + set id [object invoke Interpreter.GetActive NextId] + set dataSource [file join [getDatabaseDirectory] $fileName] + + set sql(1) { \ + CREATE VIRTUAL TABLE t${id} USING mod${id}; \ + } + + set sql(2) { \ + SELECT Base64(x, CAST('one' AS BLOB)) FROM t${id}; \ + } + + set sql(3) { \ + SELECT Base64(x, CAST('one' AS BLOB), 'two') FROM t${id}; \ + } + + set sql(4) { \ + SELECT Base65(x, CAST('one' AS BLOB)) FROM t${id}; \ + } + + unset -nocomplain results errors + + set code [compileCSharpWith [subst { + using System; + using System.Data.SQLite; + using Eagle._Containers.Public; + + namespace _Dynamic${id} + { + public class SQLiteFunction${id} : SQLiteFunction + { + public SQLiteFunction${id}() + : base(SQLiteDateFormats.Default, DateTimeKind.Unspecified, + null, false) + { + // do nothing. + } + + /////////////////////////////////////////////////////////////////////// + + public override object Invoke( + object\[\] args + ) + { + if (args == null) + return null; + + if (args.Length != 2) + return new ArgumentException(String.Format( + "need exactly two arguments, got {0}", args.Length)); + + object arg = args\[1\]; + + if (arg == null) + return String.Empty; + + Type type = arg.GetType(); + + if (type == typeof(DBNull)) + return String.Empty; + + if (type != typeof(byte\[\])) + return new ArgumentException(String.Format( + "argument must be byte array, got {0}", type)); + + return Convert.ToBase64String((byte\[\]) arg); + } + } + + ///////////////////////////////////////////////////////////////////////// + + public sealed class SQLiteModuleTest${id} : SQLiteModuleNoop + { + public SQLiteModuleTest${id}(string name) + : base(name) + { + // do nothing. + } + + /////////////////////////////////////////////////////////////////////// + + public override SQLiteErrorCode Create( + SQLiteConnection connection, + IntPtr pClientData, + string\[\] arguments, + ref SQLiteVirtualTable table, + ref string error + ) + { + SQLiteErrorCode rc = DeclareTable( + connection, "CREATE TABLE ignored(x);", ref error); + + if (rc != SQLiteErrorCode.Ok) + return rc; + + rc = DeclareFunction(connection, -1, "Base64", ref error); + + if (rc != SQLiteErrorCode.Ok) + return rc; + + table = new SQLiteVirtualTable(arguments); + return SQLiteErrorCode.Ok; + } + + /////////////////////////////////////////////////////////////////////// + + public override SQLiteErrorCode Open( + SQLiteVirtualTable table, + ref SQLiteVirtualTableCursor cursor + ) + { + cursor = new SQLiteVirtualTableCursor(table); + return SQLiteErrorCode.Ok; + } + + /////////////////////////////////////////////////////////////////////// + + public override bool FindFunction( + SQLiteVirtualTable table, + int argumentCount, + string name, + ref SQLiteFunction function, + ref IntPtr pClientData + ) + { + if (argumentCount != 2) + { + SetTableError(table, String.Format( + "no \\"{0}\\" functions accept {1} argument(s)", + base.Name, argumentCount)); + + return false; + } + + if (!String.Equals(name, "Base64", + StringComparison.OrdinalIgnoreCase)) + { + SetTableError(table, String.Format( + "no \\"{0}\\" functions are named \\"{1}\\"", + base.Name, name)); + + return false; + } + + function = new SQLiteFunction${id}(); + return true; + } + } + + ///////////////////////////////////////////////////////////////////////// + + public static class Test${id} + { + public static StringList GetList() + { + StringList result = new StringList(); + + using (SQLiteConnection connection = new SQLiteConnection( + "Data Source=${dataSource};Flags=NoFunctions;")) + { + connection.Open(); + connection.CreateModule(new SQLiteModuleTest${id}("mod${id}")); + + try + { + using (SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "[subst ${sql(1)}]"; + result.Add(String.Format("{0}", command.ExecuteScalar())); + } + } + catch (Exception e) + { + result.Add(e.Message); + } + + try + { + using (SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "[subst ${sql(2)}]"; + result.Add(String.Format("{0}", command.ExecuteScalar())); + } + } + catch (Exception e) + { + result.Add(e.Message); + } + + try + { + using (SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "[subst ${sql(3)}]"; + result.Add(String.Format("{0}", command.ExecuteScalar())); + } + } + catch (Exception e) + { + result.Add(e.Message); + } + + try + { + using (SQLiteCommand command = connection.CreateCommand()) + { + command.CommandText = "[subst ${sql(4)}]"; + result.Add(String.Format("{0}", command.ExecuteScalar())); + } + } + catch (Exception e) + { + result.Add(e.Message); + } + + connection.Close(); + } + + return result; + } + + /////////////////////////////////////////////////////////////////////// + + public static void Main() + { + // do nothing. + } + } + } + }] true true true results errors [list System.Data.SQLite.dll Eagle.dll]] + + list $code $results \ + [expr {[info exists errors] ? $errors : ""}] \ + [expr {$code eq "Ok" ? [catch { + object invoke _Dynamic${id}.Test${id} GetList + } result] : [set result ""]}] $result +} -cleanup { + cleanupDb $fileName + + unset -nocomplain result code results errors sql dataSource id fileName +} -constraints \ +{eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite\ +defineConstant.System.Data.SQLite.INTEROP_VIRTUAL_TABLE} -match regexp -result \ +[string map [list \n \r\n] {^Ok System#CodeDom#Compiler#CompilerResults#\d+\ +\{\} 0 \{\{\} b25l \{SQL logic error or missing database +unable to use function Base64 in the requested context\} \{SQL logic error or\ +missing database +no such function: Base65\}\}$}]} + +############################################################################### + +runTest {test vtab-1.5 {virtual table function support} -setup { + set fileName vtab-1.5.db } -body { set id [object invoke Interpreter.GetActive NextId] set dataSource [file join [getDatabaseDirectory] $fileName] set sql(1) { \ @@ -562,19 +815,19 @@ object invoke _Dynamic${id}.Test${id} GetList } result] : [set result ""]}] $result } -cleanup { cleanupDb $fileName - unset -nocomplain result code results errors sql dataSource id db fileName + unset -nocomplain result code results errors sql dataSource id fileName } -constraints \ {eagle monoBug28 command.sql compile.DATA SQLite System.Data.SQLite\ defineConstant.System.Data.SQLite.INTEROP_VIRTUAL_TABLE} -match regexp -result \ [string map [list \n \r\n] {^Ok System#CodeDom#Compiler#CompilerResults#\d+\ \{\} 0 \{\{\} b25l \{SQL logic error or missing database -unable to use function Base64 in the requested context\} \{SQL logic error or\ -missing database +(?:unable to use function Base64 in the requested context|need exactly one\ +argument, got 3)\} \{SQL logic error or missing database no such function: Base65\}\}$}]} ############################################################################### runSQLiteTestEpilogue runTestEpilogue Index: readme.htm ================================================================== --- readme.htm +++ readme.htm @@ -191,10 +191,12 @@

  • Add all the necessary infrastructure to allow virtual tables to be implemented in managed code. Fix for [9a544991be].
  • The DbType to type name translation needs to prioritize the Entity Framework type names. Fix for [47f4bac575].
  • Add DateTimeFormatString connection string property to allow the DateTime format string used for all parsing and formatting to be overridden.
  • +
  • Add NoFunctions connection flag to skip binding functions registered in the application domain.
  • +
  • Add several data-types for compatibility purposes. Fix for [fe50b8c2e8].
  • When reading a DateTime value, avoid unnecessary string conversions. Fix for [4d87fbc742].
  • Modify the index introspection code so that it does not treat PRAGMA table_info "pk" column values as boolean. Fix for [f2c47a01eb].
  • Disable use of the new connection string parsing algorithm when the No_SQLiteConnectionNewParser environment variable is set. Pursuant to [bbdda6eae2].
  • Rename the ReturnCode property of the SQLiteException class to ResultCode. ** Potentially Incompatible Change **
Index: www/news.wiki ================================================================== --- www/news.wiki +++ www/news.wiki @@ -7,10 +7,12 @@

  • Add all the necessary infrastructure to allow virtual tables to be implemented in managed code. Fix for [9a544991be].
  • The DbType to type name translation needs to prioritize the Entity Framework type names. Fix for [47f4bac575].
  • Add DateTimeFormatString connection string property to allow the DateTime format string used for all parsing and formatting to be overridden.
  • +
  • Add NoFunctions connection flag to skip binding functions registered in the application domain.
  • +
  • Add several data-types for compatibility purposes. Fix for [fe50b8c2e8].
  • When reading a DateTime value, avoid unnecessary string conversions. Fix for [4d87fbc742].
  • Modify the index introspection code so that it does not treat PRAGMA table_info "pk" column values as boolean. Fix for [f2c47a01eb].
  • Disable use of the new connection string parsing algorithm when the No_SQLiteConnectionNewParser environment variable is set. Pursuant to [bbdda6eae2].
  • Rename the ReturnCode property of the SQLiteException class to ResultCode. ** Potentially Incompatible Change **