Add support for BigInteger, Int128, and UInt128 in SqliteValueBinder#37492
Conversation
- Bind Int128, UInt128, and BigInteger parameters as TEXT in SQLite. - Add provider-level tests to verify correct binding of these large numeric types. - This change only affects parameter binding; reading values back still returns string.
Add support for BigInteger, Int128, and UInt128 in SqliteValueBinder
249ae47 to
6b86657
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated 5 comments.
Comments suppressed due to low confidence (1)
test/Microsoft.Data.Sqlite.Tests/SqliteParameterTest.cs:670
- The new types BigInteger, Int128, and UInt128 should be added to the TypesData collection to ensure comprehensive test coverage via the existing SqliteType_is_inferred_from_value test. This would follow the pattern established for other supported types like decimal (line 646) and provide additional test coverage beyond the specific binding tests.
public static IEnumerable<object[]> TypesData
=> new List<object[]>
{
new object[] { default(DateTime), SqliteType.Text },
new object[] { default(DateTimeOffset), SqliteType.Text },
new object[] { DBNull.Value, SqliteType.Text },
new object[] { 0m, SqliteType.Text },
new object[] { default(Guid), SqliteType.Text },
new object[] { default(TimeSpan), SqliteType.Text },
new object[] { default(TimeSpan), SqliteType.Text },
#if NET6_0_OR_GREATER
new object[] { default(DateOnly), SqliteType.Text },
new object[] { default(TimeOnly), SqliteType.Text },
#endif
new object[] { 'A', SqliteType.Text },
new object[] { "", SqliteType.Text },
new object[] { false, SqliteType.Integer },
new object[] { (byte)0, SqliteType.Integer },
new object[] { 0, SqliteType.Integer },
new object[] { 0L, SqliteType.Integer },
new object[] { (sbyte)0, SqliteType.Integer },
new object[] { (short)0, SqliteType.Integer },
new object[] { 0u, SqliteType.Integer },
new object[] { 0ul, SqliteType.Integer },
new object[] { (ushort)0, SqliteType.Integer },
new object[] { 0.0, SqliteType.Real },
new object[] { 0f, SqliteType.Real },
new object[] { Array.Empty<byte>(), SqliteType.Blob },
new object[] { new Memory<byte>([]), SqliteType.Blob },
new object[] { new ReadOnlyMemory<byte>([]), SqliteType.Blob },
};
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
|
@copilot open a new pull request to apply changes based on the comments in this thread |
|
The current .NET SDK does not support targeting .NET 11.0. Either target .NET 10.0 or lower, or use a version of the .NET SDK that supports .NET 11.0. Download the .NET SDK from https://aka.ms/dotnet/download .NET 11 SDK is not available for download on the official Microsoft site, so I cannot install it. Please advise which supported .NET version should be used instead. |
AndriySvyryd
left a comment
There was a problem hiding this comment.
Mapping these types as TEXT doesn’t preserve ordering unless the values are padded. So, remove BigInteger support and pad Int128 and UInt128 values to 39 digits when converting to a string.
| #if NET7_0_OR_GREATER | ||
| else if (type == typeof(Int128)) | ||
| { | ||
| var shifted = (UInt128)((Int128)value - Int128.MinValue); |
There was a problem hiding this comment.
You are right that the lexicographical order wouldn't work for negative numbers, but while this produces the correct order concatenating the value with a string will produce an incorrect and unexpected result.
You'll have to drop the support for Int128 as well from this PR.
Also add tests for ordering and concatenation
There was a problem hiding this comment.
Can you tell me why I need to do this? (You'll have to remove support for Int128 from this PR as well.)
There was a problem hiding this comment.
Because some operations (like ||) would produce incorrect results. If the user is ok with that they should opt-in explicitly by converting it to a string themselves, but we shouldn't pretend like this is a supported data type that will just work
There was a problem hiding this comment.
Does that mean I can just close the PR?
There was a problem hiding this comment.
You could. But I don't see any significant problems with the UInt128 support
|
Thanks for your contribution! |
Uh oh!
There was an error while loading. Please reload this page.