From 94a0d060600f75e38f3ed69d1c78e464338340e1 Mon Sep 17 00:00:00 2001 From: "h.viktor" Date: Thu, 22 Jan 2026 20:48:07 +0100 Subject: [PATCH 1/5] Add implementation for request value in Postgres --- .../PostgreSqlKernel.cs | 91 ++++++++++++++++--- 1 file changed, 78 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.DotNet.Interactive.PostgreSql/PostgreSqlKernel.cs b/src/Microsoft.DotNet.Interactive.PostgreSql/PostgreSqlKernel.cs index ed23cbbbf9..5018240bf5 100644 --- a/src/Microsoft.DotNet.Interactive.PostgreSql/PostgreSqlKernel.cs +++ b/src/Microsoft.DotNet.Interactive.PostgreSql/PostgreSqlKernel.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. +using System; using System.Collections.Generic; using System.Data; using System.Data.Common; @@ -8,6 +9,9 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Html; using Microsoft.DotNet.Interactive.Commands; +using Microsoft.DotNet.Interactive.Directives; +using Microsoft.DotNet.Interactive.Events; +using Microsoft.DotNet.Interactive.Formatting; using Microsoft.DotNet.Interactive.Formatting.TabularData; using Npgsql; using Enumerable = System.Linq.Enumerable; @@ -16,10 +20,12 @@ namespace Microsoft.DotNet.Interactive.PostgreSql; public class PostgreSqlKernel : Kernel, - IKernelCommandHandler + IKernelCommandHandler, + IKernelCommandHandler { private readonly string _connectionString; private IEnumerable>> _tables; + private readonly Dictionary _resultSets = new(StringComparer.Ordinal); public PostgreSqlKernel(string name, string connectionString) : base(name) { @@ -31,6 +37,16 @@ Query a PostgreSQL database _connectionString = connectionString; } + public override KernelSpecifierDirective KernelSpecifierDirective + { + get + { + var directive = base.KernelSpecifierDirective; + directive.Parameters.Add(new("--name")); + return directive; + } + } + private DbConnection OpenConnection() { return new NpgsqlConnection(_connectionString); @@ -40,24 +56,35 @@ async Task IKernelCommandHandler.HandleAsync( SubmitCode submitCode, KernelInvocationContext context) { - await using var connection = OpenConnection(); - if (connection.State is not ConnectionState.Open) + var results = new List(); + try { - await connection.OpenAsync(); - } + await using var connection = OpenConnection(); + if (connection.State is not ConnectionState.Open) + { + await connection.OpenAsync(); + } - await using var dbCommand = connection.CreateCommand(); + await using var dbCommand = connection.CreateCommand(); - dbCommand.CommandText = submitCode.Code; + dbCommand.CommandText = submitCode.Code; - _tables = Execute(dbCommand); + _tables = Execute(dbCommand); - foreach (var table in _tables) - { - var tabularDataResource = table.ToTabularDataResource(); + foreach (var table in _tables) + { + var tabularDataResource = table.ToTabularDataResource(); - var explorer = DataExplorer.CreateDefault(tabularDataResource); - context.Display(explorer); + var explorer = DataExplorer.CreateDefault(tabularDataResource); + context.Display(explorer); + + results.Add(tabularDataResource); + } + } + finally + { + submitCode.Parameters.TryGetValue("--name", out var queryName); + StoreQueryResultSet(queryName ?? "", results); } } @@ -125,4 +152,42 @@ public static void AddPostgreSqlKernelConnectorToCurrentRoot() "text/html"); } } + + public bool TryGetValue(string name, out T value) + { + if (_resultSets.TryGetValue(name, out var resultSet) && + resultSet is T resultSetT) + { + value = resultSetT; + return true; + } + + value = default; + return false; + } + + Task IKernelCommandHandler.HandleAsync(RequestValue command, KernelInvocationContext context) + { + if (TryGetValue(command.Name, out var value)) + { + context.Publish(new ValueProduced( + value, + command.Name, + new FormattedValue( + command.MimeType, + value.ToDisplayString(command.MimeType)), + command)); + } + else + { + context.Fail(command, message: $"Value '{command.Name}' not found in kernel {Name}"); + } + + return Task.CompletedTask; + } + + protected void StoreQueryResultSet(string name, IReadOnlyCollection queryResultSet) + { + _resultSets[name] = queryResultSet; + } } From 45d6e39176a33b34d643c2d820975b2ab0fd62e5 Mon Sep 17 00:00:00 2001 From: "h.viktor" Date: Thu, 22 Jan 2026 20:52:16 +0100 Subject: [PATCH 2/5] Scaffold for tests based on Mssql tests --- .../PostgreSqlConnectionTests.cs | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) diff --git a/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs b/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs index 9925dad72f..e842e53aa3 100644 --- a/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs +++ b/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs @@ -82,6 +82,153 @@ public async Task It_returns_error_if_query_is_not_valid() .Contain("column \"not_known_column\" does not exist"); } +// public async Task When_variable_does_not_exist_then_an_error_is_returned() +// { +// var connectionString = MsSqlFactAttribute.GetConnectionStringForTests(); +// using var kernel = await CreateKernelAsync(); +// var result = await kernel.SubmitCodeAsync( +// $"#!connect mssql --kernel-name adventureworks \"{connectionString}\""); + +// result.Events +// .Should() +// .NotContainErrors(); + +// var sqlKernel = kernel.FindKernelByName("sql-adventureworks"); + +// result = await sqlKernel.SendAsync(new RequestValue("my_data_result")); + +// result.Events.Should() +// .ContainSingle() +// .Which +// .Message +// .Should() +// .Contain("Value 'my_data_result' not found in kernel sql-adventureworks"); +// } + +// [MsSqlFact] +// public async Task It_can_store_result_set_with_a_name() +// { +// var connectionString = MsSqlFactAttribute.GetConnectionStringForTests(); +// using var kernel = await CreateKernelAsync(); +// await kernel.SubmitCodeAsync( +// $"#!connect mssql --kernel-name adventureworks \"{connectionString}\""); + +// // Run query with result set +// await kernel.SubmitCodeAsync($@" +// #!sql-adventureworks --name my_data_result +// select * from sys.databases +// "); + +// // Use share to fetch result set +// var result = await kernel.SubmitCodeAsync($@" +// #!csharp +// #!share --from sql-adventureworks my_data_result +// my_data_result"); + +// // Verify the variable loaded is of the correct type and has the expected number of result sets +// result.Events +// .Should() +// .ContainSingle() +// .Which +// .Value +// .Should() +// .BeAssignableTo>() +// .Which.Count() +// .Should() +// .Be(1); +// } + +// [MsSqlFact] +// public async Task Stored_query_results_are_listed_in_ValueInfos() +// { +// var connectionString = MsSqlFactAttribute.GetConnectionStringForTests(); +// using var kernel = await CreateKernelAsync(); +// await kernel.SubmitCodeAsync( +// $"#!connect mssql --kernel-name adventureworks \"{connectionString}\""); + +// // Run query with result set +// await kernel.SubmitCodeAsync($@" +// #!sql-adventureworks --name my_data_result +// select * from sys.databases +// "); + +// var sqlKernel = kernel.FindKernelByName("sql-adventureworks"); + +// var result = await sqlKernel.SendAsync(new RequestValueInfos()); + +// var valueInfos = result.Events.Should().ContainSingle() +// .Which.ValueInfos; + +// valueInfos.Should().Contain(v => v.Name == "my_data_result"); +// } + +// [MsSqlFact] +// public async Task Storing_results_does_interfere_with_subsequent_executions() +// { +// var connectionString = MsSqlFactAttribute.GetConnectionStringForTests(); +// using var kernel = await CreateKernelAsync(); +// await kernel.SubmitCodeAsync( +// $"#!connect mssql --kernel-name adventureworks \"{connectionString}\""); + +// // Run query with result set +// await kernel.SubmitCodeAsync($@" +// #!sql-adventureworks --name my_data_result +// select * from sys.databases +// "); + +// var sqlKernel = kernel.FindKernelByName("sql-adventureworks"); + +// var result = await sqlKernel.SendAsync(new RequestValueInfos()); + +// var valueInfos = result.Events.Should().ContainSingle() +// .Which.ValueInfos; + +// valueInfos.Should().Contain(v => v.Name == "my_data_result"); + +// result = await kernel.SubmitCodeAsync($@" +// #!sql-adventureworks --name my_data_result +// select * from sys.databases +// "); + +// result.Events.Should().NotContainErrors(); +// } + +// [MsSqlFact] +// public async Task It_can_store_multiple_result_set_with_a_name() +// { +// var connectionString = MsSqlFactAttribute.GetConnectionStringForTests(); +// using var kernel = await CreateKernelAsync(); +// await kernel.SubmitCodeAsync( +// $"#!connect mssql --kernel-name adventureworks \"{connectionString}\""); + +// // Run query with result set +// await kernel.SubmitCodeAsync($@" +// #!sql-adventureworks --name my_data_result +// select * from sys.databases +// select * from sys.databases +// "); + +// // Use share to fetch result set +// var result = await kernel.SubmitCodeAsync($@" +// #!csharp +// #!share --from sql-adventureworks my_data_result +// my_data_result"); + +// // Verify the variable loaded is of the correct type and has the expected number of result sets +// result.Events +// .Should() +// .ContainSingle() +// .Which +// .Value +// .Should() +// .BeAssignableTo>() +// .Which.Count() +// .Should() +// .Be(2); +// } + + + public void Dispose() { DataExplorer.ResetToDefault(); From e3fca7da9dff55b8d04608707bcd810ce6797943 Mon Sep 17 00:00:00 2001 From: "h.viktor" Date: Fri, 23 Jan 2026 00:01:49 +0100 Subject: [PATCH 3/5] Add tests --- .../PostgreSqlConnectionTests.cs | 291 +++++++++--------- .../PostgreSqlKernel.cs | 32 +- 2 files changed, 173 insertions(+), 150 deletions(-) diff --git a/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs b/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs index e842e53aa3..1f263de233 100644 --- a/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs +++ b/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs @@ -11,8 +11,10 @@ using Microsoft.DotNet.Interactive.Events; using Microsoft.DotNet.Interactive.CSharp; using Microsoft.DotNet.Interactive.App; +using Microsoft.DotNet.Interactive.Commands; using FluentAssertions; using Xunit; +using System.Collections.Generic; namespace Microsoft.DotNet.Interactive.PostgreSql.Tests; @@ -82,155 +84,154 @@ public async Task It_returns_error_if_query_is_not_valid() .Contain("column \"not_known_column\" does not exist"); } -// public async Task When_variable_does_not_exist_then_an_error_is_returned() -// { -// var connectionString = MsSqlFactAttribute.GetConnectionStringForTests(); -// using var kernel = await CreateKernelAsync(); -// var result = await kernel.SubmitCodeAsync( -// $"#!connect mssql --kernel-name adventureworks \"{connectionString}\""); - -// result.Events -// .Should() -// .NotContainErrors(); - -// var sqlKernel = kernel.FindKernelByName("sql-adventureworks"); - -// result = await sqlKernel.SendAsync(new RequestValue("my_data_result")); - -// result.Events.Should() -// .ContainSingle() -// .Which -// .Message -// .Should() -// .Contain("Value 'my_data_result' not found in kernel sql-adventureworks"); -// } - -// [MsSqlFact] -// public async Task It_can_store_result_set_with_a_name() -// { -// var connectionString = MsSqlFactAttribute.GetConnectionStringForTests(); -// using var kernel = await CreateKernelAsync(); -// await kernel.SubmitCodeAsync( -// $"#!connect mssql --kernel-name adventureworks \"{connectionString}\""); - -// // Run query with result set -// await kernel.SubmitCodeAsync($@" -// #!sql-adventureworks --name my_data_result -// select * from sys.databases -// "); - -// // Use share to fetch result set -// var result = await kernel.SubmitCodeAsync($@" -// #!csharp -// #!share --from sql-adventureworks my_data_result -// my_data_result"); - -// // Verify the variable loaded is of the correct type and has the expected number of result sets -// result.Events -// .Should() -// .ContainSingle() -// .Which -// .Value -// .Should() -// .BeAssignableTo>() -// .Which.Count() -// .Should() -// .Be(1); -// } - -// [MsSqlFact] -// public async Task Stored_query_results_are_listed_in_ValueInfos() -// { -// var connectionString = MsSqlFactAttribute.GetConnectionStringForTests(); -// using var kernel = await CreateKernelAsync(); -// await kernel.SubmitCodeAsync( -// $"#!connect mssql --kernel-name adventureworks \"{connectionString}\""); - -// // Run query with result set -// await kernel.SubmitCodeAsync($@" -// #!sql-adventureworks --name my_data_result -// select * from sys.databases -// "); - -// var sqlKernel = kernel.FindKernelByName("sql-adventureworks"); - -// var result = await sqlKernel.SendAsync(new RequestValueInfos()); - -// var valueInfos = result.Events.Should().ContainSingle() -// .Which.ValueInfos; - -// valueInfos.Should().Contain(v => v.Name == "my_data_result"); -// } - -// [MsSqlFact] -// public async Task Storing_results_does_interfere_with_subsequent_executions() -// { -// var connectionString = MsSqlFactAttribute.GetConnectionStringForTests(); -// using var kernel = await CreateKernelAsync(); -// await kernel.SubmitCodeAsync( -// $"#!connect mssql --kernel-name adventureworks \"{connectionString}\""); - -// // Run query with result set -// await kernel.SubmitCodeAsync($@" -// #!sql-adventureworks --name my_data_result -// select * from sys.databases -// "); - -// var sqlKernel = kernel.FindKernelByName("sql-adventureworks"); - -// var result = await sqlKernel.SendAsync(new RequestValueInfos()); - -// var valueInfos = result.Events.Should().ContainSingle() -// .Which.ValueInfos; - -// valueInfos.Should().Contain(v => v.Name == "my_data_result"); - -// result = await kernel.SubmitCodeAsync($@" -// #!sql-adventureworks --name my_data_result -// select * from sys.databases -// "); - -// result.Events.Should().NotContainErrors(); -// } - -// [MsSqlFact] -// public async Task It_can_store_multiple_result_set_with_a_name() -// { -// var connectionString = MsSqlFactAttribute.GetConnectionStringForTests(); -// using var kernel = await CreateKernelAsync(); -// await kernel.SubmitCodeAsync( -// $"#!connect mssql --kernel-name adventureworks \"{connectionString}\""); - -// // Run query with result set -// await kernel.SubmitCodeAsync($@" -// #!sql-adventureworks --name my_data_result -// select * from sys.databases -// select * from sys.databases -// "); - -// // Use share to fetch result set -// var result = await kernel.SubmitCodeAsync($@" -// #!csharp -// #!share --from sql-adventureworks my_data_result -// my_data_result"); - -// // Verify the variable loaded is of the correct type and has the expected number of result sets -// result.Events -// .Should() -// .ContainSingle() -// .Which -// .Value -// .Should() -// .BeAssignableTo>() -// .Which.Count() -// .Should() -// .Be(2); -// } + [PostgreSqlFact] + public async Task When_variable_does_not_exist_then_an_error_is_returned() + { + var connectionString = PostgreSqlFactAttribute.GetConnectionStringForTests(); + using var kernel = CreateKernel(); + var result = await kernel.SubmitCodeAsync( + $"#!connect postgres --kernel-name adventureworks \"{connectionString}\""); + + result.Events + .Should() + .NotContainErrors(); + + var sqlKernel = kernel.FindKernelByName("sql-adventureworks"); + + result = await sqlKernel.SendAsync(new RequestValue("my_data_result")); + + result.Events.Should() + .ContainSingle() + .Which + .Message + .Should() + .Contain("Value 'my_data_result' not found in kernel sql-adventureworks"); + } + + [PostgreSqlFact] + public async Task It_can_store_result_set_with_a_name() + { + var connectionString = PostgreSqlFactAttribute.GetConnectionStringForTests(); + using var kernel = CreateKernel(); + await kernel.SubmitCodeAsync( + $"#!connect postgres --kernel-name adventureworks \"{connectionString}\""); + + // Run query with result set + await kernel.SubmitCodeAsync($@" +#!sql-adventureworks --name my_data_result +SELECT * FROM customers LIMIT 10; +"); + + // Use share to fetch result set + var result = await kernel.SubmitCodeAsync($@" +#!csharp +#!share --from sql-adventureworks my_data_result +my_data_result"); + + // Verify the variable loaded is of the correct type and has the expected number of result sets + result.Events + .Should() + .ContainSingle() + .Which + .Value + .Should() + .BeAssignableTo>() + .Which.Count() + .Should() + .Be(1); + } + + [PostgreSqlFact] + public async Task Stored_query_results_are_listed_in_ValueInfos() + { + var connectionString = PostgreSqlFactAttribute.GetConnectionStringForTests(); + using var kernel = CreateKernel(); + await kernel.SubmitCodeAsync( + $"#!connect postgres --kernel-name adventureworks \"{connectionString}\""); + + // Run query with result set + await kernel.SubmitCodeAsync($@" +#!sql-adventureworks --name my_data_result +SELECT * FROM customers LIMIT 10; +"); + var sqlKernel = kernel.FindKernelByName("sql-adventureworks"); + var result = await sqlKernel.SendAsync(new RequestValueInfos()); + + var valueInfos = result.Events.Should().ContainSingle() + .Which.ValueInfos; + + valueInfos.Should().Contain(v => v.Name == "my_data_result"); + } + + [PostgreSqlFact] + public async Task Storing_results_does_interfere_with_subsequent_executions() + { + var connectionString = PostgreSqlFactAttribute.GetConnectionStringForTests(); + using var kernel = CreateKernel(); + await kernel.SubmitCodeAsync( + $"#!connect postgres --kernel-name adventureworks \"{connectionString}\""); + + // Run query with result set + await kernel.SubmitCodeAsync($@" +#!sql-adventureworks --name my_data_result +SELECT * FROM customers LIMIT 10; +"); + + var sqlKernel = kernel.FindKernelByName("sql-adventureworks"); + + var result = await sqlKernel.SendAsync(new RequestValueInfos()); + + var valueInfos = result.Events.Should().ContainSingle() + .Which.ValueInfos; + + valueInfos.Should().Contain(v => v.Name == "my_data_result"); + + result = await kernel.SubmitCodeAsync($@" +#!sql-adventureworks --name my_data_result +SELECT * FROM customers LIMIT 10; +"); + + result.Events.Should().NotContainErrors(); + } + + [PostgreSqlFact] + public async Task It_can_store_multiple_result_set_with_a_name() + { + var connectionString = PostgreSqlFactAttribute.GetConnectionStringForTests(); + using var kernel = CreateKernel(); + await kernel.SubmitCodeAsync( + $"#!connect postgres --kernel-name adventureworks \"{connectionString}\""); + + // Run query with result set + await kernel.SubmitCodeAsync($@" +#!sql-adventureworks --name my_data_result +SELECT * FROM customers LIMIT 5; +SELECT * FROM customers LIMIT 5; +"); + + // Use share to fetch result set + var result = await kernel.SubmitCodeAsync($@" +#!csharp +#!share --from sql-adventureworks my_data_result +my_data_result"); + + // Verify the variable loaded is of the correct type and has the expected number of result sets + result.Events + .Should() + .ContainSingle() + .Which + .Value + .Should() + .BeAssignableTo>() + .Which.Count() + .Should() + .Be(2); + } public void Dispose() { DataExplorer.ResetToDefault(); } -} \ No newline at end of file +} diff --git a/src/Microsoft.DotNet.Interactive.PostgreSql/PostgreSqlKernel.cs b/src/Microsoft.DotNet.Interactive.PostgreSql/PostgreSqlKernel.cs index 5018240bf5..e2dfd21c23 100644 --- a/src/Microsoft.DotNet.Interactive.PostgreSql/PostgreSqlKernel.cs +++ b/src/Microsoft.DotNet.Interactive.PostgreSql/PostgreSqlKernel.cs @@ -13,6 +13,7 @@ using Microsoft.DotNet.Interactive.Events; using Microsoft.DotNet.Interactive.Formatting; using Microsoft.DotNet.Interactive.Formatting.TabularData; +using Microsoft.DotNet.Interactive.ValueSharing; using Npgsql; using Enumerable = System.Linq.Enumerable; @@ -21,7 +22,8 @@ namespace Microsoft.DotNet.Interactive.PostgreSql; public class PostgreSqlKernel : Kernel, IKernelCommandHandler, - IKernelCommandHandler + IKernelCommandHandler, + IKernelCommandHandler { private readonly string _connectionString; private IEnumerable>> _tables; @@ -84,7 +86,8 @@ async Task IKernelCommandHandler.HandleAsync( finally { submitCode.Parameters.TryGetValue("--name", out var queryName); - StoreQueryResultSet(queryName ?? "", results); + string name = queryName ?? ""; + _resultSets[name] = results; } } @@ -153,7 +156,7 @@ public static void AddPostgreSqlKernelConnectorToCurrentRoot() } } - public bool TryGetValue(string name, out T value) + private bool TryGetValue(string name, out T value) { if (_resultSets.TryGetValue(name, out var resultSet) && resultSet is T resultSetT) @@ -186,8 +189,27 @@ Task IKernelCommandHandler.HandleAsync(RequestValue command, Kerne return Task.CompletedTask; } - protected void StoreQueryResultSet(string name, IReadOnlyCollection queryResultSet) + Task IKernelCommandHandler.HandleAsync(RequestValueInfos command, KernelInvocationContext context) { - _resultSets[name] = queryResultSet; + var valueInfos = CreateKernelValueInfos(_resultSets, command.MimeType).ToArray(); + + context.Publish(new ValueInfosProduced(valueInfos, command)); + + return Task.CompletedTask; + + static IEnumerable CreateKernelValueInfos(IReadOnlyDictionary source, string mimeType) + { + return source.Keys.Select(key => + { + var formattedValues = FormattedValue.CreateSingleFromObject( + source[key], + mimeType); + + return new KernelValueInfo( + key, + formattedValues, + type: typeof(IEnumerable)); + }); + } } } From 1cb32ece645368ddb2140f2c26cc661c88005a8d Mon Sep 17 00:00:00 2001 From: "h.viktor" Date: Fri, 23 Jan 2026 00:30:57 +0100 Subject: [PATCH 4/5] Remove unnecessary comments --- .../PostgreSqlConnectionTests.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs b/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs index 1f263de233..4ac9d2b8cb 100644 --- a/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs +++ b/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs @@ -116,19 +116,16 @@ public async Task It_can_store_result_set_with_a_name() await kernel.SubmitCodeAsync( $"#!connect postgres --kernel-name adventureworks \"{connectionString}\""); - // Run query with result set await kernel.SubmitCodeAsync($@" #!sql-adventureworks --name my_data_result SELECT * FROM customers LIMIT 10; "); - // Use share to fetch result set var result = await kernel.SubmitCodeAsync($@" #!csharp #!share --from sql-adventureworks my_data_result my_data_result"); - // Verify the variable loaded is of the correct type and has the expected number of result sets result.Events .Should() .ContainSingle() @@ -149,7 +146,6 @@ public async Task Stored_query_results_are_listed_in_ValueInfos() await kernel.SubmitCodeAsync( $"#!connect postgres --kernel-name adventureworks \"{connectionString}\""); - // Run query with result set await kernel.SubmitCodeAsync($@" #!sql-adventureworks --name my_data_result SELECT * FROM customers LIMIT 10; @@ -173,7 +169,6 @@ public async Task Storing_results_does_interfere_with_subsequent_executions() await kernel.SubmitCodeAsync( $"#!connect postgres --kernel-name adventureworks \"{connectionString}\""); - // Run query with result set await kernel.SubmitCodeAsync($@" #!sql-adventureworks --name my_data_result SELECT * FROM customers LIMIT 10; @@ -204,20 +199,17 @@ public async Task It_can_store_multiple_result_set_with_a_name() await kernel.SubmitCodeAsync( $"#!connect postgres --kernel-name adventureworks \"{connectionString}\""); - // Run query with result set await kernel.SubmitCodeAsync($@" #!sql-adventureworks --name my_data_result SELECT * FROM customers LIMIT 5; SELECT * FROM customers LIMIT 5; "); - // Use share to fetch result set var result = await kernel.SubmitCodeAsync($@" #!csharp #!share --from sql-adventureworks my_data_result my_data_result"); - // Verify the variable loaded is of the correct type and has the expected number of result sets result.Events .Should() .ContainSingle() From 5f5e710de48b1d233a8077625f1edd91d61bafec Mon Sep 17 00:00:00 2001 From: "h.viktor" Date: Fri, 23 Jan 2026 00:37:08 +0100 Subject: [PATCH 5/5] Fix formatting --- .../PostgreSqlConnectionTests.cs | 60 ++++++++++--------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs b/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs index 4ac9d2b8cb..bc99dc85b0 100644 --- a/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs +++ b/src/Microsoft.DotNet.Interactive.PostgreSql.Tests/PostgreSqlConnectionTests.cs @@ -116,15 +116,16 @@ public async Task It_can_store_result_set_with_a_name() await kernel.SubmitCodeAsync( $"#!connect postgres --kernel-name adventureworks \"{connectionString}\""); - await kernel.SubmitCodeAsync($@" -#!sql-adventureworks --name my_data_result -SELECT * FROM customers LIMIT 10; -"); + await kernel.SubmitCodeAsync(""" + #!sql-adventureworks --name my_data_result + SELECT * FROM customers LIMIT 10; + """); - var result = await kernel.SubmitCodeAsync($@" -#!csharp -#!share --from sql-adventureworks my_data_result -my_data_result"); + var result = await kernel.SubmitCodeAsync(""" + #!csharp + #!share --from sql-adventureworks my_data_result + my_data_result + """); result.Events .Should() @@ -146,10 +147,10 @@ public async Task Stored_query_results_are_listed_in_ValueInfos() await kernel.SubmitCodeAsync( $"#!connect postgres --kernel-name adventureworks \"{connectionString}\""); - await kernel.SubmitCodeAsync($@" -#!sql-adventureworks --name my_data_result -SELECT * FROM customers LIMIT 10; -"); + await kernel.SubmitCodeAsync(""" + #!sql-adventureworks --name my_data_result + SELECT * FROM customers LIMIT 10; + """); var sqlKernel = kernel.FindKernelByName("sql-adventureworks"); @@ -169,10 +170,10 @@ public async Task Storing_results_does_interfere_with_subsequent_executions() await kernel.SubmitCodeAsync( $"#!connect postgres --kernel-name adventureworks \"{connectionString}\""); - await kernel.SubmitCodeAsync($@" -#!sql-adventureworks --name my_data_result -SELECT * FROM customers LIMIT 10; -"); + await kernel.SubmitCodeAsync(""" + #!sql-adventureworks --name my_data_result + SELECT * FROM customers LIMIT 10; + """); var sqlKernel = kernel.FindKernelByName("sql-adventureworks"); @@ -183,10 +184,10 @@ await kernel.SubmitCodeAsync($@" valueInfos.Should().Contain(v => v.Name == "my_data_result"); - result = await kernel.SubmitCodeAsync($@" -#!sql-adventureworks --name my_data_result -SELECT * FROM customers LIMIT 10; -"); + result = await kernel.SubmitCodeAsync(""" + #!sql-adventureworks --name my_data_result + SELECT * FROM customers LIMIT 10; + """); result.Events.Should().NotContainErrors(); } @@ -199,16 +200,17 @@ public async Task It_can_store_multiple_result_set_with_a_name() await kernel.SubmitCodeAsync( $"#!connect postgres --kernel-name adventureworks \"{connectionString}\""); - await kernel.SubmitCodeAsync($@" -#!sql-adventureworks --name my_data_result -SELECT * FROM customers LIMIT 5; -SELECT * FROM customers LIMIT 5; -"); + await kernel.SubmitCodeAsync(""" + #!sql-adventureworks --name my_data_result + SELECT * FROM customers LIMIT 5; + SELECT * FROM customers LIMIT 5; + """); - var result = await kernel.SubmitCodeAsync($@" -#!csharp -#!share --from sql-adventureworks my_data_result -my_data_result"); + var result = await kernel.SubmitCodeAsync(""" + #!csharp + #!share --from sql-adventureworks my_data_result + my_data_result + """); result.Events .Should()