diff --git a/src/MySqlConnector/MySqlConnection.cs b/src/MySqlConnector/MySqlConnection.cs index e7c0989de..27219bb47 100644 --- a/src/MySqlConnector/MySqlConnection.cs +++ b/src/MySqlConnector/MySqlConnection.cs @@ -1248,6 +1248,9 @@ private async Task DoCloseAsync(bool changeState, IOBehavior ioBehavior) { if (m_session is not null) { + // under exceptional circumstances, we may enter this code without having called FinishQuerying, which clears this field + m_activeReader = null; + if (GetInitializedConnectionSettings().Pooling) { await m_session.ReturnToPoolAsync(ioBehavior, this).ConfigureAwait(false); diff --git a/tests/MySqlConnector.Tests/ConnectionTests.cs b/tests/MySqlConnector.Tests/ConnectionTests.cs index 0c0833a1f..454c00242 100644 --- a/tests/MySqlConnector.Tests/ConnectionTests.cs +++ b/tests/MySqlConnector.Tests/ConnectionTests.cs @@ -234,6 +234,49 @@ public void ReadInfinity() Assert.False(reader.Read()); } + [Fact] + public void ReplaceActiveReader() + { + var connection = new MySqlConnection(m_csb.ConnectionString); + connection.Open(); + using (var command = connection.CreateCommand()) + { + command.CommandText = "select disconnect"; + command.CommandTimeout = 600; + var reader = command.ExecuteReader(); + Assert.True(reader.Read()); + Assert.Equal(1, reader.GetInt32(0)); + } + + try + { + connection.Close(); + } + catch (MySqlEndOfStreamException) + { + } + + connection.Open(); + using (var command = connection.CreateCommand()) + { + command.CommandText = "SELECT 1;"; + var reader = command.ExecuteReader(); + Assert.True(reader.Read()); + Assert.Equal(1, reader.GetInt32(0)); + } + connection.Close(); + + connection.Open(); + using (var command = connection.CreateCommand()) + { + command.CommandText = "SELECT 2;"; + var reader = command.ExecuteReader(); + Assert.True(reader.Read()); + Assert.Equal(2, reader.GetInt32(0)); + } + connection.Close(); + } + private static async Task WaitForConditionAsync(T expected, Func getValue) { var sw = Stopwatch.StartNew(); diff --git a/tests/MySqlConnector.Tests/FakeMySqlServerConnection.cs b/tests/MySqlConnector.Tests/FakeMySqlServerConnection.cs index 6081d7535..f07e421c0 100644 --- a/tests/MySqlConnector.Tests/FakeMySqlServerConnection.cs +++ b/tests/MySqlConnector.Tests/FakeMySqlServerConnection.cs @@ -179,6 +179,20 @@ public async Task RunAsync(TcpClient client, CancellationToken token) for (var packetIndex = 0; packetIndex < packets.Length; packetIndex++) await SendAsync(stream, packetIndex + 1, x => x.Write(packets[packetIndex])); } + else if (query == "select disconnect") + { + var packets = new[] + { + new byte[] { 1 }, // one column + [3, 0x64, 0x65, 0x66, 0, 0, 0, 1, 0x41, 0, 0x0c, 0x3f, 0, 1, 0, 0, 0, 3, 0x01, 0, 0x1F, 0, 0], // column definition (int) + [0xFE, 0, 0, 2, 0], // EOF + [1, 0x31], // 1 + }; + for (var packetIndex = 0; packetIndex < packets.Length; packetIndex++) + await SendAsync(stream, packetIndex + 1, x => x.Write(packets[packetIndex])); + stream.Close(); + client.Close(); + } else { await SendAsync(stream, 1, x => WriteError(x, "Unhandled query: " + query));