Skip to content

Tests | Refactor NativeVectorFloat32Tests for future Half support#4347

Open
edwardneal wants to merge 27 commits into
dotnet:mainfrom
edwardneal:tests/generic-vector-testbase
Open

Tests | Refactor NativeVectorFloat32Tests for future Half support#4347
edwardneal wants to merge 27 commits into
dotnet:mainfrom
edwardneal:tests/generic-vector-testbase

Conversation

@edwardneal

Copy link
Copy Markdown
Contributor

Description

This is somewhat inspired by #4234. We don't yet have support for SqlVector<Half> and other types, but this should hopefully make the test logic trivial to add.

I'd recommend moving commit by commit - the introduction of a base class has resulted in the PR looking much larger than it truly is.

The overall design is now more generic. We have:

  • NativeVectorTestDataBase<TElement>, which contains test data for SqlVector<TElement>
  • NativeVectorTestsBase<TElement, TTestData>, which contains the test logic and links it to the test data
  • VectorFloat32TestData: derived from NativeVectorTestDataBase which contains float-based sample data
  • NativeVectorFloat32Tests: the same tests and the same logic as in main, but derived from NativeVectorTestsBase

Adding future support for Half should mean simply introducing VectorFloat16TestData and NativeVectorFloat16Tests classes:

public sealed class VectorFloat16TestData : NativeVectorTestDataBase<Half>
{
    public override Half[] SampleScalarData => [1, 2, 3, 4, 5, 6];

    public override Half[,] SampleDataSet => /* */;

    public override int IncorrectScalarDataParameterSize => 9999;

    public override bool IsSupported => DataTestUtility.IsSqlVectorFloat16Supported;

    public override string SqlServerTypeName => "float16";
}

public sealed class NativeVectorFloat16Tests : NativeVectorTestsBase<Half, VectorFloat16TestData>
{
}

I've also made a handful of hygiene improvements, but none are particularly controversial:

  • Use of RAII primitives
  • Text corrections in comments
  • Assertion cleanups (catching an exception and running Assert.Fail, performing Assert.True(!verifyReader.IsDBNull(0), ...), etc.)
  • Nullability annotations

Issues

In lieu of any more specific issue for Half/float16 support for SqlVector, this contributes to #3444.

Testing

All automated tests continue to pass.

@edwardneal edwardneal requested a review from a team as a code owner June 7, 2026 16:15
@github-project-automation github-project-automation Bot moved this to To triage in SqlClient Board Jun 7, 2026
@apoorvdeshmukh apoorvdeshmukh self-assigned this Jun 8, 2026
@apoorvdeshmukh apoorvdeshmukh requested a review from Copilot June 26, 2026 09:43
@apoorvdeshmukh

Copy link
Copy Markdown
Contributor

/azp run

@apoorvdeshmukh apoorvdeshmukh moved this from To triage to In review in SqlClient Board Jun 26, 2026
@apoorvdeshmukh apoorvdeshmukh added this to the 7.1.0-preview2 milestone Jun 26, 2026
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors the native SqlVector<T> manual test suite to use a generic test-data + shared test-logic base, so adding future element types (e.g., Half) becomes mostly a matter of adding a new *TestData + thin derived test class.

Changes:

  • Adds NativeVectorTestDataBase<TElement> to centralize per-element sample data and parameter-pattern cases.
  • Adds NativeVectorTestsBase<TElement, TTestData> to host the shared insertion/read, stored-proc, bulk-copy, and prepare/execute test logic using RAII DB objects.
  • Refactors the float32 suite into VectorFloat32TestData + NativeVectorFloat32Tests : NativeVectorTestsBase<...>.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.

File Description
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/VectorTest/NativeVectorTestsBase.cs New generic base classes for vector manual tests + shared test logic and RAII-managed DB objects.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/VectorTest/NativeVectorFloat32Tests.cs Refactors float32 tests into new test-data class + thin derived test class using the new base.

Comment on lines +108 to +120
int vectorDimensions = TestDataInstance.ValidSampleScalarDataLength;
string tableDefinition = $@"(Id INT PRIMARY KEY IDENTITY, {VectorColumnName} vector({vectorDimensions}, {TestDataInstance.SqlServerTypeName}) NULL)";

_connectionString = DataTestUtility.TCPConnectionString;
_managementConnection = new SqlConnection(_connectionString);
_vectorTable = new Table(_managementConnection, "VectorTestTable", tableDefinition);
_bulkCopySourceTable = new Table(_managementConnection, "VectorBulkCopyTestTable", tableDefinition);
_vectorProcedure = new StoredProcedure(_managementConnection,
prefix: "VectorsAsVarcharSp",
definition: $@"
{VectorParameterName} vector({vectorDimensions}, {TestDataInstance.SqlServerTypeName}), -- Input: Serialized TElement[] as JSON string
{VectorOutputParameterName} vector({vectorDimensions}, {TestDataInstance.SqlServerTypeName}) OUTPUT -- Output: Echoed back from latest inserted row
AS
Comment on lines +37 to +40
public override bool IsSupported => DataTestUtility.IsSqlVectorSupported;

// Verify GetFieldValue<SqlVector<float>> returns the correct typed value
SqlVector<float> typedValue = reader.GetFieldValue<SqlVector<float>>(0);
Assert.IsType<SqlVector<float>>(typedValue);
Assert.Equal(VectorFloat32TestData.testData, typedValue.Memory.ToArray());
}
public override string SqlServerTypeName => "float32";
}
Comment on lines +463 to +468
case 1:
bulkCopy.WriteToServer(reader);
break;
case 2:
bulkCopy.WriteToServer(table);
break;
Comment on lines +556 to +561
case 1:
await bulkCopy.WriteToServerAsync(reader);
break;
case 2:
await bulkCopy.WriteToServerAsync(table);
break;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In review

Development

Successfully merging this pull request may close these issues.

3 participants