Skip to content

Commit ae988c3

Browse files
author
SqlClient Azure DevOps
committed
Merge in 'main' changes
2 parents 0c46cd7 + 61e89f9 commit ae988c3

File tree

12 files changed

+437
-36
lines changed

12 files changed

+437
-36
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,9 @@ healthchecksdb
353353
# Backup folder for Package Reference Convert tool in Visual Studio 2017
354354
MigrationBackup/
355355

356+
# JetBrains Rider (cross platform .NET IDE) working folder
357+
.idea/
358+
356359
# Ionide (cross platform F# VS Code tools) working folder
357360
.ionide/
358361

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/ExtendedClrTypeCode.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ internal enum ExtendedClrTypeCode
4949
IEnumerableOfSqlDataRecord, // System.Collections.Generic.IEnumerable<Microsoft.Data.SqlClient.Server.SqlDataRecord>
5050
TimeSpan, // System.TimeSpan
5151
DateTimeOffset, // System.DateTimeOffset
52+
#if NET6_0_OR_GREATER
53+
DateOnly, // System.DateOnly
54+
TimeOnly, // System.TimeOnly
55+
#endif
5256
Stream, // System.IO.Stream
5357
TextReader, // System.IO.TextReader
5458
XmlReader, // System.Xml.XmlReader

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/MetadataUtilsSmi.cs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ internal class MetaDataUtilsSmi
7575
SqlDbType.Structured, // System.Collections.Generic.IEnumerable<Microsoft.Data.SqlClient.Server.SqlDataRecord>
7676
SqlDbType.Time, // System.TimeSpan
7777
SqlDbType.DateTimeOffset, // System.DateTimeOffset
78+
#if NET6_0_OR_GREATER
79+
SqlDbType.Date, // System.DateOnly
80+
SqlDbType.Time, // System.TimeOnly
81+
#endif
7882
};
7983

8084

@@ -86,7 +90,11 @@ internal class MetaDataUtilsSmi
8690

8791
private static Dictionary<Type, ExtendedClrTypeCode> CreateTypeToExtendedTypeCodeMap()
8892
{
93+
#if NET6_0_OR_GREATER
94+
int Count = 44;
95+
#else
8996
int Count = 42;
97+
#endif
9098
// Keep this initialization list in the same order as ExtendedClrTypeCode for ease in validating!
9199
var dictionary = new Dictionary<Type, ExtendedClrTypeCode>(Count)
92100
{
@@ -132,6 +140,10 @@ private static Dictionary<Type, ExtendedClrTypeCode> CreateTypeToExtendedTypeCod
132140
{ typeof(IEnumerable<SqlDataRecord>), ExtendedClrTypeCode.IEnumerableOfSqlDataRecord },
133141
{ typeof(TimeSpan), ExtendedClrTypeCode.TimeSpan },
134142
{ typeof(DateTimeOffset), ExtendedClrTypeCode.DateTimeOffset },
143+
#if NET6_0_OR_GREATER
144+
{ typeof(DateOnly), ExtendedClrTypeCode.DateOnly },
145+
{ typeof(TimeOnly), ExtendedClrTypeCode.TimeOnly },
146+
#endif
135147
};
136148
return dictionary;
137149
}
@@ -244,6 +256,16 @@ Type udtType
244256
extendedCode = ExtendedClrTypeCode.Char;
245257
break;
246258
case SqlDbType.Date:
259+
#if NET6_0_OR_GREATER
260+
if (value.GetType() == typeof(DateOnly))
261+
extendedCode = ExtendedClrTypeCode.DateOnly;
262+
else if (value.GetType() == typeof(DateTime))
263+
extendedCode = ExtendedClrTypeCode.DateTime;
264+
else if (value.GetType() == typeof(SqlDateTime))
265+
extendedCode = ExtendedClrTypeCode.SqlDateTime;
266+
267+
break;
268+
#endif
247269
case SqlDbType.DateTime2:
248270
#if NETFRAMEWORK
249271
if (smiVersion >= SmiContextFactory.Sql2008Version)
@@ -330,6 +352,14 @@ Type udtType
330352
extendedCode = ExtendedClrTypeCode.Invalid;
331353
}
332354
break;
355+
#if NET6_0_OR_GREATER
356+
case SqlDbType.Time:
357+
if (value.GetType() == typeof(TimeOnly))
358+
extendedCode = ExtendedClrTypeCode.TimeOnly;
359+
else if (value.GetType() == typeof(TimeSpan))
360+
extendedCode = ExtendedClrTypeCode.TimeSpan;
361+
break;
362+
#else
333363
case SqlDbType.Time:
334364
if (value.GetType() == typeof(TimeSpan)
335365
#if NETFRAMEWORK
@@ -338,6 +368,7 @@ Type udtType
338368
)
339369
extendedCode = ExtendedClrTypeCode.TimeSpan;
340370
break;
371+
#endif
341372
case SqlDbType.DateTimeOffset:
342373
if (value.GetType() == typeof(DateTimeOffset)
343374
#if NETFRAMEWORK
@@ -500,11 +531,7 @@ internal static SmiExtendedMetaData SqlMetaDataToSmiExtendedMetaData(SqlMetaData
500531
source.Scale,
501532
source.LocaleId,
502533
source.CompareOptions,
503-
#if NETFRAMEWORK
504534
source.Type,
505-
#else
506-
null,
507-
#endif
508535
source.Name,
509536
typeSpecificNamePart1,
510537
typeSpecificNamePart2,

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/ValueUtilsSmi.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1542,6 +1542,14 @@ value is DataFeed
15421542
SetCompatibleValue(sink, setters, ordinal, metaData, charsValue, ExtendedClrTypeCode.CharArray, 0);
15431543
break;
15441544
}
1545+
#if NET6_0_OR_GREATER
1546+
case ExtendedClrTypeCode.DateOnly:
1547+
SetDateTime_Checked(sink, setters, ordinal, metaData, ((DateOnly)value).ToDateTime(new TimeOnly(0, 0)));
1548+
break;
1549+
case ExtendedClrTypeCode.TimeOnly:
1550+
SetTimeSpan_Checked(sink, (SmiTypedGetterSetter)setters, ordinal, metaData, ((TimeOnly)value).ToTimeSpan());
1551+
break;
1552+
#endif
15451553
case ExtendedClrTypeCode.DateTime:
15461554
SetDateTime_Checked(sink, setters, ordinal, metaData, (DateTime)value);
15471555
break;
@@ -2899,6 +2907,10 @@ int length
28992907
/*EnSDR*/{ _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , X, _ , _ , _ , _ , },/*IEnurerable<SqlDataRecord>*/
29002908
/*TmSpn*/{ _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _, _ , X , _ , _ , },/*TimeSpan*/
29012909
/*DTOst*/{ _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _, _ , _ , _ , X , },/*DateTimeOffset*/
2910+
#if NET6_0_OR_GREATER
2911+
/*DOnly*/{ _ , _ , _ , _ , X , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , X , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _, X , _ , X , _ , },/*DateOnly*/
2912+
/*TOnly*/{ _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _, _ , X , _ , _ , },/*TimeOnly*/
2913+
#endif
29022914
/*Strm */{ _ , X , _ , _ , _ , _ , _ , X , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , X , _ , _ , _ , _ , _ , _ , _ , X , _, _ , _ , _ , _ , },/*Stream*/
29032915
/*TxRdr*/{ _ , _ , _ , X , _ , _ , _ , _ , _ , _ , X , X , X , _ , _ , _ , _ , _ , X , _ , _ , _ , X , _ , _ , _ , _ , _ , _ , _ , _, _ , _ , _ , _ , },/*TextReader*/
29042916
/*XmlRd*/{ _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _, _ , _ , _ , _ , },/*XmlReader*/
@@ -2951,6 +2963,10 @@ int length
29512963
/*EnSDR*/{ _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , X, _ , _ , _ , _ , },/*IEnurerable<SqlDataRecord>*/
29522964
/*TmSpn*/{ _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _, _ , X , _ , _ , },/*TimeSpan*/
29532965
/*DTOst*/{ _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _, _ , _ , _ , X , },/*DateTimeOffset*/
2966+
#if NET6_0_OR_GREATER
2967+
/*DOnly*/{ _ , _ , _ , _ , X , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , X , _ , _ , _ , _ , _ , _ , _ , X , _ , _ , _ , _ , _ , _ , _, X , _ , X , _ , },/*DateOnly*/
2968+
/*TOnly*/{ _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _, _ , X , _ , _ , },/*TimeOnly*/
2969+
#endif
29542970
/*Strm */{ _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _, _ , _ , _ , _ , },/*Stream*/
29552971
/*TxRdr*/{ _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _, _ , _ , _ , _ , },/*TextReader*/
29562972
/*XmlRd*/{ _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _ , _, _ , _ , _ , _ , },/*XmlReader*/

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlBuffer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,7 @@ internal SqlGuid SqlGuid
811811
{
812812
if (StorageType.Guid == _type)
813813
{
814-
return new SqlGuid(_value._guid);
814+
return IsNull ? SqlGuid.Null : new SqlGuid(_value._guid);
815815
}
816816
else if (StorageType.SqlGuid == _type)
817817
{

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlSequentialTextReader.cs

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System;
6+
using System.Buffers;
67
using System.Buffers.Binary;
78
using System.Diagnostics;
89
using System.Text;
@@ -18,7 +19,8 @@ sealed internal class SqlSequentialTextReader : System.IO.TextReader
1819
private readonly int _columnIndex; // The index of out column in the table
1920
private readonly Encoding _encoding; // Encoding for this character stream
2021
private readonly Decoder _decoder; // Decoder based on the encoding (NOTE: Decoders are stateful as they are designed to process streams of data)
21-
private byte[] _leftOverBytes; // Bytes leftover from the last Read() operation - this can be null if there were no bytes leftover (Possible optimization: re-use the same array?)
22+
private byte[] _leftOverBytes; // Bytes leftover from the last Read() operation - this can be null if there were no bytes leftover
23+
private int _leftOverByteBufferUsed; //Number of bytes used from _leftOverBytes buffer - will be zero in case of null buffer
2224
private int _peekedChar; // The last character that we peeked at (or -1 if we haven't peeked at anything)
2325
private Task _currentTask; // The current async task
2426
private readonly CancellationTokenSource _disposalTokenSource; // Used to indicate that a cancellation is requested due to disposal
@@ -357,23 +359,18 @@ private byte[] PrepareByteBuffer(int numberOfChars, out int byteBufferUsed)
357359

358360
if (_leftOverBytes != null)
359361
{
360-
// If we have more leftover bytes than we need for this conversion, then just re-use the leftover buffer
361-
if (_leftOverBytes.Length > byteBufferSize)
362-
{
363-
byteBuffer = _leftOverBytes;
364-
byteBufferUsed = byteBuffer.Length;
365-
}
366-
else
367-
{
368-
// Otherwise, copy over the leftover buffer
369-
byteBuffer = new byte[byteBufferSize];
370-
Buffer.BlockCopy(_leftOverBytes, 0, byteBuffer, 0, _leftOverBytes.Length);
371-
byteBufferUsed = _leftOverBytes.Length;
372-
}
362+
// Copy over the leftover buffer
363+
byteBuffer = ArrayPool<byte>.Shared.Rent(byteBufferSize);
364+
Buffer.BlockCopy(_leftOverBytes, 0, byteBuffer, 0, _leftOverByteBufferUsed);
365+
byteBufferUsed = _leftOverByteBufferUsed;
366+
//return _leftOverBytes and clean _leftOverBytes reference
367+
ArrayPool<byte>.Shared.Return(_leftOverBytes);
368+
_leftOverBytes = null;
369+
_leftOverByteBufferUsed = 0;
373370
}
374371
else
375372
{
376-
byteBuffer = new byte[byteBufferSize];
373+
byteBuffer = ArrayPool<byte>.Shared.Rent(byteBufferSize);
377374
byteBufferUsed = 0;
378375
}
379376
}
@@ -402,14 +399,26 @@ private int DecodeBytesToChars(byte[] inBuffer, int inBufferCount, char[] outBuf
402399
// completed may be false and there is no spare bytes if the Decoder has stored bytes to use later
403400
if ((!completed) && (bytesUsed < inBufferCount))
404401
{
405-
_leftOverBytes = new byte[inBufferCount - bytesUsed];
406-
Buffer.BlockCopy(inBuffer, bytesUsed, _leftOverBytes, 0, _leftOverBytes.Length);
402+
_leftOverByteBufferUsed = inBufferCount - bytesUsed;
403+
_leftOverBytes = ArrayPool<byte>.Shared.Rent(_leftOverByteBufferUsed);
404+
405+
Buffer.BlockCopy(inBuffer, bytesUsed, _leftOverBytes, 0, _leftOverByteBufferUsed);
407406
}
408407
else
409408
{
410409
// If Convert() sets completed to true, then it must have used all of the bytes we gave it
411410
Debug.Assert(bytesUsed >= inBufferCount, "Converted completed, but not all bytes were used");
412-
_leftOverBytes = null;
411+
if (_leftOverBytes != null)
412+
{
413+
ArrayPool<byte>.Shared.Return(_leftOverBytes);
414+
_leftOverBytes = null;
415+
_leftOverByteBufferUsed = 0;
416+
}
417+
}
418+
419+
if (inBuffer.Length > 0)
420+
{
421+
ArrayPool<byte>.Shared.Return(inBuffer);
413422
}
414423

415424
Debug.Assert(((_reader == null) || (_reader.ColumnDataBytesRemaining() > 0) || (!completed) || (_leftOverBytes == null)), "Stream has run out of data and the decoder finished, but there are leftover bytes");

src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<Compile Include="LocalizationTest.cs" />
3434
<Compile Include="MultipartIdentifierTests.cs" />
3535
<Compile Include="SqlAuthenticationProviderTest.cs" />
36+
<Compile Include="SqlBufferTests.cs" />
3637
<Compile Include="SqlClientLoggerTest.cs" />
3738
<Compile Include="SqlCommandSetTest.cs" />
3839
<Compile Include="SqlConfigurableRetryLogicTest.cs" />
@@ -95,6 +96,8 @@
9596
<PackageReference Condition="$(ReferenceType.Contains('NetStandard'))" Include="System.Diagnostics.DiagnosticSource" Version="$(SystemDiagnosticsDiagnosticSourceVersion)" />
9697
<PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />
9798
<Reference Condition="'$(TargetGroup)'=='netfx'" Include="System.Transactions" />
99+
<PackageReference Condition="'$(TargetGroup)'=='netfx'" Include="Microsoft.SqlServer.Types" Version="$(MicrosoftSqlServerTypesVersion)" />
100+
<PackageReference Condition="'$(TargetGroup)'=='netcoreapp'" Include="Microsoft.SqlServer.Types" Version="$(MicrosoftSqlServerTypesVersionNet)" />
98101
</ItemGroup>
99102
<ItemGroup Condition="'$(TargetGroup)' == 'netcoreapp'">
100103
<PackageReference Include="System.Data.Odbc" Version="$(SystemDataOdbcVersion)" />

0 commit comments

Comments
 (0)