Skip to content

Commit bafb468

Browse files
committed
Return empty schema when there is no result set. Fixes #744
1 parent ff3da11 commit bafb468

File tree

5 files changed

+46
-14
lines changed

5 files changed

+46
-14
lines changed

src/MySqlConnector/MySql.Data.MySqlClient/MySqlDataReader.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -300,12 +300,12 @@ public override long GetChars(int ordinal, long dataOffset, char[]? buffer, int
300300

301301
public ReadOnlyCollection<DbColumn> GetColumnSchema()
302302
{
303-
var columnDefinitions = GetResultSet().ColumnDefinitions;
304-
if (columnDefinitions is null)
305-
throw new InvalidOperationException("There is no current result set.");
306-
return columnDefinitions
307-
.Select((c, n) => (DbColumn) new MySqlDbColumn(n, c, Connection!.AllowZeroDateTime, GetResultSet().ColumnTypes![n]))
308-
.ToList().AsReadOnly();
303+
var columnDefinitions = m_resultSet?.ColumnDefinitions;
304+
var hasNoSchema = columnDefinitions is null || m_resultSet!.ContainsCommandParameters;
305+
return hasNoSchema ? new List<DbColumn>().AsReadOnly() :
306+
columnDefinitions!
307+
.Select((c, n) => (DbColumn) new MySqlDbColumn(n, c, Connection!.AllowZeroDateTime, GetResultSet().ColumnTypes![n]))
308+
.ToList().AsReadOnly();
309309
}
310310

311311
public override T GetFieldValue<T>(int ordinal)
@@ -411,11 +411,11 @@ internal static async Task<MySqlDataReader> CreateAsync(CommandListPosition comm
411411
#if !NETSTANDARD1_3
412412
internal DataTable BuildSchemaTable()
413413
{
414-
var colDefinitions = GetResultSet().ColumnDefinitions;
415-
if (colDefinitions is null)
416-
throw new InvalidOperationException("There is no current result set.");
417-
DataTable schemaTable = new DataTable("SchemaTable");
418-
schemaTable.Locale = CultureInfo.InvariantCulture;
414+
var schemaTable = new DataTable("SchemaTable") { Locale = CultureInfo.InvariantCulture };
415+
416+
var colDefinitions = m_resultSet?.ColumnDefinitions;
417+
if (colDefinitions is null || m_resultSet!.ContainsCommandParameters)
418+
return schemaTable;
419419
schemaTable.MinimumCapacity = colDefinitions.Length;
420420

421421
var columnName = new DataColumn(SchemaTableColumn.ColumnName, typeof(string));

tests/Conformance.Tests/DataReaderTests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,8 @@ public DataReaderTests(SelectValueFixture fixture)
1212

1313
[Fact(Skip = "Deliberately throws InvalidCastException")]
1414
public override void GetTextReader_returns_empty_for_null_String() { }
15+
16+
[Fact(Skip = "https://github.com/mysql-net/MySqlConnector/issues/744")]
17+
public override void GetSchemaTable_throws_after_Delete() { }
1518
}
1619
}

tests/SideBySide/DataTypes.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1174,7 +1174,10 @@ public void GetSchemaTableAfterNextResult()
11741174
#if BASELINE
11751175
Assert.Null(reader.GetSchemaTable());
11761176
#else
1177-
Assert.Throws<InvalidOperationException>(() => reader.GetSchemaTable());
1177+
table = reader.GetSchemaTable();
1178+
Assert.NotNull(table);
1179+
Assert.Empty(table.Rows);
1180+
Assert.Empty(table.Columns);
11781181
#endif
11791182
}
11801183
#endif

tests/SideBySide/QueryTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,7 @@ public void GetColumnSchemaAfterNextResult()
792792
cmd.CommandText = "select 1;";
793793
using var reader = cmd.ExecuteReader();
794794
Assert.False(reader.NextResult());
795-
Assert.Throws<InvalidOperationException>(() => reader.GetColumnSchema());
795+
Assert.Empty(reader.GetColumnSchema());
796796
}
797797
#endif
798798

tests/SideBySide/StoredProcedureTests.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,33 @@ public async Task GetSchemaTableForNoResultSet()
172172
using (var reader = await cmd.ExecuteReaderAsync())
173173
{
174174
Assert.False(await reader.ReadAsync());
175-
Assert.Throws<InvalidOperationException>(() => reader.GetSchemaTable());
175+
var table = reader.GetSchemaTable();
176+
Assert.NotNull(table);
177+
Assert.Empty(table.Rows);
178+
Assert.Empty(table.Columns);
179+
Assert.False(await reader.NextResultAsync());
180+
}
181+
}
182+
#endif
183+
184+
#if !BASELINE
185+
[Fact]
186+
public async Task GetColumnSchemaForNoResultSet()
187+
{
188+
using var cmd = m_database.Connection.CreateCommand();
189+
cmd.CommandText = "out_string";
190+
cmd.CommandType = CommandType.StoredProcedure;
191+
cmd.Parameters.Add(new MySqlParameter
192+
{
193+
ParameterName = "@value",
194+
DbType = DbType.String,
195+
Direction = ParameterDirection.Output,
196+
});
197+
198+
using (var reader = (MySqlDataReader) await cmd.ExecuteReaderAsync())
199+
{
200+
Assert.False(await reader.ReadAsync());
201+
Assert.Empty(reader.GetColumnSchema());
176202
Assert.False(await reader.NextResultAsync());
177203
}
178204
}

0 commit comments

Comments
 (0)