Skip to content

Cleanup | Consolidate connection capability metadata#3862

Merged
paulmedynski merged 39 commits into
dotnet:mainfrom
edwardneal:cleanup/unified-connection-capabilities
Jul 13, 2026
Merged

Cleanup | Consolidate connection capability metadata#3862
paulmedynski merged 39 commits into
dotnet:mainfrom
edwardneal:cleanup/unified-connection-capabilities

Conversation

@edwardneal

@edwardneal edwardneal commented Dec 28, 2025

Copy link
Copy Markdown
Contributor

Description

This PR emerges in part from discussion with @paulmedynski on #3858. We noticed that the json datatype wouldn't appear when running SqlConnection.GetSchema("DataTypes") against an Azure SQL instance. This is because of an underlying design choice in SqlMetaDataFactory: it only uses the SQL Server version number to control whether specific queries are used and specific records are returned. This isn't compatible with Azure SQL (which always returns a version of 12.x.) To fix this, we need SqlMetaDataFactory to be able to make decisions based upon the server capabilities, whether determined by the version, the presence of a FEATUREEXTACK token, or the contents of one of those tokens' values.

In this PR, we introduce a new type, ConnectionCapabilities. This class takes on the responsibility of hosting the various feature flags as an object which SqlConnectionInternal, SqlMetaDataFactory and TdsParser can interrogate to check for feature availability. For good measure, I then plumb this object through to SqlMetaDataFactory. A subsequent PR can work out the best way to implement filtering.

Other points of errata:

  • Moving the LOGINACK capability/version interrogation into the new type means that we no longer need to keep the original SqlLoginAck instance as a field on SqlConnectionInternal, which means that it never leaves the scope it was created in. I've turned it into a readonly ref struct.
  • 229a04d enables SqlClient to build under the Release configuration. This was necessary to get the benchmarking to work.
  • Benchmarking confirms that the CPU time, number of Gen0 GCs and memory usage remains identical (or very slightly better - slightly fewer Gen0 collections) between this branch and main.

This is a comparatively large PR, so I've tried to make it practical to move commit-by-commit.

Issues

Builds on a conversation in #3858.
Prerequisite to #3833.

Testing

This is covered by existing tests.

This class parses FEATUREEXTACK and LOGINACK streams, updating an object which specifies the capabilities of a connection.
This also means that we no longer need to hold the original SqlLoginAck record in memory.
This is adjacent cleanup which is best kept separate from the next step.
This includes the now-redundant checking (and associated exception) of the TDS version, and the assignment to _is20XX.
Remove the now-redundant _is20XX fields.
We only ever use two of these versions, and they're based on TDS versions rather than SQL Server versions.
Convert the Major/Minor/Increment bit-shifting to a constant value for clarity, and associate it with ConnectionCapabilities to eliminate duplication.
Also add explanatory comment to describe reason for big-endian vs. little-endian reads.
Move UTF8 feature detection handling to ConnectionCapabilities.
This was always equal to !Capability.DnsCaching.
This enables the if condition from OnFeatureExtAck to continue to apply to capability processing.

Also remove now-redundant comments, and clean up one reference to IsSQLDNSCachingSupported.
This is never persisted, and eliminates an allocation
One missing validation path.

Also switched conditions to use pattern matching and to better align with original method for easier comparison and better codegen.
@edwardneal
edwardneal requested a review from a team as a code owner December 28, 2025 23:23
@github-project-automation github-project-automation Bot moved this to To triage in SqlClient Board Dec 28, 2025
@cheenamalhotra cheenamalhotra moved this from To triage to In review in SqlClient Board Jan 5, 2026
@cheenamalhotra cheenamalhotra added the Code Health 💊 Issues/PRs that are targeted to source code quality improvements. label Jan 13, 2026
@github-actions

Copy link
Copy Markdown

This pull request has been marked as stale due to inactivity for more than 30 days.

If you would like to keep this pull request open, please provide an update or respond to any comments. Otherwise, it will be closed automatically in 7 days.

@github-actions github-actions Bot added the Stale The Issue or PR has become stale and will be automatically closed shortly if no activity occurs. label Feb 12, 2026
mdaigle
mdaigle previously approved these changes Jun 3, 2026
@mdaigle mdaigle removed the Author attention needed PRs that require author to respond or make updates to PR. label Jun 3, 2026
@mdaigle

mdaigle commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

/azp run

@azure-pipelines

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

@mdaigle

mdaigle commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

/azp run

@mdaigle
mdaigle requested a review from paulmedynski June 24, 2026 18:05
@azure-pipelines

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

@paulmedynski paulmedynski 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.

Great changes overall and a good step towards encapsulating concerns in this old spaghetti code! A few questions/comments for your consideration.

@github-project-automation github-project-automation Bot moved this from In progress to Waiting for customer in SqlClient Board Jun 26, 2026
@paulmedynski paulmedynski moved this from Waiting for customer to In review in SqlClient Board Jun 30, 2026
Name is misleading, and this corrects the semantics of Is2012OrNewer
@mdaigle

mdaigle commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

/azp run

@azure-pipelines

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

@paulmedynski
paulmedynski enabled auto-merge (squash) July 13, 2026 18:21
@paulmedynski
paulmedynski requested a review from mdaigle July 13, 2026 18:21
@paulmedynski
paulmedynski merged commit ca469d5 into dotnet:main Jul 13, 2026
354 checks passed
@github-project-automation github-project-automation Bot moved this from In review to Done in SqlClient Board Jul 13, 2026
@edwardneal
edwardneal deleted the cleanup/unified-connection-capabilities branch July 13, 2026 22:27
cheenamalhotra pushed a commit that referenced this pull request Jul 14, 2026
Co-authored-by: Malcolm Daigle <mdaigle@microsoft.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Code Health 💊 Issues/PRs that are targeted to source code quality improvements.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

6 participants