From cc6cd33bcd7b7eb9c3e37637e1fd2794868a4b44 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Wed, 3 Sep 2025 07:58:26 -0300
Subject: [PATCH 01/11] User Story 38467: Backport mac server name fix
- Backported part of #3494 and #3591:
- Added configurable test jobs timeout, defaulting to 90 minutes.
- Reduced generated database names to 96 chars to try to fix macOS test failures.
---
.../jobs/run-tests-package-reference-job.yml | 10 ++++++++++
.../dotnet-sqlclient-signing-pipeline.yml | 7 +++++++
.../ManualTests/DataCommon/DataTestUtility.cs | 17 ++++++++++++++---
3 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/eng/pipelines/common/templates/jobs/run-tests-package-reference-job.yml b/eng/pipelines/common/templates/jobs/run-tests-package-reference-job.yml
index a9fcd12720..9973e362e7 100644
--- a/eng/pipelines/common/templates/jobs/run-tests-package-reference-job.yml
+++ b/eng/pipelines/common/templates/jobs/run-tests-package-reference-job.yml
@@ -17,11 +17,21 @@ parameters:
type: string
default: empty
+ # The timeout, in minutes, for this job.
+ - name: timeout
+ type: string
+ default: 90
+
jobs:
- job: run_tests_package_reference
displayName: 'Run tests with package reference'
${{ if ne(parameters.dependsOn, 'empty')}}:
dependsOn: '${{parameters.dependsOn }}'
+
+ # Some of our tests take longer than the default 60 minutes to run on some
+ # OSes and configurations.
+ timeoutInMinutes: ${{ parameters.timeout }}
+
pool:
type: windows # read more about custom job pool types at https://aka.ms/obpipelines/yaml/jobs
isCustom: true
diff --git a/eng/pipelines/dotnet-sqlclient-signing-pipeline.yml b/eng/pipelines/dotnet-sqlclient-signing-pipeline.yml
index 64dbcc2573..a4490de1fa 100644
--- a/eng/pipelines/dotnet-sqlclient-signing-pipeline.yml
+++ b/eng/pipelines/dotnet-sqlclient-signing-pipeline.yml
@@ -65,6 +65,12 @@ parameters: # parameters are shown up in ADO UI in a build queue time
- NonOfficial
- Official
+# The timeout, in minutes, for each test job.
+- name: testsTimeout
+ displayName: 'Tests timeout (in minutes)'
+ type: string
+ default: 90
+
variables:
- template: /eng/pipelines/libraries/variables.yml@self
- name: packageFolderName
@@ -164,6 +170,7 @@ extends:
- template: eng/pipelines/common/templates/jobs/run-tests-package-reference-job.yml@self
parameters:
packageFolderName: $(packageFolderName)
+ timeout: ${{ parameters.testsTimeout }}
downloadPackageStep:
download: current
artifact: $(packageFolderName)
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs
index ef1586f51c..ceaa87d629 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs
@@ -573,7 +573,7 @@ public static string GetUniqueName(string prefix, bool withBracket = true)
///
/// Add the prefix to the generate string.
/// Database name must be pass with brackets by default.
- /// Unique name by considering the Sql Server naming rules.
+ /// Unique name by considering the Sql Server naming rules, never longer than 96 characters.
public static string GetUniqueNameForSqlServer(string prefix, bool withBracket = true)
{
string extendedPrefix = string.Format(
@@ -583,10 +583,21 @@ public static string GetUniqueNameForSqlServer(string prefix, bool withBracket =
Environment.MachineName,
DateTime.Now.ToString("yyyy_MM_dd", CultureInfo.InvariantCulture));
string name = GetUniqueName(extendedPrefix, withBracket);
- if (name.Length > 128)
+
+ // Truncate to no more than 96 characters.
+ const int maxLen = 96;
+ if (name.Length > maxLen)
{
- throw new ArgumentOutOfRangeException("the name is too long - SQL Server names are limited to 128");
+ if (withBracket)
+ {
+ name = name.Substring(0, maxLen - 1) + ']';
+ }
+ else
+ {
+ name = name.Substring(0, maxLen);
+ }
}
+
return name;
}
From 1e3557cabc19937c5bb67380aad79d9f6daac786 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Fri, 5 Sep 2025 09:30:46 -0300
Subject: [PATCH 02/11] User Story 38481: Fix unique db object name issues
- Fixed the unique name generators to:
- Keep max lengths to 30 and 96 characters respectively.
- Ensure uniqueness at the start of the names.
- Added link to database identifier syntax.
---
.../ManualTests/AlwaysEncrypted/ApiShould.cs | 10 +-
.../AlwaysEncrypted/CspProviderExt.cs | 4 +-
.../ManualTests/DataCommon/DataTestUtility.cs | 209 ++++++++++++----
.../ProviderAgnostic/ReaderTest/ReaderTest.cs | 6 +-
.../SQL/AdapterTest/AdapterTest.cs | 10 +-
.../SQL/ConnectivityTests/ConnectivityTest.cs | 2 +-
.../DataClassificationTest.cs | 6 +-
.../SQL/DataReaderTest/DataReaderTest.cs | 2 +-
.../SQL/DataStreamTest/DataStreamTest.cs | 10 +-
.../SQL/ParameterTest/DateTimeVariantTest.cs | 52 ++--
.../SQL/ParameterTest/ParametersTest.cs | 225 +++++++++++++++++-
.../ParameterTest/SqlAdapterUpdateBatch.cs | 2 +-
.../SQL/ParameterTest/SqlVariantParam.cs | 4 +-
.../RetryLogic/SqlCommandReliabilityTest.cs | 4 +-
.../SqlConnectionReliabilityTest.cs | 2 +-
.../AdjustPrecScaleForBulkCopy.cs | 2 +-
.../AzureDistributedTransaction.cs | 2 +-
.../CopyWidenNullInexactNumerics.cs | 4 +-
.../DataConversionErrorMessageTest.cs | 2 +-
.../SQL/SqlCommand/SqlCommandCompletedTest.cs | 2 +-
.../SQL/SqlCommand/SqlCommandSetTest.cs | 4 +-
.../SqlFileStreamTest/SqlFileStreamTest.cs | 4 +-
.../SQL/UdtTest/SqlServerTypesTest.cs | 2 +-
.../SQL/UdtTest/UdtBulkCopyTest.cs | 6 +-
.../SQL/UdtTest/UdtDateTimeOffsetTest.cs | 36 +--
.../tests/ManualTests/SQL/UdtTest/UdtTest2.cs | 16 +-
.../SQL/Utf8SupportTest/Utf8SupportTest.cs | 2 +-
27 files changed, 477 insertions(+), 153 deletions(-)
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs
index f6e203c8b7..3c487b532c 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs
@@ -148,8 +148,8 @@ public void SqlParameterProperties(string connection)
const string firstColumnName = @"firstColumn";
const string secondColumnName = @"secondColumn";
const string thirdColumnName = @"thirdColumn";
- string inputProcedureName = DataTestUtility.GetUniqueName("InputProc").ToString();
- string outputProcedureName = DataTestUtility.GetUniqueName("OutputProc").ToString();
+ string inputProcedureName = DataTestUtility.GetShortName("InputProc").ToString();
+ string outputProcedureName = DataTestUtility.GetShortName("OutputProc").ToString();
const int charColumnSize = 100;
const int decimalColumnPrecision = 10;
const int decimalColumnScale = 4;
@@ -694,7 +694,7 @@ public void TestExecuteReader(string connection)
[ClassData(typeof(AEConnectionStringProvider))]
public async void TestExecuteReaderAsyncWithLargeQuery(string connectionString)
{
- string randomName = DataTestUtility.GetUniqueName(Guid.NewGuid().ToString().Replace("-", ""), false);
+ string randomName = DataTestUtility.GetShortName(Guid.NewGuid().ToString().Replace("-", ""), false);
if (randomName.Length > 50)
{
randomName = randomName.Substring(0, 50);
@@ -878,8 +878,8 @@ public void TestEnclaveStoredProceduresWithAndWithoutParameters(string connectio
using SqlCommand sqlCommand = new("", sqlConnection, transaction: null,
columnEncryptionSetting: SqlCommandColumnEncryptionSetting.Enabled);
- string procWithoutParams = DataTestUtility.GetUniqueName("EnclaveWithoutParams", withBracket: false);
- string procWithParam = DataTestUtility.GetUniqueName("EnclaveWithParams", withBracket: false);
+ string procWithoutParams = DataTestUtility.GetShortName("EnclaveWithoutParams", withBracket: false);
+ string procWithParam = DataTestUtility.GetShortName("EnclaveWithParams", withBracket: false);
try
{
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs
index 52f52c72df..3367f193aa 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs
@@ -162,7 +162,9 @@ public void TestRoundTripWithCSPAndCertStoreProvider()
public void TestEncryptDecryptWithCSP(string connectionString)
{
string providerName = @"Microsoft Enhanced RSA and AES Cryptographic Provider";
- string keyIdentifier = DataTestUtility.GetUniqueNameForSqlServer("CSP");
+ string keyIdentifier = DataTestUtility.GetLongName("CSP");
+ CspParameters namedCspParameters = new CspParameters(providerType, providerName, keyIdentifier);
+ using SQLSetupStrategyCspProvider sqlSetupStrategyCsp = new SQLSetupStrategyCspProvider(namedCspParameters);
try
{
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs
index ceaa87d629..14598056dd 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/DataCommon/DataTestUtility.cs
@@ -117,7 +117,7 @@ public static bool TcpConnectionStringDoesNotUseAadAuth
{
get
{
- SqlConnectionStringBuilder builder = new (TCPConnectionString);
+ SqlConnectionStringBuilder builder = new(TCPConnectionString);
return builder.Authentication == SqlAuthenticationMethod.SqlPassword || builder.Authentication == SqlAuthenticationMethod.NotSpecified;
}
}
@@ -546,59 +546,176 @@ public static bool DoesHostAddressContainBothIPv4AndIPv6()
}
}
+ // Generate a new GUID and return the characters from its 1st and 4th
+ // parts, as shown here:
+ //
+ // 7ff01cb8-88c7-11f0-b433-00155d7e531e
+ // ^^^^^^^^ ^^^^
+ //
+ // These 12 characters are concatenated together without any
+ // separators. These 2 parts typically comprise a timestamp and clock
+ // sequence, most likely to be unique for tests that generate names in
+ // quick succession.
+ private static string GetGuidParts()
+ {
+ var guid = Guid.NewGuid().ToString();
+ // GOTCHA: The slice operator is inclusive of the start index and
+ // exclusive of the end index!
+ return guid.Substring(0, 8) + guid.Substring(19, 4);
+ }
+
///
- /// Generate a unique name to use in Sql Server;
- /// some providers does not support names (Oracle supports up to 30).
+ /// Generate a short unique database object name, whose maximum length
+ /// is 30 characters, with the format:
+ ///
+ /// _
+ ///
+ /// The Prefix will be truncated to satisfy the overall maximum length.
+ ///
+ /// The GUID parts will be the characters from the 1st and 4th blocks
+ /// from a traditional string representation, as shown here:
+ ///
+ /// 7ff01cb8-88c7-11f0-b433-00155d7e531e
+ /// ^^^^^^^^ ^^^^
+ ///
+ /// These 2 parts typically comprise a timestamp and clock sequence,
+ /// most likely to be unique for tests that generate names in quick
+ /// succession. The 12 characters are concatenated together without any
+ /// separators.
///
- /// The name length will be no more then (16 + prefix.Length + escapeLeft.Length + escapeRight.Length).
- /// Name without brackets.
- /// Unique name by considering the Sql Server naming rules.
- public static string GetUniqueName(string prefix, bool withBracket = true)
- {
- string escapeLeft = withBracket ? "[" : string.Empty;
- string escapeRight = withBracket ? "]" : string.Empty;
- string uniqueName = string.Format("{0}{1}_{2}_{3}{4}",
- escapeLeft,
- prefix,
- DateTime.Now.Ticks.ToString("X", CultureInfo.InvariantCulture), // up to 8 characters
- Guid.NewGuid().ToString().Substring(0, 6), // take the first 6 characters only
- escapeRight);
- return uniqueName;
+ ///
+ ///
+ /// The prefix to use when generating the unique name, truncated to at
+ /// most 18 characters when withBracket is false, and 16 characters when
+ /// withBracket is true.
+ ///
+ /// This should not contain any characters that cannot be used in
+ /// database object names. See:
+ ///
+ /// https://learn.microsoft.com/en-us/sql/relational-databases/databases/database-identifiers?view=sql-server-ver17#rules-for-regular-identifiers
+ ///
+ ///
+ ///
+ /// When true, the entire generated name will be enclosed in square
+ /// brackets, for example:
+ ///
+ /// [MyPrefix_7ff01cb811f0]
+ ///
+ ///
+ ///
+ /// A unique database object name, no more than 30 characters long.
+ ///
+ public static string GetShortName(string prefix, bool withBracket = true)
+ {
+ StringBuilder name = new(30);
+
+ if (withBracket)
+ {
+ name.Append('[');
+ }
+
+ int maxPrefixLength = withBracket ? 16 : 18;
+ if (prefix.Length > maxPrefixLength)
+ {
+ prefix = prefix.Substring(0, maxPrefixLength);
+ }
+
+ name.Append(prefix);
+ name.Append('_');
+ name.Append(GetGuidParts());
+
+ if (withBracket)
+ {
+ name.Append(']');
+ }
+
+ return name.ToString();
}
///
- /// Uses environment values `UserName` and `MachineName` in addition to the specified `prefix` and current date
- /// to generate a unique name to use in Sql Server;
- /// SQL Server supports long names (up to 128 characters), add extra info for troubleshooting.
+ /// Generate a long unique database object name, whose maximum length is
+ /// 96 characters, with the format:
+ ///
+ /// ___
+ ///
+ /// The Prefix will be truncated to satisfy the overall maximum length.
+ ///
+ /// The GUID Parts will be the characters from the 1st and 4th blocks
+ /// from a traditional string representation, as shown here:
+ ///
+ /// 7ff01cb8-88c7-11f0-b433-00155d7e531e
+ /// ^^^^^^^^ ^^^^
+ ///
+ /// These 2 parts typically comprise a timestamp and clock sequence,
+ /// most likely to be unique for tests that generate names in quick
+ /// succession. The 12 characters are concatenated together without any
+ /// separators.
+ ///
+ /// The UserName and MachineName are obtained from the Environment,
+ /// and will be truncated to satisfy the maximum overall length.
///
- /// Add the prefix to the generate string.
- /// Database name must be pass with brackets by default.
- /// Unique name by considering the Sql Server naming rules, never longer than 96 characters.
- public static string GetUniqueNameForSqlServer(string prefix, bool withBracket = true)
- {
- string extendedPrefix = string.Format(
- "{0}_{1}_{2}@{3}",
- prefix,
- Environment.UserName,
- Environment.MachineName,
- DateTime.Now.ToString("yyyy_MM_dd", CultureInfo.InvariantCulture));
- string name = GetUniqueName(extendedPrefix, withBracket);
-
- // Truncate to no more than 96 characters.
- const int maxLen = 96;
- if (name.Length > maxLen)
- {
- if (withBracket)
- {
- name = name.Substring(0, maxLen - 1) + ']';
- }
- else
- {
- name = name.Substring(0, maxLen);
- }
+ ///
+ ///
+ /// The prefix to use when generating the unique name, truncated to at
+ /// most 32 characters.
+ ///
+ /// This should not contain any characters that cannot be used in
+ /// database object names. See:
+ ///
+ /// https://learn.microsoft.com/en-us/sql/relational-databases/databases/database-identifiers?view=sql-server-ver17#rules-for-regular-identifiers
+ ///
+ ///
+ ///
+ /// When true, the entire generated name will be enclosed in square
+ /// brackets, for example:
+ ///
+ /// [MyPrefix_7ff01cb811f0_test_user_ci_agent_machine_name]
+ ///
+ ///
+ ///
+ /// A unique database object name, no more than 96 characters long.
+ ///
+ public static string GetLongName(string prefix, bool withBracket = true)
+ {
+ StringBuilder name = new(96);
+
+ if (withBracket)
+ {
+ name.Append('[');
+ }
+
+ if (prefix.Length > 32)
+ {
+ prefix = prefix.Substring(0, 32);
+ }
+
+ name.Append(prefix);
+ name.Append('_');
+ name.Append(GetGuidParts());
+ name.Append('_');
+
+ var suffix =
+ Environment.UserName + '_' +
+ Environment.MachineName;
+
+ int maxSuffixLength = 96 - name.Length;
+ if (withBracket)
+ {
+ --maxSuffixLength;
+ }
+ if (suffix.Length > maxSuffixLength)
+ {
+ suffix = suffix.Substring(0, maxSuffixLength);
+ }
+
+ name.Append(suffix);
+
+ if (withBracket)
+ {
+ name.Append(']');
}
- return name;
+ return name.ToString();
}
public static void DropTable(SqlConnection sqlConnection, string tableName)
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/ReaderTest/ReaderTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/ReaderTest/ReaderTest.cs
index 5d09be77f4..5728a8b1ac 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/ReaderTest/ReaderTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/ReaderTest/ReaderTest.cs
@@ -19,7 +19,7 @@ public static void TestMain()
{
string connectionString = DataTestUtility.TCPConnectionString;
- string tempTable = DataTestUtility.GetUniqueNameForSqlServer("table");
+ string tempTable = DataTestUtility.GetLongName("table");
DbProviderFactory provider = SqlClientFactory.Instance;
try
@@ -275,7 +275,7 @@ public static void TestMain()
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
public static void SqlDataReader_SqlBuffer_GetFieldValue()
{
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("SqlBuffer_GetFieldValue");
+ string tableName = DataTestUtility.GetLongName("SqlBuffer_GetFieldValue");
DateTimeOffset dtoffset = DateTimeOffset.Now;
DateTime dt = DateTime.Now;
//Exclude the millisecond because of rounding at some points by SQL Server.
@@ -374,7 +374,7 @@ public static void SqlDataReader_SqlBuffer_GetFieldValue()
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
public static async Task SqlDataReader_SqlBuffer_GetFieldValue_Async()
{
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("SqlBuffer_GetFieldValue_Async");
+ string tableName = DataTestUtility.GetLongName("SqlBuffer_GetFieldValue_Async");
DateTimeOffset dtoffset = DateTimeOffset.Now;
DateTime dt = DateTime.Now;
//Exclude the millisecond because of rounding at some points by SQL Server.
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs
index e3226c5e3c..4938fc5a76 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs
@@ -54,7 +54,7 @@ public class AdapterTest
public AdapterTest()
{
// create random name for temp tables
- _tempTable = DataTestUtility.GetUniqueName("AdapterTest");
+ _tempTable = DataTestUtility.GetShortName("AdapterTest");
_tempTable = _tempTable.Replace('-', '_');
_randomGuid = Guid.NewGuid().ToString();
@@ -555,7 +555,7 @@ public void ParameterTest_AllTypes()
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
public void ParameterTest_InOut()
{
- string procName = DataTestUtility.GetUniqueName("P");
+ string procName = DataTestUtility.GetShortName("P");
// input, output
string spCreateInOut =
"CREATE PROCEDURE " + procName + " @in int, @inout int OUTPUT, @out nvarchar(8) OUTPUT " +
@@ -836,13 +836,13 @@ public void BulkUpdateTest()
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
public void UpdateRefreshTest()
{
- string identTableName = DataTestUtility.GetUniqueName("ID_");
+ string identTableName = DataTestUtility.GetShortName("ID_");
string createIdentTable =
$"CREATE TABLE {identTableName} (id int IDENTITY," +
"LastName nvarchar(50) NULL," +
"Firstname nvarchar(50) NULL)";
- string spName = DataTestUtility.GetUniqueName("sp_insert", withBracket: false);
+ string spName = DataTestUtility.GetShortName("sp_insert", withBracket: false);
string spCreateInsert =
$"CREATE PROCEDURE {spName}" +
"(@FirstName nvarchar(50), @LastName nvarchar(50), @id int OUTPUT) " +
@@ -1155,7 +1155,7 @@ public void AutoGenUpdateTest()
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
public void AutoGenErrorTest()
{
- string identTableName = DataTestUtility.GetUniqueName("ID_");
+ string identTableName = DataTestUtility.GetShortName("ID_");
string createIdentTable =
$"CREATE TABLE {identTableName} (id int IDENTITY," +
"LastName nvarchar(50) NULL," +
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/ConnectivityTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/ConnectivityTest.cs
index da09f3406c..de2de4ad37 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/ConnectivityTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/ConnectivityTest.cs
@@ -383,7 +383,7 @@ public static void ConnectionOpenDisableRetry()
Assert.Throws(() => sqlConnection.Open());
timer.Stop();
duration = timer.Elapsed;
- Assert.True(duration.Seconds > 5, $"Connection Open() with retries took less time than expected. Expect > 5 sec with transient fault handling. Took {duration.Seconds} sec."); // sqlConnection.Open();
+ Assert.True(duration.Seconds > 5, $"Connection Open() with retries took less time than expected. Expect > 5 sec with transient fault handling. Took {duration.Seconds} sec."); // sqlConnection.Open();
}
[PlatformSpecific(TestPlatforms.Windows)]
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataClassificationTest/DataClassificationTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataClassificationTest/DataClassificationTest.cs
index 8119bd2586..24786999e7 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataClassificationTest/DataClassificationTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataClassificationTest/DataClassificationTest.cs
@@ -18,7 +18,7 @@ public static class DataClassificationTest
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse), nameof(DataTestUtility.IsSupportedDataClassification))]
public static void TestDataClassificationResultSetRank()
{
- s_tableName = DataTestUtility.GetUniqueNameForSqlServer("DC");
+ s_tableName = DataTestUtility.GetLongName("DC");
using (SqlConnection sqlConnection = new SqlConnection(DataTestUtility.TCPConnectionString))
using (SqlCommand sqlCommand = sqlConnection.CreateCommand())
{
@@ -41,7 +41,7 @@ public static void TestDataClassificationResultSetRank()
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsSupportedDataClassification))]
public static void TestDataClassificationResultSet()
{
- s_tableName = DataTestUtility.GetUniqueNameForSqlServer("DC");
+ s_tableName = DataTestUtility.GetLongName("DC");
using (SqlConnection sqlConnection = new SqlConnection(DataTestUtility.TCPConnectionString))
using (SqlCommand sqlCommand = sqlConnection.CreateCommand())
{
@@ -232,7 +232,7 @@ public static void TestDataClassificationBulkCopy()
data.Rows.Add(Guid.NewGuid(), "Company 2", "sample2@contoso.com", 1);
data.Rows.Add(Guid.NewGuid(), "Company 3", "sample3@contoso.com", 1);
- var tableName = DataTestUtility.GetUniqueNameForSqlServer("DC");
+ var tableName = DataTestUtility.GetLongName("DC");
using (var connection = new SqlConnection(DataTestUtility.TCPConnectionString))
{
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs
index d00ea1d226..60917e50e0 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs
@@ -133,7 +133,7 @@ public static void CheckSparseColumnBit()
[InlineData("Georgian_Modern_Sort_CI_AS")]
public static void CollatedDataReaderTest(string collation)
{
- string dbName = DataTestUtility.GetUniqueName("CollationTest", false);
+ string dbName = DataTestUtility.GetShortName("CollationTest", false);
SqlConnectionStringBuilder builder = new(DataTestUtility.TCPConnectionString)
{
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs
index cc11acc1da..5bc0c8a7d7 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs
@@ -50,7 +50,7 @@ public static async Task AsyncMultiPacketStreamRead()
byte[] inputData = null;
byte[] outputData = null;
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("data");
+ string tableName = DataTestUtility.GetLongName("data");
using (SqlConnection connection = new(connectionString))
{
@@ -546,7 +546,7 @@ private static void RowBuffer(string connectionString)
private static void TimestampRead(string connectionString)
{
- string tempTable = DataTestUtility.GetUniqueNameForSqlServer("##Temp");
+ string tempTable = DataTestUtility.GetLongName("##Temp");
tempTable = tempTable.Replace('-', '_');
using (SqlConnection conn = new SqlConnection(connectionString))
@@ -1041,7 +1041,7 @@ private static void SequentialAccess(string connectionString)
private static void NumericRead(string connectionString)
{
- string tempTable = DataTestUtility.GetUniqueNameForSqlServer("##Temp");
+ string tempTable = DataTestUtility.GetLongName("##Temp");
tempTable = tempTable.Replace('-', '_');
using (SqlConnection conn = new SqlConnection(connectionString))
@@ -1872,8 +1872,8 @@ private static void StreamingBlobDataTypes(string connectionString)
private static void VariantCollationsTest(string connectionString)
{
- string dbName = DataTestUtility.GetUniqueName("JPN");
- string tableName = DataTestUtility.GetUniqueName("T");
+ string dbName = DataTestUtility.GetShortName("JPN");
+ string tableName = DataTestUtility.GetShortName("T");
using (SqlConnection connection = new SqlConnection(connectionString))
{
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/DateTimeVariantTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/DateTimeVariantTest.cs
index 31c232e3d0..20768e9329 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/DateTimeVariantTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/DateTimeVariantTest.cs
@@ -75,7 +75,7 @@ private static void TestSimpleParameter_Type(object paramValue, string expectedT
{
string tag = "TestSimpleParameter_Type";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string procName = DataTestUtility.GetUniqueNameForSqlServer("paramProc1");
+ string procName = DataTestUtility.GetLongName("paramProc1");
try
{
using SqlConnection conn = new(s_connStr);
@@ -115,7 +115,7 @@ private static void TestSimpleParameter_Variant(object paramValue, string expect
{
string tag = "TestSimpleParameter_Variant";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string procName = DataTestUtility.GetUniqueNameForSqlServer("paramProc2");
+ string procName = DataTestUtility.GetLongName("paramProc2");
try
{
using SqlConnection conn = new(s_connStr);
@@ -153,7 +153,7 @@ private static void TestSqlDataRecordParameterToTVP_Type(object paramValue, stri
{
string tag = "TestSqlDataRecordParameterToTVP_Type";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string tvpTypeName = DataTestUtility.GetUniqueNameForSqlServer("tvpType");
+ string tvpTypeName = DataTestUtility.GetLongName("tvpType");
try
{
using SqlConnection conn = new(s_connStr);
@@ -200,7 +200,7 @@ private static void TestSqlDataRecordParameterToTVP_Variant(object paramValue, s
{
string tag = "TestSqlDataRecordParameterToTVP_Variant";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string tvpTypeName = DataTestUtility.GetUniqueNameForSqlServer("tvpVariant");
+ string tvpTypeName = DataTestUtility.GetLongName("tvpVariant");
try
{
using SqlConnection conn = new(s_connStr);
@@ -245,7 +245,7 @@ private static void TestSqlDataReaderParameterToTVP_Type(object paramValue, stri
{
string tag = "TestSqlDataReaderParameterToTVP_Type";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string tvpTypeName = DataTestUtility.GetUniqueNameForSqlServer("tvpType");
+ string tvpTypeName = DataTestUtility.GetLongName("tvpType");
try
{
using SqlConnection conn = new(s_connStr);
@@ -295,7 +295,7 @@ private static void TestSqlDataReaderParameterToTVP_Variant(object paramValue, s
{
string tag = "TestSqlDataReaderParameterToTVP_Variant";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string tvpTypeName = DataTestUtility.GetUniqueNameForSqlServer("tvpVariant");
+ string tvpTypeName = DataTestUtility.GetLongName("tvpVariant");
try
{
using SqlConnection conn = new(s_connStr);
@@ -347,10 +347,10 @@ private static void TestSqlDataReader_TVP_Type(object paramValue, string expecte
{
string tag = "TestSqlDataReader_TVP_Type";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string tvpTypeName = DataTestUtility.GetUniqueNameForSqlServer("tvpType");
- string InputTableName = DataTestUtility.GetUniqueNameForSqlServer("InputTable");
- string OutputTableName = DataTestUtility.GetUniqueNameForSqlServer("OutputTable");
- string ProcName = DataTestUtility.GetUniqueNameForSqlServer("spTVPProc");
+ string tvpTypeName = DataTestUtility.GetLongName("tvpType");
+ string InputTableName = DataTestUtility.GetLongName("InputTable");
+ string OutputTableName = DataTestUtility.GetLongName("OutputTable");
+ string ProcName = DataTestUtility.GetLongName("spTVPProc");
try
{
using SqlConnection conn = new(s_connStr);
@@ -428,10 +428,10 @@ private static void TestSqlDataReader_TVP_Variant(object paramValue, string expe
{
string tag = "TestSqlDataReader_TVP_Variant";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string tvpTypeName = DataTestUtility.GetUniqueNameForSqlServer("tvpVariant_DRdrTVPVar");
- string InputTableName = DataTestUtility.GetUniqueNameForSqlServer("InputTable");
- string OutputTableName = DataTestUtility.GetUniqueNameForSqlServer("OutputTable");
- string ProcName = DataTestUtility.GetUniqueNameForSqlServer("spTVPProc_DRdrTVPVar");
+ string tvpTypeName = DataTestUtility.GetLongName("tvpVariant_DRdrTVPVar");
+ string InputTableName = DataTestUtility.GetLongName("InputTable");
+ string OutputTableName = DataTestUtility.GetLongName("OutputTable");
+ string ProcName = DataTestUtility.GetLongName("spTVPProc_DRdrTVPVar");
try
{
using SqlConnection conn = new(s_connStr);
@@ -512,8 +512,8 @@ private static void TestSimpleDataReader_Type(object paramValue, string expected
{
string tag = "TestSimpleDataReader_Type";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string inputTable = DataTestUtility.GetUniqueNameForSqlServer("inputTable");
- string procName = DataTestUtility.GetUniqueNameForSqlServer("paramProc3");
+ string inputTable = DataTestUtility.GetLongName("inputTable");
+ string procName = DataTestUtility.GetLongName("paramProc3");
try
{
using SqlConnection conn = new(s_connStr);
@@ -568,8 +568,8 @@ private static void TestSimpleDataReader_Variant(object paramValue, string expec
{
string tag = "TestSimpleDataReader_Variant";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string inputTable = DataTestUtility.GetUniqueNameForSqlServer("inputTable");
- string procName = DataTestUtility.GetUniqueNameForSqlServer("paramProc4");
+ string inputTable = DataTestUtility.GetLongName("inputTable");
+ string procName = DataTestUtility.GetLongName("paramProc4");
try
{
using SqlConnection conn = new(s_connStr);
@@ -624,8 +624,8 @@ private static void SqlBulkCopySqlDataReader_Type(object paramValue, string expe
{
string tag = "SqlBulkCopySqlDataReader_Type";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string bulkCopySrcTableName = DataTestUtility.GetUniqueNameForSqlServer("bulkSrcTable");
- string bulkCopyTableName = DataTestUtility.GetUniqueNameForSqlServer("bulkDestTable");
+ string bulkCopySrcTableName = DataTestUtility.GetLongName("bulkSrcTable");
+ string bulkCopyTableName = DataTestUtility.GetLongName("bulkDestTable");
try
{
using SqlConnection conn = new(s_connStr);
@@ -698,8 +698,8 @@ private static void SqlBulkCopySqlDataReader_Variant(object paramValue, string e
{
string tag = "SqlBulkCopySqlDataReader_Variant";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string bulkCopySrcTableName = DataTestUtility.GetUniqueNameForSqlServer("bulkSrcTable");
- string bulkCopyTableName = DataTestUtility.GetUniqueNameForSqlServer("bulkDestTable");
+ string bulkCopySrcTableName = DataTestUtility.GetLongName("bulkSrcTable");
+ string bulkCopyTableName = DataTestUtility.GetLongName("bulkDestTable");
try
{
using SqlConnection conn = new(s_connStr);
@@ -776,7 +776,7 @@ private static void SqlBulkCopyDataTable_Type(object paramValue, string expected
{
string tag = "SqlBulkCopyDataTable_Type";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string bulkCopyTableName = DataTestUtility.GetUniqueNameForSqlServer("bulkDestType");
+ string bulkCopyTableName = DataTestUtility.GetLongName("bulkDestType");
try
{
using SqlConnection conn = new(s_connStr);
@@ -836,7 +836,7 @@ private static void SqlBulkCopyDataTable_Variant(object paramValue, string expec
{
string tag = "SqlBulkCopyDataTable_Variant";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string bulkCopyTableName = DataTestUtility.GetUniqueNameForSqlServer("bulkDestVariant");
+ string bulkCopyTableName = DataTestUtility.GetLongName("bulkDestVariant");
try
{
using SqlConnection conn = new(s_connStr);
@@ -886,7 +886,7 @@ private static void SqlBulkCopyDataRow_Type(object paramValue, string expectedTy
{
string tag = "SqlBulkCopyDataRow_Type";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string bulkCopyTableName = DataTestUtility.GetUniqueNameForSqlServer("bulkDestType");
+ string bulkCopyTableName = DataTestUtility.GetLongName("bulkDestType");
try
{
using SqlConnection conn = new(s_connStr);
@@ -941,7 +941,7 @@ private static void SqlBulkCopyDataRow_Variant(object paramValue, string expecte
{
string tag = "SqlBulkCopyDataRow_Variant";
DisplayHeader(tag, paramValue, expectedBaseTypeName);
- string bulkCopyTableName = DataTestUtility.GetUniqueNameForSqlServer("bulkDestVariant");
+ string bulkCopyTableName = DataTestUtility.GetLongName("bulkDestVariant");
try
{
using SqlConnection conn = new(s_connStr);
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/ParametersTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/ParametersTest.cs
index 3b71cbf851..564657edc5 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/ParametersTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/ParametersTest.cs
@@ -8,6 +8,8 @@
using System.Data;
using System.Data.SqlTypes;
using System.Threading;
+using Microsoft.Data.SqlClient.Server;
+using Microsoft.SqlServer.Types;
using Xunit;
namespace Microsoft.Data.SqlClient.ManualTesting.Tests
@@ -111,7 +113,7 @@ public static void CodeCoverageSqlClient()
public static void Test_Copy_SqlParameter()
{
using var conn = new SqlConnection(s_connString);
- string cTableName = DataTestUtility.GetUniqueNameForSqlServer("#tmp");
+ string cTableName = DataTestUtility.GetLongName("#tmp");
try
{
// Create tmp table
@@ -253,9 +255,9 @@ public static void TestParametersWithDatatablesTVPInsert()
};
using SqlConnection connection = new(builder.ConnectionString);
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("Table");
- string procName = DataTestUtility.GetUniqueNameForSqlServer("Proc");
- string typeName = DataTestUtility.GetUniqueName("Type");
+ string tableName = DataTestUtility.GetLongName("Table");
+ string procName = DataTestUtility.GetLongName("Proc");
+ string typeName = DataTestUtility.GetShortName("Type");
try
{
connection.Open();
@@ -306,6 +308,209 @@ public static void TestParametersWithDatatablesTVPInsert()
}
}
+#if !NETFRAMEWORK
+ // Synapse: Parse error at line: 1, column: 8: Incorrect syntax near 'TYPE'.
+ [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
+ public static void TestParametersWithSqlRecordsTVPInsert()
+ {
+ SqlConnectionStringBuilder builder = new(DataTestUtility.TCPConnectionString);
+
+ SqlGeography geog = SqlGeography.Point(43, -81, 4326);
+
+ SqlMetaData[] metadata = new SqlMetaData[]
+ {
+ new SqlMetaData("Id", SqlDbType.UniqueIdentifier),
+ new SqlMetaData("geom", SqlDbType.Udt, typeof(SqlGeography), "Geography")
+ };
+
+ SqlDataRecord record1 = new SqlDataRecord(metadata);
+ record1.SetValues(Guid.NewGuid(), geog);
+
+ SqlDataRecord record2 = new SqlDataRecord(metadata);
+ record2.SetValues(Guid.NewGuid(), geog);
+
+ IList featureInserts = new List
+ {
+ record1,
+ record2,
+ };
+
+ using SqlConnection connection = new(builder.ConnectionString);
+ string procName = DataTestUtility.GetLongName("Proc");
+ string typeName = DataTestUtility.GetShortName("Type");
+ try
+ {
+ connection.Open();
+
+ using (SqlCommand cmd = connection.CreateCommand())
+ {
+ cmd.CommandText = $"CREATE TYPE {typeName} AS TABLE([Id] [uniqueidentifier] NULL, [geom] [geography] NULL)";
+ cmd.ExecuteNonQuery();
+
+ cmd.CommandText = @$"CREATE PROCEDURE {procName}
+ @newRoads as {typeName} READONLY
+ AS
+ BEGIN
+ SELECT* FROM @newRoads
+ END";
+ cmd.ExecuteNonQuery();
+
+ }
+ using (SqlCommand cmd = connection.CreateCommand())
+ {
+ // Update Data Using TVPs
+ cmd.CommandText = procName;
+ cmd.CommandType = CommandType.StoredProcedure;
+
+ SqlParameter param = new SqlParameter("@newRoads", SqlDbType.Structured);
+ param.Value = featureInserts;
+ param.TypeName = typeName;
+
+ cmd.Parameters.Add(param);
+
+ using var reader = cmd.ExecuteReader();
+
+ Assert.True(reader.HasRows);
+
+ int count = 0;
+ while (reader.Read())
+ {
+ Assert.NotNull(reader[0]);
+ Assert.NotNull(reader[1]);
+ count++;
+ }
+
+ Assert.Equal(2, count);
+ }
+ }
+ finally
+ {
+ using SqlCommand cmd = connection.CreateCommand();
+ cmd.CommandText = "DROP PROCEDURE " + procName;
+ cmd.ExecuteNonQuery();
+ cmd.CommandText = "DROP TYPE " + typeName;
+ cmd.ExecuteNonQuery();
+ }
+ }
+
+ [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
+ public static void TestDateOnlyTVPDataTable_CommandSP()
+ {
+ string tableTypeName = "[dbo]." + DataTestUtility.GetLongName("UDTTTestDateOnlyTVP");
+ string spName = DataTestUtility.GetLongName("spTestDateOnlyTVP");
+ SqlConnection connection = new(s_connString);
+ try
+ {
+ connection.Open();
+ using (SqlCommand cmd = connection.CreateCommand())
+ {
+ cmd.CommandType = CommandType.Text;
+ cmd.CommandText = $"CREATE TYPE {tableTypeName} AS TABLE ([DateColumn] date NULL, [TimeColumn] time NULL)";
+ cmd.ExecuteNonQuery();
+ cmd.CommandText = $"CREATE PROCEDURE {spName} (@dates {tableTypeName} READONLY) AS SELECT COUNT(*) FROM @dates";
+ cmd.ExecuteNonQuery();
+ }
+ using (SqlCommand cmd = connection.CreateCommand())
+ {
+ cmd.CommandText = spName;
+ cmd.CommandType = CommandType.StoredProcedure;
+
+ DataTable dtTest = new();
+ dtTest.Columns.Add(new DataColumn("DateColumn", typeof(DateOnly)));
+ dtTest.Columns.Add(new DataColumn("TimeColumn", typeof(TimeOnly)));
+ var dataRow = dtTest.NewRow();
+ dataRow["DateColumn"] = new DateOnly(2023, 11, 15);
+ dataRow["TimeColumn"] = new TimeOnly(12, 30, 45);
+ dtTest.Rows.Add(dataRow);
+
+ cmd.Parameters.Add(new SqlParameter
+ {
+ ParameterName = "@dates",
+ SqlDbType = SqlDbType.Structured,
+ TypeName = tableTypeName,
+ Value = dtTest,
+ });
+
+ cmd.ExecuteNonQuery();
+ }
+ }
+ finally
+ {
+ DataTestUtility.DropStoredProcedure(connection, spName);
+ DataTestUtility.DropUserDefinedType(connection, tableTypeName);
+ }
+ }
+
+ [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
+ public static void TestDateOnlyTVPSqlDataRecord_CommandSP()
+ {
+ string tableTypeName = "[dbo]." + DataTestUtility.GetLongName("UDTTTestDateOnlySqlDataRecordTVP");
+ string spName = DataTestUtility.GetLongName("spTestDateOnlySqlDataRecordTVP");
+ SqlConnection connection = new(s_connString);
+ try
+ {
+ connection.Open();
+ using (SqlCommand cmd = connection.CreateCommand())
+ {
+ cmd.CommandType = CommandType.Text;
+ cmd.CommandText = $"CREATE TYPE {tableTypeName} AS TABLE ([DateColumn] date NULL, [TimeColumn] time NULL)";
+ cmd.ExecuteNonQuery();
+ cmd.CommandText = $"CREATE PROCEDURE {spName} (@dates {tableTypeName} READONLY) AS SELECT COUNT(*) FROM @dates";
+ cmd.ExecuteNonQuery();
+ }
+ using (SqlCommand cmd = connection.CreateCommand())
+ {
+ cmd.CommandText = spName;
+ cmd.CommandType = CommandType.StoredProcedure;
+
+ SqlMetaData[] metadata = new SqlMetaData[]
+ {
+ new SqlMetaData("DateColumn", SqlDbType.Date),
+ new SqlMetaData("TimeColumn", SqlDbType.Time)
+ };
+
+ SqlDataRecord record1 = new SqlDataRecord(metadata);
+ record1.SetValues(new DateOnly(2023, 11, 15), new TimeOnly(12, 30, 45));
+
+ SqlDataRecord record2 = new SqlDataRecord(metadata);
+ record2.SetValues(new DateOnly(2025, 11, 15), new TimeOnly(13, 31, 46));
+
+ IList featureInserts = new List
+ {
+ record1,
+ record2,
+ };
+
+ cmd.Parameters.Add(new SqlParameter
+ {
+ ParameterName = "@dates",
+ SqlDbType = SqlDbType.Structured,
+ TypeName = tableTypeName,
+ Value = featureInserts,
+ });
+
+ using var reader = cmd.ExecuteReader();
+
+ Assert.True(reader.HasRows);
+
+ int count = 0;
+ while (reader.Read())
+ {
+ Assert.NotNull(reader[0]);
+ count++;
+ }
+
+ Assert.Equal(1, count);
+ }
+ }
+ finally
+ {
+ DataTestUtility.DropStoredProcedure(connection, spName);
+ DataTestUtility.DropUserDefinedType(connection, tableTypeName);
+ }
+ }
+#endif
+
#region Scaled Decimal Parameter & TVP Test
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
[InlineData("CAST(1.0 as decimal(38, 37))", "1.0000000000000000000000000000")]
@@ -360,7 +565,7 @@ public static void SqlDecimalConvertToDecimal_TestOutOfRange(string sqlDecimalVa
[ClassData(typeof(ConnectionStringsProvider))]
public static void TestScaledDecimalParameter_CommandInsert(string connectionString, bool truncateScaledDecimal)
{
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("TestDecimalParameterCMD");
+ string tableName = DataTestUtility.GetLongName("TestDecimalParameterCMD");
using SqlConnection connection = InitialDatabaseTable(connectionString, tableName);
try
{
@@ -392,7 +597,7 @@ public static void TestScaledDecimalParameter_CommandInsert(string connectionStr
[ClassData(typeof(ConnectionStringsProvider))]
public static void TestScaledDecimalParameter_BulkCopy(string connectionString, bool truncateScaledDecimal)
{
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("TestDecimalParameterBC");
+ string tableName = DataTestUtility.GetLongName("TestDecimalParameterBC");
using SqlConnection connection = InitialDatabaseTable(connectionString, tableName);
try
{
@@ -426,9 +631,9 @@ public static void TestScaledDecimalParameter_BulkCopy(string connectionString,
[ClassData(typeof(ConnectionStringsProvider))]
public static void TestScaledDecimalTVP_CommandSP(string connectionString, bool truncateScaledDecimal)
{
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("TestDecimalParameterBC");
- string tableTypeName = DataTestUtility.GetUniqueNameForSqlServer("UDTTTestDecimalParameterBC");
- string spName = DataTestUtility.GetUniqueNameForSqlServer("spTestDecimalParameterBC");
+ string tableName = DataTestUtility.GetLongName("TestDecimalParameterBC");
+ string tableTypeName = DataTestUtility.GetLongName("UDTTTestDecimalParameterBC");
+ string spName = DataTestUtility.GetLongName("spTestDecimalParameterBC");
using SqlConnection connection = InitialDatabaseUDTT(connectionString, tableName, tableTypeName, spName);
try
{
@@ -713,7 +918,7 @@ private static void EnableOptimizedParameterBinding_ReturnSucceeds()
{
int firstInput = 12;
- string sprocName = DataTestUtility.GetUniqueName("P");
+ string sprocName = DataTestUtility.GetShortName("P");
// input, output
string createSprocQuery =
"CREATE PROCEDURE " + sprocName + " @in int " +
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/SqlAdapterUpdateBatch.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/SqlAdapterUpdateBatch.cs
index 7f383e8201..aa59bc319c 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/SqlAdapterUpdateBatch.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/SqlAdapterUpdateBatch.cs
@@ -15,7 +15,7 @@ public class SqlAdapterUpdateBatch
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
public void SqlAdapterTest()
{
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("Adapter");
+ string tableName = DataTestUtility.GetLongName("Adapter");
string tableNameNoBrackets = tableName.Substring(1, tableName.Length - 2);
try
{
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/SqlVariantParam.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/SqlVariantParam.cs
index 2d11274191..e1592825b1 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/SqlVariantParam.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/SqlVariantParam.cs
@@ -108,7 +108,7 @@ private static void SendVariantParam(object paramValue, string expectedTypeName,
///
private static void SendVariantBulkCopy(object paramValue, string expectedTypeName, string expectedBaseTypeName)
{
- string bulkCopyTableName = DataTestUtility.GetUniqueNameForSqlServer("bulkDest");
+ string bulkCopyTableName = DataTestUtility.GetLongName("bulkDest");
// Fetch reader using type.
using SqlDataReader dr = GetReaderForVariant(paramValue, false);
@@ -194,7 +194,7 @@ private static void SendVariantBulkCopy(object paramValue, string expectedTypeNa
///
private static void SendVariantTvp(object paramValue, string expectedTypeName, string expectedBaseTypeName)
{
- string tvpTypeName = DataTestUtility.GetUniqueNameForSqlServer("tvpVariant");
+ string tvpTypeName = DataTestUtility.GetLongName("tvpVariant");
using SqlConnection connTvp = new(s_connStr);
connTvp.Open();
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlCommandReliabilityTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlCommandReliabilityTest.cs
index c25df6e069..7318d5c5b4 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlCommandReliabilityTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlCommandReliabilityTest.cs
@@ -268,7 +268,7 @@ public void RetryExecuteUnauthorizedSqlStatementDML(string cnnString, SqlRetryLo
public void DropDatabaseWithActiveConnection(string cnnString, SqlRetryLogicBaseProvider provider)
{
int currentRetries = 0;
- string database = DataTestUtility.GetUniqueNameForSqlServer($"RetryLogic_{provider.RetryLogic.RetryIntervalEnumerator.GetType().Name}", false);
+ string database = DataTestUtility.GetLongName($"RetryLogic_{provider.RetryLogic.RetryIntervalEnumerator.GetType().Name}", false);
var builder = new SqlConnectionStringBuilder(cnnString)
{
InitialCatalog = database,
@@ -330,7 +330,7 @@ public void DropDatabaseWithActiveConnection(string cnnString, SqlRetryLogicBase
public void UpdateALockedTable(string cnnString, SqlRetryLogicBaseProvider provider)
{
int currentRetries = 0;
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("Region");
+ string tableName = DataTestUtility.GetLongName("Region");
string fieldName = "RegionDescription";
using (var cnn1 = new SqlConnection(cnnString))
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConnectionReliabilityTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConnectionReliabilityTest.cs
index 7bdebfcfc1..301ed95d74 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConnectionReliabilityTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConnectionReliabilityTest.cs
@@ -58,7 +58,7 @@ public void ConnectionCancelRetryOpenInvalidCatalog(string cnnString, SqlRetryLo
public void CreateDatabaseWhileTryingToConnect(string cnnString, SqlRetryLogicBaseProvider provider)
{
int currentRetries = 0;
- string database = DataTestUtility.GetUniqueNameForSqlServer($"RetryLogic_{provider.RetryLogic.RetryIntervalEnumerator.GetType().Name}", false);
+ string database = DataTestUtility.GetLongName($"RetryLogic_{provider.RetryLogic.RetryIntervalEnumerator.GetType().Name}", false);
var builder = new SqlConnectionStringBuilder(cnnString)
{
InitialCatalog = database,
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/AdjustPrecScaleForBulkCopy.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/AdjustPrecScaleForBulkCopy.cs
index 72bab47869..a845710d50 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/AdjustPrecScaleForBulkCopy.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/AdjustPrecScaleForBulkCopy.cs
@@ -41,7 +41,7 @@ public static void RunTest()
private static SqlDecimal BulkCopySqlDecimalToTable(SqlDecimal decimalValue, int sourcePrecision, int sourceScale, int targetPrecision, int targetScale)
{
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("Table");
+ string tableName = DataTestUtility.GetLongName("Table");
string connectionString = DataTestUtility.TCPConnectionString;
SqlDecimal resultValue;
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/AzureDistributedTransaction.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/AzureDistributedTransaction.cs
index 823bc50a9d..2a853d7ed4 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/AzureDistributedTransaction.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/AzureDistributedTransaction.cs
@@ -11,7 +11,7 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests
public class AzureDistributedTransaction
{
private static readonly string s_connectionString = DataTestUtility.TCPConnectionString;
- private static readonly string s_tableName = DataTestUtility.GetUniqueNameForSqlServer("Azure");
+ private static readonly string s_tableName = DataTestUtility.GetLongName("Azure");
private static readonly string s_createTableCmd = $"CREATE TABLE {s_tableName} (NAME NVARCHAR(40), AGE INT)";
private static readonly string s_sqlBulkCopyCmd = "SELECT * FROM(VALUES ('Fuller', 33), ('Davon', 49)) AS q (FirstName, Age)";
private static readonly int s_commandTimeout = 30;
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/CopyWidenNullInexactNumerics.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/CopyWidenNullInexactNumerics.cs
index 5ccda71fb9..f961521233 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/CopyWidenNullInexactNumerics.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/CopyWidenNullInexactNumerics.cs
@@ -12,8 +12,8 @@ public class CopyWidenNullInexactNumerics
{
public static void Test(string sourceDatabaseConnectionString, string destinationDatabaseConnectionString)
{
- string sourceTableName = DataTestUtility.GetUniqueNameForSqlServer("BCP_SRC");
- string destTableName = DataTestUtility.GetUniqueNameForSqlServer("BCP_DST");
+ string sourceTableName = DataTestUtility.GetLongName("BCP_SRC");
+ string destTableName = DataTestUtility.GetLongName("BCP_DST");
// this test copies float and real inexact numeric types into decimal targets using bulk copy to check that the widening of the type succeeds.
using (var sourceConnection = new SqlConnection(sourceDatabaseConnectionString))
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/DataConversionErrorMessageTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/DataConversionErrorMessageTest.cs
index 4c3d594ad1..4a722dd409 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/DataConversionErrorMessageTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlBulkCopyTest/DataConversionErrorMessageTest.cs
@@ -28,7 +28,7 @@ public InitialDatabase()
srcConstr = DataTestUtility.TCPConnectionString;
Connection = new SqlConnection(srcConstr);
- TableName = DataTestUtility.GetUniqueNameForSqlServer("SqlBulkCopyTest_CopyStringToIntTest_");
+ TableName = DataTestUtility.GetLongName("SqlBulkCopyTest_CopyStringToIntTest_");
InitialTable(Connection, TableName);
}
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandCompletedTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandCompletedTest.cs
index 8e38bee7c0..21ff771ac0 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandCompletedTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandCompletedTest.cs
@@ -11,7 +11,7 @@ public static class SqlCommandCompletedTest
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
public static void VerifyStatmentCompletedCalled()
{
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("stmt");
+ string tableName = DataTestUtility.GetLongName("stmt");
using (var conn = new SqlConnection(s_connStr))
using (var cmd = conn.CreateCommand())
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandSetTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandSetTest.cs
index 26b11055c2..7f28a4a09a 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandSetTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandSetTest.cs
@@ -15,8 +15,8 @@ public class SqlCommandSetTest
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
public void TestByteArrayParameters()
{
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("CMD");
- string procName = DataTestUtility.GetUniqueNameForSqlServer("CMD");
+ string tableName = DataTestUtility.GetLongName("CMD");
+ string procName = DataTestUtility.GetLongName("CMD");
byte[] bArray = new byte[] { 1, 2, 3 };
using (var connection = new SqlConnection(DataTestUtility.TCPConnectionString))
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlFileStreamTest/SqlFileStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlFileStreamTest/SqlFileStreamTest.cs
index c34b7e9ceb..4d3533f6c9 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlFileStreamTest/SqlFileStreamTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlFileStreamTest/SqlFileStreamTest.cs
@@ -221,7 +221,7 @@ private static string SetupFileStreamDB()
fileStreamDir += "\\";
}
- string dbName = DataTestUtility.GetUniqueName("FS", false);
+ string dbName = DataTestUtility.GetShortName("FS", false);
string createDBQuery = @$"CREATE DATABASE [{dbName}]
ON PRIMARY
(NAME = PhotoLibrary_data,
@@ -266,7 +266,7 @@ private static void DropFileStreamDb(string connString)
private static string SetupTable(string connString)
{
// Generate random table name
- string tempTable = DataTestUtility.GetUniqueNameForSqlServer("fs");
+ string tempTable = DataTestUtility.GetLongName("fs");
// Create table
string createTable = $"CREATE TABLE {tempTable} (EmployeeId INT NOT NULL PRIMARY KEY, Photo VARBINARY(MAX) FILESTREAM NULL, RowGuid UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL UNIQUE DEFAULT NEWID() ) ";
ExecuteNonQueryCommand(createTable, connString);
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/SqlServerTypesTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/SqlServerTypesTest.cs
index bdbd805e73..c28f1d0c96 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/SqlServerTypesTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/SqlServerTypesTest.cs
@@ -410,7 +410,7 @@ private static string GetUdtName(Type udtClrType)
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
public static void TestSqlServerTypesInsertAndRead()
{
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("Type");
+ string tableName = DataTestUtility.GetLongName("Type");
string allTypesSQL = @$"
if not exists (select * from sysobjects where name='{tableName}' and xtype='U')
Begin
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtBulkCopyTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtBulkCopyTest.cs
index 8adf6c7bb5..469c895a61 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtBulkCopyTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtBulkCopyTest.cs
@@ -18,9 +18,9 @@ public void RunCopyTest()
_connStr = (new SqlConnectionStringBuilder(DataTestUtility.TCPConnectionString) { InitialCatalog = DataTestUtility.UdtTestDbName }).ConnectionString;
SqlConnection conn = new SqlConnection(_connStr);
- string cities = DataTestUtility.GetUniqueNameForSqlServer("UdtBulkCopy_cities");
- string customers = DataTestUtility.GetUniqueNameForSqlServer("UdtBulkCopy_customers");
- string circles = DataTestUtility.GetUniqueNameForSqlServer("UdtBulkCopy_circles");
+ string cities = DataTestUtility.GetLongName("UdtBulkCopy_cities");
+ string customers = DataTestUtility.GetLongName("UdtBulkCopy_customers");
+ string circles = DataTestUtility.GetLongName("UdtBulkCopy_circles");
conn.Open();
try
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtDateTimeOffsetTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtDateTimeOffsetTest.cs
index a09d00895c..9052da57a1 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtDateTimeOffsetTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtDateTimeOffsetTest.cs
@@ -30,7 +30,7 @@ public DateTimeOffsetVariableScale(DateTimeOffset dateTimeOffset, int scale)
public class UdtDateTimeOffsetTest
{
private readonly string _connectionString = null;
- private readonly string _udtTableType = DataTestUtility.GetUniqueNameForSqlServer("DataTimeOffsetTableType");
+ private readonly string _udtTableType = DataTestUtility.GetLongName("DataTimeOffsetTableType");
public UdtDateTimeOffsetTest()
{
@@ -74,26 +74,26 @@ public void SelectFromSqlParameterShouldSucceed()
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer), nameof(DataTestUtility.IsNotAzureSynapse))]
public void DateTimeOffsetAllScalesTestShouldSucceed()
{
- string tvpTypeName = DataTestUtility.GetUniqueNameForSqlServer("tvpType");
-
using SqlConnection connection = new(_connectionString);
connection.Open();
- try
+ // Use different scale for each test: 0 to 7
+ int fromScale = 0;
+ int toScale = 7;
+ string tvpTypeName = DataTestUtility.GetLongName("tvpType"); // Need a unique name per scale, else we get errors. See https://github.com/dotnet/SqlClient/issues/3011
+
+ for (int scale = fromScale; scale <= toScale; scale++)
{
- // Use different scale for each test: 0 to 7
- int fromScale = 0;
- int toScale = 7;
+ DateTimeOffset dateTimeOffset = new DateTimeOffset(2024, 1, 1, 23, 59, 59, TimeSpan.Zero);
- for (int scale = fromScale; scale <= toScale; scale++)
- {
- DateTimeOffset dateTimeOffset = new DateTimeOffset(2024, 1, 1, 23, 59, 59, TimeSpan.Zero);
+ // Add sub-second offset corresponding to the scale being tested
+ TimeSpan subSeconds = TimeSpan.FromTicks((long)(TimeSpan.TicksPerSecond / Math.Pow(10, scale)));
+ dateTimeOffset = dateTimeOffset.Add(subSeconds);
- // Add sub-second offset corresponding to the scale being tested
- TimeSpan subSeconds = TimeSpan.FromTicks((long)(TimeSpan.TicksPerSecond / Math.Pow(10, scale)));
- dateTimeOffset = dateTimeOffset.Add(subSeconds);
+ DataTestUtility.DropUserDefinedType(connection, tvpTypeName);
- DataTestUtility.DropUserDefinedType(connection, tvpTypeName);
+ try
+ {
SetupDateTimeOffsetTableType(connection, tvpTypeName, scale);
var param = new SqlParameter
@@ -113,10 +113,10 @@ public void DateTimeOffsetAllScalesTestShouldSucceed()
Assert.Equal(dateTimeOffset, result);
}
}
- }
- finally
- {
- DataTestUtility.DropUserDefinedType(connection, tvpTypeName);
+ finally
+ {
+ DataTestUtility.DropUserDefinedType(connection, tvpTypeName);
+ }
}
}
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtTest2.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtTest2.cs
index 16d48d7c37..85dbf99b33 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtTest2.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UdtTest2.cs
@@ -84,8 +84,8 @@ public void UDTParams_Binary()
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsUdtTestDatabasePresent), nameof(DataTestUtility.AreConnStringsSetup))]
public void UDTParams_Invalid2()
{
- string spInsertCustomer = DataTestUtility.GetUniqueNameForSqlServer("spUdtTest2_InsertCustomer");
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("UdtTest2");
+ string spInsertCustomer = DataTestUtility.GetLongName("spUdtTest2_InsertCustomer");
+ string tableName = DataTestUtility.GetLongName("UdtTest2");
using (SqlConnection conn = new SqlConnection(_connStr))
using (SqlCommand cmd = conn.CreateCommand())
@@ -143,8 +143,8 @@ public void UDTParams_Invalid()
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsUdtTestDatabasePresent), nameof(DataTestUtility.AreConnStringsSetup))]
public void UDTParams_TypedNull()
{
- string spInsertCustomer = DataTestUtility.GetUniqueNameForSqlServer("spUdtTest2_InsertCustomer");
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("UdtTest2_Customer");
+ string spInsertCustomer = DataTestUtility.GetLongName("spUdtTest2_InsertCustomer");
+ string tableName = DataTestUtility.GetLongName("UdtTest2_Customer");
using (SqlConnection conn = new SqlConnection(_connStr))
using (SqlCommand cmd = conn.CreateCommand())
@@ -188,8 +188,8 @@ public void UDTParams_TypedNull()
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsUdtTestDatabasePresent), nameof(DataTestUtility.AreConnStringsSetup))]
public void UDTParams_NullInput()
{
- string spInsertCustomer = DataTestUtility.GetUniqueNameForSqlServer("spUdtTest2_InsertCustomer");
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("UdtTest2_Customer");
+ string spInsertCustomer = DataTestUtility.GetLongName("spUdtTest2_InsertCustomer");
+ string tableName = DataTestUtility.GetLongName("UdtTest2_Customer");
using (SqlConnection conn = new SqlConnection(_connStr))
using (SqlCommand cmd = conn.CreateCommand())
@@ -232,8 +232,8 @@ public void UDTParams_NullInput()
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.IsUdtTestDatabasePresent), nameof(DataTestUtility.AreConnStringsSetup))]
public void UDTParams_InputOutput()
{
- string spInsertCity = DataTestUtility.GetUniqueNameForSqlServer("spUdtTest2_InsertCity");
- string tableName = DataTestUtility.GetUniqueNameForSqlServer("UdtTest2");
+ string spInsertCity = DataTestUtility.GetLongName("spUdtTest2_InsertCity");
+ string tableName = DataTestUtility.GetLongName("UdtTest2");
using (SqlConnection conn = new SqlConnection(_connStr))
{
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Utf8SupportTest/Utf8SupportTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Utf8SupportTest/Utf8SupportTest.cs
index effecb35b3..41f81b12e3 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Utf8SupportTest/Utf8SupportTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Utf8SupportTest/Utf8SupportTest.cs
@@ -37,7 +37,7 @@ public static void CheckSupportUtf8ConnectionProperty()
public static void UTF8databaseTest()
{
const string letters = @"!\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u007f€\u0081‚ƒ„…†‡ˆ‰Š‹Œ\u008dŽ\u008f\u0090‘’“”•–—˜™š›œ\u009džŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ";
- string dbName = DataTestUtility.GetUniqueNameForSqlServer("UTF8databaseTest", false);
+ string dbName = DataTestUtility.GetLongName("UTF8databaseTest", false);
string tblName = "Table1";
SqlConnectionStringBuilder builder = new(DataTestUtility.TCPConnectionString);
From f0bfe23a7fe59182258fe728ebddd2c92933d59c Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Fri, 5 Sep 2025 11:07:04 -0300
Subject: [PATCH 03/11] User Story 38481: Fix unique db object name issues
- Removing a new test that needs other files that weren't cherry-picked.
---
.../AlwaysEncrypted/CspProviderExt.cs | 51 -------------------
1 file changed, 51 deletions(-)
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs
index 3367f193aa..16cc166abc 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs
@@ -157,57 +157,6 @@ public void TestRoundTripWithCSPAndCertStoreProvider()
}
}
- [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringSetupForAE))]
- [ClassData(typeof(AEConnectionStringProvider))]
- public void TestEncryptDecryptWithCSP(string connectionString)
- {
- string providerName = @"Microsoft Enhanced RSA and AES Cryptographic Provider";
- string keyIdentifier = DataTestUtility.GetLongName("CSP");
- CspParameters namedCspParameters = new CspParameters(providerType, providerName, keyIdentifier);
- using SQLSetupStrategyCspProvider sqlSetupStrategyCsp = new SQLSetupStrategyCspProvider(namedCspParameters);
-
- try
- {
- CertificateUtilityWin.RSAPersistKeyInCsp(providerName, keyIdentifier);
- string cspPath = String.Concat(providerName, @"/", keyIdentifier);
-
- SQLSetupStrategyCspExt sqlSetupStrategyCsp = new SQLSetupStrategyCspExt(cspPath);
- string tableName = sqlSetupStrategyCsp.CspProviderTable.Name;
-
- try
- {
- using SqlConnection sqlConn = new(connectionString);
- sqlConn.Open();
-
- Table.DeleteData(tableName, sqlConn);
-
- // insert 1 row data
- Customer customer = new Customer(45, "Microsoft", "Corporation");
-
- DatabaseHelper.InsertCustomerData(sqlConn, null, tableName, customer);
-
- // Test INPUT parameter on an encrypted parameter
- using SqlCommand sqlCommand = new(@$"SELECT CustomerId, FirstName, LastName FROM [{tableName}] WHERE FirstName = @firstName",
- sqlConn, null, SqlCommandColumnEncryptionSetting.Enabled);
- SqlParameter customerFirstParam = sqlCommand.Parameters.AddWithValue(@"firstName", @"Microsoft");
- Console.WriteLine(@"Exception: {0}");
- customerFirstParam.Direction = System.Data.ParameterDirection.Input;
-
- using SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
- ValidateResultSet(sqlDataReader);
- }
- finally
- {
- // clean up database resources
- sqlSetupStrategyCsp.Dispose();
- }
- }
- finally
- {
- CertificateUtilityWin.RSADeleteKeyInCsp(providerName, keyIdentifier);
- }
- }
-
///
/// Validates that the results are the ones expected.
///
From f0a4542947fe31f23c728dda685d13e8b67c0dba Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Mon, 8 Sep 2025 11:50:43 -0300
Subject: [PATCH 04/11] User Story 38481: Fix unique db object name issues
- Removed DateOnly tests since that type doesn't exist in 5.2.
---
.../SQL/ParameterTest/ParametersTest.cs | 117 ------------------
1 file changed, 117 deletions(-)
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/ParametersTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/ParametersTest.cs
index 564657edc5..5c3e1867c5 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/ParametersTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/ParametersTest.cs
@@ -392,123 +392,6 @@ @newRoads as {typeName} READONLY
cmd.ExecuteNonQuery();
}
}
-
- [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
- public static void TestDateOnlyTVPDataTable_CommandSP()
- {
- string tableTypeName = "[dbo]." + DataTestUtility.GetLongName("UDTTTestDateOnlyTVP");
- string spName = DataTestUtility.GetLongName("spTestDateOnlyTVP");
- SqlConnection connection = new(s_connString);
- try
- {
- connection.Open();
- using (SqlCommand cmd = connection.CreateCommand())
- {
- cmd.CommandType = CommandType.Text;
- cmd.CommandText = $"CREATE TYPE {tableTypeName} AS TABLE ([DateColumn] date NULL, [TimeColumn] time NULL)";
- cmd.ExecuteNonQuery();
- cmd.CommandText = $"CREATE PROCEDURE {spName} (@dates {tableTypeName} READONLY) AS SELECT COUNT(*) FROM @dates";
- cmd.ExecuteNonQuery();
- }
- using (SqlCommand cmd = connection.CreateCommand())
- {
- cmd.CommandText = spName;
- cmd.CommandType = CommandType.StoredProcedure;
-
- DataTable dtTest = new();
- dtTest.Columns.Add(new DataColumn("DateColumn", typeof(DateOnly)));
- dtTest.Columns.Add(new DataColumn("TimeColumn", typeof(TimeOnly)));
- var dataRow = dtTest.NewRow();
- dataRow["DateColumn"] = new DateOnly(2023, 11, 15);
- dataRow["TimeColumn"] = new TimeOnly(12, 30, 45);
- dtTest.Rows.Add(dataRow);
-
- cmd.Parameters.Add(new SqlParameter
- {
- ParameterName = "@dates",
- SqlDbType = SqlDbType.Structured,
- TypeName = tableTypeName,
- Value = dtTest,
- });
-
- cmd.ExecuteNonQuery();
- }
- }
- finally
- {
- DataTestUtility.DropStoredProcedure(connection, spName);
- DataTestUtility.DropUserDefinedType(connection, tableTypeName);
- }
- }
-
- [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
- public static void TestDateOnlyTVPSqlDataRecord_CommandSP()
- {
- string tableTypeName = "[dbo]." + DataTestUtility.GetLongName("UDTTTestDateOnlySqlDataRecordTVP");
- string spName = DataTestUtility.GetLongName("spTestDateOnlySqlDataRecordTVP");
- SqlConnection connection = new(s_connString);
- try
- {
- connection.Open();
- using (SqlCommand cmd = connection.CreateCommand())
- {
- cmd.CommandType = CommandType.Text;
- cmd.CommandText = $"CREATE TYPE {tableTypeName} AS TABLE ([DateColumn] date NULL, [TimeColumn] time NULL)";
- cmd.ExecuteNonQuery();
- cmd.CommandText = $"CREATE PROCEDURE {spName} (@dates {tableTypeName} READONLY) AS SELECT COUNT(*) FROM @dates";
- cmd.ExecuteNonQuery();
- }
- using (SqlCommand cmd = connection.CreateCommand())
- {
- cmd.CommandText = spName;
- cmd.CommandType = CommandType.StoredProcedure;
-
- SqlMetaData[] metadata = new SqlMetaData[]
- {
- new SqlMetaData("DateColumn", SqlDbType.Date),
- new SqlMetaData("TimeColumn", SqlDbType.Time)
- };
-
- SqlDataRecord record1 = new SqlDataRecord(metadata);
- record1.SetValues(new DateOnly(2023, 11, 15), new TimeOnly(12, 30, 45));
-
- SqlDataRecord record2 = new SqlDataRecord(metadata);
- record2.SetValues(new DateOnly(2025, 11, 15), new TimeOnly(13, 31, 46));
-
- IList featureInserts = new List
- {
- record1,
- record2,
- };
-
- cmd.Parameters.Add(new SqlParameter
- {
- ParameterName = "@dates",
- SqlDbType = SqlDbType.Structured,
- TypeName = tableTypeName,
- Value = featureInserts,
- });
-
- using var reader = cmd.ExecuteReader();
-
- Assert.True(reader.HasRows);
-
- int count = 0;
- while (reader.Read())
- {
- Assert.NotNull(reader[0]);
- count++;
- }
-
- Assert.Equal(1, count);
- }
- }
- finally
- {
- DataTestUtility.DropStoredProcedure(connection, spName);
- DataTestUtility.DropUserDefinedType(connection, tableTypeName);
- }
- }
#endif
#region Scaled Decimal Parameter & TVP Test
From 6dacbf16b33df73e3be8505bb48869fd3fccebab Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Thu, 7 Aug 2025 15:18:15 -0300
Subject: [PATCH 05/11] Add CodeQL suppression for DefaultAzureCredential use
in Production (#3542) - Adjusted CodeQL suppression to meet the strict
requirements of where it may appear relative to the flagged code. - Adding
catch for macOS socket error to log and ignore.
---
.../Data/SqlClient/SNI/SNITcpHandle.cs | 27 ++++++++++++++++---
.../ActiveDirectoryAuthenticationProvider.cs | 23 +++++++++++++++-
2 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs
index b90cb821c4..1487f14fa3 100644
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs
+++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs
@@ -867,9 +867,30 @@ public override uint Receive(out SNIPacket packet, int timeoutInMilliseconds)
}
finally
{
- // Reset the socket timeout to Timeout.Infinite after the receive operation is done
- // to avoid blocking the thread in case of a timeout error.
- _socket.ReceiveTimeout = Timeout.Infinite;
+ const int resetTimeout = Timeout.Infinite;
+
+ try
+ {
+ // Reset the socket timeout to Timeout.Infinite after
+ // the receive operation is done to avoid blocking the
+ // thread in case of a timeout error.
+ _socket.ReceiveTimeout = resetTimeout;
+
+ }
+ catch (SocketException ex)
+ {
+ // We sometimes see setting the ReceiveTimeout fail
+ // on macOS. There's isn't much we can do about it
+ // though, so just log and move on.
+ SqlClientEventSource.Log.TrySNITraceEvent(
+ nameof(SNITCPHandle),
+ EventType.ERR,
+ "Connection Id {0}, Failed to reset socket " +
+ "receive timeout to {1}: {2}",
+ _connectionId,
+ resetTimeout,
+ ex.Message);
+ }
}
}
}
diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/ActiveDirectoryAuthenticationProvider.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/ActiveDirectoryAuthenticationProvider.cs
index 40fceda2c9..5ac75ee1a6 100644
--- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/ActiveDirectoryAuthenticationProvider.cs
+++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/ActiveDirectoryAuthenticationProvider.cs
@@ -599,7 +599,28 @@ private static TokenCredentialData CreateTokenCredentialInstance(TokenCredential
defaultAzureCredentialOptions.WorkloadIdentityClientId = tokenCredentialKey._clientId;
}
- return new TokenCredentialData(new DefaultAzureCredential(defaultAzureCredentialOptions), GetHash(secret));
+ // SqlClient is a library and provides support to acquire access
+ // token using 'DefaultAzureCredential' on user demand when they
+ // specify 'Authentication = Active Directory Default' in
+ // connection string.
+ //
+ // Default Azure Credential is instantiated by the calling
+ // application when using "Active Directory Default"
+ // authentication code to connect to Azure SQL instance.
+ // SqlClient is a library, doesn't instantiate the credential
+ // without running application instructions.
+ //
+ // Note that CodeQL suppression support can only detect
+ // suppression comments that appear immediately above the
+ // flagged statement, or appended to the end of the statement.
+ // Multi-line justifications are not supported.
+ //
+ // https://eng.ms/docs/cloud-ai-platform/devdiv/one-engineering-system-1es/1es-docs/codeql/codeql-semmle#guidance-on-suppressions
+ //
+ // CodeQL [SM05137] See above for justification.
+ DefaultAzureCredential cred = new(defaultAzureCredentialOptions);
+
+ return new TokenCredentialData(cred, GetHash(secret));
}
TokenCredentialOptions tokenCredentialOptions = new() { AuthorityHost = new Uri(tokenCredentialKey._authority) };
From d1e36ea0c078fc59c1f55a308518ffaa659dd0ff Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Tue, 9 Sep 2025 09:59:53 -0300
Subject: [PATCH 06/11] Disabled parallelization for batch tests in an attempt
to avoid deadlocks.
---
.../tests/ManualTests/SQL/Batch/BatchTests.cs | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Batch/BatchTests.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Batch/BatchTests.cs
index c02658284b..69ae65ba21 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Batch/BatchTests.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Batch/BatchTests.cs
@@ -10,6 +10,12 @@
namespace Microsoft.Data.SqlClient.ManualTesting.Tests
{
+ // The batch tests frequently get deadlocked against one another when run in
+ // parallel, so we define an xUnit Collection that disables parallelization.
+ [CollectionDefinition("BatchTestsCollection", DisableParallelization = true)]
+ public class BatchTestsCollection {}
+
+ [Collection("BatchTestsCollection")]
public static class BatchTests
{
From 2f5b79c887334e516eb79be4f34f61085a7120b6 Mon Sep 17 00:00:00 2001
From: Michel Zehnder
Date: Fri, 21 Mar 2025 18:23:11 +0100
Subject: [PATCH 07/11] Add retry on deadlock for sp_help (#3025)
Add parameter to sp_help
---
.../tests/ManualTests/SQL/Batch/BatchTests.cs | 28 +++++++++++++------
1 file changed, 19 insertions(+), 9 deletions(-)
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Batch/BatchTests.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Batch/BatchTests.cs
index 69ae65ba21..8a04af38ab 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Batch/BatchTests.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Batch/BatchTests.cs
@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using System;
+using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Threading.Tasks;
@@ -80,9 +81,13 @@ public static void SqlBatchCanCreateParameter()
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
public static void StoredProcedureBatchSupported()
{
+ SqlRetryLogicOption rto = new() { NumberOfTries = 3, DeltaTime = TimeSpan.FromMilliseconds(100), TransientErrors = new[] { 1205 } }; // Retry on 1205 / Deadlock
+ SqlRetryLogicBaseProvider prov = SqlConfigurableRetryFactory.CreateIncrementalRetryProvider(rto);
+
using (var connection = new SqlConnection(DataTestUtility.TCPConnectionString))
- using (var batch = new SqlBatch { Connection = connection, BatchCommands = { new SqlBatchCommand("sp_help", CommandType.StoredProcedure) } })
+ using (var batch = new SqlBatch { Connection = connection, BatchCommands = { new SqlBatchCommand("sp_help", CommandType.StoredProcedure, new List { new("@objname", "sys.indexes") }) } })
{
+ connection.RetryLogicProvider = prov;
connection.Open();
batch.ExecuteNonQuery();
}
@@ -108,19 +113,24 @@ public static void TableDirectBatchNotSupported()
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
public static void MixedBatchSupported()
{
+ SqlRetryLogicOption rto = new() { NumberOfTries = 3, DeltaTime = TimeSpan.FromMilliseconds(100), TransientErrors = new[] { 1205 } }; // Retry on 1205 / Deadlock
+ SqlRetryLogicBaseProvider prov = SqlConfigurableRetryFactory.CreateIncrementalRetryProvider(rto);
+
using (var connection = new SqlConnection(DataTestUtility.TCPConnectionString))
using (var batch = new SqlBatch
+ {
+ Connection = connection,
+ BatchCommands =
+ {
+ new SqlBatchCommand("select @@SPID", CommandType.Text),
+ new SqlBatchCommand("sp_help", CommandType.StoredProcedure, new List { new("@objname", "sys.indexes") })
+ }
+ })
{
- Connection = connection,
- BatchCommands =
- {
- new SqlBatchCommand("select @@SPID", CommandType.Text),
- new SqlBatchCommand("sp_help",CommandType.StoredProcedure)
- }
- })
- {
+ connection.RetryLogicProvider = prov;
connection.Open();
batch.ExecuteNonQuery();
+ return;
}
}
From 98fe1e02d463ea3aa49365cd6a0dc89c9ddd22b4 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Mon, 15 Sep 2025 12:05:19 -0300
Subject: [PATCH 08/11] - Updated Xunit packages to avoid transitive
System.Net.Http vulnerability warnings.
---
tools/props/Versions.props | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tools/props/Versions.props b/tools/props/Versions.props
index 1576a8a7ce..980aafeb66 100644
--- a/tools/props/Versions.props
+++ b/tools/props/Versions.props
@@ -67,8 +67,8 @@
13.0.1
4.3.0
6.0.1
- 2.6.3
- 2.5.5
+ 2.9.3
+ 2.8.2
1.0.3
7.0.0-beta.22316.1
2.0.8
From 736764a37745b4f05e307e192416c05fd70fd755 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Mon, 15 Sep 2025 15:31:54 -0300
Subject: [PATCH 09/11] User Story 38467: Backport mac server name fix
- Fixed 'async void' tests.
---
.../SqlConfigurableRetryLogicTest.cs | 3 +-
.../SqlConnectionBasicTests.cs | 2 +-
.../ManualTests/AlwaysEncrypted/ApiShould.cs | 2 +-
.../SQL/AsyncTest/XmlReaderAsyncTest.cs | 4 +-
.../SQL/ConnectivityTests/ConnectivityTest.cs | 3 +-
.../DataReaderTest/DataReaderStreamsTest.cs | 14 +++---
.../ManualTests/SQL/MARSTest/MARSTest.cs | 10 ++--
.../SQL/RetryLogic/RetryLogicCounterTest.cs | 2 +-
.../RetryLogic/SqlCommandReliabilityTest.cs | 6 +--
.../SqlConnectionReliabilityTest.cs | 4 +-
.../DataTypeReaderAsyncRunner.cs | 50 +++++++++----------
11 files changed, 51 insertions(+), 49 deletions(-)
diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConfigurableRetryLogicTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConfigurableRetryLogicTest.cs
index cd3fb3bdec..b04115b191 100644
--- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConfigurableRetryLogicTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConfigurableRetryLogicTest.cs
@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using System;
+using System.Threading.Tasks;
using Xunit;
namespace Microsoft.Data.SqlClient.Tests
@@ -10,7 +11,7 @@ namespace Microsoft.Data.SqlClient.Tests
public class SqlConfigurableRetryLogicTest
{
[Fact]
- public async void InvalidExecute()
+ public async Task InvalidExecute()
{
SqlRetryLogicOption option = new SqlRetryLogicOption()
{
diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs
index 6b9713d4a0..24da19e995 100644
--- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs
+++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs
@@ -281,7 +281,7 @@ public void ConnectionTimeoutTest(int timeout)
[InlineData(10)]
[InlineData(5)]
[InlineData(1)]
- public async void ConnectionTimeoutTestAsync(int timeout)
+ public async Task ConnectionTimeoutTestAsync(int timeout)
{
// Start a server with connection timeout from the inline data.
using TestTdsServer server = TestTdsServer.StartTestServer(false, false, timeout);
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs
index 3c487b532c..15c51ccee4 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs
@@ -692,7 +692,7 @@ public void TestExecuteReader(string connection)
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.IsTargetReadyForAeWithKeyStore))]
[ClassData(typeof(AEConnectionStringProvider))]
- public async void TestExecuteReaderAsyncWithLargeQuery(string connectionString)
+ public async Task TestExecuteReaderAsyncWithLargeQuery(string connectionString)
{
string randomName = DataTestUtility.GetShortName(Guid.NewGuid().ToString().Replace("-", ""), false);
if (randomName.Length > 50)
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AsyncTest/XmlReaderAsyncTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AsyncTest/XmlReaderAsyncTest.cs
index af5045e6ad..2f430245e9 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AsyncTest/XmlReaderAsyncTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AsyncTest/XmlReaderAsyncTest.cs
@@ -3,8 +3,8 @@
// See the LICENSE file in the project root for more information.
using System;
+using System.Threading.Tasks;
using System.Xml;
-using System.Xml.Linq;
using Xunit;
namespace Microsoft.Data.SqlClient.ManualTesting.Tests
@@ -71,7 +71,7 @@ public static void ExceptionTest()
// Synapse: Parse error at line: 1, column: 29: Incorrect syntax near 'FOR'.
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
- public static async void MoveToContentAsyncTest()
+ public static async Task MoveToContentAsyncTest()
{
using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString))
using (SqlCommand command = new SqlCommand(CommandText, connection))
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/ConnectivityTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/ConnectivityTest.cs
index de2de4ad37..7a22f87ea6 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/ConnectivityTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/ConnectivityTest.cs
@@ -7,6 +7,7 @@
using System.Data;
using System.Diagnostics;
using System.Threading;
+using System.Threading.Tasks;
using Xunit;
namespace Microsoft.Data.SqlClient.ManualTesting.Tests
@@ -87,7 +88,7 @@ public static void EnvironmentHostNameSPIDTest()
}
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
- public static async void ConnectionTimeoutInfiniteTest()
+ public static async Task ConnectionTimeoutInfiniteTest()
{
// Exercise the special-case infinite connect timeout code path
SqlConnectionStringBuilder builder = new(DataTestUtility.TCPConnectionString)
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderStreamsTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderStreamsTest.cs
index 3f16a3a138..01b1429afd 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderStreamsTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderStreamsTest.cs
@@ -157,7 +157,7 @@ public static async Task GetFieldValueAsync_Char_OfTextReader(CommandBehavior be
// Synapse: Cannot find data type 'XML'.
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
[MemberData(nameof(GetCommandBehavioursAndIsAsync))]
- public static async void GetFieldValue_OfXmlReader(CommandBehavior behavior, bool isExecuteAsync)
+ public static async Task GetFieldValue_OfXmlReader(CommandBehavior behavior, bool isExecuteAsync)
{
const int PacketSize = 512; // force minimun packet size so that the test data spans multiple packets to test sequential access spanning
string connectionString = SetConnectionStringPacketSize(DataTestUtility.TCPConnectionString, PacketSize);
@@ -191,7 +191,7 @@ public static async void GetFieldValue_OfXmlReader(CommandBehavior behavior, boo
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
[MemberData(nameof(GetCommandBehavioursAndIsAsync))]
- public static async void GetFieldValue_OfStream(CommandBehavior behavior, bool isExecuteAsync)
+ public static async Task GetFieldValue_OfStream(CommandBehavior behavior, bool isExecuteAsync)
{
const int PacketSize = 512; // force minimun packet size so that the test data spans multiple packets to test sequential access spanning
string connectionString = SetConnectionStringPacketSize(DataTestUtility.TCPConnectionString, PacketSize);
@@ -224,7 +224,7 @@ public static async void GetFieldValue_OfStream(CommandBehavior behavior, bool i
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
[MemberData(nameof(GetCommandBehavioursAndIsAsync))]
- public static async void GetFieldValue_OfTextReader(CommandBehavior behavior, bool isExecuteAsync)
+ public static async Task GetFieldValue_OfTextReader(CommandBehavior behavior, bool isExecuteAsync)
{
const int PacketSize = 512; // force minimun packet size so that the test data spans multiple packets to test sequential access spanning
string connectionString = SetConnectionStringPacketSize(DataTestUtility.TCPConnectionString, PacketSize);
@@ -258,7 +258,7 @@ public static async void GetFieldValue_OfTextReader(CommandBehavior behavior, bo
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
[MemberData(nameof(GetCommandBehavioursAndIsAsync))]
- public static async void GetStream(CommandBehavior behavior, bool isExecuteAsync)
+ public static async Task GetStream(CommandBehavior behavior, bool isExecuteAsync)
{
const int PacketSize = 512; // force minimun packet size so that the test data spans multiple packets to test sequential access spanning
string connectionString = SetConnectionStringPacketSize(DataTestUtility.TCPConnectionString, PacketSize);
@@ -294,7 +294,7 @@ public static async void GetStream(CommandBehavior behavior, bool isExecuteAsync
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
[MemberData(nameof(GetCommandBehavioursAndIsAsync))]
- public static async void GetXmlReader(CommandBehavior behavior, bool isExecuteAsync)
+ public static async Task GetXmlReader(CommandBehavior behavior, bool isExecuteAsync)
{
const int PacketSize = 512; // force minimun packet size so that the test data spans multiple packets to test sequential access spanning
string connectionString = SetConnectionStringPacketSize(DataTestUtility.TCPConnectionString, PacketSize);
@@ -328,7 +328,7 @@ public static async void GetXmlReader(CommandBehavior behavior, bool isExecuteAs
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
[MemberData(nameof(GetCommandBehavioursAndIsAsync))]
- public static async void GetTextReader(CommandBehavior behavior, bool isExecuteAsync)
+ public static async Task GetTextReader(CommandBehavior behavior, bool isExecuteAsync)
{
const int PacketSize = 512; // force minimun packet size so that the test data spans multiple packets to test sequential access spanning
string connectionString = SetConnectionStringPacketSize(DataTestUtility.TCPConnectionString, PacketSize);
@@ -474,7 +474,7 @@ public static void InvalidCastExceptionStream(CommandBehavior behavior, Accessor
#if NETCOREAPP
[ConditionalFact(typeof(DataTestUtility),nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
- public static async void ReadAsyncContentsCompletes()
+ public static async Task ReadAsyncContentsCompletes()
{
string expectedXml = "This is a test string";
string query = $"SELECT CAST('{expectedXml}' AS NVARCHAR(MAX))";
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/MARSTest/MARSTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/MARSTest/MARSTest.cs
index 2cdbfdcc40..9bbccb8b31 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/MARSTest/MARSTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/MARSTest/MARSTest.cs
@@ -251,7 +251,7 @@ public static void MARSSyncBusyReaderTest()
}
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
- public static async void MARSAsyncExecuteNonQueryTest()
+ public static async Task MARSAsyncExecuteNonQueryTest()
{
using SqlConnection con = new(_connStr);
con.Open();
@@ -298,7 +298,7 @@ public static void MARSSyncExecuteNonQueryTest()
}
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
- public static async void MARSAsyncExecuteReaderTest1()
+ public static async Task MARSAsyncExecuteReaderTest1()
{
using SqlConnection con = new(_connStr);
con.Open();
@@ -412,7 +412,7 @@ public static void MARSSyncExecuteReaderTest1()
}
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
- public static async void MARSAsyncExecuteReaderTest2()
+ public static async Task MARSAsyncExecuteReaderTest2()
{
using SqlConnection con = new(_connStr);
con.Open();
@@ -463,7 +463,7 @@ public static void MARSSyncExecuteReaderTest2()
}
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
- public static async void MARSAsyncExecuteReaderTest3()
+ public static async Task MARSAsyncExecuteReaderTest3()
{
using SqlConnection con = new(_connStr);
con.Open();
@@ -525,7 +525,7 @@ public static void MARSSyncExecuteReaderTest3()
}
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
- public static async void MARSAsyncExecuteReaderTest4()
+ public static async Task MARSAsyncExecuteReaderTest4()
{
using SqlConnection con = new(_connStr);
con.Open();
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/RetryLogicCounterTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/RetryLogicCounterTest.cs
index e451091315..4b1b7add4d 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/RetryLogicCounterTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/RetryLogicCounterTest.cs
@@ -16,7 +16,7 @@ public class RetryLogicCounterTest
[InlineData("ExecuteReaderAsync", 3)]
[InlineData("ExecuteXmlReaderAsync", 3)]
[InlineData("ExecuteNonQueryAsync", 3)]
- public async void ValidateRetryCount_SqlCommand_Async(string methodName, int numOfTries)
+ public async Task ValidateRetryCount_SqlCommand_Async(string methodName, int numOfTries)
{
ErrorInfoRetryLogicProvider _errorInfoRetryProvider = new(
SqlConfigurableRetryFactory.CreateFixedRetryProvider(new SqlRetryLogicOption()
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlCommandReliabilityTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlCommandReliabilityTest.cs
index 7318d5c5b4..21165e7624 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlCommandReliabilityTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlCommandReliabilityTest.cs
@@ -418,7 +418,7 @@ public void NoneRetriableExecuteFail(string cnnString, SqlRetryLogicBaseProvider
#region Async
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
[MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyInvalidCommand), parameters: new object[] { 2 }, MemberType = typeof(RetryLogicTestHelper), DisableDiscoveryEnumeration = true)]
- public async void RetryExecuteAsyncFail(string cnnString, SqlRetryLogicBaseProvider provider)
+ public async Task RetryExecuteAsyncFail(string cnnString, SqlRetryLogicBaseProvider provider)
{
int numberOfTries = provider.RetryLogic.NumberOfTries;
int cancelAfterRetries = numberOfTries + 1;
@@ -483,7 +483,7 @@ public async void RetryExecuteAsyncFail(string cnnString, SqlRetryLogicBaseProvi
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
[MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyInvalidCommand), parameters: new object[] { 2 }, MemberType = typeof(RetryLogicTestHelper), DisableDiscoveryEnumeration = true)]
- public async void RetryExecuteAsyncCancel(string cnnString, SqlRetryLogicBaseProvider provider)
+ public async Task RetryExecuteAsyncCancel(string cnnString, SqlRetryLogicBaseProvider provider)
{
int numberOfTries = provider.RetryLogic.NumberOfTries;
int cancelAfterRetries = numberOfTries - 1;
@@ -567,7 +567,7 @@ public void ConcurrentExecution(string cnnString, SqlRetryLogicBaseProvider prov
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
[MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyInvalidCommand), parameters: new object[] { 2 }, MemberType = typeof(RetryLogicTestHelper), DisableDiscoveryEnumeration = true)]
- public async void ConcurrentExecutionAsync(string cnnString, SqlRetryLogicBaseProvider provider)
+ public async Task ConcurrentExecutionAsync(string cnnString, SqlRetryLogicBaseProvider provider)
{
string query = "SELECT bad command";
await ProcessDataAsAsync(cnnString, provider, query, cmd => cmd.ExecuteScalarAsync());
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConnectionReliabilityTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConnectionReliabilityTest.cs
index 301ed95d74..4dfa9269d9 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConnectionReliabilityTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/RetryLogic/SqlConnectionReliabilityTest.cs
@@ -160,7 +160,7 @@ public void DefaultOpenWithoutRetry(string connectionString, SqlRetryLogicBasePr
// Test relies on error 4060 for automatic retry, which is not reliable when using Azure or AAD auth
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))]
[MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyInvalidCatalog), parameters: new object[] { 5 }, MemberType = typeof(RetryLogicTestHelper), DisableDiscoveryEnumeration = true)]
- public async void ConnectionRetryOpenAsyncInvalidCatalogFailed(string cnnString, SqlRetryLogicBaseProvider provider)
+ public async Task ConnectionRetryOpenAsyncInvalidCatalogFailed(string cnnString, SqlRetryLogicBaseProvider provider)
{
int numberOfTries = provider.RetryLogic.NumberOfTries;
int cancelAfterRetries = numberOfTries + 1;
@@ -178,7 +178,7 @@ public async void ConnectionRetryOpenAsyncInvalidCatalogFailed(string cnnString,
// Test relies on error 4060 for automatic retry, which is not returned when using AAD auth
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.TcpConnectionStringDoesNotUseAadAuth))]
[MemberData(nameof(RetryLogicTestHelper.GetConnectionAndRetryStrategyInvalidCatalog), parameters: new object[] { 2 }, MemberType = typeof(RetryLogicTestHelper), DisableDiscoveryEnumeration = true)]
- public async void ConnectionCancelRetryOpenAsyncInvalidCatalog(string cnnString, SqlRetryLogicBaseProvider provider)
+ public async Task ConnectionCancelRetryOpenAsyncInvalidCatalog(string cnnString, SqlRetryLogicBaseProvider provider)
{
int numberOfTries = provider.RetryLogic.NumberOfTries;
int cancelAfterRetries = numberOfTries - 1;
diff --git a/src/Microsoft.Data.SqlClient/tests/PerformanceTests/BenchmarkRunners/DataTypeReaderAsyncRunner.cs b/src/Microsoft.Data.SqlClient/tests/PerformanceTests/BenchmarkRunners/DataTypeReaderAsyncRunner.cs
index 84e9046cda..07391ce35f 100644
--- a/src/Microsoft.Data.SqlClient/tests/PerformanceTests/BenchmarkRunners/DataTypeReaderAsyncRunner.cs
+++ b/src/Microsoft.Data.SqlClient/tests/PerformanceTests/BenchmarkRunners/DataTypeReaderAsyncRunner.cs
@@ -53,78 +53,78 @@ private static async Task RunBenchmarkAsync(DataType type)
}
[Benchmark]
- public static async void BitAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_bit]);
+ public static async Task BitAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_bit]);
[Benchmark]
- public static async void IntAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_int]);
+ public static async Task IntAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_int]);
[Benchmark]
- public static async void TinyIntAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_tinyint]);
+ public static async Task TinyIntAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_tinyint]);
[Benchmark]
- public static async void SmallIntAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_smallint]);
+ public static async Task SmallIntAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_smallint]);
[Benchmark]
- public static async void BigIntAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_bigint]);
+ public static async Task BigIntAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_bigint]);
[Benchmark]
- public static async void MoneyAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_money]);
+ public static async Task MoneyAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_money]);
[Benchmark]
- public static async void SmallMoneyAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_smallmoney]);
+ public static async Task SmallMoneyAsync() => await RunBenchmarkAsync(s_datatypes.Numerics[n_smallmoney]);
[Benchmark]
- public static async void DecimalAsync() => await RunBenchmarkAsync(s_datatypes.Decimals[d_decimal]);
+ public static async Task DecimalAsync() => await RunBenchmarkAsync(s_datatypes.Decimals[d_decimal]);
[Benchmark]
- public static async void NumericAsync() => await RunBenchmarkAsync(s_datatypes.Decimals[d_numeric]);
+ public static async Task NumericAsync() => await RunBenchmarkAsync(s_datatypes.Decimals[d_numeric]);
[Benchmark]
- public static async void FloatAsync() => await RunBenchmarkAsync(s_datatypes.Decimals[d_float]);
+ public static async Task FloatAsync() => await RunBenchmarkAsync(s_datatypes.Decimals[d_float]);
[Benchmark]
- public static async void RealAsync() => await RunBenchmarkAsync(s_datatypes.Decimals[d_real]);
+ public static async Task RealAsync() => await RunBenchmarkAsync(s_datatypes.Decimals[d_real]);
[Benchmark]
- public static async void DateAsync() => await RunBenchmarkAsync(s_datatypes.DateTimes[t_date]);
+ public static async Task DateAsync() => await RunBenchmarkAsync(s_datatypes.DateTimes[t_date]);
[Benchmark]
- public static async void DatetimeAsync() => await RunBenchmarkAsync(s_datatypes.DateTimes[t_datetime]);
+ public static async Task DatetimeAsync() => await RunBenchmarkAsync(s_datatypes.DateTimes[t_datetime]);
[Benchmark]
- public static async void Datetime2Async() => await RunBenchmarkAsync(s_datatypes.DateTimes[t_datetime2]);
+ public static async Task Datetime2Async() => await RunBenchmarkAsync(s_datatypes.DateTimes[t_datetime2]);
[Benchmark]
- public static async void TimeAsync() => await RunBenchmarkAsync(s_datatypes.DateTimes[t_time]);
+ public static async Task TimeAsync() => await RunBenchmarkAsync(s_datatypes.DateTimes[t_time]);
[Benchmark]
- public static async void SmallDateTimeAsync() => await RunBenchmarkAsync(s_datatypes.DateTimes[t_smalldatetime]);
+ public static async Task SmallDateTimeAsync() => await RunBenchmarkAsync(s_datatypes.DateTimes[t_smalldatetime]);
[Benchmark]
- public static async void DateTimeOffsetAsync() => await RunBenchmarkAsync(s_datatypes.DateTimes[t_datetimeoffset]);
+ public static async Task DateTimeOffsetAsync() => await RunBenchmarkAsync(s_datatypes.DateTimes[t_datetimeoffset]);
[Benchmark]
- public static async void CharAsync() => await RunBenchmarkAsync(s_datatypes.Characters[c_char]);
+ public static async Task CharAsync() => await RunBenchmarkAsync(s_datatypes.Characters[c_char]);
[Benchmark]
- public static async void NCharAsync() => await RunBenchmarkAsync(s_datatypes.Characters[c_nchar]);
+ public static async Task NCharAsync() => await RunBenchmarkAsync(s_datatypes.Characters[c_nchar]);
[Benchmark]
- public static async void BinaryAsync() => await RunBenchmarkAsync(s_datatypes.Binary[b_binary]);
+ public static async Task BinaryAsync() => await RunBenchmarkAsync(s_datatypes.Binary[b_binary]);
[Benchmark]
- public static async void VarCharAsync() => await RunBenchmarkAsync(s_datatypes.MaxTypes[m_varchar]);
+ public static async Task VarCharAsync() => await RunBenchmarkAsync(s_datatypes.MaxTypes[m_varchar]);
[Benchmark]
- public static async void NVarCharAsync() => await RunBenchmarkAsync(s_datatypes.MaxTypes[m_nvarchar]);
+ public static async Task NVarCharAsync() => await RunBenchmarkAsync(s_datatypes.MaxTypes[m_nvarchar]);
[Benchmark]
- public static async void VarBinaryAsync() => await RunBenchmarkAsync(s_datatypes.MaxTypes[m_varbinary]);
+ public static async Task VarBinaryAsync() => await RunBenchmarkAsync(s_datatypes.MaxTypes[m_varbinary]);
[Benchmark]
- public static async void UniqueIdentifierAsync() => await RunBenchmarkAsync(s_datatypes.Others[o_uniqueidentifier]);
+ public static async Task UniqueIdentifierAsync() => await RunBenchmarkAsync(s_datatypes.Others[o_uniqueidentifier]);
[Benchmark]
- public static async void XmlAsync() => await RunBenchmarkAsync(s_datatypes.Others[o_xml]);
+ public static async Task XmlAsync() => await RunBenchmarkAsync(s_datatypes.Others[o_xml]);
}
}
From c2b98235b0607ecf735eb4e762ac1d9d4c25e194 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Mon, 15 Sep 2025 15:40:45 -0300
Subject: [PATCH 10/11] User Story 38467: Backport mac server name fix
- Upgraded System.Text.Json 6.0.0 to 6.0.11 in the tests to avoid vulnerability warnings.
---
.../tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj | 2 ++
.../Microsoft.Data.SqlClient.ManualTesting.Tests.csproj | 2 ++
tools/props/Versions.props | 1 +
3 files changed, 5 insertions(+)
diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj
index 506960d3b6..413a00e253 100644
--- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj
@@ -96,6 +96,8 @@
+
+
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj
index 7eb2b1140c..5ccb1b6111 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.csproj
@@ -345,6 +345,8 @@
+
+
diff --git a/tools/props/Versions.props b/tools/props/Versions.props
index 980aafeb66..50c059bedc 100644
--- a/tools/props/Versions.props
+++ b/tools/props/Versions.props
@@ -34,6 +34,7 @@
4.5.1
6.0.0
8.0.0
+ 6.0.11
From 5df3143a6ff3841fc808eba4e1f9f54fd355f340 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Mon, 15 Sep 2025 15:47:40 -0300
Subject: [PATCH 11/11] User Story 38467: Backport mac server name fix
- Added back test removed in error from cherry-pick.
- Removed unnecessary xUnit parallel test class configuration.
---
.../AlwaysEncrypted/CspProviderExt.cs | 49 +++++++++++++++++++
.../tests/ManualTests/SQL/Batch/BatchTests.cs | 5 --
2 files changed, 49 insertions(+), 5 deletions(-)
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs
index 16cc166abc..a2a0945293 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/CspProviderExt.cs
@@ -157,6 +157,55 @@ public void TestRoundTripWithCSPAndCertStoreProvider()
}
}
+ [ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringSetupForAE))]
+ [ClassData(typeof(AEConnectionStringProvider))]
+ public void TestEncryptDecryptWithCSP(string connectionString)
+ {
+ string providerName = @"Microsoft Enhanced RSA and AES Cryptographic Provider";
+ string keyIdentifier = DataTestUtility.GetLongName("CSP");
+
+ try
+ {
+ CertificateUtilityWin.RSAPersistKeyInCsp(providerName, keyIdentifier);
+ string cspPath = String.Concat(providerName, @"/", keyIdentifier);
+
+ SQLSetupStrategyCspExt sqlSetupStrategyCsp = new SQLSetupStrategyCspExt(cspPath);
+ string tableName = sqlSetupStrategyCsp.CspProviderTable.Name;
+
+ try
+ {
+ using SqlConnection sqlConn = new(connectionString);
+ sqlConn.Open();
+
+ Table.DeleteData(tableName, sqlConn);
+
+ // insert 1 row data
+ Customer customer = new Customer(45, "Microsoft", "Corporation");
+
+ DatabaseHelper.InsertCustomerData(sqlConn, null, tableName, customer);
+
+ // Test INPUT parameter on an encrypted parameter
+ using SqlCommand sqlCommand = new(@$"SELECT CustomerId, FirstName, LastName FROM [{tableName}] WHERE FirstName = @firstName",
+ sqlConn, null, SqlCommandColumnEncryptionSetting.Enabled);
+ SqlParameter customerFirstParam = sqlCommand.Parameters.AddWithValue(@"firstName", @"Microsoft");
+ Console.WriteLine(@"Exception: {0}");
+ customerFirstParam.Direction = System.Data.ParameterDirection.Input;
+
+ using SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
+ ValidateResultSet(sqlDataReader);
+ }
+ finally
+ {
+ // clean up database resources
+ sqlSetupStrategyCsp.Dispose();
+ }
+ }
+ finally
+ {
+ CertificateUtilityWin.RSADeleteKeyInCsp(providerName, keyIdentifier);
+ }
+ }
+
///
/// Validates that the results are the ones expected.
///
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Batch/BatchTests.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Batch/BatchTests.cs
index 8a04af38ab..1a22af41e9 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Batch/BatchTests.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/Batch/BatchTests.cs
@@ -11,11 +11,6 @@
namespace Microsoft.Data.SqlClient.ManualTesting.Tests
{
- // The batch tests frequently get deadlocked against one another when run in
- // parallel, so we define an xUnit Collection that disables parallelization.
- [CollectionDefinition("BatchTestsCollection", DisableParallelization = true)]
- public class BatchTestsCollection {}
-
[Collection("BatchTestsCollection")]
public static class BatchTests
{