Skip to content

Commit ed05ab2

Browse files
authored
Override GetColumnSchemaAsync (#6337)
Fixes #6017
1 parent b8b7f34 commit ed05ab2

4 files changed

Lines changed: 19 additions & 14 deletions

File tree

src/Npgsql/NpgsqlDataReader.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1771,7 +1771,7 @@ public override IEnumerator GetEnumerator()
17711771
/// </summary>
17721772
/// <returns></returns>
17731773
public ReadOnlyCollection<NpgsqlDbColumn> GetColumnSchema()
1774-
=> GetColumnSchema(async: false).GetAwaiter().GetResult();
1774+
=> GetColumnSchema<NpgsqlDbColumn>(async: false).GetAwaiter().GetResult();
17751775

17761776
ReadOnlyCollection<DbColumn> IDbColumnSchemaGenerator.GetColumnSchema()
17771777
{
@@ -1788,14 +1788,14 @@ ReadOnlyCollection<DbColumn> IDbColumnSchemaGenerator.GetColumnSchema()
17881788
/// Asynchronously returns schema information for the columns in the current resultset.
17891789
/// </summary>
17901790
/// <returns></returns>
1791-
public new Task<ReadOnlyCollection<NpgsqlDbColumn>> GetColumnSchemaAsync(CancellationToken cancellationToken = default)
1792-
=> GetColumnSchema(async: true, cancellationToken);
1791+
public override Task<ReadOnlyCollection<DbColumn>> GetColumnSchemaAsync(CancellationToken cancellationToken = default)
1792+
=> GetColumnSchema<DbColumn>(async: true, cancellationToken);
17931793

1794-
Task<ReadOnlyCollection<NpgsqlDbColumn>> GetColumnSchema(bool async, CancellationToken cancellationToken = default)
1794+
Task<ReadOnlyCollection<T>> GetColumnSchema<T>(bool async, CancellationToken cancellationToken = default) where T : DbColumn
17951795
=> RowDescription == null || ColumnCount == 0
1796-
? Task.FromResult(new List<NpgsqlDbColumn>().AsReadOnly())
1796+
? Task.FromResult(new List<T>().AsReadOnly())
17971797
: new DbColumnSchemaGenerator(_connection!, RowDescription, _behavior.HasFlag(CommandBehavior.KeyInfo))
1798-
.GetColumnSchema(async, cancellationToken);
1798+
.GetColumnSchema<T>(async, cancellationToken);
17991799

18001800
#endregion
18011801

@@ -1853,7 +1853,7 @@ Task<ReadOnlyCollection<NpgsqlDbColumn>> GetColumnSchema(bool async, Cancellatio
18531853
table.Columns.Add("ProviderSpecificDataType", typeof(Type));
18541854
table.Columns.Add("DataTypeName", typeof(string));
18551855

1856-
foreach (var column in await GetColumnSchema(async, cancellationToken).ConfigureAwait(false))
1856+
foreach (var column in await GetColumnSchema<NpgsqlDbColumn>(async, cancellationToken).ConfigureAwait(false))
18571857
{
18581858
var row = table.NewRow();
18591859

src/Npgsql/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ Npgsql.Replication.PgOutput.PgOutputStreamingMode.Parallel = 2 -> Npgsql.Replica
8787
Npgsql.SslNegotiation
8888
Npgsql.SslNegotiation.Direct = 1 -> Npgsql.SslNegotiation
8989
Npgsql.SslNegotiation.Postgres = 0 -> Npgsql.SslNegotiation
90+
override Npgsql.NpgsqlDataReader.GetColumnSchemaAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.ObjectModel.ReadOnlyCollection<System.Data.Common.DbColumn!>!>!
9091
override Npgsql.NpgsqlMultiHostDataSource.Clear() -> void
9192
Npgsql.NpgsqlDataSource.ReloadTypes() -> void
9293
Npgsql.NpgsqlDataSource.ReloadTypesAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
@@ -135,3 +136,4 @@ NpgsqlTypes.NpgsqlTid.Deconstruct(out uint blockNumber, out ushort offsetNumber)
135136
*REMOVED*Npgsql.NpgsqlConnection.BeginTextExportAsync(string! copyToCommand, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.IO.TextReader!>!
136137
*REMOVED*Npgsql.NpgsqlConnection.BeginTextImport(string! copyFromCommand) -> System.IO.TextWriter!
137138
*REMOVED*Npgsql.NpgsqlConnection.BeginTextImportAsync(string! copyFromCommand, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.IO.TextWriter!>!
139+
*REMOVED*Npgsql.NpgsqlDataReader.GetColumnSchemaAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.ObjectModel.ReadOnlyCollection<Npgsql.Schema.NpgsqlDbColumn!>!>!

src/Npgsql/Schema/DbColumnSchemaGenerator.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Collections.ObjectModel;
44
using System.Data;
5+
using System.Data.Common;
56
using System.Threading;
67
using System.Threading.Tasks;
78
using System.Transactions;
@@ -93,13 +94,13 @@ nspname NOT IN ('pg_catalog', 'information_schema') AND
9394

9495
#endregion Column queries
9596

96-
internal async Task<ReadOnlyCollection<NpgsqlDbColumn>> GetColumnSchema(bool async, CancellationToken cancellationToken = default)
97+
internal async Task<ReadOnlyCollection<T>> GetColumnSchema<T>(bool async, CancellationToken cancellationToken = default) where T : DbColumn
9798
{
9899
// This is mainly for Amazon Redshift
99100
var oldQueryMode = _connection.PostgreSqlVersion < new Version(8, 2);
100101

101102
var numFields = _rowDescription.Count;
102-
var result = new List<NpgsqlDbColumn?>(numFields);
103+
var result = new List<T?>(numFields);
103104
for (var i = 0; i < numFields; i++)
104105
result.Add(null);
105106
var populatedColumns = 0;
@@ -153,7 +154,7 @@ internal async Task<ReadOnlyCollection<NpgsqlDbColumn>> GetColumnSchema(bool asy
153154

154155
// The column's ordinal is with respect to the resultset, not its table
155156
column.ColumnOrdinal = ordinal;
156-
result[ordinal] = column;
157+
result[ordinal] = (T?)(object)column;
157158
}
158159
}
159160
}
@@ -172,14 +173,14 @@ internal async Task<ReadOnlyCollection<NpgsqlDbColumn>> GetColumnSchema(bool asy
172173
// Fill in whatever info we have from the RowDescription itself
173174
for (var i = 0; i < numFields; i++)
174175
{
175-
var column = result[i];
176+
var column = (NpgsqlDbColumn?)(object?)result[i];
176177
var field = _rowDescription[i];
177178

178179
if (column is null)
179180
{
180181
column = SetUpNonColumnField(field);
181182
column.ColumnOrdinal = i;
182-
result[i] = column;
183+
result[i] = (T?)(object)column;
183184
populatedColumns++;
184185
}
185186

test/Npgsql.Tests/ReaderNewSchemaTests.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Collections.ObjectModel;
34
using System.Data;
45
using System.Data.Common;
56
using System.Linq;
7+
using System.Threading;
68
using System.Threading.Tasks;
79
using Npgsql.PostgresTypes;
810
using NUnit.Framework;
@@ -809,6 +811,6 @@ class SomeComposite
809811
public int Foo { get; set; }
810812
}
811813

812-
async Task<ReadOnlyCollection<Schema.NpgsqlDbColumn>> GetColumnSchema(NpgsqlDataReader reader)
813-
=> IsAsync ? await reader.GetColumnSchemaAsync() : reader.GetColumnSchema();
814+
async Task<IReadOnlyList<Schema.NpgsqlDbColumn>> GetColumnSchema(NpgsqlDataReader reader)
815+
=> IsAsync ? (await reader.GetColumnSchemaAsync(CancellationToken.None)).Cast<Schema.NpgsqlDbColumn>().ToArray() : reader.GetColumnSchema();
814816
}

0 commit comments

Comments
 (0)