Skip to content

Update pipelines for the 7.1 staging branch - #4689

Closed
paulmedynski wants to merge 28 commits into
release/7.1-stagingfrom
dev/paul/release/7.1-staging/pipelines
Closed

paulmedynski wants to merge 28 commits into
release/7.1-stagingfrom
dev/paul/release/7.1-staging/pipelines

Conversation

@paulmedynski

Copy link
Copy Markdown
Contributor

Description

Update Azure DevOps pipeline branch specifications for the 7.1 staging branch:

  • Restrict PR, CI, schedule, and pipeline-completion triggers to release/7.1-staging and internal/release/7.1-staging.
  • Disable the legacy package-reference PR and GitHub CI triggers due to limited resources, matching Disable legacy package-reference pipelines on main #4647; their branch entries remain commented for easy re-enablement, while scheduled and ADO internal CI runs remain active.
  • Stagger 7.1 schedules between 09:00 and 23:00 UTC to avoid trigger-time overlap with main and existing release branches.
  • Update GitHub Sync source and target defaults and sanitize / as - in its generated sync branch name.
  • Refresh nearby pipeline guidance and comments for the 7.1 schedule and trigger configuration.

There are no public API or product behavior changes.

Testing

I will be manually running the affected pipelines in the Public and ADO.Net projects, and confirming their calculated triggers. I will list successful runs here as they complete.

cheenamalhotra and others added 28 commits September 4, 2026 12:21
Co-authored-by: SqlClient DevOps <sqlclient@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Replace inaccessible wording in an internal comment and exclude the Northwind SqlDataAdapter snippet where Country is a required schema identifier.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add multilingual Unicode and UTF-8 coverage for parameters, readers, streaming, and bulk copy across sync and async paths.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* Pipelines | Use per-package APIScan name/version pairs

Each of our NuGet packages is now registered with APIScan under its own
name/version pair, so stop attributing every scan to a single global
Microsoft.Data.SqlClient / 6.10 registration.

- Reinstate the per-job ob_sdl_apiscan_softwareName and
  ob_sdl_apiscan_versionNumber variables in build-buildproj-job, driven by
  packageFullName and a new apiScanSoftwareVersion parameter.
- Remove softwareName/versionNumber from the globalSdl.apiscan blocks so the
  build job template is the single place the pair is specified.
- Replace ApiScanSoftwareVersion with ApiScanVersionSqlClient (7.1, this
  branch targets the 7.1.0 release) and ApiScanVersionSqlServer (1.0).
- Disable APIScan on validate-signed-package-job, which produces no
  assemblies and previously relied on the global registration.
- Update the SDL section of the OneBranch pipeline design instructions.

* Derive APIScan versions from package versions

* Log APIScan versions during version computation
…llers (#4547)

* Scope configurable retry logic assembly resolution

SqlConfigurableRetryLogicLoader subscribed a handler to
AssemblyLoadContext.Default.Resolving in its constructor and never removed
it. Because SqlConfigurableRetryLogicManager builds that loader on the
default RetryLogicProvider path, simply reading
SqlCommand.RetryLogicProvider or SqlConnection.RetryLogicProvider installed
a permanent, process-wide assembly resolution hook.

The hook then participated in resolving every assembly the host application
failed to find, even though the application had not configured any custom
retry logic type. It also probed Environment.CurrentDirectory, which is
ambient process state unrelated to where the application's binaries live,
so assemblies could be resolved from an unintended location.

Applications observed this as load failures, and in #2214 as a stack
overflow, originating inside SqlClient for assemblies unrelated to
SqlClient.

Changes:

- Probe AppContext.BaseDirectory instead of Environment.CurrentDirectory.
- Subscribe the resolving handler only for the duration of the Type.GetType
  call in LoadType, and remove it in a finally block.
- Skip type resolution entirely when no retryLogicType is configured.
  retryLogicType is optional while retryMethod is required, so
  configurations selecting a built-in retry method previously still ran the
  custom type resolution path.

Together these mean the handler is never installed unless the application
explicitly configured a custom retry logic type, and is gone again as soon
as that type has been resolved.

Only .NET is affected; the .NET Framework code path does not use
AssemblyLoadContext.

Refs #2214, #2134

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801

* Test | Address review feedback on retry logic assembly probing tests

Replaces the internals-based assertions in the configurable retry logic
regression tests with a behavioural probe, and restores the UTF-8 BOM that
was dropped from the functional test file.

The unit test previously read AssemblyLoadContext's private _resolving
field to check whether a handler was still subscribed. That reflects into
runtime internals we do not own, so the value cannot simply be exposed
internally as review suggested. The functional test took a different but
also problematic approach, mutating Environment.CurrentDirectory, which is
process-wide state and unsafe under parallel test execution.

Both now plant a file that is not a valid assembly in the loader's probing
directory (AppContext.BaseDirectory) under a name no other component could
request, then assert that Assembly.Load reports it as not found. A
subscribed handler would locate that file and surface
BadImageFormatException instead, so the assertion discriminates cleanly
while observing only public behaviour and touching no shared process state.

Verified by temporarily reintroducing the unconditional subscription: all
four unit tests and the functional test fail, and pass again once removed.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801

* Test | Cover the successful retry logic type resolution path

The existing tests only covered the code paths where the assembly probing
handler is never subscribed. The path that legitimately subscribes it, a
configured custom retry logic type that actually resolves, was untested, so
nothing verified that the handler is removed again afterwards.

Add a test that resolves a retry logic factory out of the loader's probing
directory and asserts that no probing handler remains subscribed once the
loader has been constructed. An invocation counter on the factory confirms the
configured type really was resolved and used, rather than the loader silently
falling back to the built-in factory.

Verified the test is sensitive to both behaviours it covers: pointing the
loader's probing directory elsewhere makes it fail, and restoring the
unconditional handler subscription makes it fail.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801

* Test | Widen probe file cleanup to non-IO failures

File.Delete can fail with UnauthorizedAccessException as well as IOException.
Catching only the latter meant a cleanup failure could surface as a test
failure that had nothing to do with the behaviour under test.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801

* Keep retry logic assembly probing active during provider construction

Addresses review feedback that scoping the assembly resolving handler to type
resolution alone could break existing consumers whose configured retryLogicType
has private dependencies.

The handler is now subscribed before LoadType and removed only after
CreateInstance has run the configured type's constructor and invoked its retry
method, so dependency loads triggered during construction are still resolved.

Adds Switch.Microsoft.Data.SqlClient.UseLegacyRetryLogicAssemblyResolution as an
escape hatch that restores the process-lifetime handler. The switch restores
lifetime only; the probing directory remains AppContext.BaseDirectory, so it
cannot re-enable the binary planting vector.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801

* Treat a whitespace-only retryLogicType as not configured

A whitespace value has no type to resolve, so it previously installed the
resolving handler, attempted resolution and then fell back to the built-in
factory. Skipping the subscription reaches the same provider without changing
assembly resolution behavior on the application's behalf.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801

* Remove the UseLegacyRetryLogicAssemblyResolution app context switch

The switch restored the process-lifetime assembly resolving handler for the
one case that scoping cannot cover: a custom retry logic provider whose
private dependency is first touched after the provider has been constructed.

Shipping a supported way to permanently reinstate a process-wide handler on
AssemblyLoadContext.Default works against the point of the change. The driver
should not be altering assembly resolution for the whole application on
behalf of configurable retry logic, and an affected provider has a simple fix
of its own: reference the dependency normally so it lands in deps.json, or
register a resolving handler in the application.

The handler is now always subscribed only while a configured provider is
being resolved and constructed, and only when a custom retry logic type has
been configured.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801

* Refactor retry assembly resolution subscription

Encapsulate the temporary AssemblyLoadContext resolving handler in an
IDisposable subscription so cleanup is tied to a using scope. Remove the
handler immediately when custom type resolution falls back to the built-in
factory, and add direct unit coverage for disposal.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801
* Move CI and PR pipelines to SQL Server 2025 agent images

Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:

  ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
  ADO-UB22-SQL22  -> ADO-UB24-SQL25

This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.

Two notes on the change:

  - CI test stage names derive from the image keys, so stages such as
    Win22_Sql22 are now named Win25_Sql25.  Any branch policies or
    required status checks that reference the old stage names will need
    to be updated.

  - The Linux SQL configuration previously ran on both ADO-UB20-SQL22
    and ADO-UB22-SQL22.  We only have a single Ubuntu SQL 2025 image, so
    it now runs on ADO-UB24-SQL25 alone.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Clarify why the Linux enclave stage key is left unchanged

The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Install sqlcmd on Linux agents before configuring SQL Server

The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:

  ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.

Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable.  Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.

sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Add .NET 10 test coverage to the CI-SqlClient pipeline

Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux.  Those configurations now run
net10.0 in addition to the existing target frameworks.

Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image.  The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.

Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build.  These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Move CI and PR jobs off Microsoft-hosted agents

All jobs that previously ran on the Microsoft-hosted 'Azure Pipelines'
pool now run on our 1ES pools, with the sole exception of macOS jobs,
since our 1ES pools do not offer macOS images.

  - Parameterize the pool name and image for the secrets, pack,
    verify-nuget, and code-coverage jobs in both the CI and PR
    pipelines, defaulting to the 1ES pool with a Linux image (or a
    Windows image, for verify-nuget).
  - Point the Abstractions package Linux and Windows test jobs at
    ADO-UB24-SQL25 and ADO-MMS25-SQL25.
  - Drop the redundant hosted Linux and Windows Azure package test jobs.
    The self-hosted integration jobs already cover the same runtimes,
    and additionally exercise a local SQL Server.
  - Pass explicit pool names from the stress and Kerberos pipelines,
    which reuse these templates but do not import the CI build
    variables.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Move the CI package pipeline to the SQL Server 2025 agent images

The nightly package build pipeline still offered ADO-UB24 and ADO-Win25
as its agentImage choices.  Move it onto the same images the rest of CI
now uses: ADO-UB24-SQL25 and ADO-MMS25-SQL25.

The job only runs build.proj Pack, so it does not depend on the SQL
Server instance these images carry.  Aligning them means we maintain one
set of agent images rather than two.

Note that both ADO-1ES-Pool and ADO-CI-1ES-Pool must publish these
images before this merges, since the pool is chosen based on whether the
build is internal or public.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Move the GitHub sync pipeline off the hosted ubuntu-latest agent

This was the last job outside of macOS still running on a
Microsoft-hosted agent.  Move it to ADO-UB24-SQL25 on the 1ES pool,
selecting the pool based on the project the way the stress and package
pipelines do.

The job runs a PowerShell script with pwsh, which the ADO-UB24-SQL25
image already provides -- the stress job relies on the same thing
without installing PowerShell first.

After this change, the only remaining Microsoft-hosted jobs are the
macOS ones, since our 1ES pools do not offer macOS images.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Support both 1ES and hosted pools in parameterized job templates

The pack, secrets, coverage and NuGet verification templates now take
poolName/vmImage parameters, but selected the image with a 1ES imageOverride
demand unconditionally.  That breaks if a caller (or a variable group that has
not been migrated yet) still points poolName at the hosted 'Azure Pipelines'
pool, which requires vmImage instead.

Use the same conditional pool block the test-* job templates already use, so
these templates work with either pool type.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Move CI and PR pipelines to SQL Server 2025 agent images

Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:

  ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
  ADO-UB22-SQL22  -> ADO-UB24-SQL25

This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.

Two notes on the change:

  - CI test stage names derive from the image keys, so stages such as
    Win22_Sql22 are now named Win25_Sql25.  Any branch policies or
    required status checks that reference the old stage names will need
    to be updated.

  - The Linux SQL configuration previously ran on both ADO-UB20-SQL22
    and ADO-UB22-SQL22.  We only have a single Ubuntu SQL 2025 image, so
    it now runs on ADO-UB24-SQL25 alone.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Clarify why the Linux enclave stage key is left unchanged

The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Install sqlcmd on Linux agents before configuring SQL Server

The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:

  ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.

Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable.  Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.

sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Add .NET 10 test coverage to the CI-SqlClient pipeline

Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux.  Those configurations now run
net10.0 in addition to the existing target frameworks.

Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image.  The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.

Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build.  These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Move CI and PR pipelines to SQL Server 2025 agent images

Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:

  ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
  ADO-UB22-SQL22  -> ADO-UB24-SQL25

This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.

Two notes on the change:

  - CI test stage names derive from the image keys, so stages such as
    Win22_Sql22 are now named Win25_Sql25.  Any branch policies or
    required status checks that reference the old stage names will need
    to be updated.

  - The Linux SQL configuration previously ran on both ADO-UB20-SQL22
    and ADO-UB22-SQL22.  We only have a single Ubuntu SQL 2025 image, so
    it now runs on ADO-UB24-SQL25 alone.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Clarify why the Linux enclave stage key is left unchanged

The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Install sqlcmd on Linux agents before configuring SQL Server

The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:

  ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.

Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable.  Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.

sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Add .NET 10 test coverage to the CI-SqlClient pipeline

Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux.  Those configurations now run
net10.0 in addition to the existing target frameworks.

Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image.  The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.

Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build.  These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Move agent configuration to pipeline roots

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Move CI and PR pipelines to SQL Server 2025 agent images

Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:

  ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
  ADO-UB22-SQL22  -> ADO-UB24-SQL25

This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.

Two notes on the change:

  - CI test stage names derive from the image keys, so stages such as
    Win22_Sql22 are now named Win25_Sql25.  Any branch policies or
    required status checks that reference the old stage names will need
    to be updated.

  - The Linux SQL configuration previously ran on both ADO-UB20-SQL22
    and ADO-UB22-SQL22.  We only have a single Ubuntu SQL 2025 image, so
    it now runs on ADO-UB24-SQL25 alone.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Clarify why the Linux enclave stage key is left unchanged

The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Install sqlcmd on Linux agents before configuring SQL Server

The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:

  ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.

Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable.  Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.

sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Add .NET 10 test coverage to the CI-SqlClient pipeline

Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux.  Those configurations now run
net10.0 in addition to the existing target frameworks.

Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image.  The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.

Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build.  These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Move CI and PR pipelines to SQL Server 2025 agent images

Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:

  ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
  ADO-UB22-SQL22  -> ADO-UB24-SQL25

This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.

Two notes on the change:

  - CI test stage names derive from the image keys, so stages such as
    Win22_Sql22 are now named Win25_Sql25.  Any branch policies or
    required status checks that reference the old stage names will need
    to be updated.

  - The Linux SQL configuration previously ran on both ADO-UB20-SQL22
    and ADO-UB22-SQL22.  We only have a single Ubuntu SQL 2025 image, so
    it now runs on ADO-UB24-SQL25 alone.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Clarify why the Linux enclave stage key is left unchanged

The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Install sqlcmd on Linux agents before configuring SQL Server

The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:

  ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.

Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable.  Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.

sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Add .NET 10 test coverage to the CI-SqlClient pipeline

Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux.  Those configurations now run
net10.0 in addition to the existing target frameworks.

Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image.  The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.

Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build.  These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Move CI and PR pipelines to SQL Server 2025 agent images

Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:

  ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
  ADO-UB22-SQL22  -> ADO-UB24-SQL25

This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.

Two notes on the change:

  - CI test stage names derive from the image keys, so stages such as
    Win22_Sql22 are now named Win25_Sql25.  Any branch policies or
    required status checks that reference the old stage names will need
    to be updated.

  - The Linux SQL configuration previously ran on both ADO-UB20-SQL22
    and ADO-UB22-SQL22.  We only have a single Ubuntu SQL 2025 image, so
    it now runs on ADO-UB24-SQL25 alone.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Clarify why the Linux enclave stage key is left unchanged

The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Install sqlcmd on Linux agents before configuring SQL Server

The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:

  ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.

Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable.  Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.

sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Add .NET 10 test coverage to the CI-SqlClient pipeline

Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux.  Those configurations now run
net10.0 in addition to the existing target frameworks.

Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image.  The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.

Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build.  These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Flow the CI pool name down from the pipeline root

Review feedback: the pool name was specified in two different ways, and
deep templates read it straight out of a variable group.

Every CI stage and job template now takes the pool name as a required
parameter, threaded down from 'defaultPoolName' in
dotnet-sqlclient-ci-core.yml.  That leaves exactly one reference to
$(ci_var_defaultPoolName) per CI pipeline root, mirroring how the PR
pipeline references $(PoolNameDefault) once at its root.

Both roots now document where their variable comes from and why the two
pipeline families use different variable groups.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Move CI and PR pipelines to SQL Server 2025 agent images

Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:

  ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
  ADO-UB22-SQL22  -> ADO-UB24-SQL25

This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.

Two notes on the change:

  - CI test stage names derive from the image keys, so stages such as
    Win22_Sql22 are now named Win25_Sql25.  Any branch policies or
    required status checks that reference the old stage names will need
    to be updated.

  - The Linux SQL configuration previously ran on both ADO-UB20-SQL22
    and ADO-UB22-SQL22.  We only have a single Ubuntu SQL 2025 image, so
    it now runs on ADO-UB24-SQL25 alone.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Clarify why the Linux enclave stage key is left unchanged

The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Install sqlcmd on Linux agents before configuring SQL Server

The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:

  ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.

Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable.  Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.

sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Add .NET 10 test coverage to the CI-SqlClient pipeline

Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux.  Those configurations now run
net10.0 in addition to the existing target frameworks.

Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image.  The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.

Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build.  These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Pipelines | Restore SQL Server 2022 coverage in the CI test matrix (#4587)

* Restore SQL Server 2022 coverage in the CI test matrix

Adds back windows_sql_22_x64 (ADO-MMS22-SQL22) and linux_ub22_sql_22
(ADO-UB22-SQL22) to the CI-SqlClient test configurations, so moving the
primary configurations to SQL Server 2025 does not drop SQL Server 2022
coverage entirely.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Gate SQL Server 2022 test configurations to CI pipelines only

Groups windows_sql_22_x64 and linux_ub22_sql_22 under a single
runSql22Tests conditional (mirroring the existing legacy SQL block) and
opts the PR pipelines out, so PR validation stays on SQL Server 2019,
2025 and Azure SQL.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Add .NET 10 test coverage to the CI-SqlClient pipeline

Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux.  Those configurations now run
net10.0 in addition to the existing target frameworks.

Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image.  The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.

Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build.  These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d

* Rename the Linux enclave stage key to match its Ubuntu 24 agent

The key doubles as the generated stage name, and it still said Ubuntu20 after
the agent moved to Ubuntu 24.  A comment previously justified leaving it alone
by claiming branch policies and required status checks referenced it, but that
is not the case: the ADO branch policies reference pipeline definition ids, the
GitHub 'Main' ruleset defines no required status check contexts, and no policy
or ruleset mentions the stage name.  Stage names surface only in check-run
names, so the rename is safe.

Rename it to Ubuntu24_Enclave_Sql19 and keep a one-line note that the 'Sql19'
suffix names the remote Enclave-enabled SQL Server 2019 under test rather than
the agent image.

* Select agent images from the pool name in every job template

Four job templates each decided differently whether to select an image with
'vmImage' (Microsoft-hosted) or an imageOverride demand (1ES): a hostedPool
boolean, a poolName comparison, and a startsWith(vmImage, 'macos') check.  The
stress job additionally picked its own pool name from the ADO project.

Unify all four on the poolName comparison already used by the package test
jobs, so the invariant "the hosted 'Azure Pipelines' pool is used only for
macos-latest" is visible at each call site:

  pool:
    name: ${{ parameters.poolName }}
    ${{ if eq(parameters.poolName, 'Azure Pipelines') }}:
      vmImage: ${{ parameters.vmImage }}
    ${{ else }}:
      demands:
        - imageOverride -equals ${{ parameters.vmImage }}

Drop the hostedPool parameter and its plumbing, give the stress job a poolName
parameter flowed down from its pipeline root, and hardcode 'Azure Pipelines' at
the three macOS call sites instead of routing it through an azurePoolName
parameter that no caller ever set.

Also rename the test configuration keys in the CI core pipeline to an
<os>_<sql> form, and split the combined Windows Azure SQL configuration into
separate Windows Server 2025 and Windows 11 configurations.

* Standardize the pool parameter name and clarify pool terminology

Rename the 'adoPoolName' stage parameter to 'poolName'.  The name existed to
distinguish it from a sibling 'azurePoolName' parameter, but that sibling is
gone now that the macOS jobs name the Microsoft-hosted pool directly, and three
of the five build stages that used 'adoPoolName' never had a sibling to
disambiguate from.  Every pool parameter in eng/pipelines is now 'poolName'.

Document, on each job template that selects an image, that the pool name is
compared at template-expansion time, so the Microsoft-hosted pool must be named
by the literal 'Azure Pipelines' rather than a $(...) macro.

Replace the ambiguous term 'hosted pool' with 'Microsoft-hosted Azure Pipelines
pool', since every pool is hosted somewhere, and reword the SQL Server setup
step headers from '1ES Hosted Pool' to '1ES pools'.  Refresh the stale
ADO-UB20-SQL22 example in the CI Linux setup step to ADO-UB24-SQL25.

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Add bidi text preservation coverage

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Address directionality test review

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 46c00f98-d1ca-4b28-a221-6328e7d4f1ef

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 46c00f98-d1ca-4b28-a221-6328e7d4f1ef
* Pipelines | Pre-compute all OneBranch package and file versions

Make the compute-versions stage the single source of every version the
OneBranch build jobs consume, so nothing is re-derived downstream.

- Remove the addRevision mode entirely.  Package versions now have a single
  shape driven by the pipeline build number, and the 16-bit revision wrapping,
  the four-part package base handling, and the Build.BuildId plumbing are gone.

- Move package version stamping out of PowerShell and into Versions.props.
  BuildSuffix now does what it always documented: it turns a stable base into a
  prerelease.  Any version carrying a prerelease tag, from either source, is
  stamped with the build number; released versions are left untouched.

- Publish SqlClient and SqlServer file versions from the compute-versions stage
  and pass them into the build jobs, which previously received a raw build
  number and re-derived the file version through MSBuild.  build.proj gains
  opt-in FileVersion* arguments, so PR/CI and local builds are unchanged.

- Fix SBOM metadata, which reported the pipeline run number as the version of a
  single hardcoded package name.  Each build job now supplies the name and
  computed version of the package it produces, and jobs that publish no
  packages disable SBOM generation instead.

* Add version composition target tests for PR 4652

* Fix version extraction example for PR 4652

* Validate computed file version component count for PR 4652

* Require four-part numeric file versions for PR 4652

* Disable SBOM generation in non-producing jobs for PR 4652
Co-authored-by: SqlClient DevOps <sqlclient@microsoft.com>
* Correct SqlMetaData documentation

* Correct SqlDataRecord documentation

* First round of review feedback

* Correct comments in SqlDataRecord.cs code (and identical snippet in docs.)
* Grammar fix in SqlMetaData.xml.
* Place summary/remarks/example tags in the correct order.
* Use correct syntax for a reference to IEnumerable<SqlDataRecord>.

* Second round of review feedback
…ion (#4557)

* Fix | Preserve delegated transactions when resetting a pooled connection

Fixes #4001

A connection can be tied to a transaction in one of two mutually exclusive
ways on this code path:

  - It is the *root* of a delegated transaction. The transaction has been
    delegated down to this connection, so IsTransactionRoot is true and
    EnlistedTransaction is null.
  - It merely *enlisted* in a transaction owned elsewhere, so
    EnlistedTransaction is set and IsTransactionRoot is false.

Before #3019, ResetConnection() only preserved the transaction for the
delegated-root case, which missed the enlisted case (#2970). PR #3019
replaced that check with `EnlistedTransaction is not null` rather than
adding to it, which fixed #2970 but silently dropped the delegated-root case.

The result is that a connection returned to the pool while it is still the
root of a live delegated transaction has its server-side transaction reset
out from under System.Transactions. When the TransactionScope later rolls
back, SqlDelegatedTransaction.Rollback fails and dooms the connection. With
a small pool the same doomed physical connection is handed straight back
out, producing "The requested operation cannot be completed because the
connection has been broken."

Preserve the transaction when either condition holds. This is a strict
superset of both the pre-#3019 and post-#3019 behavior, so it cannot
regress either issue.

Verified against the reporter's repro on both the WaitHandle and V2
(channel) connection pools, and against the full manual TransactionTest
suite (9/9 passing).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091

* Docs | Add root cause analysis note for #4001

Records the delegated-root vs enlisted-participant distinction that this bug
turns on, why #3019 swapped one case for the other rather than covering both,
and why the union condition cannot reintroduce #2970.

Also records the result of mutation testing the manual TransactionTest suite:
the suite passes against the pre-#3019 condition (which carries #2970) and
against the #3019 condition (which carries #4001), so it does not currently
guard this line. The 9/9 pass rate is evidence of no collateral damage, not
evidence that the fix works.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091

* Docs | Trim RCA note for #4001

Drops the alternative-approach rationale, the residual-risk discussion, and
the failed-reproduction-variants section, and renumbers the remainder.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091

* Tests | Add regression tests for delegated transaction reset (#4001)

Extract the reset-time transaction preservation predicate into an internal
testable helper, ShouldPreserveTransactionOnReset, and pin its full truth
table with unit tests.

This also restores the Is2008OrNewer guard that the original one-line fix
dropped. Preserving a delegated transaction root across a reset is only
valid on SQL Server 2008 and newer; SQL Server 2005 is still an accepted
TDS version, so the guard is load bearing.

The tests were mutation tested against three buggy variants of the
predicate -- the #3019 condition (reintroduces #4001), the pre-#3019
condition (reintroduces #2970), and the union without the 2008 guard --
and each one is caught. This follows the existing precedent of
ResolveLoginTimeout / SqlConnectionInternalTimeoutTests.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091

* Docs | Correct and expand the RCA note for #4001

Fixes two factual errors flagged in review:

- A delegated transaction root does not always have a null
  EnlistedTransaction. The property is set unconditionally on enlistment;
  null is specific to the transient half state left behind by
  DetachCurrentTransactionIfEnded.
- Is2008OrNewer is not vestigial. SQL Server 2005 is still an accepted TDS
  version, so the guard can be false.

Also documents the new regression tests, why an end-to-end reproduction was
abandoned in favour of a helper level test, and removes an inaccurate claim
that the new condition is a strict superset of the pre-#3019 one.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091

* Tests | Make the reset predicate theory genuinely exhaustive

The unpooled block enumerated only four of its eight input combinations
while the doc comment claimed exhaustive coverage. Add the missing four so
all sixteen combinations of the four booleans are pinned, and state the
count explicitly.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091

* Docs | Hyphenate server-side in reset predicate docs

Compound adjective. Comment-only change, no behavior impact.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091

* Fix | Drop unsupported server-version guard from reset predicate

The restored Is2008OrNewer guard reinstated only half of a retired safety
mechanism. Pre-#3019, IsNonPoolableTransactionRoot both suppressed the
preserve bit and routed the connection into pool stasis; being parked is
what made the plain reset harmless. #3019 removed the property, and both
pools now route on EnlistedTransaction alone, so a delegated root with a
null EnlistedTransaction returns to the general pool. Suppressing the
preserve bit without the stasis routing therefore reproduces #4001 on
SQL Server 2005 -- which is below the supported floor of 2012 anyway.

Predicate is now isPooled && (isTransactionRoot || hasEnlistedTransaction).
Tests simplified from 19 to 11; both bug mutants still fail.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091

* Tests | Remove duplicate reset predicate facts

Keep the regression context beside the corresponding exhaustive theory rows
instead of repeating those cases as separate facts.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091
* Derive APIScan versions from package versions

* Pipelines | Pre-compute all OneBranch package and file versions

Make the compute-versions stage the single source of every version the
OneBranch build jobs consume, so nothing is re-derived downstream.

- Remove the addRevision mode entirely.  Package versions now have a single
  shape driven by the pipeline build number, and the 16-bit revision wrapping,
  the four-part package base handling, and the Build.BuildId plumbing are gone.

- Move package version stamping out of PowerShell and into Versions.props.
  BuildSuffix now does what it always documented: it turns a stable base into a
  prerelease.  Any version carrying a prerelease tag, from either source, is
  stamped with the build number; released versions are left untouched.

- Publish SqlClient and SqlServer file versions from the compute-versions stage
  and pass them into the build jobs, which previously received a raw build
  number and re-derived the file version through MSBuild.  build.proj gains
  opt-in FileVersion* arguments, so PR/CI and local builds are unchanged.

- Fix SBOM metadata, which reported the pipeline run number as the version of a
  single hardcoded package name.  Each build job now supplies the name and
  computed version of the package it produces, and jobs that publish no
  packages disable SBOM generation instead.

* Pipelines | Validate every package the OneBranch build produces

Re-enable the package validation stage, which had been commented out pending the
version pre-computation that landed in the previous change, and widen it from one
package to all six.

- Add a package_validation stage that depends on all four build stages.  Every
  package is downloaded into one tree and validated together so PackageValidator
  can apply its cross-package rules: the SqlClient family must share a single
  version, and their inter-package dependency ranges must agree.  Validating one
  package at a time would silently skip all of those findings.

- Assert the versions the compute-versions stage already published, rather than
  re-deriving them.  The family version is applied as a wildcard expectation, so
  a mismatch in any one package is caught along with the case where every package
  is consistently wrong; Microsoft.SqlServer.Server overrides it by id.  When
  SqlServer is not built its expectations are omitted entirely, because the
  validator rejects an expectation whose value is empty.

- Gate on error and missing-symbols always, plus package-unsigned on official
  runs.  missing-symbols is a warning and package-unsigned is info, so neither is
  covered by the error severity and both must be named explicitly.  Non-official
  runs are deliberately unsigned, so gating them on package-unsigned would always
  fail.

- Make the release stage depend on package validation, so a package that fails
  validation is never published.

- Replace the SqlClient-only validate-signed-package-job, which checked one
  package, could not detect missing files, indexed extracted content positionally,
  and depended on a hardcoded sn.exe path.  Authenticode and NuGet signature
  verification now cover every produced package.

Step and job logic lives in scripts with Pester coverage rather than inline YAML,
matching compute-versions and publish-symbols.

* Pipelines | Disable Roslyn SDL analysis in the package validation job

1ES auto-injects the RoslynAnalyzers task into any job containing a DotNetCoreCLI build task, and drives the build itself. The validation job's only compile is PackageValidator, a build-time tool that never ships, and the injected run is launched from the host where the container's dotnet does not exist, so it failed with exit code 17 and failed the job even though package validation passed.

* Pipelines | Fail fast on validator errors and normalize FailOn tokens

Addresses review feedback on PR #4655.

The JSON-report invocation of PackageValidator ignored its exit code, so a
validator crash produced a misleading report artifact and let the gated run
obscure the real cause.  Capture and check the code before writing the
success message or reaching the gate.

FailOn arrives from the pipeline as a single comma-joined token, which
PowerShell -File argument mode does not split into an array.  Normalize the
parameter by splitting, trimming, and dropping empties, and quote the YAML
argument so the value is one token in every invocation mode.

* Pipelines | Gate package validation on dependency and strong-name findings

Addresses review feedback on PR #4655.

The error severity covers only error-severity findings, so the warning and
info categories this job exists to catch were slipping through the gate.
dependency-inconsistency is a warning, and mismatched family dependency
ranges are precisely what validating the whole drop at once is meant to
find, so gate it on every run.

delay-signed is a warning and unsigned is info.  Non-official builds have no
access to the real strong-name key and are delay-signed by design, so gate
those two on official runs only, alongside package-unsigned.

* Pipelines | Gate strong-name findings on every run, not just official

Addresses review feedback on PR #4655.

The previous split assumed non-official builds cannot strong-name sign, but
build-buildproj-step.yml downloads netfxKeypair.snk and passes SigningKeyPath
unconditionally, so every OneBranch build signs with the real key.  Run
26251.2 confirms it: 59 of 59 implementation assemblies reported Signed on a
non-official run, with no delay-signed or unsigned findings.

Gating delay-signed and unsigned only on official runs therefore left the one
signing type the pipeline always applies unvalidated on PR builds, where a
regression that drops the key would go unnoticed.  Gate both everywhere.

package-unsigned stays official-only.  NuGet package signing is an ESRP step
condition on shouldSignPackage, so non-official packages genuinely carry no
.signature.p7s.

* Pipelines | Clarify that the reporting validator run is ungated, not infallible

Addresses PR #4655 review feedback: the first PackageValidator invocation is
ungated so the JSON report survives a failing run, but it still fails the step
when the validator itself errors.
…equire it (#4626)

* Name the agent image parameter poolImage everywhere and require it

The image parameter was spelled five different ways across the pipeline
templates - vmImage, image, agentImage, imageOverride and platformImage - so a
reader had to check each template to learn what to pass.  Rename all twenty
declarations, references and call-site keys to 'poolImage', alongside the
'poolName' parameter it accompanies.

Remove the image defaults from the nineteen templates that have callers, and
pass the value explicitly at the nine call sites that had been inheriting one.
A default meant a template silently picked an agent image that its caller never
mentioned, which is easy to miss when auditing which images a pool must
provide.  Every call site now names its image.

The queue-time parameter on the CI package pipeline keeps its default, since it
has no caller to supply one, and the default lets a manual run pick a Windows
agent when that is what we want to validate.

This does not change which image any job runs on.  All 38 call sites resolve to
the same image as before, whether they previously passed a value or inherited a
default.

Note that ADO's own 'vmImage' pool keyword and the 'imageOverride' demand
capability keep their names; only our parameters are renamed.

* Fixed botched rebase conflict resolution.

* Pipelines | Finish the vmImage -> poolImage rename in kerberos and MI templates

Complete the rename started in PR #4626 so template expansion matches the
renamed declarations:

- sqlclient-ci-kerberos-job.yml: rename the vmImage parameter to poolImage
  and update the ImageOverride demand.
- sqlclient-ci-kerberos-stages.yml: rename all four call-site keys.
- sqlclient-ci-managed-instance-stages.yml: rename all four call-site keys
  to match the already-renamed poolImage parameter.

Addresses review feedback on PR #4626.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…le group (#4627)

* Read the general-purpose pool name from one shared variable group

The pool name was configured three different ways: the CI pipelines read
'ci_var_defaultPoolName' from 'ADO Build properties', the PR pipeline read
'PoolNameDefault' from 'sqlclient-testconfig-v1', and the package pipeline
hardcoded ADO-1ES-Pool or ADO-CI-1ES-Pool based on which project it ran in.
Three sources for one value, and the package pipeline's copy had to be edited
by hand whenever the pool changed.

Add a 'sqlclient_pipeline_config' variable group to both the ADO.Net and Public
projects, holding 'general_purpose_pool_name' set to that project's pool, and
read it at every pipeline root.  The name says general-purpose deliberately: we
also use special-purpose pools for Always Encrypted, ARM64, Kerberos and
Managed Instance jobs, which are still named directly and could get their own
variables later.

This also removes the project-name check that chose the package pipeline's
pool, so 'isInternalBuild' now serves only the signing key argument.

No existing variable group is modified.  'ci_var_defaultPoolName' and
'PoolNameDefault' keep their current values; they are simply no longer read.

* Rename the variable group to sqlclient-pipeline-config-v1

Match the naming convention used by the other groups in these projects, such as
sqlclient-testconfig-v1 and symbols-variables-v3: dashes rather than
underscores, and a version suffix.

The group was renamed in place in both the ADO.Net and Public projects, so its
contents and its pipeline authorization are unchanged.

* Keep the pool variable group at pipeline root scope

Addresses review feedback on PR #4627.

ci-build-nugets-job.yml imported ci-build-variables.yml at job scope, which
meant the sqlclient-pipeline-config-v1 group was loaded below the pipeline
root. The import was redundant: that job is only reachable from
dotnet-sqlclient-ci-core.yml, which already imports the same template at its
root, so localFeedPath and packagePath were already in scope. It was also the
only job template in the repo importing a shared variables file. Remove it so
ci-build-variables.yml is imported at pipeline root only.

Also reword the defaultPoolName parameter comment to "most CI jobs", since
the Always Encrypted, ARM64, and macOS jobs use special-purpose pools.
* Add localization validation to OneBranch pipelines

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Run localization validation in SqlClient build

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Allow approved localization value matches

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1

* Harden localization validation

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1

* Handle localization handback delay

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1

* Honor warning-only allowlist validation

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1

* Always enforce localization validation

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1

* Clarify localization validation docs

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1
* Release notes for v6.1.7

* Release notes for v7.0.3
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings September 15, 2026 12:15
@paulmedynski paulmedynski added this to the 7.1.0 milestone Sep 15, 2026
@paulmedynski paulmedynski added the Area\Engineering Use this for issues that are targeted for changes in the 'eng' folder or build systems. label Sep 15, 2026
@github-project-automation github-project-automation Bot moved this to To triage in SqlClient Board Sep 15, 2026
paulmedynski added a commit that referenced this pull request Sep 15, 2026
Address Copilot review feedback from #4650 (carried to #4689): pipeline
header comments, schedule/registration notes, and the ADO/OneBranch
instruction files still named the non-staging release/7.1 and
internal/release/7.1 branches even though every branch filter now targets
the -staging branches.

Also align the perf documentation with the new baselineSourceRef default:
sqlclient-perf-pr-pipeline.yml's header and eng/pipelines/perf/README.md
now state release/7.1-staging instead of main.

Comments and documentation only; no pipeline behavior changes.

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.

🟡 Changes recommended

One or more issues must be addressed before approval.

Get a fresh assessment by requesting another Copilot review.

Pull request overview

This PR retargets Azure DevOps pipelines and schedules to the 7.1 staging branches, but also includes extensive unrelated SDK, product, test, fixture, documentation, and release-note changes.

Changes:

  • Updates staging branch filters, schedules, disabled triggers, and GitHub Sync naming.
  • Aligns SDK configuration and package versions.
  • Expands test cleanup, authentication, metadata, localization, and pipeline infrastructure changes.
File summaries
File Description
tools/PackageValidator/global.json Updated as part of this pull request.
tools/PackageCompatibility/global.json Updated as part of this pull request.
TESTGUIDE.md Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/UnitTests/SimulatedServerTests/ConnectionTests.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/UnitTests/SimulatedServerTests/ConnectionFailoverTests.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/UnitTests/Fixtures/AlwaysEncrypted/NativeColumnEncryptionKeyCertificateBaselineFixture.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/UnitTests/ConnectionPool/WaitHandleDbConnectionPoolTransactionTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/UnitTests/ConnectionPool/WaitHandleDbConnectionPoolShutdownTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/UnitTests/ConnectionPool/ChannelDbConnectionPoolTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/tools/Microsoft.Data.SqlClient.TestUtilities/config.default.jsonc Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/TracingTests/MetricsTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/TracingTests/DiagnosticTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/WeakRefTestYukonSpecific/WeakRefTestYukonSpecific.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/SqlServerTypesTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/TransactionTest/TransactionTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/TransactionTest/DistributedTransactionTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCredentialTest/SqlCredentialTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpColumnBoundariesTests.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/StreamInputParameterTests.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/SqlVariantParameterTests.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/ParametersTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/DateTimeVariantTests.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/MARSSessionPoolingTest/MarsSessionPoolingTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonBulkCopyTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/ConnectivityTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionPoolTest/TransactionPoolTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionPoolTest/ConnectionPoolTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AsyncTest/AsyncTimeoutTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/SpecialCharacterNames.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/OrderHintTransaction.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/MissingTargetTable.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/Helpers.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/ErrorOnRowsMarkedAsDeleted.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/DataConversionErrorMessageTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/ColumnCollation.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/Bug903514.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/SqlSetupStrategyCspProvider.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/SQLSetupStrategyCertStoreProvider.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/SQLSetupStrategyAzureKeyVault.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/Table.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/ColumnMasterKey.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/ColumnEncryptionKey.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/ConversionTestFixture.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlDataRecordTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConfigurableRetryLogicTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/FunctionalTests/LocalizationTest.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/UserDefinedType.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/StoredProcedure.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/ServerLogin.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/NameIsVerbatim.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/ExistingObject.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/DatabaseUser.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/ColumnMasterKey.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/ColumnEncryptionKey.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/Common/Fixtures/CspCertificateFixture.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/Common/Fixtures/ColumnMasterKeyCertificateFixture.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/tests/Common/Fixtures/AzureKeyVaultKeyFixtureBase.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Resources/Strings.zh-Hant.resx Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Resources/Strings.zh-Hans.resx Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Resources/Strings.tr.resx Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Resources/Strings.ru.resx Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Resources/Strings.pt-BR.resx Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Resources/Strings.pl.resx Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Resources/Strings.ko.resx Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Resources/Strings.ja.resx Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Resources/Strings.it.resx Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Resources/Strings.fr.resx Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Resources/Strings.es.resx Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Resources/Strings.de.resx Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Resources/Strings.cs.resx Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlMetaDataFactory.DataTypes.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlMetaDataFactory.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlCommand.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient.Extensions/Azure/test/Config.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient.Extensions/Azure/test/ActiveDirectoryInteractiveTests.cs Updated as part of this pull request.
src/Microsoft.Data.SqlClient.Extensions/Azure/test/AADConnectionTest.cs Updated as part of this pull request.
release-notes/Internal/Logging/7.0/README.md Updated as part of this pull request.
release-notes/Internal/Logging/7.0/7.0.3.md Updated as part of this pull request.
release-notes/Extensions/Azure/7.0/README.md Updated as part of this pull request.
release-notes/Extensions/Azure/7.0/7.0.3.md Updated as part of this pull request.
release-notes/Extensions/Abstractions/7.0/README.md Updated as part of this pull request.
release-notes/Extensions/Abstractions/7.0/7.0.3.md Updated as part of this pull request.
release-notes/add-ons/AzureKeyVaultProvider/7.0/README.md Updated as part of this pull request.
release-notes/add-ons/AzureKeyVaultProvider/7.0/7.0.3.md Updated as part of this pull request.
release-notes/7.0/README.md Updated as part of this pull request.
release-notes/6.1/README.md Updated as part of this pull request.
README.md Updated as part of this pull request.
global.json Updated as part of this pull request.
eng/pipelines/stages/verify-nuget-packages-ci-stage.yml Updated as part of this pull request.
eng/pipelines/stages/generate-secrets-ci-stage.yml Updated as part of this pull request.
eng/pipelines/stages/compute-versions-ci-stage.yml Updated as part of this pull request.
eng/pipelines/stages/build-sqlserver-package-ci-stage.yml Updated as part of this pull request.
eng/pipelines/stages/build-sqlclient-package-ci-stage.yml Updated as part of this pull request.
eng/pipelines/stages/build-logging-package-ci-stage.yml Updated as part of this pull request.
eng/pipelines/stages/build-abstractions-package-ci-stage.yml Updated as part of this pull request.
eng/pipelines/sqlclient-pr-project-ref-pipeline.yml Updated as part of this pull request.
eng/pipelines/sqlclient-pr-package-ref-pipeline.yml Updated as part of this pull request.
eng/pipelines/scripts/tests/README.md Updated as part of this pull request.
eng/pipelines/pr/variables/pr-variables.yml Updated as part of this pull request.
eng/pipelines/pr/steps/configure-sqlserver-windows-step.yml Updated as part of this pull request.
eng/pipelines/pr/steps/configure-sqlserver-linux-step.yml Updated as part of this pull request.
eng/pipelines/pr/stages/pack-stage.yml Updated as part of this pull request.
eng/pipelines/pr/stages/generate-secrets-stage.yml Updated as part of this pull request.
eng/pipelines/pr/stages/collect-coverage-stage.yml Updated as part of this pull request.
eng/pipelines/pr/jobs/test-sqlclientmanual-job.yml Updated as part of this pull request.
eng/pipelines/pr/jobs/test-buildproj-job.yml Updated as part of this pull request.
eng/pipelines/perf/sqlclient-perf-pr-pipeline.yml Updated as part of this pull request.
eng/pipelines/onebranch/variables/package-variables.yml Updated as part of this pull request.
eng/pipelines/onebranch/variables/onebranch-variables.yml Updated as part of this pull request.
eng/pipelines/onebranch/steps/validate-localization-step.yml Updated as part of this pull request.
eng/pipelines/onebranch/steps/roslyn-analyzers-buildproj-step.yml Updated as part of this pull request.
eng/pipelines/onebranch/steps/pack-buildproj-step.yml Updated as part of this pull request.
eng/pipelines/onebranch/steps/build-buildproj-step.yml Updated as part of this pull request.
eng/pipelines/onebranch/stages/release-stages.yml Updated as part of this pull request.
eng/pipelines/onebranch/sqlclient-non-official.yml Updated as part of this pull request.
eng/pipelines/onebranch/scripts/tests/README.md Updated as part of this pull request.
eng/pipelines/onebranch/jobs/publish-symbols-job.yml Updated as part of this pull request.
eng/pipelines/onebranch/jobs/publish-nuget-package-job.yml Updated as part of this pull request.
eng/pipelines/libraries/ci-build-variables.yml Updated as part of this pull request.
eng/pipelines/jobs/test-azure-package-ci-job.yml Updated as part of this pull request.
eng/pipelines/jobs/test-abstractions-package-ci-job.yml Updated as part of this pull request.
eng/pipelines/jobs/pack-sqlserver-package-ci-job.yml Updated as part of this pull request.
eng/pipelines/jobs/pack-logging-package-ci-job.yml Updated as part of this pull request.
eng/pipelines/jobs/pack-azure-package-ci-job.yml Updated as part of this pull request.
eng/pipelines/jobs/pack-abstractions-package-ci-job.yml Updated as part of this pull request.
eng/pipelines/common/templates/steps/publish-test-results-step.yml Updated as part of this pull request.
eng/pipelines/common/templates/steps/configure-sql-server-win-step.yml Updated as part of this pull request.
eng/pipelines/common/templates/steps/configure-sql-server-linux-step.yml Updated as part of this pull request.
eng/pipelines/common/templates/stages/ci-run-tests-stage.yml Updated as part of this pull request.
eng/pipelines/common/templates/jobs/ci-run-tests-job.yml Updated as part of this pull request.
eng/pipelines/common/templates/jobs/ci-code-coverage-job.yml Updated as part of this pull request.
eng/pipelines/common/templates/jobs/ci-build-nugets-job.yml Updated as part of this pull request.
eng/pipelines/ci/stress/sqlclient-ci-stress-stage.yml Updated as part of this pull request.
eng/pipelines/ci/stress/sqlclient-ci-stress-pipeline.yml Updated as part of this pull request.
eng/pipelines/ci/managed-instance/sqlclient-ci-managed-instance-stages.yml Updated as part of this pull request.
eng/pipelines/ci/managed-instance/sqlclient-ci-managed-instance-pipeline.yml Updated as part of this pull request.
eng/pipelines/ci/managed-instance/sqlclient-ci-managed-instance-job.yml Updated as part of this pull request.
eng/pipelines/ci/kerberos/sqlclient-ci-kerberos-stages.yml Updated as part of this pull request.
eng/pipelines/ci/kerberos/sqlclient-ci-kerberos-pipeline.yml Updated as part of this pull request.
eng/pipelines/ci/kerberos/sqlclient-ci-kerberos-job.yml Updated as part of this pull request.
doc/snippets/Microsoft.Data.SqlClient/SqlParameter.xml Updated as part of this pull request.
doc/samples/SqlMetaData.cs Updated as part of this pull request.
CONTRIBUTING.md Updated as part of this pull request.
.github/workflows/verify-aw-lock.yml Updated as part of this pull request.
.github/workflows/issue-triage.md Updated as part of this pull request.
.github/prompts/triage-pipeline-failures.prompt.md Updated as part of this pull request.
.github/instructions/ado-pipelines.instructions.md Updated as part of this pull request.
.github/aw/actions-lock.json Updated as part of this pull request.
.gitattributes Updated as part of this pull request.
.config/PolicheckExclusions.xml Updated as part of this pull request.
Review details

Suppressed comments (7)

CHANGELOG.md:18

  • This pipeline-only PR directly adds stable release entries to CHANGELOG.md. Repository guidance says the changelog is generated by the release workflow and should not be edited directly; please move this release content to the appropriate release workflow/PR or split it from the staging-trigger change.
## [Stable Release 7.0.3] - 2026-09-10

### Changed

- Updated the `Microsoft.Data.SqlClient.SNI` and `Microsoft.Data.SqlClient.SNI.runtime` dependencies to 6.0.3 (was 6.0.2).
  ([#4599](https://github.com/dotnet/SqlClient/pull/4599))

### Fixed

- Fixed a `SqlBulkCopy` regression in environments where the application login cannot read `sys.all_columns`. Bulk copy now falls back to the earlier column-discovery behavior when that permission is unavailable. Support for hidden columns and SQL Graph column aliases still requires access to the metadata view.

eng/pipelines/dotnet-sqlclient-ci-package-reference-pipeline.yml:76

  • This schedule now targets release/7.1-staging, while its preceding comment still says GitHub release/7.1 daily. Update the comment to name the staging branch.
    eng/pipelines/dotnet-sqlclient-ci-package-reference-pipeline.yml:84
  • This schedule now targets internal/release/7.1-staging, while its preceding comment still says ADO internal/release/7.1 daily. Update the comment to name the staging branch.
    global.json:5
  • This changes the repository-wide required SDK from 10.0.300 to 10.0.401, and the same pin is repeated in the tool subtrees, but the PR description only calls out staging-branch trigger updates. This alters build prerequisites for every contributor and pipeline; document the SDK rationale and agent availability, or split the SDK update into a separately described change.
    src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft/Data/SqlClient/SqlMetaDataFactoryDataTypesTest.cs:20
  • This new test helper has no XML summary. The repository testing guidance requires summaries for helper methods used by tests, so document what resource it opens and why it is needed.
    src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft/Data/SqlClient/SqlMetaDataFactoryDataTypesTest.cs:28
  • This new test helper has no XML documentation. Add a summary, parameter description, and return description explaining that it constructs a factory with the requested JSON capability.
    src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft/Data/SqlClient/SqlMetaDataFactoryDataTypesTest.cs:42
  • This new test helper has no XML documentation. Add a summary, parameter description, and return description explaining that it checks whether the factory's DataTypes schema contains json.
  • Files reviewed: 260/261 changed files
  • Comments generated: 9
  • Review effort level: Lite (auto)

Note

Copilot is running an experiment and ran this review at Lite.


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +46 to +49
// Adopted only once the CREATE above has succeeded, since that statement is what brings the
// history table into existence. If it throws, the base constructor disposes this instance,
// and the null check in DropObject keeps that path safe.
HistoryTable = Table.AdoptExisting(connection, historyName);
Comment on lines +61 to +64
if (jsonTypeSupported)
{
AddLongStringOrBinaryType(SqlDbTypeExtensions.Json, literalPrefix: "'", literalSuffix: "'");
}
include:
- main
- internal/main
- release/7.1-staging
Comment on lines +63 to +66
#- release/7.1-staging

# ADO main and release branches.
- internal/main
- internal/release/*
# ADO release branch.
- internal/release/7.1-staging
# GitHub main daily.
- cron: '0 1 * * *'
displayName: Daily Run (Release Config)
# GitHub release/7.1 daily.
Comment on lines +52 to +58
default: release/7.1-staging

# The ADO target branch to create the PR against.
- name: targetBranch
displayName: ADO Target Branch
type: string
default: internal/main
default: internal/release/7.1-staging
- feat/*
- main
- release/*
- release/7.1-staging
- release/*
#
# GOTCHA: Currently disabled due to limited resources.
# release/7.1-staging
- feat/*
- main
- release/*
- release/7.1-staging
Copilot AI review requested due to automatic review settings September 15, 2026 12:30
@paulmedynski
paulmedynski force-pushed the dev/paul/release/7.1-staging/pipelines branch from e5ddc4b to 9902296 Compare September 15, 2026 12:32
@paulmedynski paulmedynski moved this from To triage to In progress in SqlClient Board Sep 15, 2026

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.

🔵 Needs a closer look

The package-reference PR trigger is not reliably disabled, cleanup can still leak resources, and the diff materially exceeds the pipeline-only scope described.

Review details

Suppressed comments (5)

Previously missed (4) — in code that hasn't changed since the last review.

eng/pipelines/sqlclient-pr-package-ref-pipeline.yml:39

  • This does not reliably disable PR validation: Azure Pipelines treats an empty branch include filter as no effective restriction, so the pipeline can still trigger for PRs to any branch. Use the documented pr: none form (and keep the intended branch as a nearby comment for re-enablement).
    src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonBulkCopyTest.cs:48
  • If dropping the source table throws, control jumps to the outer catch and the destination table is never attempted, so this new cleanup path can still leak one of the two GUID-named tables. Catch failures per table (for example, iterate the names and guard each DropTable call independently).
    src/Microsoft.Data.SqlClient/src/Resources/Strings.ja.resx:2086
  • Remove the stray ASCII space after the Japanese comma so the property list is formatted consistently.
    src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/TransactionTest/TransactionTest.cs:187
  • The newly introduced test helper is missing the required behavior-focused XML documentation. The repository testing guide requires <summary> plus applicable <param> documentation for test helpers (.github/instructions/testing.instructions.md:181-194).

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlMetaDataFactory.DataTypes.cs:64

  • The PR description states that there are no product behavior changes, but this changes the public GetSchema(DataTypes) result by conditionally removing the json row. Either split this product change from the pipeline-only PR or update the title, description, release/testing scope, and review accordingly.
  • Files reviewed: 259/260 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced (auto)

Note

Copilot is running an experiment and ran this review at Balanced.

Copilot AI review requested due to automatic review settings September 15, 2026 12:40

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.

🟡 Changes recommended

Fixture cleanup can mask constructor failures, JSON cleanup remains partial, and the stated pipeline-only scope conflicts with product behavior and branch documentation changes.

Get a fresh assessment by requesting another Copilot review.

Review details

Suppressed comments (3)

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlMetaDataFactory.DataTypes.cs:64

  • The PR description says there are no product behavior changes, but this changes the public GetSchema("DataTypes") result by omitting json unless the negotiated capability is set (and the added unit tests explicitly codify that behavior). Either move this product change to its own PR or update this PR's scope, description, and validation plan so reviewers can assess it.
    eng/pipelines/sqlclient-pr-project-ref-pipeline.yml:14
  • This comment names release/7.1, but the trigger immediately below targets release/7.1-staging. Keeping the branch name exact is important when this file is used to understand PR validation coverage.
    eng/pipelines/sqlclient-pr-package-ref-pipeline.yml:14
  • The disabled entry is release/7.1-staging, not release/7.1; the comment currently implies validation is disabled for a different branch.
  • Files reviewed: 259/260 changed files
  • Comments generated: 4
  • Review effort level: Balanced (auto)

Note

Copilot is running an experiment and ran this review at Balanced.

}
catch
{
Dispose();
Comment on lines +47 to +48
DataTestUtility.DropTable(connection, _sourceTableName);
DataTestUtility.DropTable(connection, _destinationTableName);

PR pipelines:
- Trigger on PRs to `dev/*`, `feat/*`, `main`; exclude `eng/pipelines/onebranch/*` paths
- Trigger on PRs targeting `release/7.1`; path filters vary by pipeline
CI pipelines:
- Trigger on push to `main` (GitHub) and `internal/main` (ADO) with `batch: true`
- Scheduled weekday builds (see individual pipeline files for cron times)
- Trigger on push to `release/7.1` (GitHub) and `internal/release/7.1` (ADO) with `batch: true`
@paulmedynski
paulmedynski deleted the dev/paul/release/7.1-staging/pipelines branch September 15, 2026 13:43
@github-project-automation github-project-automation Bot moved this from In progress to Done in SqlClient Board Sep 15, 2026
@paulmedynski

Copy link
Copy Markdown
Contributor Author

Moved to #4690

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Area\Engineering Use this for issues that are targeted for changes in the 'eng' folder or build systems.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

7 participants