diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTests.csproj b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTests.csproj index 7ae352c028..8a81560710 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTests.csproj +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTests.csproj @@ -277,22 +277,6 @@ PreserveNewest TvpColumnBoundaries_ReleaseMode_Azure.bsl - - PreserveNewest - TvpQueryHints_DebugMode.bsl - - - PreserveNewest - TvpQueryHints_DebugMode_Azure.bsl - - - PreserveNewest - TvpQueryHints_ReleaseMode.bsl - - - PreserveNewest - TvpQueryHints_ReleaseMode_Azure.bsl - PreserveNewest SqlVariantParameter_DebugMode.bsl diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHintsTests.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHintsTests.cs index 512026f0a5..62df3f2c27 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHintsTests.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHintsTests.cs @@ -3,138 +3,286 @@ // See the LICENSE file in the project root for more information. using System; -using System.Globalization; -using System.IO; -using System.Text; -using System.Threading; +using System.Collections.Generic; +using System.Data; +using Microsoft.Data.SqlClient.Server; using Xunit; namespace Microsoft.Data.SqlClient.ManualTesting.Tests { /// /// Tests for TVP query hints (sort order, uniqueness, default columns). - /// These tests run independently with their own baseline comparison. /// - [Collection("ParameterBaselineTests")] - public class TvpQueryHintsTests + public sealed class TvpQueryHintsTests : IDisposable { - [Trait("Category", "flaky")] - [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))] - public void TvpQueryHintsTest() + private readonly SqlConnection _conn; + private readonly SqlCommand _cmd; + private readonly SqlParameter _param; + private readonly string _procName; + private readonly string _typeName; + + public TvpQueryHintsTests() { - Assert.True(RunTestAndCompareWithBaseline()); + Guid randomizer = Guid.NewGuid(); + _typeName = string.Format("dbo.[QHint_{0}]", randomizer); + _procName = string.Format("dbo.[QHint_Proc_{0}]", randomizer); + string createTypeSql = string.Format( + "CREATE TYPE {0} AS TABLE(" + + " c1 Int DEFAULT -1," + + " c2 NVarChar(40) DEFAULT N'DEFUALT'," + + " c3 DateTime DEFAULT '1/1/2006'," + + " c4 Int DEFAULT -1)", + _typeName); + string createProcSql = string.Format( + "CREATE PROC {0}(@tvp {1} READONLY) AS SELECT TOP(2) * FROM @tvp ORDER BY c1", _procName, _typeName); + + _conn = new SqlConnection(DataTestUtility.TCPConnectionString); + _conn.Open(); + + _cmd = new SqlCommand(createTypeSql, _conn); + _cmd.ExecuteNonQuery(); + + _cmd.CommandText = createProcSql; + _cmd.ExecuteNonQuery(); + + _cmd.CommandText = _procName; + _cmd.CommandType = CommandType.StoredProcedure; + _param = _cmd.Parameters.Add("@tvp", SqlDbType.Structured); } - private bool RunTestAndCompareWithBaseline() + public void Dispose() { - CultureInfo previousCulture = Thread.CurrentThread.CurrentCulture; - Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); - try - { - string outputPath = "TvpQueryHints.out"; - string baselinePath; -#if DEBUG - if (DataTestUtility.IsNotAzureServer() || DataTestUtility.IsManagedInstance) - { - baselinePath = "TvpQueryHints_DebugMode.bsl"; - } - else - { - baselinePath = "TvpQueryHints_DebugMode_Azure.bsl"; - } -#else - if (DataTestUtility.IsNotAzureServer() || DataTestUtility.IsManagedInstance) - { - baselinePath = "TvpQueryHints_ReleaseMode.bsl"; - } - else + string dropSql = string.Format("DROP PROC {0}; DROP TYPE {1}", _procName, _typeName); + using SqlCommand cmd = new(dropSql, _conn); + cmd.ExecuteNonQuery(); + _conn.Dispose(); + } + + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))] + public void SortOrderSimple() + { + // Arrange + List rows = new(); + + SqlMetaData[] columnMetadata = new SqlMetaData[] { - baselinePath = "TvpQueryHints_ReleaseMode_Azure.bsl"; - } -#endif + new SqlMetaData("", SqlDbType.Int, false, true, SortOrder.Ascending, 0), + new SqlMetaData("", SqlDbType.NVarChar, 40, false, true, SortOrder.Descending, 1), + new SqlMetaData("", SqlDbType.DateTime, false, true, SortOrder.Ascending, 2), + new SqlMetaData("", SqlDbType.Int, false, true, SortOrder.Descending, 3), + }; - var fstream = new FileStream(outputPath, FileMode.Create, FileAccess.Write, FileShare.Read); - var swriter = new StreamWriter(fstream, Encoding.UTF8); - var twriter = new TvpTest.CarriageReturnLineFeedReplacer(swriter); - Console.SetOut(twriter); + AddRow(rows, columnMetadata, 0, "Z-value", DateTime.Parse("03/01/2000"), 5); + AddRow(rows, columnMetadata, 1, "Y-value", DateTime.Parse("02/01/2000"), 6); + AddRow(rows, columnMetadata, 1, "X-value", DateTime.Parse("01/01/2000"), 7); + AddRow(rows, columnMetadata, 1, "X-value", DateTime.Parse("04/01/2000"), 8); + AddRow(rows, columnMetadata, 1, "X-value", DateTime.Parse("04/01/2000"), 4); - // Run Test - TvpTest instance is needed to access QueryHintsTest - var tvpTest = new TvpTest(); - tvpTest.QueryHintsTest(); + _param.Value = rows; - Console.Out.Flush(); - Console.Out.Dispose(); + // Act + List results = ExecuteAndGetResults(_cmd); - // Recover the standard output stream - StreamWriter standardOutput = new(Console.OpenStandardOutput()); - standardOutput.AutoFlush = true; - Console.SetOut(standardOutput); + // Assert + Assert.Equal(2, results.Count); + Assert.Equal(0, results[0].C1); + Assert.Equal("Z-value", results[0].C2); + Assert.Equal(new DateTime(2000, 3, 1), results[0].C3); + Assert.Equal(5, results[0].C4); + Assert.Equal(1, results[1].C1); + Assert.Equal("X-value", results[1].C2); + Assert.Equal(new DateTime(2000, 1, 1), results[1].C3); + Assert.Equal(7, results[1].C4); + } - // Compare output file - var comparisonResult = FindDiffFromBaseline(baselinePath, outputPath); + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))] + public void SortOrderMixed() + { + // Arrange + List rows = new(); - if (string.IsNullOrEmpty(comparisonResult)) + SqlMetaData[] columnMetadata = new SqlMetaData[] { - return true; - } + new SqlMetaData("", SqlDbType.Int, false, true, SortOrder.Descending, 3), + new SqlMetaData("", SqlDbType.NVarChar, 40, false, true, SortOrder.Descending, 0), + new SqlMetaData("", SqlDbType.DateTime, false, true, SortOrder.Ascending, 2), + new SqlMetaData("", SqlDbType.Int, false, true, SortOrder.Ascending, 1), + }; - Console.WriteLine("TvpQueryHintsTest Failed!"); - Console.WriteLine("Please compare baseline: {0} with output: {1}", Path.GetFullPath(baselinePath), Path.GetFullPath(outputPath)); - Console.WriteLine("Comparison Results:"); - Console.WriteLine(comparisonResult); - return false; - } - finally - { - Thread.CurrentThread.CurrentCulture = previousCulture; - } + AddRow(rows, columnMetadata, 6, "Z-value", DateTime.Parse("01/01/2000"), 1); + AddRow(rows, columnMetadata, 6, "Z-value", DateTime.Parse("01/01/2000"), 2); + AddRow(rows, columnMetadata, 6, "Y-value", DateTime.Parse("01/01/2000"), 3); + AddRow(rows, columnMetadata, 6, "Y-value", DateTime.Parse("02/01/2000"), 3); + AddRow(rows, columnMetadata, 5, "X-value", DateTime.Parse("03/01/2000"), 3); + AddRow(rows, columnMetadata, 4, "X-value", DateTime.Parse("01/01/2000"), 3); + + _param.Value = rows; + + // Act + List results = ExecuteAndGetResults(_cmd); + + // Assert + Assert.Equal(2, results.Count); + Assert.Equal(4, results[0].C1); + Assert.Equal("X-value", results[0].C2); + Assert.Equal(new DateTime(2000, 1, 1), results[0].C3); + Assert.Equal(3, results[0].C4); + Assert.Equal(5, results[1].C1); + Assert.Equal("X-value", results[1].C2); + Assert.Equal(new DateTime(2000, 3, 1), results[1].C3); + Assert.Equal(3, results[1].C4); } - private static string FindDiffFromBaseline(string baselinePath, string outputPath) + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))] + public void DefaultColumnOuterSubset() { - var expectedLines = File.ReadAllLines(baselinePath); - var outputLines = File.ReadAllLines(outputPath); + // Arrange + List rows = new(); + + SqlMetaData[] columnMetadata = new SqlMetaData[] + { + new SqlMetaData("", SqlDbType.Int, true, false, SortOrder.Unspecified, -1), + new SqlMetaData("", SqlDbType.NVarChar, 40, false, false, SortOrder.Unspecified, -1), + new SqlMetaData("", SqlDbType.DateTime, false, false, SortOrder.Unspecified, -1), + new SqlMetaData("", SqlDbType.Int, true, false, SortOrder.Unspecified, -1), + }; + + AddRow(rows, columnMetadata, 6, "Z-value", DateTime.Parse("01/01/2000"), 1); + AddRow(rows, columnMetadata, 6, "Z-value", DateTime.Parse("01/01/2000"), 2); + AddRow(rows, columnMetadata, 6, "Y-value", DateTime.Parse("01/01/2000"), 3); + AddRow(rows, columnMetadata, 6, "Y-value", DateTime.Parse("02/01/2000"), 3); + AddRow(rows, columnMetadata, 5, "X-value", DateTime.Parse("03/01/2000"), 3); + AddRow(rows, columnMetadata, 4, "X-value", DateTime.Parse("01/01/2000"), 3); + + _param.Value = rows; + + // Act + List results = ExecuteAndGetResults(_cmd); - var comparisonSb = new StringBuilder(); + // Assert + Assert.Equal(2, results.Count); + Assert.Equal(-1, results[0].C1); + Assert.Equal("Y-value", results[0].C2); + Assert.Equal(new DateTime(2000, 1, 1), results[0].C3); + Assert.Equal(-1, results[0].C4); + Assert.Equal(-1, results[1].C1); + Assert.Equal("Z-value", results[1].C2); + Assert.Equal(new DateTime(2000, 1, 1), results[1].C3); + Assert.Equal(-1, results[1].C4); + } - var expectedLength = expectedLines.Length; - var outputLength = outputLines.Length; - var findDiffLength = Math.Min(expectedLength, outputLength); + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))] + public void DefaultColumnMiddleSubset() + { + // Arrange + List rows = new(); - for (var lineNo = 0; lineNo < findDiffLength; lineNo++) + SqlMetaData[] columnMetadata = new SqlMetaData[] { - if (!expectedLines[lineNo].Equals(outputLines[lineNo])) - { - comparisonSb.AppendFormat("** DIFF at line {0} \n", lineNo); - comparisonSb.AppendFormat("A : {0} \n", outputLines[lineNo]); - comparisonSb.AppendFormat("E : {0} \n", expectedLines[lineNo]); - } - } + new SqlMetaData("", SqlDbType.Int, false, false, SortOrder.Unspecified, -1), + new SqlMetaData("", SqlDbType.NVarChar, 40, true, false, SortOrder.Unspecified, -1), + new SqlMetaData("", SqlDbType.DateTime, true, false, SortOrder.Unspecified, -1), + new SqlMetaData("", SqlDbType.Int, false, false, SortOrder.Unspecified, -1), + }; + + AddRow(rows, columnMetadata, 6, "Z-value", DateTime.Parse("01/01/2000"), 1); + AddRow(rows, columnMetadata, 6, "Z-value", DateTime.Parse("01/01/2000"), 2); + AddRow(rows, columnMetadata, 6, "Y-value", DateTime.Parse("01/01/2000"), 3); + AddRow(rows, columnMetadata, 6, "Y-value", DateTime.Parse("02/01/2000"), 3); + AddRow(rows, columnMetadata, 5, "X-value", DateTime.Parse("03/01/2000"), 3); + AddRow(rows, columnMetadata, 4, "X-value", DateTime.Parse("01/01/2000"), 3); + + _param.Value = rows; + + // Act + List results = ExecuteAndGetResults(_cmd); + + // Assert + Assert.Equal(2, results.Count); + Assert.Equal(4, results[0].C1); + Assert.Equal("DEFUALT", results[0].C2); + Assert.Equal(new DateTime(2006, 1, 1), results[0].C3); + Assert.Equal(3, results[0].C4); + Assert.Equal(5, results[1].C1); + Assert.Equal("DEFUALT", results[1].C2); + Assert.Equal(new DateTime(2006, 1, 1), results[1].C3); + Assert.Equal(3, results[1].C4); + } + + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))] + public void DefaultColumnAll() + { + // Arrange + List rows = new(); - var startIndex = findDiffLength - 1; - if (startIndex < 0) + SqlMetaData[] columnMetadata = new SqlMetaData[] { - startIndex = 0; - } + new SqlMetaData("", SqlDbType.Int, true, false, SortOrder.Unspecified, -1), + new SqlMetaData("", SqlDbType.NVarChar, 40, true, false, SortOrder.Unspecified, -1), + new SqlMetaData("", SqlDbType.DateTime, true, false, SortOrder.Unspecified, -1), + new SqlMetaData("", SqlDbType.Int, true, false, SortOrder.Unspecified, -1), + }; + + AddRow(rows, columnMetadata, 6, "Z-value", DateTime.Parse("01/01/2000"), 1); + AddRow(rows, columnMetadata, 6, "Z-value", DateTime.Parse("01/01/2000"), 2); + AddRow(rows, columnMetadata, 6, "Y-value", DateTime.Parse("01/01/2000"), 3); + AddRow(rows, columnMetadata, 6, "Y-value", DateTime.Parse("02/01/2000"), 3); + AddRow(rows, columnMetadata, 5, "X-value", DateTime.Parse("03/01/2000"), 3); + AddRow(rows, columnMetadata, 4, "X-value", DateTime.Parse("01/01/2000"), 3); + + _param.Value = rows; + + // Act + List results = ExecuteAndGetResults(_cmd); - if (findDiffLength < expectedLength) + // Assert + Assert.Equal(2, results.Count); + Assert.Equal(-1, results[0].C1); + Assert.Equal("DEFUALT", results[0].C2); + Assert.Equal(new DateTime(2006, 1, 1), results[0].C3); + Assert.Equal(-1, results[0].C4); + Assert.Equal(-1, results[1].C1); + Assert.Equal("DEFUALT", results[1].C2); + Assert.Equal(new DateTime(2006, 1, 1), results[1].C3); + Assert.Equal(-1, results[1].C4); + } + + private static void AddRow(List rows, SqlMetaData[] metadata, params object[] values) + { + SqlDataRecord record = new(metadata); + record.SetValues(values); + rows.Add(record); + } + + private static List ExecuteAndGetResults(SqlCommand cmd) + { + List results = new(); + using SqlDataReader rdr = cmd.ExecuteReader(); + while (rdr.Read()) { - comparisonSb.AppendFormat("** MISSING \n"); - for (var lineNo = startIndex; lineNo < expectedLength; lineNo++) - { - comparisonSb.AppendFormat("{0} : {1}", lineNo, expectedLines[lineNo]); - } + results.Add(new QueryHintResult( + rdr.GetInt32(0), + rdr.GetString(1), + rdr.GetDateTime(2), + rdr.GetInt32(3))); } - if (findDiffLength < outputLength) + return results; + } + + private sealed class QueryHintResult + { + public int C1 { get; } + public string C2 { get; } + public DateTime C3 { get; } + public int C4 { get; } + + public QueryHintResult(int c1, string c2, DateTime c3, int c4) { - comparisonSb.AppendFormat("** EXTRA \n"); - for (var lineNo = startIndex; lineNo < outputLength; lineNo++) - { - comparisonSb.AppendFormat("{0} : {1}", lineNo, outputLines[lineNo]); - } + C1 = c1; + C2 = c2; + C3 = c3; + C4 = c4; } - - return comparisonSb.ToString(); } } } diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHints_DebugMode.bsl b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHints_DebugMode.bsl deleted file mode 100644 index e72190c064..0000000000 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHints_DebugMode.bsl +++ /dev/null @@ -1,30 +0,0 @@ -------- Sort order + uniqueness #1: simple ------- -------------- -0 Z-value 3/1/2000 12:00:00 AM 5 -1 X-value 1/1/2000 12:00:00 AM 7 - -------------- -------- Sort order + uniqueness #2: mixed order ------- -------------- -4 X-value 1/1/2000 12:00:00 AM 3 -5 X-value 3/1/2000 12:00:00 AM 3 - -------------- -------- default column #1: outer subset ------- -------------- --1 Y-value 1/1/2000 12:00:00 AM -1 --1 Z-value 1/1/2000 12:00:00 AM -1 - -------------- -------- default column #1: middle subset ------- -------------- -4 DEFUALT 1/1/2006 12:00:00 AM 3 -5 DEFUALT 1/1/2006 12:00:00 AM 3 - -------------- -------- default column #1: all ------- -------------- --1 DEFUALT 1/1/2006 12:00:00 AM -1 --1 DEFUALT 1/1/2006 12:00:00 AM -1 - -------------- diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHints_DebugMode_Azure.bsl b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHints_DebugMode_Azure.bsl deleted file mode 100644 index e72190c064..0000000000 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHints_DebugMode_Azure.bsl +++ /dev/null @@ -1,30 +0,0 @@ -------- Sort order + uniqueness #1: simple ------- -------------- -0 Z-value 3/1/2000 12:00:00 AM 5 -1 X-value 1/1/2000 12:00:00 AM 7 - -------------- -------- Sort order + uniqueness #2: mixed order ------- -------------- -4 X-value 1/1/2000 12:00:00 AM 3 -5 X-value 3/1/2000 12:00:00 AM 3 - -------------- -------- default column #1: outer subset ------- -------------- --1 Y-value 1/1/2000 12:00:00 AM -1 --1 Z-value 1/1/2000 12:00:00 AM -1 - -------------- -------- default column #1: middle subset ------- -------------- -4 DEFUALT 1/1/2006 12:00:00 AM 3 -5 DEFUALT 1/1/2006 12:00:00 AM 3 - -------------- -------- default column #1: all ------- -------------- --1 DEFUALT 1/1/2006 12:00:00 AM -1 --1 DEFUALT 1/1/2006 12:00:00 AM -1 - -------------- diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHints_ReleaseMode.bsl b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHints_ReleaseMode.bsl deleted file mode 100644 index e72190c064..0000000000 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHints_ReleaseMode.bsl +++ /dev/null @@ -1,30 +0,0 @@ -------- Sort order + uniqueness #1: simple ------- -------------- -0 Z-value 3/1/2000 12:00:00 AM 5 -1 X-value 1/1/2000 12:00:00 AM 7 - -------------- -------- Sort order + uniqueness #2: mixed order ------- -------------- -4 X-value 1/1/2000 12:00:00 AM 3 -5 X-value 3/1/2000 12:00:00 AM 3 - -------------- -------- default column #1: outer subset ------- -------------- --1 Y-value 1/1/2000 12:00:00 AM -1 --1 Z-value 1/1/2000 12:00:00 AM -1 - -------------- -------- default column #1: middle subset ------- -------------- -4 DEFUALT 1/1/2006 12:00:00 AM 3 -5 DEFUALT 1/1/2006 12:00:00 AM 3 - -------------- -------- default column #1: all ------- -------------- --1 DEFUALT 1/1/2006 12:00:00 AM -1 --1 DEFUALT 1/1/2006 12:00:00 AM -1 - -------------- diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHints_ReleaseMode_Azure.bsl b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHints_ReleaseMode_Azure.bsl deleted file mode 100644 index e72190c064..0000000000 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpQueryHints_ReleaseMode_Azure.bsl +++ /dev/null @@ -1,30 +0,0 @@ -------- Sort order + uniqueness #1: simple ------- -------------- -0 Z-value 3/1/2000 12:00:00 AM 5 -1 X-value 1/1/2000 12:00:00 AM 7 - -------------- -------- Sort order + uniqueness #2: mixed order ------- -------------- -4 X-value 1/1/2000 12:00:00 AM 3 -5 X-value 3/1/2000 12:00:00 AM 3 - -------------- -------- default column #1: outer subset ------- -------------- --1 Y-value 1/1/2000 12:00:00 AM -1 --1 Z-value 1/1/2000 12:00:00 AM -1 - -------------- -------- default column #1: middle subset ------- -------------- -4 DEFUALT 1/1/2006 12:00:00 AM 3 -5 DEFUALT 1/1/2006 12:00:00 AM 3 - -------------- -------- default column #1: all ------- -------------- --1 DEFUALT 1/1/2006 12:00:00 AM -1 --1 DEFUALT 1/1/2006 12:00:00 AM -1 - -------------- diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpTest.cs index 5c788be58a..5c0459b687 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpTest.cs @@ -338,244 +338,6 @@ private void TestTVPPermutations(SteStructuredTypeBoundaries bounds, bool runOnl } } - internal void QueryHintsTest() - { - using SqlConnection conn = new(_connStr); - conn.Open(); - - Guid randomizer = Guid.NewGuid(); - string typeName = string.Format("dbo.[QHint_{0}]", randomizer); - string procName = string.Format("dbo.[QHint_Proc_{0}]", randomizer); - string createTypeSql = string.Format( - "CREATE TYPE {0} AS TABLE(" - + " c1 Int DEFAULT -1," - + " c2 NVarChar(40) DEFAULT N'DEFUALT'," - + " c3 DateTime DEFAULT '1/1/2006'," - + " c4 Int DEFAULT -1)", - typeName); - string createProcSql = string.Format( - "CREATE PROC {0}(@tvp {1} READONLY) AS SELECT TOP(2) * FROM @tvp ORDER BY c1", procName, typeName); - string dropSql = string.Format("DROP PROC {0}; DROP TYPE {1}", procName, typeName); - - try - { - SqlCommand cmd = new(createTypeSql, conn); - cmd.ExecuteNonQuery(); - - cmd.CommandText = createProcSql; - cmd.ExecuteNonQuery(); - - cmd.CommandText = procName; - cmd.CommandType = CommandType.StoredProcedure; - SqlParameter param = cmd.Parameters.Add("@tvp", SqlDbType.Structured); - - SqlMetaData[] columnMetadata; - List rows = new(); - SqlDataRecord record; - - Console.WriteLine("------- Sort order + uniqueness #1: simple -------"); - columnMetadata = new SqlMetaData[] { - new SqlMetaData("", SqlDbType.Int, false, true, SortOrder.Ascending, 0), - new SqlMetaData("", SqlDbType.NVarChar, 40, false, true, SortOrder.Descending, 1), - new SqlMetaData("", SqlDbType.DateTime, false, true, SortOrder.Ascending, 2), - new SqlMetaData("", SqlDbType.Int, false, true, SortOrder.Descending, 3), - }; - - record = new SqlDataRecord(columnMetadata); - record.SetValues(0, "Z-value", DateTime.Parse("03/01/2000"), 5); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(1, "Y-value", DateTime.Parse("02/01/2000"), 6); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(1, "X-value", DateTime.Parse("01/01/2000"), 7); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(1, "X-value", DateTime.Parse("04/01/2000"), 8); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(1, "X-value", DateTime.Parse("04/01/2000"), 4); - rows.Add(record); - - param.Value = rows; - using (SqlDataReader rdr = cmd.ExecuteReader()) - { - WriteReader(rdr); - } - rows.Clear(); - - Console.WriteLine("------- Sort order + uniqueness #2: mixed order -------"); - columnMetadata = new SqlMetaData[] { - new SqlMetaData("", SqlDbType.Int, false, true, SortOrder.Descending, 3), - new SqlMetaData("", SqlDbType.NVarChar, 40, false, true, SortOrder.Descending, 0), - new SqlMetaData("", SqlDbType.DateTime, false, true, SortOrder.Ascending, 2), - new SqlMetaData("", SqlDbType.Int, false, true, SortOrder.Ascending, 1), - }; - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Z-value", DateTime.Parse("01/01/2000"), 1); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Z-value", DateTime.Parse("01/01/2000"), 2); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Y-value", DateTime.Parse("01/01/2000"), 3); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Y-value", DateTime.Parse("02/01/2000"), 3); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(5, "X-value", DateTime.Parse("03/01/2000"), 3); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(4, "X-value", DateTime.Parse("01/01/2000"), 3); - rows.Add(record); - - param.Value = rows; - using (SqlDataReader rdr = cmd.ExecuteReader()) - { - WriteReader(rdr); - } - rows.Clear(); - - Console.WriteLine("------- default column #1: outer subset -------"); - columnMetadata = new SqlMetaData[] { - new SqlMetaData("", SqlDbType.Int, true, false, SortOrder.Unspecified, -1), - new SqlMetaData("", SqlDbType.NVarChar, 40, false, false, SortOrder.Unspecified, -1), - new SqlMetaData("", SqlDbType.DateTime, false, false, SortOrder.Unspecified, -1), - new SqlMetaData("", SqlDbType.Int, true, false, SortOrder.Unspecified, -1), - }; - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Z-value", DateTime.Parse("01/01/2000"), 1); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Z-value", DateTime.Parse("01/01/2000"), 2); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Y-value", DateTime.Parse("01/01/2000"), 3); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Y-value", DateTime.Parse("02/01/2000"), 3); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(5, "X-value", DateTime.Parse("03/01/2000"), 3); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(4, "X-value", DateTime.Parse("01/01/2000"), 3); - rows.Add(record); - - param.Value = rows; - using (SqlDataReader rdr = cmd.ExecuteReader()) - { - WriteReader(rdr); - } - rows.Clear(); - - Console.WriteLine("------- default column #1: middle subset -------"); - columnMetadata = new SqlMetaData[] { - new SqlMetaData("", SqlDbType.Int, false, false, SortOrder.Unspecified, -1), - new SqlMetaData("", SqlDbType.NVarChar, 40, true, false, SortOrder.Unspecified, -1), - new SqlMetaData("", SqlDbType.DateTime, true, false, SortOrder.Unspecified, -1), - new SqlMetaData("", SqlDbType.Int, false, false, SortOrder.Unspecified, -1), - }; - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Z-value", DateTime.Parse("01/01/2000"), 1); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Z-value", DateTime.Parse("01/01/2000"), 2); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Y-value", DateTime.Parse("01/01/2000"), 3); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Y-value", DateTime.Parse("02/01/2000"), 3); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(5, "X-value", DateTime.Parse("03/01/2000"), 3); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(4, "X-value", DateTime.Parse("01/01/2000"), 3); - rows.Add(record); - - param.Value = rows; - using (SqlDataReader rdr = cmd.ExecuteReader()) - { - WriteReader(rdr); - } - rows.Clear(); - - Console.WriteLine("------- default column #1: all -------"); - columnMetadata = new SqlMetaData[] { - new SqlMetaData("", SqlDbType.Int, true, false, SortOrder.Unspecified, -1), - new SqlMetaData("", SqlDbType.NVarChar, 40, true, false, SortOrder.Unspecified, -1), - new SqlMetaData("", SqlDbType.DateTime, true, false, SortOrder.Unspecified, -1), - new SqlMetaData("", SqlDbType.Int, true, false, SortOrder.Unspecified, -1), - }; - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Z-value", DateTime.Parse("01/01/2000"), 1); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Z-value", DateTime.Parse("01/01/2000"), 2); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Y-value", DateTime.Parse("01/01/2000"), 3); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(6, "Y-value", DateTime.Parse("02/01/2000"), 3); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(5, "X-value", DateTime.Parse("03/01/2000"), 3); - rows.Add(record); - - record = new SqlDataRecord(columnMetadata); - record.SetValues(4, "X-value", DateTime.Parse("01/01/2000"), 3); - rows.Add(record); - - param.Value = rows; - using (SqlDataReader rdr = cmd.ExecuteReader()) - { - WriteReader(rdr); - } - rows.Clear(); - - } - catch (Exception e) - { - Console.WriteLine(e.Message); - } - finally - { - SqlCommand cmd = new(dropSql, conn); - cmd.ExecuteNonQuery(); - } - } - private static async Task RunPacketNumberWraparound( WraparoundRowEnumerator enumerator, CancellationToken cancellationToken)