From 3e79b94e79166a6ed0088f9720779b72f1ac5d11 Mon Sep 17 00:00:00 2001 From: Polyglot AI <293096396+polyglotAI-bot@users.noreply.github.com> Date: Thu, 15 Oct 2026 07:31:11 +0000 Subject: [PATCH 1/2] Fix ClickHouseDataSource: OpenConnectionAsync() without a token returns ClickHouseConnection ClickHouseDataSource.OpenConnectionAsync(CancellationToken) had no default value for its token. A call with no argument did not bind to it and bound to the base DbDataSource.OpenConnectionAsync(CancellationToken = default), which is typed ValueTask. The documented ADO.NET examples that then call connection.CreateCommand("...") did not compile (CS1501). Declare the token as `= default`, as IClickHouseDataSource already does, and update the PublicAPI files. Fixes: https://github.com/ClickHouse/clickhouse-cs/issues/686 Co-Authored-By: Claude Opus 5.5 --- ClickHouse.Driver.Tests/ADO/DataSourceTests.cs | 13 +++++++++++++ ClickHouse.Driver/ADO/ClickHouseDataSource.cs | 2 +- ClickHouse.Driver/PublicAPI/PublicAPI.Unshipped.txt | 2 +- .../PublicAPI/net8.0/PublicAPI.Shipped.txt | 2 +- .../686-datasource-openconnectionasync.fixes.md | 4 ++++ 5 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 changelog.d/686-datasource-openconnectionasync.fixes.md diff --git a/ClickHouse.Driver.Tests/ADO/DataSourceTests.cs b/ClickHouse.Driver.Tests/ADO/DataSourceTests.cs index 27086d992..5ba5eee0c 100644 --- a/ClickHouse.Driver.Tests/ADO/DataSourceTests.cs +++ b/ClickHouse.Driver.Tests/ADO/DataSourceTests.cs @@ -1,4 +1,6 @@ #if NET7_0_OR_GREATER +using System.Data; +using System.Threading.Tasks; using ClickHouse.Driver.ADO; using NUnit.Framework; @@ -14,5 +16,16 @@ public void CanCreateConnection() using var connection = dataSource.CreateConnection(); Assert.That(connectionString, Is.EqualTo(connection.ConnectionString)); } + + [Test] + public async Task OpenConnectionAsync_WithoutCancellationToken_ReturnsOpenClickHouseConnection() + { + using var dataSource = new ClickHouseDataSource(TestUtilities.GetTestClickHouseClientSettings()); + await using ClickHouseConnection connection = await dataSource.OpenConnectionAsync(); + Assert.That(connection.State, Is.EqualTo(ConnectionState.Open)); + + using var command = connection.CreateCommand("SELECT 1"); + Assert.That(await command.ExecuteScalarAsync(), Is.EqualTo(1)); + } } #endif diff --git a/ClickHouse.Driver/ADO/ClickHouseDataSource.cs b/ClickHouse.Driver/ADO/ClickHouseDataSource.cs index 998c1b3a9..8489cffe0 100644 --- a/ClickHouse.Driver/ADO/ClickHouseDataSource.cs +++ b/ClickHouse.Driver/ADO/ClickHouseDataSource.cs @@ -144,7 +144,7 @@ protected override DbConnection CreateDbConnection() IClickHouseConnection IClickHouseDataSource.OpenConnection() => OpenConnection(); - public new async Task OpenConnectionAsync(CancellationToken cancellationToken) + public new async Task OpenConnectionAsync(CancellationToken cancellationToken = default) { var cn = await OpenDbConnectionAsync(cancellationToken).ConfigureAwait(false); return (ClickHouseConnection)cn; diff --git a/ClickHouse.Driver/PublicAPI/PublicAPI.Unshipped.txt b/ClickHouse.Driver/PublicAPI/PublicAPI.Unshipped.txt index 156f29ee6..519045bec 100644 --- a/ClickHouse.Driver/PublicAPI/PublicAPI.Unshipped.txt +++ b/ClickHouse.Driver/PublicAPI/PublicAPI.Unshipped.txt @@ -91,7 +91,7 @@ ClickHouse.Driver.ADO.ClickHouseDataSource.CreateConnection() -> ClickHouse.Driv ClickHouse.Driver.ADO.ClickHouseDataSource.LoggerFactory.get -> Microsoft.Extensions.Logging.ILoggerFactory ClickHouse.Driver.ADO.ClickHouseDataSource.LoggerFactory.set -> void ClickHouse.Driver.ADO.ClickHouseDataSource.OpenConnection() -> ClickHouse.Driver.ADO.ClickHouseConnection -ClickHouse.Driver.ADO.ClickHouseDataSource.OpenConnectionAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +ClickHouse.Driver.ADO.ClickHouseDataSource.OpenConnectionAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task ClickHouse.Driver.ADO.ClickHouseDataSource.Settings.get -> ClickHouse.Driver.ADO.ClickHouseClientSettings ClickHouse.Driver.ADO.ClickHouseDefaults ClickHouse.Driver.ADO.Feature.Dynamic = 2048 -> ClickHouse.Driver.ADO.Feature diff --git a/ClickHouse.Driver/PublicAPI/net8.0/PublicAPI.Shipped.txt b/ClickHouse.Driver/PublicAPI/net8.0/PublicAPI.Shipped.txt index a36e88a58..dc4c5aaae 100644 --- a/ClickHouse.Driver/PublicAPI/net8.0/PublicAPI.Shipped.txt +++ b/ClickHouse.Driver/PublicAPI/net8.0/PublicAPI.Shipped.txt @@ -5,7 +5,7 @@ ClickHouse.Driver.ADO.ClickHouseDataSource.CreateConnection() -> ClickHouse.Driv ClickHouse.Driver.ADO.ClickHouseDataSource.Logger.get -> Microsoft.Extensions.Logging.ILogger ClickHouse.Driver.ADO.ClickHouseDataSource.Logger.set -> void ClickHouse.Driver.ADO.ClickHouseDataSource.OpenConnection() -> ClickHouse.Driver.ADO.ClickHouseConnection -ClickHouse.Driver.ADO.ClickHouseDataSource.OpenConnectionAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +ClickHouse.Driver.ADO.ClickHouseDataSource.OpenConnectionAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task ClickHouse.Driver.ADO.Readers.ClickHouseDataReader.GetTuple(int ordinal) -> System.Runtime.CompilerServices.ITuple ClickHouse.Driver.IClickHouseDataSource ClickHouse.Driver.IClickHouseDataSource.ConnectionString.get -> string diff --git a/changelog.d/686-datasource-openconnectionasync.fixes.md b/changelog.d/686-datasource-openconnectionasync.fixes.md new file mode 100644 index 000000000..7247112a2 --- /dev/null +++ b/changelog.d/686-datasource-openconnectionasync.fixes.md @@ -0,0 +1,4 @@ +* Fixed `ClickHouseDataSource.OpenConnectionAsync()` without a cancellation token being typed as + `DbConnection` instead of `ClickHouseConnection` + ([#686](https://github.com/ClickHouse/clickhouse-cs/issues/686)). The documented ADO.NET examples + now compile. From ac7929b85ff21440f50242324b5c57c80c80df31 Mon Sep 17 00:00:00 2001 From: Polyglot AI <293096396+polyglotAI-bot@users.noreply.github.com> Date: Thu, 15 Oct 2026 07:45:44 +0000 Subject: [PATCH 2/2] Changelog: note the OpenConnectionAsync() return-type source change A no-argument call on ClickHouseDataSource now returns Task, not ValueTask. Code that stores the call as ValueTask, or calls .AsTask()/.Preserve() on it, no longer compiles. Tell users how to keep compiling. Co-Authored-By: Claude Opus 5.5 --- changelog.d/686-datasource-openconnectionasync.fixes.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/changelog.d/686-datasource-openconnectionasync.fixes.md b/changelog.d/686-datasource-openconnectionasync.fixes.md index 7247112a2..c0e4c0a92 100644 --- a/changelog.d/686-datasource-openconnectionasync.fixes.md +++ b/changelog.d/686-datasource-openconnectionasync.fixes.md @@ -2,3 +2,6 @@ `DbConnection` instead of `ClickHouseConnection` ([#686](https://github.com/ClickHouse/clickhouse-cs/issues/686)). The documented ADO.NET examples now compile. + - The call now returns `Task` instead of `ValueTask`. Code + that stores it as a `ValueTask`, or calls `.AsTask()` or `.Preserve()` on it, no + longer compiles: await the call directly, or call it through `DbDataSource` to keep the old type.