System.Data.SQLite
Check-in [bf714af93b]
Not logged in

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

Overview
Comment:Get this branch up-to-date with most trunk changes.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | branch-1.0.112
Files: files | file ages | folders
SHA1: bf714af93b7c9378fa5142c94fb9201598557685
User & Date: mistachkin 2020-05-24 00:36:30
Context
2020-05-30
14:39
Cherrypick of [1f32d0222f902faa]. check-in: c52f0efc92 user: mistachkin tags: branch-1.0.112
2020-05-24
00:36
Get this branch up-to-date with most trunk changes. check-in: bf714af93b user: mistachkin tags: branch-1.0.112
2020-05-22
21:30
Update version history docs. check-in: 782f3a82d9 user: mistachkin tags: trunk
2020-04-26
02:42
Cherrypick of [e3b31857dc55530137]. check-in: e1ea8c4460 user: mistachkin tags: branch-1.0.112
2020-04-25
19:21
Support automatic value conversions for columns with a declared type of MEDIUMINT or MEDIUMUINT. Pursuant to [515cb60b10]. check-in: b4eb15b5a5 user: mistachkin tags: trunk
2020-03-05
00:36
More work on tests. Rename the new environment variable. check-in: f6f755c1ee user: mistachkin tags: trunk
2020-03-04
03:31
Fix typos in comments. check-in: 4194e07323 user: mistachkin tags: trunk
03:25
When using the (unsupported) legacy CryptoAPI based codec, skip encrypting page #1 because that can lead to database corruption and other malfunctions. check-in: e877217109 user: mistachkin tags: trunk
02:04
Update several test cases. check-in: 8fa881a525 user: mistachkin tags: trunk
2019-12-08
04:01
Include the 'LINQ' partial classes in the primary managed assembly for .NET Standard 2.1. Fix for [ad28d8e026]. Also, enhancements to related diagnostic functionality, including the new 'SQLite_ForceLogLifecycle' environment variable. check-in: 6b6fb5374d user: mistachkin tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

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

261
262
263
264
265
266
267










268
269
270
271
272
273






274
275
276
277
278
279
280
          <td>PROCESSOR_ARCHITECTURE</td>
          <td>This environment variable is normally set by the operating
          system itself and should reflect the native processor architecture
          of the current process (e.g. a 32-bit x86 application running on a
          64-bit x64 operating system should have the value &quot;x86&quot;).
          </td>
        </tr>










        <tr valign="top">
          <td>SQLite_ForceLogPrepare</td>
          <td>If this environment variable is set [to anything], all calls to
          prepare a SQL query will be logged, regardless of the flags for the
          associated connection.</td>
        </tr>






        <tr valign="top">
          <td>TypeName_SQLiteProviderServices</td>
          <td>If this environment variable is set [to anything], it will be
          used by the System.Data.SQLite.SQLiteFactory class as the type name
          containing the System.Data.Common.DbProviderServices implementation
          that should be used.</td>
        </tr>







>
>
>
>
>
>
>
>
>
>






>
>
>
>
>
>







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
286
287
288
289
290
291
292
293
294
295
296
          <td>PROCESSOR_ARCHITECTURE</td>
          <td>This environment variable is normally set by the operating
          system itself and should reflect the native processor architecture
          of the current process (e.g. a 32-bit x86 application running on a
          64-bit x64 operating system should have the value &quot;x86&quot;).
          </td>
        </tr>
        <tr valign="top">
          <td>SQLite_LegacyEncryptPage1</td>
          <td>If this environment variable is set [to anything], page #1 of
          database files encrypted using the (unsupported) legacy CryptoAPI
          codec will be encrypted.  This was the default behavior prior to
          release 1.0.112.3; however, it is now disabled (by default) as it
          can cause corruption and/or other malfunctions in some circumstances.
          Please do not use this environment variable unless it is absolutely
          necessary for your specific use case.</td>
        </tr>
        <tr valign="top">
          <td>SQLite_ForceLogPrepare</td>
          <td>If this environment variable is set [to anything], all calls to
          prepare a SQL query will be logged, regardless of the flags for the
          associated connection.</td>
        </tr>
        <tr valign="top">
          <td>SQLite_ForceLogLifecycle</td>
          <td>If this environment variable is set [to anything], calls into
          key members pertaining to the lifecycle of connections and their
          associated classes (e.g. LINQ, EF6, etc) will be logged.</td>
        </tr>
        <tr valign="top">
          <td>TypeName_SQLiteProviderServices</td>
          <td>If this environment variable is set [to anything], it will be
          used by the System.Data.SQLite.SQLiteFactory class as the type name
          containing the System.Data.Common.DbProviderServices implementation
          that should be used.</td>
        </tr>

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

90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
      <p>
        This command must be used in conjunction with a SELECT statement.&nbsp; It only
        works when both the TYPES keyword and its value(s) are passed along with a SELECT
        statement as a single semi-colon separated unit.</p>
      <h3>
        Examples</h3>
      <p>
        <strong><span style="color: #2c2cf0">TYPES</span> [bigint], [int], [smallint], [tinyint];<br />
          <span style="color: #2c2cf0">SELECT</span> 1, 2, 3, 4;</strong></p>
      <p>
        The above query would return the columns as types System.Int64, System.Int32, System.Int16
        and System.Byte respectively.</p>
      <p>
        <strong><span style="color: #2c2cf0">TYPES</span> [bigint], [int], , [tinyint];<br />
          <span style="color: #2c2cf0">SELECT</span> 1, 2, 3, 4;</strong></p>
      <p>
        In this sample, only columns 1, 2 and 4 would have explicit typing.&nbsp; Column
        3's datatype would pass though the system and be discovered normally.</p>







|


|







90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
      <p>
        This command must be used in conjunction with a SELECT statement.&nbsp; It only
        works when both the TYPES keyword and its value(s) are passed along with a SELECT
        statement as a single semi-colon separated unit.</p>
      <h3>
        Examples</h3>
      <p>
        <strong><span style="color: #2c2cf0">TYPES</span> [bigint], [int], [mediumint], [smallint], [tinyint];<br />
          <span style="color: #2c2cf0">SELECT</span> 1, 2, 3, 4;</strong></p>
      <p>
        The above query would return the columns as types System.Int64, System.Int32, System.Int32, System.Int16
        and System.Byte respectively.</p>
      <p>
        <strong><span style="color: #2c2cf0">TYPES</span> [bigint], [int], , [tinyint];<br />
          <span style="color: #2c2cf0">SELECT</span> 1, 2, 3, 4;</strong></p>
      <p>
        In this sample, only columns 1, 2 and 4 would have explicit typing.&nbsp; Column
        3's datatype would pass though the system and be discovered normally.</p>

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

39
40
41
42
43
44
45
46
47

48
49
50
51
52




53
54
55
56
57
58
59
          </td>
        </tr>
      </table>
    </div>
    <div id="mainSection">
    <div id="mainBody">
    <h1 class="heading">Version History</h1>
    <p><b>1.0.113.0 - May XX, 2020 <font color="red">(release scheduled)</font></b></p>
    <ul>

      <li>Add SQLite_ForceLogLifecycle environment variable to force logging of calls into key members pertaining to the lifecycle of connections and their associated classes (e.g. LINQ, EF6, etc).</li>
      <li>When using the (unsupported) legacy CryptoAPI based codec, skip encrypting page #1 because that can lead to database corruption and other malfunctions.</li>
      <li>Support automatic value conversions for columns with a declared type of MEDIUMINT or MEDIUMUINT. Pursuant to <a href="https://system.data.sqlite.org/index.html/info/515cb60b10">[515cb60b10]</a>.</li>
      <li>Add preliminary support for the .NET Framework 4.8.</li>
    </ul>




    <p><b>1.0.112.2 - April 27, 2020</b></p>
    <ul>
      <li>Fix NuGet packaging for .NET Standard 2.1. Fix for <a href="https://system.data.sqlite.org/index.html/info/7c73262e6f">[7c73262e6f]</a>.</li>
    </ul>
    <p><b>1.0.112.1 - April 6, 2020</b></p>
    <ul>
      <li>Updated to <a href="https://www.sqlite.org/releaselog/3_31_1.html">SQLite 3.31.1</a>.</li>







|

>

<



>
>
>
>







39
40
41
42
43
44
45
46
47
48
49

50
51
52
53
54
55
56
57
58
59
60
61
62
63
          </td>
        </tr>
      </table>
    </div>
    <div id="mainSection">
    <div id="mainBody">
    <h1 class="heading">Version History</h1>
    <p><b>1.0.113.0 - June XX, 2020 <font color="red">(release scheduled)</font></b></p>
    <ul>
      <li>Updated to <a href="https://www.sqlite.org/releaselog/3_32_0.html">SQLite 3.32.0</a>.</li>
      <li>Add SQLite_ForceLogLifecycle environment variable to force logging of calls into key members pertaining to the lifecycle of connections and their associated classes (e.g. LINQ, EF6, etc).</li>

      <li>Support automatic value conversions for columns with a declared type of MEDIUMINT or MEDIUMUINT. Pursuant to <a href="https://system.data.sqlite.org/index.html/info/515cb60b10">[515cb60b10]</a>.</li>
      <li>Add preliminary support for the .NET Framework 4.8.</li>
    </ul>
    <p><b>1.0.112.3 - Xxxx XX, 2020</b></p>
    <ul>
      <li>When using the (unsupported) legacy CryptoAPI based codec, skip encrypting page #1 because that can lead to database corruption and other malfunctions.</li>
    </ul>
    <p><b>1.0.112.2 - April 27, 2020</b></p>
    <ul>
      <li>Fix NuGet packaging for .NET Standard 2.1. Fix for <a href="https://system.data.sqlite.org/index.html/info/7c73262e6f">[7c73262e6f]</a>.</li>
    </ul>
    <p><b>1.0.112.1 - April 6, 2020</b></p>
    <ul>
      <li>Updated to <a href="https://www.sqlite.org/releaselog/3_31_1.html">SQLite 3.31.1</a>.</li>

Changes to SQLite.Interop/src/win/crypt.c.

20
21
22
23
24
25
26






27
28
29
30
31
32
33
...
149
150
151
152
153
154
155
156













157


















158
159
160
161
162
163
164
  HCRYPTKEY hReadKey;     /* Key used to read from the database and write to the journal */
  HCRYPTKEY hWriteKey;    /* Key used to write to the database */
  DWORD     dwPageSize;   /* Size of pages */
  LPVOID    pvCrypt;      /* A buffer for encrypting/decrypting (if necessary) */
  DWORD     dwCryptSize;  /* Equal to or greater than dwPageSize.  If larger, pvCrypt is valid and this is its size */
} CRYPTBLOCK, *LPCRYPTBLOCK;







HCRYPTPROV g_hProvider = 0; /* Global instance of the cryptographic provider */

#define SQLITECRYPTERROR_PROVIDER "Cryptographic provider not available"

/* Needed for re-keying */
static void * sqlite3pager_get_codecarg(Pager *pPager)
{
................................................................................

/* Encrypt/Decrypt functionality, called by pager.c */
static void *sqlite3Codec(void *pArg, void *data, Pgno nPageNum, int nMode)
{
  LPCRYPTBLOCK pBlock = (LPCRYPTBLOCK)pArg;
  DWORD dwPageSize;
  LPVOID pvTemp = NULL;














  if (!pBlock) return data;


















  if (pBlock->pvCrypt == NULL) return NULL; /* This only happens if CreateCryptBlock() failed to make scratch space */

  switch(nMode)
  {
  case 0: /* Undo a "case 7" journal file encryption */
  case 2: /* Reload a page */
  case 3: /* Load a page */







>
>
>
>
>
>







 








>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
...
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
  HCRYPTKEY hReadKey;     /* Key used to read from the database and write to the journal */
  HCRYPTKEY hWriteKey;    /* Key used to write to the database */
  DWORD     dwPageSize;   /* Size of pages */
  LPVOID    pvCrypt;      /* A buffer for encrypting/decrypting (if necessary) */
  DWORD     dwCryptSize;  /* Equal to or greater than dwPageSize.  If larger, pvCrypt is valid and this is its size */
} CRYPTBLOCK, *LPCRYPTBLOCK;

#define CRYPT_PAGE1_UNKNOWN  (0)
#define CRYPT_PAGE1_ENABLED  (1)
#define CRYPT_PAGE1_DISABLED (2)

BOOL g_bEncryptPage1 = CRYPT_PAGE1_UNKNOWN;

HCRYPTPROV g_hProvider = 0; /* Global instance of the cryptographic provider */

#define SQLITECRYPTERROR_PROVIDER "Cryptographic provider not available"

/* Needed for re-keying */
static void * sqlite3pager_get_codecarg(Pager *pPager)
{
................................................................................

/* Encrypt/Decrypt functionality, called by pager.c */
static void *sqlite3Codec(void *pArg, void *data, Pgno nPageNum, int nMode)
{
  LPCRYPTBLOCK pBlock = (LPCRYPTBLOCK)pArg;
  DWORD dwPageSize;
  LPVOID pvTemp = NULL;

  if (g_bEncryptPage1 == CRYPT_PAGE1_UNKNOWN)
  {
    WCHAR aBuf[2];
    memset(aBuf, 0, sizeof(aBuf));
    if ((GetEnvironmentVariableW(L"SQLite_LegacyEncryptPage1", aBuf, sizeof(aBuf)) != 0)
     || (GetLastError() != ERROR_ENVVAR_NOT_FOUND))
    {
      g_bEncryptPage1 = CRYPT_PAGE1_ENABLED;
    } else {
      g_bEncryptPage1 = CRYPT_PAGE1_DISABLED;
    }
  }

  if (!pBlock) return data;
  if (g_bEncryptPage1 == CRYPT_PAGE1_DISABLED)
  {
    if (nPageNum == 1) // BUGFIX: Skip first page as it contains metadata
                       //         necessary to initialize the pager.  For
                       //         backward compatibility, decrypt page #1
                       //         for any existing databases.
    {
      //
      // NOTE: If this is page #1 and it starts with the file header, it
      //       should not be encrypted; so, do nothing to it; otherwise,
      //       it is encrypted and must be decrypted.
      //
      if (memcmp(data, zMagicHeader, sizeof(zMagicHeader)) == 0)
      {
        return data;
      }
    }
  }
  if (pBlock->pvCrypt == NULL) return NULL; /* This only happens if CreateCryptBlock() failed to make scratch space */

  switch(nMode)
  {
  case 0: /* Undo a "case 7" journal file encryption */
  case 2: /* Reload a page */
  case 3: /* Load a page */

Changes to System.Data.SQLite.Linq/SQLiteProviderFactory.cs.

137
138
139
140
141
142
143




144
145
146
147



148
149
150

151



152
153
154
155



156
157
158
159
160
161
162
        public object GetService(
            Type serviceType
            )
        {
            if ((serviceType == typeof(ISQLiteSchemaExtensions)) ||
                (serviceType == typeof(DbProviderServices)))
            {




                SQLiteLog.LogMessage(HelperMethods.StringFormat(
                    CultureInfo.CurrentCulture,
                    "IServiceProvider.GetService for type \"{0}\" (success).",
                    serviceType));




                return SQLiteProviderServices.Instance;
            }





            SQLiteLog.LogMessage(HelperMethods.StringFormat(
                CultureInfo.CurrentCulture,
                "IServiceProvider.GetService for type \"{0}\" (failure).",
                serviceType));




            return null;
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////








>
>
>
>
|
|
<
<
>
>
>
|
<
|
>
|
>
>
>
|
|
<
<
>
>
>







137
138
139
140
141
142
143
144
145
146
147
148
149


150
151
152
153

154
155
156
157
158
159
160
161


162
163
164
165
166
167
168
169
170
171
        public object GetService(
            Type serviceType
            )
        {
            if ((serviceType == typeof(ISQLiteSchemaExtensions)) ||
                (serviceType == typeof(DbProviderServices)))
            {
                object result = SQLiteProviderServices.Instance;

                if (SQLite3.ForceLogLifecycle())
                {
                    SQLiteLog.LogMessage(HelperMethods.StringFormat(
                        CultureInfo.CurrentCulture,


                        "Success of \"{0}\" from SQLiteProviderFactory.GetService(\"{1}\")...",
                        (result != null) ? result.ToString() : "<null>",
                        (serviceType != null) ? serviceType.ToString() : "<null>"));
                }


                return result;
            }

            if (SQLite3.ForceLogLifecycle())
            {
                SQLiteLog.LogMessage(HelperMethods.StringFormat(
                    CultureInfo.CurrentCulture,


                    "Failure of SQLiteProviderFactory.GetService(\"{0}\")...",
                    (serviceType != null) ? serviceType.ToString() : "<null>"));
            }

            return null;
        }
        #endregion

        ///////////////////////////////////////////////////////////////////////

Changes to System.Data.SQLite/Configurations/System.Data.SQLite.dll.config.

251
252
253
254
255
256
257


















258
259
260
261
262
263
264
265
266









267
268
269
270
271
272
273
              architecture of the current process (e.g. a 32-bit x86
              application running on a 64-bit x64 operating system should have
              the value "x86").
    -->
    <!--
    <add key="PROCESSOR_ARCHITECTURE" value="%PROCESSOR_ARCHITECTURE%" />
    -->



















    <!--
        NOTE: If this environment variable is set [to anything], all calls to
              prepare a SQL query will be logged, regardless of the flags for
              the associated connection.
    -->
    <!--
    <add key="SQLite_ForceLogPrepare" value="1" />
    -->










    <!--
        NOTE: If this environment variable is set [to anything], it will be
              used by the System.Data.SQLite.SQLiteFactory class as the type
              name containing the System.Data.Common.DbProviderServices
              implementation that should be used.
    -->







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>









>
>
>
>
>
>
>
>
>







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
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
              architecture of the current process (e.g. a 32-bit x86
              application running on a 64-bit x64 operating system should have
              the value "x86").
    -->
    <!--
    <add key="PROCESSOR_ARCHITECTURE" value="%PROCESSOR_ARCHITECTURE%" />
    -->

    <!--
        NOTE: If this environment variable is set [to anything], page #1
              of database files encrypted using the (unsupported) legacy
              CryptoAPI codec will be encrypted.  This was the default
              behavior prior to release 1.0.112.3; however, it is now
              disabled (by default) as it can cause corruption and/or other
              malfunctions in some circumstances.  Please do not use this
              environment variable unless it is absolutely necessary for your
              specific use case.

        NOTE: Since this environment variable is (only) read from the native
              interop assembly, it cannot be set via this configuration file.
              It can only be set within the process environment.
    -->
    <!--
    <add key="SQLite_LegacyEncryptPage1" value="1" />
    -->

    <!--
        NOTE: If this environment variable is set [to anything], all calls to
              prepare a SQL query will be logged, regardless of the flags for
              the associated connection.
    -->
    <!--
    <add key="SQLite_ForceLogPrepare" value="1" />
    -->

    <!--
        NOTE: If this environment variable is set [to anything], calls into
              key members pertaining to the lifecycle of connections and their
              associated classes (e.g. LINQ, EF6, etc) will be logged.
    -->
    <!--
    <add key="SQLite_ForceLogLifecycle" value="1" />
    -->

    <!--
        NOTE: If this environment variable is set [to anything], it will be
              used by the System.Data.SQLite.SQLiteFactory class as the type
              name containing the System.Data.Common.DbProviderServices
              implementation that should be used.
    -->

Changes to System.Data.SQLite/LINQ/SQLiteConnection_Linq.cs.

3
4
5
6
7
8
9

10
11
12
13
14
15
16
17
18


19











20
21
22
23
 * Written by Robert Simpson (robert@blackcastlesoft.com)
 * 
 * Released to the public domain, use at your own risk!
 ********************************************************/

namespace System.Data.SQLite
{

  using System.Data.Common;

  public sealed partial class SQLiteConnection
  {
    /// <summary>
    /// Returns the <see cref="SQLiteFactory" /> instance.
    /// </summary>
    protected override DbProviderFactory DbProviderFactory
    {


      get { return SQLiteFactory.Instance; }











    }
  }
}








>









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




3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 * Written by Robert Simpson (robert@blackcastlesoft.com)
 * 
 * Released to the public domain, use at your own risk!
 ********************************************************/

namespace System.Data.SQLite
{
  using System.Globalization;
  using System.Data.Common;

  public sealed partial class SQLiteConnection
  {
    /// <summary>
    /// Returns the <see cref="SQLiteFactory" /> instance.
    /// </summary>
    protected override DbProviderFactory DbProviderFactory
    {
      get
      {
        DbProviderFactory result = SQLiteFactory.Instance;

        if (SQLite3.ForceLogLifecycle())
        {
          SQLiteLog.LogMessage(HelperMethods.StringFormat(
            CultureInfo.CurrentCulture,
            "Returning \"{0}\" from SQLiteConnection.DbProviderFactory...",
            (result != null) ? result.ToString() : "<null>"));
        }

        return result;
      }
    }
  }
}

Changes to System.Data.SQLite/LINQ/SQLiteFactory_Linq.cs.

26
27
28
29
30
31
32
33
34
35
36
37
38
39


40
41











42
43
44
45
46











47
48
49
50
51
52
53
54
55
56
57


58
59
60
61
62
63
64
65
66
67
68
69




















70
71


72
73
74
75
76
77
78
...
100
101
102
103
104
105
106

107
108
109
110
    //       situation may need to change.
    //
    private static readonly string DefaultTypeName =
      "System.Data.SQLite.Linq.SQLiteProviderServices, System.Data.SQLite.Linq, " +
      "Version={0}, Culture=neutral, PublicKeyToken=db937bc2d44ff139";

    private static readonly BindingFlags DefaultBindingFlags =
        BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;

    ///////////////////////////////////////////////////////////////////////////

    private static Type _dbProviderServicesType;
    private static object _sqliteServices;



    static SQLiteFactory()
    {











#if (SQLITE_STANDARD || USE_INTEROP_DLL || PLATFORM_COMPACTFRAMEWORK) && PRELOAD_NATIVE_LIBRARY
        UnsafeNativeMethods.Initialize();
#endif

        SQLiteLog.Initialize(typeof(SQLiteFactory).Name);












        string version =
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471 || NET_472 || NET_STANDARD_20 || NET_STANDARD_21
            "4.0.0.0";
#else
            "3.5.0.0";
#endif

        _dbProviderServicesType = Type.GetType(HelperMethods.StringFormat(CultureInfo.InvariantCulture, "System.Data.Common.DbProviderServices, System.Data.Entity, Version={0}, Culture=neutral, PublicKeyToken=b77a5c561934e089", version), false);
    }



    /// <summary>
    /// Will provide a <see cref="IServiceProvider" /> object in .NET 3.5.
    /// </summary>
    /// <param name="serviceType">The class or interface type to query for.</param>
    /// <returns></returns>
    object IServiceProvider.GetService(Type serviceType)
    {
      if (serviceType == typeof(ISQLiteSchemaExtensions) ||
        (_dbProviderServicesType != null && serviceType == _dbProviderServicesType))
      {
        return GetSQLiteProviderServicesInstance();
      }




















      return null;
    }



#if !NET_STANDARD_20 && !NET_STANDARD_21
    [ReflectionPermission(SecurityAction.Assert, MemberAccess = true)]
#endif
    private object GetSQLiteProviderServicesInstance()
    {
        if (_sqliteServices == null)
................................................................................
                FieldInfo field = type.GetField(
                    "Instance", DefaultBindingFlags);

                if (field != null)
                    _sqliteServices = field.GetValue(null);
            }
        }

        return _sqliteServices;
    }
  }
}







|






>
>


>
>
>
>
>
>
>
>
>
>
>





>
>
>
>
>
>
>
>
>
>
>











>
>










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


>
>







 







>




26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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
122
123
124
125
126
...
148
149
150
151
152
153
154
155
156
157
158
159
    //       situation may need to change.
    //
    private static readonly string DefaultTypeName =
      "System.Data.SQLite.Linq.SQLiteProviderServices, System.Data.SQLite.Linq, " +
      "Version={0}, Culture=neutral, PublicKeyToken=db937bc2d44ff139";

    private static readonly BindingFlags DefaultBindingFlags =
        BindingFlags.NonPublic | BindingFlags.Static;

    ///////////////////////////////////////////////////////////////////////////

    private static Type _dbProviderServicesType;
    private static object _sqliteServices;

    ///////////////////////////////////////////////////////////////////////////

    static SQLiteFactory()
    {
      InitializeDbProviderServices();
    }

    ///////////////////////////////////////////////////////////////////////////

    /// <summary>
    /// This method is called to perform preliminary static initialization
    /// necessary for this class.
    /// </summary>
    internal static void PreInitialize()
    {
#if (SQLITE_STANDARD || USE_INTEROP_DLL || PLATFORM_COMPACTFRAMEWORK) && PRELOAD_NATIVE_LIBRARY
        UnsafeNativeMethods.Initialize();
#endif

        SQLiteLog.Initialize(typeof(SQLiteFactory).Name);
    }

    ///////////////////////////////////////////////////////////////////////////

    /// <summary>
    /// This method is called to perform some of the static initialization
    /// necessary for this class.
    /// </summary>
    private static void InitializeDbProviderServices()
    {
        PreInitialize();

        string version =
#if NET_40 || NET_45 || NET_451 || NET_452 || NET_46 || NET_461 || NET_462 || NET_47 || NET_471 || NET_472 || NET_STANDARD_20 || NET_STANDARD_21
            "4.0.0.0";
#else
            "3.5.0.0";
#endif

        _dbProviderServicesType = Type.GetType(HelperMethods.StringFormat(CultureInfo.InvariantCulture, "System.Data.Common.DbProviderServices, System.Data.Entity, Version={0}, Culture=neutral, PublicKeyToken=b77a5c561934e089", version), false);
    }

    ///////////////////////////////////////////////////////////////////////////

    /// <summary>
    /// Will provide a <see cref="IServiceProvider" /> object in .NET 3.5.
    /// </summary>
    /// <param name="serviceType">The class or interface type to query for.</param>
    /// <returns></returns>
    object IServiceProvider.GetService(Type serviceType)
    {
      if (serviceType == typeof(ISQLiteSchemaExtensions) ||
        (_dbProviderServicesType != null && serviceType == _dbProviderServicesType))
      {
        object result = GetSQLiteProviderServicesInstance();

        if (SQLite3.ForceLogLifecycle())
        {
          SQLiteLog.LogMessage(HelperMethods.StringFormat(
            CultureInfo.CurrentCulture,
            "Success of \"{0}\" from SQLiteFactory.GetService(\"{1}\")...",
            (result != null) ? result.ToString() : "<null>",
            (serviceType != null) ? serviceType.ToString() : "<null>"));
        }

        return result;
      }

      if (SQLite3.ForceLogLifecycle())
      {
        SQLiteLog.LogMessage(HelperMethods.StringFormat(
          CultureInfo.CurrentCulture,
          "Failure of SQLiteFactory.GetService(\"{0}\")...",
          (serviceType != null) ? serviceType.ToString() : "<null>"));
      }

      return null;
    }

    ///////////////////////////////////////////////////////////////////////////

#if !NET_STANDARD_20 && !NET_STANDARD_21
    [ReflectionPermission(SecurityAction.Assert, MemberAccess = true)]
#endif
    private object GetSQLiteProviderServicesInstance()
    {
        if (_sqliteServices == null)
................................................................................
                FieldInfo field = type.GetField(
                    "Instance", DefaultBindingFlags);

                if (field != null)
                    _sqliteServices = field.GetValue(null);
            }
        }

        return _sqliteServices;
    }
  }
}

Changes to System.Data.SQLite/Resources/DataTypes.xml.

40
41
42
43
44
45
46

















47
48
49
50
51
52
53
    <IsLong>false</IsLong>
    <IsNullable>true</IsNullable>
    <IsSearchable>true</IsSearchable>
    <IsSearchableWithLike>false</IsSearchableWithLike>
    <IsUnsigned>false</IsUnsigned>
    <IsBestMatch>true</IsBestMatch>
  </DataTypes>

















  <DataTypes>
    <TypeName>real</TypeName>
    <ProviderDbType>8</ProviderDbType>
    <ColumnSize>6</ColumnSize>
    <DataType>System.Double</DataType>
    <CreateFormat>real</CreateFormat>
    <IsAutoIncrementable>false</IsAutoIncrementable>







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
    <IsLong>false</IsLong>
    <IsNullable>true</IsNullable>
    <IsSearchable>true</IsSearchable>
    <IsSearchableWithLike>false</IsSearchableWithLike>
    <IsUnsigned>false</IsUnsigned>
    <IsBestMatch>true</IsBestMatch>
  </DataTypes>
  <DataTypes>
    <TypeName>mediumint</TypeName>
    <ProviderDbType>11</ProviderDbType>
    <ColumnSize>10</ColumnSize>
    <DataType>System.Int32</DataType>
    <CreateFormat>mediumint</CreateFormat>
    <IsAutoIncrementable>false</IsAutoIncrementable>
    <IsCaseSensitive>false</IsCaseSensitive>
    <IsFixedLength>true</IsFixedLength>
    <IsFixedPrecisionScale>true</IsFixedPrecisionScale>
    <IsLong>false</IsLong>
    <IsNullable>true</IsNullable>
    <IsSearchable>true</IsSearchable>
    <IsSearchableWithLike>false</IsSearchableWithLike>
    <IsUnsigned>false</IsUnsigned>
    <IsBestMatch>false</IsBestMatch>
  </DataTypes>
  <DataTypes>
    <TypeName>real</TypeName>
    <ProviderDbType>8</ProviderDbType>
    <ColumnSize>6</ColumnSize>
    <DataType>System.Double</DataType>
    <CreateFormat>real</CreateFormat>
    <IsAutoIncrementable>false</IsAutoIncrementable>

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

1342
1343
1344
1345
1346
1347
1348









1349
1350
1351
1352
1353
1354
1355
....
1369
1370
1371
1372
1373
1374
1375
































1376
1377
1378
1379
1380
1381
1382
    /// "SQLite_ForceLogPrepare" environment variable has been queried.  If so,
    /// it will only be non-zero if the environment variable was present.
    /// </summary>
    private static bool? forceLogPrepare = null;

    ///////////////////////////////////////////////////////////////////////////////////////////////










    /// <summary>
    /// Determines if all calls to prepare a SQL query will be logged,
    /// regardless of the flags for the associated connection.
    /// </summary>
    /// <returns>
    /// Non-zero to log all calls to prepare a SQL query.
    /// </returns>
................................................................................
                    forceLogPrepare = false;
                }
            }

            return (bool)forceLogPrepare;
        }
    }
































    #endregion

    ///////////////////////////////////////////////////////////////////////////////////////////////

    internal override SQLiteStatement Prepare(SQLiteConnection cnn, string strSql, SQLiteStatement previous, uint timeoutMS, ref string strRemain)
    {
      if (!String.IsNullOrEmpty(strSql)) strSql = strSql.Trim();







>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
....
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
    /// "SQLite_ForceLogPrepare" environment variable has been queried.  If so,
    /// it will only be non-zero if the environment variable was present.
    /// </summary>
    private static bool? forceLogPrepare = null;

    ///////////////////////////////////////////////////////////////////////////////////////////////

    /// <summary>
    /// This field is used to keep track of whether or not the
    /// "SQLite_ForceLogLifecycle" environment variable has been queried.  If
    /// so, it will only be non-zero if the environment variable was present.
    /// </summary>
    private static bool? forceLogLifecycle = null;

    ///////////////////////////////////////////////////////////////////////////////////////////////

    /// <summary>
    /// Determines if all calls to prepare a SQL query will be logged,
    /// regardless of the flags for the associated connection.
    /// </summary>
    /// <returns>
    /// Non-zero to log all calls to prepare a SQL query.
    /// </returns>
................................................................................
                    forceLogPrepare = false;
                }
            }

            return (bool)forceLogPrepare;
        }
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////

    /// <summary>
    /// Determines if calls into key members pertaining to the lifecycle of
    /// connections and their associated classes will be logged, regardless
    /// of the flags for the associated connection.
    /// </summary>
    /// <returns>
    /// Non-zero to log calls into key members pertaining to the lifecycle of
    /// connections and their associated classes (e.g. LINQ, EF6, etc).
    /// </returns>
    internal static bool ForceLogLifecycle()
    {
        lock (syncRoot)
        {
            if (forceLogLifecycle == null)
            {
                if (UnsafeNativeMethods.GetSettingValue(
                        "SQLite_ForceLogLifecycle", null) != null)
                {
                    forceLogLifecycle = true;
                }
                else
                {
                    forceLogLifecycle = false;
                }
            }

            return (bool)forceLogLifecycle;
        }
    }
    #endregion

    ///////////////////////////////////////////////////////////////////////////////////////////////

    internal override SQLiteStatement Prepare(SQLiteConnection cnn, string strSql, SQLiteStatement previous, uint timeoutMS, ref string strRemain)
    {
      if (!String.IsNullOrEmpty(strSql)) strSql = strSql.Trim();

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

1775
1776
1777
1778
1779
1780
1781


1782
1783
1784
1785
1786
1787
1788
            new SQLiteDbTypeMapping("INTEGER32", DbType.Int32, false),
            new SQLiteDbTypeMapping("INTEGER64", DbType.Int64, false),
            new SQLiteDbTypeMapping("LOGICAL", DbType.Boolean, false),
            new SQLiteDbTypeMapping("LONG", DbType.Int64, false),
            new SQLiteDbTypeMapping("LONGCHAR", DbType.String, false),
            new SQLiteDbTypeMapping("LONGTEXT", DbType.String, false),
            new SQLiteDbTypeMapping("LONGVARCHAR", DbType.String, false),


            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),







>
>







1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
            new SQLiteDbTypeMapping("INTEGER32", DbType.Int32, false),
            new SQLiteDbTypeMapping("INTEGER64", DbType.Int64, false),
            new SQLiteDbTypeMapping("LOGICAL", DbType.Boolean, false),
            new SQLiteDbTypeMapping("LONG", DbType.Int64, false),
            new SQLiteDbTypeMapping("LONGCHAR", DbType.String, false),
            new SQLiteDbTypeMapping("LONGTEXT", DbType.String, false),
            new SQLiteDbTypeMapping("LONGVARCHAR", DbType.String, false),
            new SQLiteDbTypeMapping("MEDIUMINT", DbType.Int32, false),
            new SQLiteDbTypeMapping("MEDIUMUINT", DbType.UInt32, false),
            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),

Changes to Tests/basic.eagle.

1992
1993
1994
1995
1996
1997
1998
1999
2000

2001
2002
2003
2004
2005
2006
2007
....
2033
2034
2035
2036
2037
2038
2039
2040
2041

2042
2043
2044
2045
2046
2047
2048
....
2063
2064
2065
2066
2067
2068
2069








2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
....
2110
2111
2112
2113
2114
2115
2116
2117
2118

2119
2120
2121
2122
2123
2124
2125
....
2151
2152
2153
2154
2155
2156
2157
2158
2159

2160
2161
2162
2163
2164
2165
2166
....
2181
2182
2183
2184
2185
2186
2187








2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
....
2228
2229
2230
2231
2232
2233
2234
2235
2236

2237
2238
2239
2240
2241
2242
2243
....
2271
2272
2273
2274
2275
2276
2277








2278
2279
2280
2281
2282
2283
2284
2285
2286
2287

2288
2289
2290
2291
2292
2293
2294
....
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
....
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}


###############################################################################

runTest {test data-1.40 {encrypted database, wrong password} -setup {
  setupDb [set fileName data-1.40.db] "" "" "" "" "Password=12345;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}


###############################################################################

runTest {test data-1.41 {encrypted database, password w/start-space} -setup {
  setupDb [set fileName data-1.41.db] "" "" "" "" "Password= 1234;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................
  setupDb $fileName "" "" "" "" "Password= 1234;" true false

  lappend result [catch {sql execute $db \
      "INSERT INTO t1 (x) VALUES(1);"} error] $error

  lappend result [catch {sql execute -execute scalar $db \
      "SELECT COUNT(*) FROM t1;"} error] $error









  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {0 1 0 1 0 1 0 3}}

###############################################################################

runTest {test data-1.42 {encrypted database, w/quoted-start-space} -setup {
  setupDb [set fileName data-1.42.db] "" "" "" "" "Password=\" 1234\";"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}


###############################################################################

runTest {test data-1.43 {encrypted database, password w/mid-space} -setup {
  setupDb [set fileName data-1.43.db] "" "" "" "" "Password=12 45;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}


###############################################################################

runTest {test data-1.44 {encrypted database, password w/end-space} -setup {
  setupDb [set fileName data-1.44.db] "" "" "" "" "Password=1234 ;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................
  setupDb $fileName "" "" "" "" "Password=1234 ;" true false

  lappend result [catch {sql execute $db \
      "INSERT INTO t1 (x) VALUES(1);"} error] $error

  lappend result [catch {sql execute -execute scalar $db \
      "SELECT COUNT(*) FROM t1;"} error] $error









  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {0 1 0 1 0 1 0 3}}

###############################################################################

runTest {test data-1.45 {encrypted database, w/quoted-end-space} -setup {
  setupDb [set fileName data-1.45.db] "" "" "" "" "Password=\"1234 \";"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}


###############################################################################

runTest {test data-1.46 {encrypted database, password via builder} -setup {
  setupDb [set fileName data-1.46.db] "" "" "" "" "Password=67 89;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................
  setupDb $fileName "" "" "" "" "Password=\"67 89\";" true false

  lappend result [catch {sql execute $db \
      "INSERT INTO t1 (x) VALUES(1);"} error] $error

  lappend result [catch {sql execute -execute scalar $db \
      "SELECT COUNT(*) FROM t1;"} error] $error









  set result
} -cleanup {
  unset -nocomplain connection

  cleanupDb $fileName; # NOTE: After object disposal.

  unset -nocomplain connectionStringBuilder error result db fileName
} -constraints {eagle command.object System.Data.SQLite.Encryption monoBug28\
command.sql compile.DATA SQLite System.Data.SQLite} -result {0 1 0 1 0 1 0 3}}


###############################################################################

runTest {test data-1.47 {quoted connection string properties} -setup {
  unset -nocomplain result list pair strings string
} -body {
  set result [list]
................................................................................
runTest {test data-1.55 {SQLiteConvert TypeNameToDbType} -setup {
  unset -nocomplain result typeName
} -body {
  foreach typeName [list \
      BIGINT BIGUINT BINARY BIT BLOB BOOL BOOLEAN CHAR CLOB COUNTER CURRENCY \
      DATE DATETIME DECIMAL DOUBLE FLOAT GENERAL GUID IDENTITY IMAGE INT INT8 \
      INT16 INT32 INT64 INTEGER INTEGER8 INTEGER16 INTEGER32 INTEGER64 \
      LOGICAL LONG LONGCHAR LONGTEXT LONGVARCHAR MEMO MONEY NCHAR NOTE NTEXT \
      NUMBER NUMERIC NVARCHAR OLEOBJECT RAW REAL SINGLE SMALLDATE SMALLINT \
      SMALLUINT STRING TEXT TIME TIMESTAMP TINYINT TINYSINT UINT UINT8 UINT16 \
      UINT32 UINT64 ULONG UNIQUEIDENTIFIER UNSIGNEDINTEGER UNSIGNEDINTEGER8 \
      UNSIGNEDINTEGER16 UNSIGNEDINTEGER32 UNSIGNEDINTEGER64 VARBINARY VARCHAR \
      VARCHAR2 YESNO] {
    lappend result [list $typeName [object invoke -flags +NonPublic \
        System.Data.SQLite.SQLiteConvert TypeNameToDbType null $typeName None]]
  }
  set result
} -cleanup {
  unset -nocomplain result typeName
} -constraints {eagle command.object System.Data.SQLite} -result {{BIGINT\
................................................................................
Int64} {BIGUINT UInt64} {BINARY Binary} {BIT Boolean} {BLOB Binary} {BOOL\
Boolean} {BOOLEAN Boolean} {CHAR AnsiStringFixedLength} {CLOB String} {COUNTER\
Int64} {CURRENCY Decimal} {DATE DateTime} {DATETIME DateTime} {DECIMAL Decimal}\
{DOUBLE Double} {FLOAT Double} {GENERAL Binary} {GUID Guid} {IDENTITY Int64}\
{IMAGE Binary} {INT Int32} {INT8 SByte} {INT16 Int16} {INT32 Int32} {INT64\
Int64} {INTEGER Int64} {INTEGER8 SByte} {INTEGER16 Int16} {INTEGER32 Int32}\
{INTEGER64 Int64} {LOGICAL Boolean} {LONG Int64} {LONGCHAR String} {LONGTEXT\
String} {LONGVARCHAR String} {MEMO String} {MONEY Decimal} {NCHAR\
StringFixedLength} {NOTE String} {NTEXT String} {NUMBER Decimal} {NUMERIC\
Decimal} {NVARCHAR String} {OLEOBJECT Binary} {RAW Binary} {REAL Double}\
{SINGLE Single} {SMALLDATE DateTime} {SMALLINT Int16} {SMALLUINT UInt16}\
{STRING String} {TEXT String} {TIME DateTime} {TIMESTAMP DateTime} {TINYINT\
Byte} {TINYSINT SByte} {UINT UInt32} {UINT8 Byte} {UINT16 UInt16} {UINT32\
UInt32} {UINT64 UInt64} {ULONG UInt64} {UNIQUEIDENTIFIER Guid} {UNSIGNEDINTEGER\
UInt64} {UNSIGNEDINTEGER8 Byte} {UNSIGNEDINTEGER16 UInt16} {UNSIGNEDINTEGER32\
UInt32} {UNSIGNEDINTEGER64 UInt64} {VARBINARY Binary} {VARCHAR AnsiString}\
{VARCHAR2 AnsiString} {YESNO Boolean}}}

###############################################################################

runTest {test data-1.56 {totype extension} -setup {
  setupDb [set fileName data-1.56.db]
} -body {
  set connection [getDbConnection]







|
|
>







 







|
|
>







 







>
>
>
>
>
>
>
>







|







 







|
|
>







 







|
|
>







 







>
>
>
>
>
>
>
>







|







 







|
|
>







 







>
>
>
>
>
>
>
>









|
>







 







|
|
|
|
|
|







 







|
|
|
|
|
|
|
|
|
|







1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
....
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
....
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
....
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
....
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
....
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
....
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
....
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
....
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
....
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -match regexp -result {^1 \{(?:file is\
not a database|database disk image is malformed)\} 1 \{(?:file is not a\
database|database disk image is malformed)\} 0 1 0 2$}}

###############################################################################

runTest {test data-1.40 {encrypted database, wrong password} -setup {
  setupDb [set fileName data-1.40.db] "" "" "" "" "Password=12345;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -match regexp -result {^1 \{(?:file is\
not a database|database disk image is malformed)\} 1 \{(?:file is not a\
database|database disk image is malformed)\} 0 1 0 2$}}

###############################################################################

runTest {test data-1.41 {encrypted database, password w/start-space} -setup {
  setupDb [set fileName data-1.41.db] "" "" "" "" "Password= 1234;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................
  setupDb $fileName "" "" "" "" "Password= 1234;" true false

  lappend result [catch {sql execute $db \
      "INSERT INTO t1 (x) VALUES(1);"} error] $error

  lappend result [catch {sql execute -execute scalar $db \
      "SELECT COUNT(*) FROM t1;"} error] $error

  cleanupDb $fileName db true false false

  lappend result [expr {
      [string equal [readDbFileHeader [file join \
      [getDatabaseDirectory] $fileName]] \
      [getDbFileHeader]] == ![page1MustBeEncrypted]
  }]

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {0 1 0 1 0 1 0 3 True}}

###############################################################################

runTest {test data-1.42 {encrypted database, w/quoted-start-space} -setup {
  setupDb [set fileName data-1.42.db] "" "" "" "" "Password=\" 1234\";"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -match regexp -result {^1 \{(?:file is\
not a database|database disk image is malformed)\} 1 \{(?:file is not a\
database|database disk image is malformed)\} 0 1 0 2$}}

###############################################################################

runTest {test data-1.43 {encrypted database, password w/mid-space} -setup {
  setupDb [set fileName data-1.43.db] "" "" "" "" "Password=12 45;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -match regexp -result {^1 \{(?:file is\
not a database|database disk image is malformed)\} 1 \{(?:file is not a\
database|database disk image is malformed)\} 0 1 0 2$}}

###############################################################################

runTest {test data-1.44 {encrypted database, password w/end-space} -setup {
  setupDb [set fileName data-1.44.db] "" "" "" "" "Password=1234 ;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................
  setupDb $fileName "" "" "" "" "Password=1234 ;" true false

  lappend result [catch {sql execute $db \
      "INSERT INTO t1 (x) VALUES(1);"} error] $error

  lappend result [catch {sql execute -execute scalar $db \
      "SELECT COUNT(*) FROM t1;"} error] $error

  cleanupDb $fileName db true false false

  lappend result [expr {
      [string equal [readDbFileHeader [file join \
      [getDatabaseDirectory] $fileName]] \
      [getDbFileHeader]] == ![page1MustBeEncrypted]
  }]

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {0 1 0 1 0 1 0 3 True}}

###############################################################################

runTest {test data-1.45 {encrypted database, w/quoted-end-space} -setup {
  setupDb [set fileName data-1.45.db] "" "" "" "" "Password=\"1234 \";"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -match regexp -result {^1 \{(?:file is\
not a database|database disk image is malformed)\} 1 \{(?:file is not a\
database|database disk image is malformed)\} 0 1 0 2$}}

###############################################################################

runTest {test data-1.46 {encrypted database, password via builder} -setup {
  setupDb [set fileName data-1.46.db] "" "" "" "" "Password=67 89;"
} -body {
  sql execute $db "CREATE TABLE t1(x);"
................................................................................
  setupDb $fileName "" "" "" "" "Password=\"67 89\";" true false

  lappend result [catch {sql execute $db \
      "INSERT INTO t1 (x) VALUES(1);"} error] $error

  lappend result [catch {sql execute -execute scalar $db \
      "SELECT COUNT(*) FROM t1;"} error] $error

  cleanupDb $fileName db true false false

  lappend result [expr {
      [string equal [readDbFileHeader [file join \
      [getDatabaseDirectory] $fileName]] \
      [getDbFileHeader]] == ![page1MustBeEncrypted]
  }]

  set result
} -cleanup {
  unset -nocomplain connection

  cleanupDb $fileName; # NOTE: After object disposal.

  unset -nocomplain connectionStringBuilder error result db fileName
} -constraints {eagle command.object System.Data.SQLite.Encryption monoBug28\
command.sql compile.DATA SQLite System.Data.SQLite} -result \
{0 1 0 1 0 1 0 3 True}}

###############################################################################

runTest {test data-1.47 {quoted connection string properties} -setup {
  unset -nocomplain result list pair strings string
} -body {
  set result [list]
................................................................................
runTest {test data-1.55 {SQLiteConvert TypeNameToDbType} -setup {
  unset -nocomplain result typeName
} -body {
  foreach typeName [list \
      BIGINT BIGUINT BINARY BIT BLOB BOOL BOOLEAN CHAR CLOB COUNTER CURRENCY \
      DATE DATETIME DECIMAL DOUBLE FLOAT GENERAL GUID IDENTITY IMAGE INT INT8 \
      INT16 INT32 INT64 INTEGER INTEGER8 INTEGER16 INTEGER32 INTEGER64 \
      LOGICAL LONG LONGCHAR LONGTEXT LONGVARCHAR MEDIUMINT MEDIUMUINT MEMO \
      MONEY NCHAR NOTE NTEXT NUMBER NUMERIC NVARCHAR OLEOBJECT RAW REAL SINGLE \
      SMALLDATE SMALLINT SMALLUINT STRING TEXT TIME TIMESTAMP TINYINT TINYSINT \
      UINT UINT8 UINT16 UINT32 UINT64 ULONG UNIQUEIDENTIFIER UNSIGNEDINTEGER \
      UNSIGNEDINTEGER8 UNSIGNEDINTEGER16 UNSIGNEDINTEGER32 UNSIGNEDINTEGER64 \
      VARBINARY VARCHAR VARCHAR2 YESNO] {
    lappend result [list $typeName [object invoke -flags +NonPublic \
        System.Data.SQLite.SQLiteConvert TypeNameToDbType null $typeName None]]
  }
  set result
} -cleanup {
  unset -nocomplain result typeName
} -constraints {eagle command.object System.Data.SQLite} -result {{BIGINT\
................................................................................
Int64} {BIGUINT UInt64} {BINARY Binary} {BIT Boolean} {BLOB Binary} {BOOL\
Boolean} {BOOLEAN Boolean} {CHAR AnsiStringFixedLength} {CLOB String} {COUNTER\
Int64} {CURRENCY Decimal} {DATE DateTime} {DATETIME DateTime} {DECIMAL Decimal}\
{DOUBLE Double} {FLOAT Double} {GENERAL Binary} {GUID Guid} {IDENTITY Int64}\
{IMAGE Binary} {INT Int32} {INT8 SByte} {INT16 Int16} {INT32 Int32} {INT64\
Int64} {INTEGER Int64} {INTEGER8 SByte} {INTEGER16 Int16} {INTEGER32 Int32}\
{INTEGER64 Int64} {LOGICAL Boolean} {LONG Int64} {LONGCHAR String} {LONGTEXT\
String} {LONGVARCHAR String} {MEDIUMINT Int32} {MEDIUMUINT UInt32} {MEMO\
String} {MONEY Decimal} {NCHAR StringFixedLength} {NOTE String} {NTEXT String}\
{NUMBER Decimal} {NUMERIC Decimal} {NVARCHAR String} {OLEOBJECT Binary} {RAW\
Binary} {REAL Double} {SINGLE Single} {SMALLDATE DateTime} {SMALLINT Int16}\
{SMALLUINT UInt16} {STRING String} {TEXT String} {TIME DateTime} {TIMESTAMP\
DateTime} {TINYINT Byte} {TINYSINT SByte} {UINT UInt32} {UINT8 Byte} {UINT16\
UInt16} {UINT32 UInt32} {UINT64 UInt64} {ULONG UInt64} {UNIQUEIDENTIFIER Guid}\
{UNSIGNEDINTEGER UInt64} {UNSIGNEDINTEGER8 Byte} {UNSIGNEDINTEGER16 UInt16}\
{UNSIGNEDINTEGER32 UInt32} {UNSIGNEDINTEGER64 UInt64} {VARBINARY Binary}\
{VARCHAR AnsiString} {VARCHAR2 AnsiString} {YESNO Boolean}}}

###############################################################################

runTest {test data-1.56 {totype extension} -setup {
  setupDb [set fileName data-1.56.db]
} -body {
  set connection [getDbConnection]

Changes to Tests/tkt-0ed01c447c.eagle.

39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  freeDbConnection

  unset -nocomplain dataRow dataRows dataTable results connection db fileName
} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
System.Data.SQLite} -result {{autoincrement 12} {bigint 12} {binary 1} {bit 3}\
{blob 1} {bool 3} {boolean 3} {char 16} {counter 12} {currency 7} {date 6}\
{datetime 6} {decimal 7} {double 8} {float 8} {general 1} {guid 9} {identity\
12} {image 1} {int 11} {integer 12} {logical 3} {long 12} {longtext 16} {memo\
16} {money 7} {nchar 16} {note 16} {ntext 16} {numeric 7} {nvarchar 16}\
{oleobject 1} {real 8} {single 15} {smalldate 6} {smallint 10} {string 16}\
{text 16} {time 6} {timestamp 6} {tinyint 2} {uniqueidentifier 9} {varbinary 1}\
{varchar 16} {yesno 3}}}

###############################################################################

runSQLiteTestEpilogue
runTestEpilogue







|
|
|
|
|





39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  freeDbConnection

  unset -nocomplain dataRow dataRows dataTable results connection db fileName
} -constraints {eagle command.object monoBug28 command.sql compile.DATA SQLite\
System.Data.SQLite} -result {{autoincrement 12} {bigint 12} {binary 1} {bit 3}\
{blob 1} {bool 3} {boolean 3} {char 16} {counter 12} {currency 7} {date 6}\
{datetime 6} {decimal 7} {double 8} {float 8} {general 1} {guid 9} {identity\
12} {image 1} {int 11} {integer 12} {logical 3} {long 12} {longtext 16}\
{mediumint 11} {memo 16} {money 7} {nchar 16} {note 16} {ntext 16} {numeric 7}\
{nvarchar 16} {oleobject 1} {real 8} {single 15} {smalldate 6} {smallint 10}\
{string 16} {text 16} {time 6} {timestamp 6} {tinyint 2} {uniqueidentifier 9}\
{varbinary 1} {varchar 16} {yesno 3}}}

###############################################################################

runSQLiteTestEpilogue
runTestEpilogue

Changes to Tests/tkt-1c456ae75f.eagle.

52
53
54
55
56
57
58
59
60

61
62
63
64
65
66
67
..
83
84
85
86
87
88
89








90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
...
131
132
133
134
135
136
137
138
139

140
141
142
143
144
145
146
...
175
176
177
178
179
180
181








182
183
184
185
186
187
188
189
190
191

192
193
194
195
196

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}


###############################################################################

runTest {test tkt-1c456ae75f-1.2 {database, hex password} -setup {
  setupDb [set fileName tkt-1c456ae75f-1.2.db] "" "" "" "" \
      "HexPassword=3132333435;"
} -body {
................................................................................
  setupDb $fileName "" "" "" "" "HexPassword=3132333435;" true false

  lappend result [catch {sql execute $db \
      "INSERT INTO t1 (x) VALUES(1);"} error] $error

  lappend result [catch {sql execute -execute scalar $db \
      "SELECT COUNT(*) FROM t1;"} error] $error









  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {0 1 0 1 0 1 0 3}}

###############################################################################

runTest {test tkt-1c456ae75f-1.3 {database, wrong hex password} -setup {
  setupDb [set fileName tkt-1c456ae75f-1.3.db] "" "" "" "" \
      "HexPassword=3132333435;"
} -body {
................................................................................

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {1 {file is not a database} 1\
{file is not a database} 0 1 0 2}}


###############################################################################

runTest {test tkt-1c456ae75f-1.4 {database, hex password via builder} -setup {
  setupDb [set fileName tkt-1c456ae75f-1.4.db] "" "" "" "" \
      "HexPassword=3132333435;"
} -body {
................................................................................
  setupDb $fileName "" "" "" "" "Password=\"12345\";" true false

  lappend result [catch {sql execute $db \
      "INSERT INTO t1 (x) VALUES(1);"} error] $error

  lappend result [catch {sql execute -execute scalar $db \
      "SELECT COUNT(*) FROM t1;"} error] $error









  set result
} -cleanup {
  unset -nocomplain connection

  cleanupDb $fileName; # NOTE: After object disposal.

  unset -nocomplain connectionStringBuilder error result db fileName
} -constraints {eagle command.object System.Data.SQLite.Encryption monoBug28\
command.sql compile.DATA SQLite System.Data.SQLite} -result {0 1 0 1 0 1 0 3}}


###############################################################################

runSQLiteTestEpilogue
runTestEpilogue







|
|
>







 







>
>
>
>
>
>
>
>







|







 







|
|
>







 







>
>
>
>
>
>
>
>









|
>





52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
..
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
...
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
...
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -match regexp -result {^1 \{(?:file is\
not a database|database disk image is malformed)\} 1 \{(?:file is not a\
database|database disk image is malformed)\} 0 1 0 2$}}

###############################################################################

runTest {test tkt-1c456ae75f-1.2 {database, hex password} -setup {
  setupDb [set fileName tkt-1c456ae75f-1.2.db] "" "" "" "" \
      "HexPassword=3132333435;"
} -body {
................................................................................
  setupDb $fileName "" "" "" "" "HexPassword=3132333435;" true false

  lappend result [catch {sql execute $db \
      "INSERT INTO t1 (x) VALUES(1);"} error] $error

  lappend result [catch {sql execute -execute scalar $db \
      "SELECT COUNT(*) FROM t1;"} error] $error

  cleanupDb $fileName db true false false

  lappend result [expr {
      [string equal [readDbFileHeader [file join \
      [getDatabaseDirectory] $fileName]] \
      [getDbFileHeader]] == ![page1MustBeEncrypted]
  }]

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -result {0 1 0 1 0 1 0 3 True}}

###############################################################################

runTest {test tkt-1c456ae75f-1.3 {database, wrong hex password} -setup {
  setupDb [set fileName tkt-1c456ae75f-1.3.db] "" "" "" "" \
      "HexPassword=3132333435;"
} -body {
................................................................................

  set result
} -cleanup {
  cleanupDb $fileName

  unset -nocomplain error result db fileName
} -constraints {eagle System.Data.SQLite.Encryption monoBug28 command.sql\
compile.DATA SQLite System.Data.SQLite} -match regexp -result {^1 \{(?:file is\
not a database|database disk image is malformed)\} 1 \{(?:file is not a\
database|database disk image is malformed)\} 0 1 0 2$}}

###############################################################################

runTest {test tkt-1c456ae75f-1.4 {database, hex password via builder} -setup {
  setupDb [set fileName tkt-1c456ae75f-1.4.db] "" "" "" "" \
      "HexPassword=3132333435;"
} -body {
................................................................................
  setupDb $fileName "" "" "" "" "Password=\"12345\";" true false

  lappend result [catch {sql execute $db \
      "INSERT INTO t1 (x) VALUES(1);"} error] $error

  lappend result [catch {sql execute -execute scalar $db \
      "SELECT COUNT(*) FROM t1;"} error] $error

  cleanupDb $fileName db true false false

  lappend result [expr {
      [string equal [readDbFileHeader [file join \
      [getDatabaseDirectory] $fileName]] \
      [getDbFileHeader]] == ![page1MustBeEncrypted]
  }]

  set result
} -cleanup {
  unset -nocomplain connection

  cleanupDb $fileName; # NOTE: After object disposal.

  unset -nocomplain connectionStringBuilder error result db fileName
} -constraints {eagle command.object System.Data.SQLite.Encryption monoBug28\
command.sql compile.DATA SQLite System.Data.SQLite} -result \
{0 1 0 1 0 1 0 3 True}}

###############################################################################

runSQLiteTestEpilogue
runTestEpilogue

Changes to Tests/tkt-c010fa6584.eagle.

45
46
47
48
49
50
51


52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
..
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
...
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
...
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956



























957
958
959
960



























961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
      a11 INT64,             -- Int64
      a12 INTEGER,           -- Int64
      a13 INTEGER8,          -- SByte
      a14 INTEGER16,         -- Int16
      a15 INTEGER32,         -- Int32
      a16 INTEGER64,         -- Int64
      a17 LONG,              -- Int64


      a18 SMALLINT,          -- Int16
      a19 SMALLUINT,         -- UInt16
      a20 TINYINT,           -- Byte
      a21 TINYSINT,          -- SByte
      a22 UINT,              -- UInt32
      a23 UINT8,             -- Byte
      a24 UINT16,            -- UInt16
      a25 UINT32,            -- UInt32
      a26 UINT64,            -- UInt64
      a27 ULONG,             -- UInt64
      a28 UNSIGNEDINTEGER,   -- UInt32
      a29 UNSIGNEDINTEGER8,  -- Byte
      a30 UNSIGNEDINTEGER16, -- UInt16
      a31 UNSIGNEDINTEGER32, -- UInt32
      a32 UNSIGNEDINTEGER64  -- UInt64
    );
  }

  #
  # NOTE: These are the numeric values being tested against all the types in
  #       the database table defined above.  This list includes values that
  #       are out-of-bounds for each primitive integral type.
................................................................................
      32767 32768 \
      65535 65536 \
      2147483647 2147483648 \
      4294967295 4294967296 \
      9223372036854775807 9223372036854775808 \
      18446744073709551615 18446744073709551616]

  for {set index 1} {$index <= 32} {incr index} {
    set name [appendArgs a [format %02d $index]]
    foreach value $values {
      sql execute $db [subst {
        INSERT INTO t1 (a00, $name) VALUES('$name', $value);
      }]
    }
  }

  set results [list]

  for {set index 1} {$index <= 32} {incr index} {
    set name [appendArgs a [format %02d $index]]
    set count [sql execute -execute scalar $db [subst {
      SELECT COUNT(*) FROM t1 WHERE a00 = '$name';
    }]]
    for {set offset 0} {$offset < $count} {incr offset} {
      set code [catch {
        sql execute -execute scalar $db [subst {
................................................................................
a17 22 True 4294967296 0 4294967296
a17 23 True 9223372036854775807 0 9223372036854775807
a17 24 False 9223372036854775808 0 9223372036854775807
a17 25 False 18446744073709551615 0 9223372036854775807
a17 26 False 18446744073709551616 0 9223372036854775807
a18 0 False -9223372036854775809 0 0
a18 1 False -9223372036854775808 0 0
a18 2 False -2147483649 0 -1
a18 3 False -2147483648 0 0
a18 4 False -32769 0 32767
a18 5 True -32768 0 -32768
a18 6 True -129 0 -129
a18 7 True -128 0 -128
a18 8 True -1 0 -1
a18 9 True 0 0 0
a18 10 True 1 0 1
a18 11 True 127 0 127
a18 12 True 128 0 128
a18 13 True 255 0 255
a18 14 True 256 0 256
a18 15 True 32767 0 32767
a18 16 False 32768 0 -32768
a18 17 False 65535 0 -1
a18 18 False 65536 0 0
a18 19 False 2147483647 0 -1
a18 20 False 2147483648 0 0
a18 21 False 4294967295 0 -1
a18 22 False 4294967296 0 0
a18 23 False 9223372036854775807 0 -1
a18 24 False 9223372036854775808 0 -1
a18 25 False 18446744073709551615 0 -1
a18 26 False 18446744073709551616 0 -1
a19 0 False -9223372036854775809 0 0
a19 1 False -9223372036854775808 0 0
a19 2 False -2147483649 0 65535
a19 3 False -2147483648 0 0
a19 4 False -32769 0 32767
a19 5 False -32768 0 32768
a19 6 False -129 0 65407
a19 7 False -128 0 65408
a19 8 False -1 0 65535
a19 9 True 0 0 0
a19 10 True 1 0 1
a19 11 True 127 0 127
a19 12 True 128 0 128
a19 13 True 255 0 255
a19 14 True 256 0 256
a19 15 True 32767 0 32767
a19 16 True 32768 0 32768
a19 17 True 65535 0 65535
a19 18 False 65536 0 0
a19 19 False 2147483647 0 65535
a19 20 False 2147483648 0 0
a19 21 False 4294967295 0 65535
a19 22 False 4294967296 0 0
a19 23 False 9223372036854775807 0 65535
a19 24 False 9223372036854775808 0 65535
a19 25 False 18446744073709551615 0 65535
a19 26 False 18446744073709551616 0 65535
a20 0 False -9223372036854775809 0 0
a20 1 False -9223372036854775808 0 0
a20 2 False -2147483649 0 255
a20 3 False -2147483648 0 0
a20 4 False -32769 0 255
a20 5 False -32768 0 0
a20 6 False -129 0 127
a20 7 False -128 0 128
a20 8 False -1 0 255
a20 9 True 0 0 0
a20 10 True 1 0 1
a20 11 True 127 0 127
a20 12 True 128 0 128
a20 13 True 255 0 255
a20 14 False 256 0 0
a20 15 False 32767 0 255
a20 16 False 32768 0 0
a20 17 False 65535 0 255
a20 18 False 65536 0 0
a20 19 False 2147483647 0 255
a20 20 False 2147483648 0 0
a20 21 False 4294967295 0 255
a20 22 False 4294967296 0 0
a20 23 False 9223372036854775807 0 255
a20 24 False 9223372036854775808 0 255
a20 25 False 18446744073709551615 0 255
a20 26 False 18446744073709551616 0 255
a21 0 False -9223372036854775809 0 0
a21 1 False -9223372036854775808 0 0
a21 2 False -2147483649 0 -1
a21 3 False -2147483648 0 0
a21 4 False -32769 0 -1
a21 5 False -32768 0 0
a21 6 False -129 0 127
a21 7 True -128 0 -128
a21 8 True -1 0 -1
a21 9 True 0 0 0
a21 10 True 1 0 1
a21 11 True 127 0 127
a21 12 False 128 0 -128
a21 13 False 255 0 -1
a21 14 False 256 0 0
a21 15 False 32767 0 -1
a21 16 False 32768 0 0
a21 17 False 65535 0 -1
a21 18 False 65536 0 0
a21 19 False 2147483647 0 -1
a21 20 False 2147483648 0 0
a21 21 False 4294967295 0 -1
a21 22 False 4294967296 0 0
a21 23 False 9223372036854775807 0 -1
a21 24 False 9223372036854775808 0 -1
a21 25 False 18446744073709551615 0 -1
a21 26 False 18446744073709551616 0 -1
a22 0 False -9223372036854775809 0 0
a22 1 False -9223372036854775808 0 0
a22 2 False -2147483649 0 2147483647
a22 3 False -2147483648 0 2147483648
a22 4 False -32769 0 4294934527
a22 5 False -32768 0 4294934528
a22 6 False -129 0 4294967167
a22 7 False -128 0 4294967168
a22 8 False -1 0 4294967295
a22 9 True 0 0 0
a22 10 True 1 0 1
a22 11 True 127 0 127
a22 12 True 128 0 128
a22 13 True 255 0 255
a22 14 True 256 0 256
a22 15 True 32767 0 32767
a22 16 True 32768 0 32768
a22 17 True 65535 0 65535
a22 18 True 65536 0 65536
a22 19 True 2147483647 0 2147483647
a22 20 True 2147483648 0 2147483648
a22 21 True 4294967295 0 4294967295
a22 22 False 4294967296 0 0
a22 23 False 9223372036854775807 0 4294967295
a22 24 False 9223372036854775808 0 4294967295
a22 25 False 18446744073709551615 0 4294967295
a22 26 False 18446744073709551616 0 4294967295
a23 0 False -9223372036854775809 0 0
a23 1 False -9223372036854775808 0 0
a23 2 False -2147483649 0 255
a23 3 False -2147483648 0 0
a23 4 False -32769 0 255
a23 5 False -32768 0 0
a23 6 False -129 0 127
a23 7 False -128 0 128
a23 8 False -1 0 255
a23 9 True 0 0 0
a23 10 True 1 0 1
a23 11 True 127 0 127
a23 12 True 128 0 128
a23 13 True 255 0 255
a23 14 False 256 0 0
a23 15 False 32767 0 255
a23 16 False 32768 0 0
a23 17 False 65535 0 255
a23 18 False 65536 0 0
a23 19 False 2147483647 0 255
a23 20 False 2147483648 0 0
a23 21 False 4294967295 0 255
a23 22 False 4294967296 0 0
a23 23 False 9223372036854775807 0 255
a23 24 False 9223372036854775808 0 255
a23 25 False 18446744073709551615 0 255
a23 26 False 18446744073709551616 0 255
a24 0 False -9223372036854775809 0 0
a24 1 False -9223372036854775808 0 0
a24 2 False -2147483649 0 65535
a24 3 False -2147483648 0 0
a24 4 False -32769 0 32767
a24 5 False -32768 0 32768
a24 6 False -129 0 65407
a24 7 False -128 0 65408
a24 8 False -1 0 65535
a24 9 True 0 0 0
a24 10 True 1 0 1
a24 11 True 127 0 127
a24 12 True 128 0 128
a24 13 True 255 0 255
a24 14 True 256 0 256
a24 15 True 32767 0 32767
a24 16 True 32768 0 32768
a24 17 True 65535 0 65535
a24 18 False 65536 0 0
a24 19 False 2147483647 0 65535
a24 20 False 2147483648 0 0
a24 21 False 4294967295 0 65535
a24 22 False 4294967296 0 0
a24 23 False 9223372036854775807 0 65535
a24 24 False 9223372036854775808 0 65535
a24 25 False 18446744073709551615 0 65535
a24 26 False 18446744073709551616 0 65535
a25 0 False -9223372036854775809 0 0
a25 1 False -9223372036854775808 0 0
a25 2 False -2147483649 0 2147483647
a25 3 False -2147483648 0 2147483648
a25 4 False -32769 0 4294934527
a25 5 False -32768 0 4294934528
a25 6 False -129 0 4294967167
a25 7 False -128 0 4294967168
a25 8 False -1 0 4294967295
a25 9 True 0 0 0
a25 10 True 1 0 1
a25 11 True 127 0 127
a25 12 True 128 0 128
a25 13 True 255 0 255
a25 14 True 256 0 256
a25 15 True 32767 0 32767
a25 16 True 32768 0 32768
a25 17 True 65535 0 65535
a25 18 True 65536 0 65536
a25 19 True 2147483647 0 2147483647
a25 20 True 2147483648 0 2147483648
a25 21 True 4294967295 0 4294967295
a25 22 False 4294967296 0 0
a25 23 False 9223372036854775807 0 4294967295
a25 24 False 9223372036854775808 0 4294967295
a25 25 False 18446744073709551615 0 4294967295
a25 26 False 18446744073709551616 0 4294967295
a26 0 False -9223372036854775809 0 9223372036854775808
a26 1 False -9223372036854775808 0 9223372036854775808
a26 2 False -2147483649 0 18446744071562067967
a26 3 False -2147483648 0 18446744071562067968
a26 4 False -32769 0 18446744073709518847
a26 5 False -32768 0 18446744073709518848
a26 6 False -129 0 18446744073709551487
a26 7 False -128 0 18446744073709551488
a26 8 False -1 0 18446744073709551615
a26 9 True 0 0 0
a26 10 True 1 0 1
a26 11 True 127 0 127
a26 12 True 128 0 128
a26 13 True 255 0 255
a26 14 True 256 0 256
a26 15 True 32767 0 32767
a26 16 True 32768 0 32768
a26 17 True 65535 0 65535
a26 18 True 65536 0 65536
a26 19 True 2147483647 0 2147483647
a26 20 True 2147483648 0 2147483648
a26 21 True 4294967295 0 4294967295
a26 22 True 4294967296 0 4294967296
a26 23 True 9223372036854775807 0 9223372036854775807
a26 24 False 9223372036854775808 0 9223372036854775807
a26 25 False 18446744073709551615 0 9223372036854775807
a26 26 False 18446744073709551616 0 9223372036854775807
a27 0 False -9223372036854775809 0 9223372036854775808
a27 1 False -9223372036854775808 0 9223372036854775808
a27 2 False -2147483649 0 18446744071562067967
a27 3 False -2147483648 0 18446744071562067968
a27 4 False -32769 0 18446744073709518847
a27 5 False -32768 0 18446744073709518848
a27 6 False -129 0 18446744073709551487
a27 7 False -128 0 18446744073709551488
a27 8 False -1 0 18446744073709551615
a27 9 True 0 0 0
a27 10 True 1 0 1
a27 11 True 127 0 127
a27 12 True 128 0 128
a27 13 True 255 0 255
a27 14 True 256 0 256
a27 15 True 32767 0 32767
a27 16 True 32768 0 32768
a27 17 True 65535 0 65535
a27 18 True 65536 0 65536
a27 19 True 2147483647 0 2147483647
a27 20 True 2147483648 0 2147483648
a27 21 True 4294967295 0 4294967295
a27 22 True 4294967296 0 4294967296
a27 23 True 9223372036854775807 0 9223372036854775807
a27 24 False 9223372036854775808 0 9223372036854775807
a27 25 False 18446744073709551615 0 9223372036854775807
a27 26 False 18446744073709551616 0 9223372036854775807
a28 0 False -9223372036854775809 0 9223372036854775808
a28 1 False -9223372036854775808 0 9223372036854775808
a28 2 False -2147483649 0 18446744071562067967
a28 3 False -2147483648 0 18446744071562067968
a28 4 False -32769 0 18446744073709518847
a28 5 False -32768 0 18446744073709518848
a28 6 False -129 0 18446744073709551487
................................................................................
a28 20 True 2147483648 0 2147483648
a28 21 True 4294967295 0 4294967295
a28 22 True 4294967296 0 4294967296
a28 23 True 9223372036854775807 0 9223372036854775807
a28 24 False 9223372036854775808 0 9223372036854775807
a28 25 False 18446744073709551615 0 9223372036854775807
a28 26 False 18446744073709551616 0 9223372036854775807
a29 0 False -9223372036854775809 0 0
a29 1 False -9223372036854775808 0 0
a29 2 False -2147483649 0 255
a29 3 False -2147483648 0 0
a29 4 False -32769 0 255
a29 5 False -32768 0 0
a29 6 False -129 0 127
a29 7 False -128 0 128
a29 8 False -1 0 255
a29 9 True 0 0 0
a29 10 True 1 0 1
a29 11 True 127 0 127
a29 12 True 128 0 128
a29 13 True 255 0 255
a29 14 False 256 0 0
a29 15 False 32767 0 255
a29 16 False 32768 0 0
a29 17 False 65535 0 255
a29 18 False 65536 0 0
a29 19 False 2147483647 0 255
a29 20 False 2147483648 0 0
a29 21 False 4294967295 0 255
a29 22 False 4294967296 0 0
a29 23 False 9223372036854775807 0 255
a29 24 False 9223372036854775808 0 255
a29 25 False 18446744073709551615 0 255
a29 26 False 18446744073709551616 0 255
a30 0 False -9223372036854775809 0 0
a30 1 False -9223372036854775808 0 0
a30 2 False -2147483649 0 65535
a30 3 False -2147483648 0 0
a30 4 False -32769 0 32767
a30 5 False -32768 0 32768
a30 6 False -129 0 65407
a30 7 False -128 0 65408
a30 8 False -1 0 65535
a30 9 True 0 0 0
a30 10 True 1 0 1
a30 11 True 127 0 127
a30 12 True 128 0 128
a30 13 True 255 0 255
a30 14 True 256 0 256
a30 15 True 32767 0 32767
a30 16 True 32768 0 32768
a30 17 True 65535 0 65535
a30 18 False 65536 0 0
a30 19 False 2147483647 0 65535
a30 20 False 2147483648 0 0
a30 21 False 4294967295 0 65535
a30 22 False 4294967296 0 0
a30 23 False 9223372036854775807 0 65535
a30 24 False 9223372036854775808 0 65535
a30 25 False 18446744073709551615 0 65535
a30 26 False 18446744073709551616 0 65535
a31 0 False -9223372036854775809 0 0
a31 1 False -9223372036854775808 0 0
a31 2 False -2147483649 0 2147483647
a31 3 False -2147483648 0 2147483648
a31 4 False -32769 0 4294934527
a31 5 False -32768 0 4294934528
a31 6 False -129 0 4294967167
a31 7 False -128 0 4294967168
a31 8 False -1 0 4294967295
a31 9 True 0 0 0
a31 10 True 1 0 1
a31 11 True 127 0 127
a31 12 True 128 0 128
a31 13 True 255 0 255



























a31 14 True 256 0 256
a31 15 True 32767 0 32767
a31 16 True 32768 0 32768
a31 17 True 65535 0 65535



























a31 18 True 65536 0 65536
a31 19 True 2147483647 0 2147483647
a31 20 True 2147483648 0 2147483648
a31 21 True 4294967295 0 4294967295
a31 22 False 4294967296 0 0
a31 23 False 9223372036854775807 0 4294967295
a31 24 False 9223372036854775808 0 4294967295
a31 25 False 18446744073709551615 0 4294967295
a31 26 False 18446744073709551616 0 4294967295
a32 0 False -9223372036854775809 0 9223372036854775808
a32 1 False -9223372036854775808 0 9223372036854775808
a32 2 False -2147483649 0 18446744071562067967
a32 3 False -2147483648 0 18446744071562067968
a32 4 False -32769 0 18446744073709518847
a32 5 False -32768 0 18446744073709518848
a32 6 False -129 0 18446744073709551487
a32 7 False -128 0 18446744073709551488
a32 8 False -1 0 18446744073709551615
a32 9 True 0 0 0
a32 10 True 1 0 1
a32 11 True 127 0 127
a32 12 True 128 0 128
a32 13 True 255 0 255
a32 14 True 256 0 256
a32 15 True 32767 0 32767
a32 16 True 32768 0 32768
a32 17 True 65535 0 65535
a32 18 True 65536 0 65536
a32 19 True 2147483647 0 2147483647
a32 20 True 2147483648 0 2147483648
a32 21 True 4294967295 0 4294967295
a32 22 True 4294967296 0 4294967296
a32 23 True 9223372036854775807 0 9223372036854775807
a32 24 False 9223372036854775808 0 9223372036854775807
a32 25 False 18446744073709551615 0 9223372036854775807
a32 26 False 18446744073709551616 0 9223372036854775807
$}}

###############################################################################

runTest {test tkt-c010fa6584-1.2 {UInt32 parameter} -setup {
  setupDb [set fileName tkt-c010fa6584-1.2.db]
} -body {







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







 







|










|







 







|
|
|











|
|
|
|
|








|
|
|
|
|
|
|









|
|
|
|

|
|
|
|


|

|
|
|
|
|





|
|
|
|

|

|

|
|
|
|


|

|
|
|
|
|



|
|
|
|
|
|

|

|

|
|
|
|


|
|
|
|
|
|
|





|
|
|
|
|
|
|
|

|
|
|
|


|

|


|
|



|
|

|

|

|

|

|
|
|
|


|
|
|
|
|
|
|









|
|
|
|

|
|
|
|


|
|
|
|
|
|
|





|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|









|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|













|
|
|
|
|







 







|
|
|
|
|
|
|
|
|





|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|









|
|
|
|
|
|
|
|
|


|
|
|
|
|
|
|





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







45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
..
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
...
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
...
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
      a11 INT64,             -- Int64
      a12 INTEGER,           -- Int64
      a13 INTEGER8,          -- SByte
      a14 INTEGER16,         -- Int16
      a15 INTEGER32,         -- Int32
      a16 INTEGER64,         -- Int64
      a17 LONG,              -- Int64
      a18 MEDIUMINT,         -- Int32
      a19 MEDIUMUINT,        -- UInt32
      a20 SMALLINT,          -- Int16
      a21 SMALLUINT,         -- UInt16
      a22 TINYINT,           -- Byte
      a23 TINYSINT,          -- SByte
      a24 UINT,              -- UInt32
      a25 UINT8,             -- Byte
      a26 UINT16,            -- UInt16
      a27 UINT32,            -- UInt32
      a28 UINT64,            -- UInt64
      a29 ULONG,             -- UInt64
      a30 UNSIGNEDINTEGER,   -- UInt32
      a31 UNSIGNEDINTEGER8,  -- Byte
      a32 UNSIGNEDINTEGER16, -- UInt16
      a33 UNSIGNEDINTEGER32, -- UInt32
      a34 UNSIGNEDINTEGER64  -- UInt64
    );
  }

  #
  # NOTE: These are the numeric values being tested against all the types in
  #       the database table defined above.  This list includes values that
  #       are out-of-bounds for each primitive integral type.
................................................................................
      32767 32768 \
      65535 65536 \
      2147483647 2147483648 \
      4294967295 4294967296 \
      9223372036854775807 9223372036854775808 \
      18446744073709551615 18446744073709551616]

  for {set index 1} {$index <= 34} {incr index} {
    set name [appendArgs a [format %02d $index]]
    foreach value $values {
      sql execute $db [subst {
        INSERT INTO t1 (a00, $name) VALUES('$name', $value);
      }]
    }
  }

  set results [list]

  for {set index 1} {$index <= 34} {incr index} {
    set name [appendArgs a [format %02d $index]]
    set count [sql execute -execute scalar $db [subst {
      SELECT COUNT(*) FROM t1 WHERE a00 = '$name';
    }]]
    for {set offset 0} {$offset < $count} {incr offset} {
      set code [catch {
        sql execute -execute scalar $db [subst {
................................................................................
a17 22 True 4294967296 0 4294967296
a17 23 True 9223372036854775807 0 9223372036854775807
a17 24 False 9223372036854775808 0 9223372036854775807
a17 25 False 18446744073709551615 0 9223372036854775807
a17 26 False 18446744073709551616 0 9223372036854775807
a18 0 False -9223372036854775809 0 0
a18 1 False -9223372036854775808 0 0
a18 2 False -2147483649 0 2147483647
a18 3 True -2147483648 0 -2147483648
a18 4 True -32769 0 -32769
a18 5 True -32768 0 -32768
a18 6 True -129 0 -129
a18 7 True -128 0 -128
a18 8 True -1 0 -1
a18 9 True 0 0 0
a18 10 True 1 0 1
a18 11 True 127 0 127
a18 12 True 128 0 128
a18 13 True 255 0 255
a18 14 True 256 0 256
a18 15 True 32767 0 32767
a18 16 True 32768 0 32768
a18 17 True 65535 0 65535
a18 18 True 65536 0 65536
a18 19 True 2147483647 0 2147483647
a18 20 False 2147483648 0 -2147483648
a18 21 False 4294967295 0 -1
a18 22 False 4294967296 0 0
a18 23 False 9223372036854775807 0 -1
a18 24 False 9223372036854775808 0 -1
a18 25 False 18446744073709551615 0 -1
a18 26 False 18446744073709551616 0 -1
a19 0 False -9223372036854775809 0 0
a19 1 False -9223372036854775808 0 0
a19 2 False -2147483649 0 2147483647
a19 3 False -2147483648 0 2147483648
a19 4 False -32769 0 4294934527
a19 5 False -32768 0 4294934528
a19 6 False -129 0 4294967167
a19 7 False -128 0 4294967168
a19 8 False -1 0 4294967295
a19 9 True 0 0 0
a19 10 True 1 0 1
a19 11 True 127 0 127
a19 12 True 128 0 128
a19 13 True 255 0 255
a19 14 True 256 0 256
a19 15 True 32767 0 32767
a19 16 True 32768 0 32768
a19 17 True 65535 0 65535
a19 18 True 65536 0 65536
a19 19 True 2147483647 0 2147483647
a19 20 True 2147483648 0 2147483648
a19 21 True 4294967295 0 4294967295
a19 22 False 4294967296 0 0
a19 23 False 9223372036854775807 0 4294967295
a19 24 False 9223372036854775808 0 4294967295
a19 25 False 18446744073709551615 0 4294967295
a19 26 False 18446744073709551616 0 4294967295
a20 0 False -9223372036854775809 0 0
a20 1 False -9223372036854775808 0 0
a20 2 False -2147483649 0 -1
a20 3 False -2147483648 0 0
a20 4 False -32769 0 32767
a20 5 True -32768 0 -32768
a20 6 True -129 0 -129
a20 7 True -128 0 -128
a20 8 True -1 0 -1
a20 9 True 0 0 0
a20 10 True 1 0 1
a20 11 True 127 0 127
a20 12 True 128 0 128
a20 13 True 255 0 255
a20 14 True 256 0 256
a20 15 True 32767 0 32767
a20 16 False 32768 0 -32768
a20 17 False 65535 0 -1
a20 18 False 65536 0 0
a20 19 False 2147483647 0 -1
a20 20 False 2147483648 0 0
a20 21 False 4294967295 0 -1
a20 22 False 4294967296 0 0
a20 23 False 9223372036854775807 0 -1
a20 24 False 9223372036854775808 0 -1
a20 25 False 18446744073709551615 0 -1
a20 26 False 18446744073709551616 0 -1
a21 0 False -9223372036854775809 0 0
a21 1 False -9223372036854775808 0 0
a21 2 False -2147483649 0 65535
a21 3 False -2147483648 0 0
a21 4 False -32769 0 32767
a21 5 False -32768 0 32768
a21 6 False -129 0 65407
a21 7 False -128 0 65408
a21 8 False -1 0 65535
a21 9 True 0 0 0
a21 10 True 1 0 1
a21 11 True 127 0 127
a21 12 True 128 0 128
a21 13 True 255 0 255
a21 14 True 256 0 256
a21 15 True 32767 0 32767
a21 16 True 32768 0 32768
a21 17 True 65535 0 65535
a21 18 False 65536 0 0
a21 19 False 2147483647 0 65535
a21 20 False 2147483648 0 0
a21 21 False 4294967295 0 65535
a21 22 False 4294967296 0 0
a21 23 False 9223372036854775807 0 65535
a21 24 False 9223372036854775808 0 65535
a21 25 False 18446744073709551615 0 65535
a21 26 False 18446744073709551616 0 65535
a22 0 False -9223372036854775809 0 0
a22 1 False -9223372036854775808 0 0
a22 2 False -2147483649 0 255
a22 3 False -2147483648 0 0
a22 4 False -32769 0 255
a22 5 False -32768 0 0
a22 6 False -129 0 127
a22 7 False -128 0 128
a22 8 False -1 0 255
a22 9 True 0 0 0
a22 10 True 1 0 1
a22 11 True 127 0 127
a22 12 True 128 0 128
a22 13 True 255 0 255
a22 14 False 256 0 0
a22 15 False 32767 0 255
a22 16 False 32768 0 0
a22 17 False 65535 0 255
a22 18 False 65536 0 0
a22 19 False 2147483647 0 255
a22 20 False 2147483648 0 0
a22 21 False 4294967295 0 255
a22 22 False 4294967296 0 0
a22 23 False 9223372036854775807 0 255
a22 24 False 9223372036854775808 0 255
a22 25 False 18446744073709551615 0 255
a22 26 False 18446744073709551616 0 255
a23 0 False -9223372036854775809 0 0
a23 1 False -9223372036854775808 0 0
a23 2 False -2147483649 0 -1
a23 3 False -2147483648 0 0
a23 4 False -32769 0 -1
a23 5 False -32768 0 0
a23 6 False -129 0 127
a23 7 True -128 0 -128
a23 8 True -1 0 -1
a23 9 True 0 0 0
a23 10 True 1 0 1
a23 11 True 127 0 127
a23 12 False 128 0 -128
a23 13 False 255 0 -1
a23 14 False 256 0 0
a23 15 False 32767 0 -1
a23 16 False 32768 0 0
a23 17 False 65535 0 -1
a23 18 False 65536 0 0
a23 19 False 2147483647 0 -1
a23 20 False 2147483648 0 0
a23 21 False 4294967295 0 -1
a23 22 False 4294967296 0 0
a23 23 False 9223372036854775807 0 -1
a23 24 False 9223372036854775808 0 -1
a23 25 False 18446744073709551615 0 -1
a23 26 False 18446744073709551616 0 -1
a24 0 False -9223372036854775809 0 0
a24 1 False -9223372036854775808 0 0
a24 2 False -2147483649 0 2147483647
a24 3 False -2147483648 0 2147483648
a24 4 False -32769 0 4294934527
a24 5 False -32768 0 4294934528
a24 6 False -129 0 4294967167
a24 7 False -128 0 4294967168
a24 8 False -1 0 4294967295
a24 9 True 0 0 0
a24 10 True 1 0 1
a24 11 True 127 0 127
a24 12 True 128 0 128
a24 13 True 255 0 255
a24 14 True 256 0 256
a24 15 True 32767 0 32767
a24 16 True 32768 0 32768
a24 17 True 65535 0 65535
a24 18 True 65536 0 65536
a24 19 True 2147483647 0 2147483647
a24 20 True 2147483648 0 2147483648
a24 21 True 4294967295 0 4294967295
a24 22 False 4294967296 0 0
a24 23 False 9223372036854775807 0 4294967295
a24 24 False 9223372036854775808 0 4294967295
a24 25 False 18446744073709551615 0 4294967295
a24 26 False 18446744073709551616 0 4294967295
a25 0 False -9223372036854775809 0 0
a25 1 False -9223372036854775808 0 0
a25 2 False -2147483649 0 255
a25 3 False -2147483648 0 0
a25 4 False -32769 0 255
a25 5 False -32768 0 0
a25 6 False -129 0 127
a25 7 False -128 0 128
a25 8 False -1 0 255
a25 9 True 0 0 0
a25 10 True 1 0 1
a25 11 True 127 0 127
a25 12 True 128 0 128
a25 13 True 255 0 255
a25 14 False 256 0 0
a25 15 False 32767 0 255
a25 16 False 32768 0 0
a25 17 False 65535 0 255
a25 18 False 65536 0 0
a25 19 False 2147483647 0 255
a25 20 False 2147483648 0 0
a25 21 False 4294967295 0 255
a25 22 False 4294967296 0 0
a25 23 False 9223372036854775807 0 255
a25 24 False 9223372036854775808 0 255
a25 25 False 18446744073709551615 0 255
a25 26 False 18446744073709551616 0 255
a26 0 False -9223372036854775809 0 0
a26 1 False -9223372036854775808 0 0
a26 2 False -2147483649 0 65535
a26 3 False -2147483648 0 0
a26 4 False -32769 0 32767
a26 5 False -32768 0 32768
a26 6 False -129 0 65407
a26 7 False -128 0 65408
a26 8 False -1 0 65535
a26 9 True 0 0 0
a26 10 True 1 0 1
a26 11 True 127 0 127
a26 12 True 128 0 128
a26 13 True 255 0 255
a26 14 True 256 0 256
a26 15 True 32767 0 32767
a26 16 True 32768 0 32768
a26 17 True 65535 0 65535
a26 18 False 65536 0 0
a26 19 False 2147483647 0 65535
a26 20 False 2147483648 0 0
a26 21 False 4294967295 0 65535
a26 22 False 4294967296 0 0
a26 23 False 9223372036854775807 0 65535
a26 24 False 9223372036854775808 0 65535
a26 25 False 18446744073709551615 0 65535
a26 26 False 18446744073709551616 0 65535
a27 0 False -9223372036854775809 0 0
a27 1 False -9223372036854775808 0 0
a27 2 False -2147483649 0 2147483647
a27 3 False -2147483648 0 2147483648
a27 4 False -32769 0 4294934527
a27 5 False -32768 0 4294934528
a27 6 False -129 0 4294967167
a27 7 False -128 0 4294967168
a27 8 False -1 0 4294967295
a27 9 True 0 0 0
a27 10 True 1 0 1
a27 11 True 127 0 127
a27 12 True 128 0 128
a27 13 True 255 0 255
a27 14 True 256 0 256
a27 15 True 32767 0 32767
a27 16 True 32768 0 32768
a27 17 True 65535 0 65535
a27 18 True 65536 0 65536
a27 19 True 2147483647 0 2147483647
a27 20 True 2147483648 0 2147483648
a27 21 True 4294967295 0 4294967295
a27 22 False 4294967296 0 0
a27 23 False 9223372036854775807 0 4294967295
a27 24 False 9223372036854775808 0 4294967295
a27 25 False 18446744073709551615 0 4294967295
a27 26 False 18446744073709551616 0 4294967295
a28 0 False -9223372036854775809 0 9223372036854775808
a28 1 False -9223372036854775808 0 9223372036854775808
a28 2 False -2147483649 0 18446744071562067967
a28 3 False -2147483648 0 18446744071562067968
a28 4 False -32769 0 18446744073709518847
a28 5 False -32768 0 18446744073709518848
a28 6 False -129 0 18446744073709551487
................................................................................
a28 20 True 2147483648 0 2147483648
a28 21 True 4294967295 0 4294967295
a28 22 True 4294967296 0 4294967296
a28 23 True 9223372036854775807 0 9223372036854775807
a28 24 False 9223372036854775808 0 9223372036854775807
a28 25 False 18446744073709551615 0 9223372036854775807
a28 26 False 18446744073709551616 0 9223372036854775807
a29 0 False -9223372036854775809 0 9223372036854775808
a29 1 False -9223372036854775808 0 9223372036854775808
a29 2 False -2147483649 0 18446744071562067967
a29 3 False -2147483648 0 18446744071562067968
a29 4 False -32769 0 18446744073709518847
a29 5 False -32768 0 18446744073709518848
a29 6 False -129 0 18446744073709551487
a29 7 False -128 0 18446744073709551488
a29 8 False -1 0 18446744073709551615
a29 9 True 0 0 0
a29 10 True 1 0 1
a29 11 True 127 0 127
a29 12 True 128 0 128
a29 13 True 255 0 255
a29 14 True 256 0 256
a29 15 True 32767 0 32767
a29 16 True 32768 0 32768
a29 17 True 65535 0 65535
a29 18 True 65536 0 65536
a29 19 True 2147483647 0 2147483647
a29 20 True 2147483648 0 2147483648
a29 21 True 4294967295 0 4294967295
a29 22 True 4294967296 0 4294967296
a29 23 True 9223372036854775807 0 9223372036854775807
a29 24 False 9223372036854775808 0 9223372036854775807
a29 25 False 18446744073709551615 0 9223372036854775807
a29 26 False 18446744073709551616 0 9223372036854775807
a30 0 False -9223372036854775809 0 9223372036854775808
a30 1 False -9223372036854775808 0 9223372036854775808
a30 2 False -2147483649 0 18446744071562067967
a30 3 False -2147483648 0 18446744071562067968
a30 4 False -32769 0 18446744073709518847
a30 5 False -32768 0 18446744073709518848
a30 6 False -129 0 18446744073709551487
a30 7 False -128 0 18446744073709551488
a30 8 False -1 0 18446744073709551615
a30 9 True 0 0 0
a30 10 True 1 0 1
a30 11 True 127 0 127
a30 12 True 128 0 128
a30 13 True 255 0 255
a30 14 True 256 0 256
a30 15 True 32767 0 32767
a30 16 True 32768 0 32768
a30 17 True 65535 0 65535
a30 18 True 65536 0 65536
a30 19 True 2147483647 0 2147483647
a30 20 True 2147483648 0 2147483648
a30 21 True 4294967295 0 4294967295
a30 22 True 4294967296 0 4294967296
a30 23 True 9223372036854775807 0 9223372036854775807
a30 24 False 9223372036854775808 0 9223372036854775807
a30 25 False 18446744073709551615 0 9223372036854775807
a30 26 False 18446744073709551616 0 9223372036854775807
a31 0 False -9223372036854775809 0 0
a31 1 False -9223372036854775808 0 0
a31 2 False -2147483649 0 255
a31 3 False -2147483648 0 0
a31 4 False -32769 0 255
a31 5 False -32768 0 0
a31 6 False -129 0 127
a31 7 False -128 0 128
a31 8 False -1 0 255
a31 9 True 0 0 0
a31 10 True 1 0 1
a31 11 True 127 0 127
a31 12 True 128 0 128
a31 13 True 255 0 255
a31 14 False 256 0 0
a31 15 False 32767 0 255
a31 16 False 32768 0 0
a31 17 False 65535 0 255
a31 18 False 65536 0 0
a31 19 False 2147483647 0 255
a31 20 False 2147483648 0 0
a31 21 False 4294967295 0 255
a31 22 False 4294967296 0 0
a31 23 False 9223372036854775807 0 255
a31 24 False 9223372036854775808 0 255
a31 25 False 18446744073709551615 0 255
a31 26 False 18446744073709551616 0 255
a32 0 False -9223372036854775809 0 0
a32 1 False -9223372036854775808 0 0
a32 2 False -2147483649 0 65535
a32 3 False -2147483648 0 0
a32 4 False -32769 0 32767
a32 5 False -32768 0 32768
a32 6 False -129 0 65407
a32 7 False -128 0 65408
a32 8 False -1 0 65535
a32 9 True 0 0 0
a32 10 True 1 0 1
a32 11 True 127 0 127
a32 12 True 128 0 128
a32 13 True 255 0 255
a32 14 True 256 0 256
a32 15 True 32767 0 32767
a32 16 True 32768 0 32768
a32 17 True 65535 0 65535
a32 18 False 65536 0 0
a32 19 False 2147483647 0 65535
a32 20 False 2147483648 0 0
a32 21 False 4294967295 0 65535
a32 22 False 4294967296 0 0
a32 23 False 9223372036854775807 0 65535
a32 24 False 9223372036854775808 0 65535
a32 25 False 18446744073709551615 0 65535
a32 26 False 18446744073709551616 0 65535
a33 0 False -9223372036854775809 0 0
a33 1 False -9223372036854775808 0 0
a33 2 False -2147483649 0 2147483647
a33 3 False -2147483648 0 2147483648
a33 4 False -32769 0 4294934527
a33 5 False -32768 0 4294934528
a33 6 False -129 0 4294967167
a33 7 False -128 0 4294967168
a33 8 False -1 0 4294967295
a33 9 True 0 0 0
a33 10 True 1 0 1
a33 11 True 127 0 127
a33 12 True 128 0 128
a33 13 True 255 0 255
a33 14 True 256 0 256
a33 15 True 32767 0 32767
a33 16 True 32768 0 32768
a33 17 True 65535 0 65535
a33 18 True 65536 0 65536
a33 19 True 2147483647 0 2147483647
a33 20 True 2147483648 0 2147483648
a33 21 True 4294967295 0 4294967295
a33 22 False 4294967296 0 0
a33 23 False 9223372036854775807 0 4294967295
a33 24 False 9223372036854775808 0 4294967295
a33 25 False 18446744073709551615 0 4294967295
a33 26 False 18446744073709551616 0 4294967295
a34 0 False -9223372036854775809 0 9223372036854775808
a34 1 False -9223372036854775808 0 9223372036854775808
a34 2 False -2147483649 0 18446744071562067967
a34 3 False -2147483648 0 18446744071562067968
a34 4 False -32769 0 18446744073709518847
a34 5 False -32768 0 18446744073709518848
a34 6 False -129 0 18446744073709551487
a34 7 False -128 0 18446744073709551488
a34 8 False -1 0 18446744073709551615
a34 9 True 0 0 0
a34 10 True 1 0 1
a34 11 True 127 0 127
a34 12 True 128 0 128
a34 13 True 255 0 255
a34 14 True 256 0 256
a34 15 True 32767 0 32767
a34 16 True 32768 0 32768
a34 17 True 65535 0 65535
a34 18 True 65536 0 65536
a34 19 True 2147483647 0 2147483647
a34 20 True 2147483648 0 2147483648
a34 21 True 4294967295 0 4294967295
a34 22 True 4294967296 0 4294967296
a34 23 True 9223372036854775807 0 9223372036854775807
a34 24 False 9223372036854775808 0 9223372036854775807
a34 25 False 18446744073709551615 0 9223372036854775807
a34 26 False 18446744073709551616 0 9223372036854775807
$}}

###############################################################################

runTest {test tkt-c010fa6584-1.2 {UInt32 parameter} -setup {
  setupDb [set fileName tkt-c010fa6584-1.2.db]
} -body {

Changes to readme.htm.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
204
205
206
207
208
209
210
211
212
213

214
215
216
217
218






219
220
221
222
223
224
225
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
ADO.NET SQLite Data Provider<br />
Version 1.0.112.2 - April 27, 2020<br />
Using <a href="https://www.sqlite.org/releaselog/3_31_1.html">SQLite 3.31.1</a><br />Originally written by Robert Simpson<br />
Released to the public domain, use at your own risk!<br />
Official provider website:&nbsp;<a href="https://system.data.sqlite.org/">https://system.data.sqlite.org/</a><br />
Legacy versions:&nbsp;<a href="https://sourceforge.net/projects/sqlite-dotnet2/">https://sourceforge.net/projects/sqlite-dotnet2/</a><br />
<br />
The current development version can be downloaded from <a href="https://system.data.sqlite.org/index.html/timeline?y=ci">
https://system.data.sqlite.org/index.html/timeline?y=ci</a>
<br />
................................................................................
designed for robustness and maximum backward compatibility with previously
released versions of System.Data.SQLite.
</p>

<h2><b>Version History</b></h2>

<p>
    <b>1.0.113.0 - May XX, 2020 <font color="red">(release scheduled)</font></b>
</p>
<ul>

    <li>Add SQLite_ForceLogLifecycle environment variable to force logging of calls into key members pertaining to the lifecycle of connections and their associated classes (e.g. LINQ, EF6, etc).</li>
    <li>When using the (unsupported) legacy CryptoAPI based codec, skip encrypting page #1 because that can lead to database corruption and other malfunctions.</li>
    <li>Support automatic value conversions for columns with a declared type of MEDIUMINT or MEDIUMUINT. Pursuant to [515cb60b10].</li>
    <li>Add preliminary support for the .NET Framework 4.8.</li>
</ul>






<p>
    <b>1.0.112.2 - April 27, 2020</b>
</p>
<ul>
    <li>Fix NuGet packaging for .NET Standard 2.1. Fix for [7c73262e6f].</li>
</ul>
<p>







|
|







 







|


>

<



>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
204
205
206
207
208
209
210
211
212
213
214
215

216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
ADO.NET SQLite Data Provider<br />
Version 1.0.113.0 - June XX, 2020 <font color="red">(release scheduled)</font><br />
Using <a href="https://www.sqlite.org/releaselog/3_32_0.html">SQLite 3.32.0</a><br />Originally written by Robert Simpson<br />
Released to the public domain, use at your own risk!<br />
Official provider website:&nbsp;<a href="https://system.data.sqlite.org/">https://system.data.sqlite.org/</a><br />
Legacy versions:&nbsp;<a href="https://sourceforge.net/projects/sqlite-dotnet2/">https://sourceforge.net/projects/sqlite-dotnet2/</a><br />
<br />
The current development version can be downloaded from <a href="https://system.data.sqlite.org/index.html/timeline?y=ci">
https://system.data.sqlite.org/index.html/timeline?y=ci</a>
<br />
................................................................................
designed for robustness and maximum backward compatibility with previously
released versions of System.Data.SQLite.
</p>

<h2><b>Version History</b></h2>

<p>
    <b>1.0.113.0 - June XX, 2020 <font color="red">(release scheduled)</font></b>
</p>
<ul>
    <li>Updated to <a href="https://www.sqlite.org/releaselog/3_32_0.html">SQLite 3.32.0</a>.</li>
    <li>Add SQLite_ForceLogLifecycle environment variable to force logging of calls into key members pertaining to the lifecycle of connections and their associated classes (e.g. LINQ, EF6, etc).</li>

    <li>Support automatic value conversions for columns with a declared type of MEDIUMINT or MEDIUMUINT. Pursuant to [515cb60b10].</li>
    <li>Add preliminary support for the .NET Framework 4.8.</li>
</ul>
<p>
    <b>1.0.112.3 - Xxxx XX, 2020</b>
</p>
<ul>
    <li>When using the (unsupported) legacy CryptoAPI based codec, skip encrypting page #1 because that can lead to database corruption and other malfunctions.</li>
</ul>
<p>
    <b>1.0.112.2 - April 27, 2020</b>
</p>
<ul>
    <li>Fix NuGet packaging for .NET Standard 2.1. Fix for [7c73262e6f].</li>
</ul>
<p>

Changes to www/news.wiki.

41
42
43
44
45
46
47
48
49
50

51
52
53
54
55






56
57
58
59
60
61
62
    Access to archived release packages will be granted on a case-by-case basis.
  </li>
</ul>

<div align="center"><h2><b>Version History</b></h2></div>

<p>
    <b>1.0.113.0 - May XX, 2020 <font color="red">(release scheduled)</font></b>
</p>
<ul>

    <li>Add SQLite_ForceLogLifecycle environment variable to force logging of calls into key members pertaining to the lifecycle of connections and their associated classes (e.g. LINQ, EF6, etc).</li>
    <li>When using the (unsupported) legacy CryptoAPI based codec, skip encrypting page #1 because that can lead to database corruption and other malfunctions.</li>
    <li>Support automatic value conversions for columns with a declared type of MEDIUMINT or MEDIUMUINT. Pursuant to [515cb60b10].</li>
    <li>Add preliminary support for the .NET Framework 4.8.</li>
</ul>






<p>
    <b>1.0.112.2 - April 27, 2020</b>
</p>
<ul>
    <li>Fix NuGet packaging for .NET Standard 2.1. Fix for [7c73262e6f].</li>
</ul>
<p>







|


>

<



>
>
>
>
>
>







41
42
43
44
45
46
47
48
49
50
51
52

53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
    Access to archived release packages will be granted on a case-by-case basis.
  </li>
</ul>

<div align="center"><h2><b>Version History</b></h2></div>

<p>
    <b>1.0.113.0 - June XX, 2020 <font color="red">(release scheduled)</font></b>
</p>
<ul>
    <li>Updated to [https://www.sqlite.org/releaselog/3_32_0.html|SQLite 3.32.0].</li>
    <li>Add SQLite_ForceLogLifecycle environment variable to force logging of calls into key members pertaining to the lifecycle of connections and their associated classes (e.g. LINQ, EF6, etc).</li>

    <li>Support automatic value conversions for columns with a declared type of MEDIUMINT or MEDIUMUINT. Pursuant to [515cb60b10].</li>
    <li>Add preliminary support for the .NET Framework 4.8.</li>
</ul>
<p>
    <b>1.0.112.3 - Xxxx XX, 2020</b>
</p>
<ul>
    <li>When using the (unsupported) legacy CryptoAPI based codec, skip encrypting page #1 because that can lead to database corruption and other malfunctions.</li>
</ul>
<p>
    <b>1.0.112.2 - April 27, 2020</b>
</p>
<ul>
    <li>Fix NuGet packaging for .NET Standard 2.1. Fix for [7c73262e6f].</li>
</ul>
<p>