Skip to content

Commit 2f8b671

Browse files
committed
Fix return value of ExecuteNonQuery.
It must return -1 for statements that don't modify data, e.g., SELECT.
1 parent 0aac9b5 commit 2f8b671

File tree

3 files changed

+35
-6
lines changed

3 files changed

+35
-6
lines changed

src/MySqlConnector/Core/ResultSet.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public async Task<ResultSet> ReadResultSetHeaderAsync(IOBehavior ioBehavior)
2626
ColumnDefinitions = null;
2727
ColumnTypes = null;
2828
LastInsertId = 0;
29-
RecordsAffected = 0;
29+
RecordsAffected = null;
3030
State = ResultSetState.None;
3131
m_columnDefinitionPayloadUsedBytes = 0;
3232
m_dataLengths = null;
@@ -46,7 +46,7 @@ public async Task<ResultSet> ReadResultSetHeaderAsync(IOBehavior ioBehavior)
4646
if (firstByte == OkPayload.Signature)
4747
{
4848
var ok = OkPayload.Create(payload);
49-
RecordsAffected += ok.AffectedRowCount;
49+
RecordsAffected = (RecordsAffected ?? 0) + ok.AffectedRowCount;
5050
LastInsertId = ok.LastInsertId;
5151
ColumnDefinitions = null;
5252
ColumnTypes = null;
@@ -334,7 +334,7 @@ public Row GetCurrentRow()
334334
public ColumnDefinitionPayload[] ColumnDefinitions { get; private set; }
335335
public MySqlDbType[] ColumnTypes { get; private set; }
336336
public long LastInsertId { get; private set; }
337-
public int RecordsAffected { get; private set; }
337+
public int? RecordsAffected { get; private set; }
338338
public ResultSetState State { get; private set; }
339339

340340
byte[] m_columnDefinitionPayloads;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ private void ActivateResultSet(ResultSet resultSet)
104104
}
105105

106106
Command.LastInsertedId = resultSet.LastInsertId;
107-
m_recordsAffected += resultSet.RecordsAffected;
107+
m_recordsAffected = m_recordsAffected == null ? resultSet.RecordsAffected : m_recordsAffected.Value + (resultSet.RecordsAffected ?? 0);
108108
}
109109

110110
private async Task<ResultSet> BufferNextResultAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
@@ -169,7 +169,7 @@ private async Task<ResultSet> ScanResultSetAsyncAwaited(IOBehavior ioBehavior, R
169169

170170
public override bool HasRows => GetResultSet().HasRows;
171171
public override bool IsClosed => Command == null;
172-
public override int RecordsAffected => m_recordsAffected;
172+
public override int RecordsAffected => m_recordsAffected.GetValueOrDefault(-1);
173173

174174
public override int GetOrdinal(string name) => GetResultSet().GetOrdinal(name);
175175

@@ -441,7 +441,7 @@ private ResultSet GetResultSet()
441441
}
442442

443443
readonly CommandBehavior m_behavior;
444-
int m_recordsAffected;
444+
int? m_recordsAffected;
445445
ResultSet m_resultSet;
446446
ResultSet m_resultSetBuffered;
447447
#if !NETSTANDARD1_3

tests/SideBySide/CommandTests.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System;
2+
using System.Threading.Tasks;
3+
using Dapper;
24
using MySql.Data.MySqlClient;
35
using Xunit;
46

@@ -58,6 +60,33 @@ public void PrepareRequiresOpenConnection()
5860
}
5961
}
6062

63+
[Fact]
64+
public void ExecuteNonQueryForSelectReturnsNegativeOne()
65+
{
66+
using (var connection = new MySqlConnection(m_database.Connection.ConnectionString))
67+
using (var command = connection.CreateCommand())
68+
{
69+
connection.Open();
70+
command.CommandText = "SELECT 1;";
71+
Assert.Equal(-1, command.ExecuteNonQuery());
72+
}
73+
}
74+
75+
[Fact]
76+
public async Task ExecuteNonQueryReturnValue()
77+
{
78+
using (var connection = new MySqlConnection(m_database.Connection.ConnectionString))
79+
{
80+
await connection.OpenAsync();
81+
await connection.ExecuteAsync(@"drop table if exists execute_non_query;
82+
create table execute_non_query(id integer not null primary key auto_increment, value text null);");
83+
Assert.Equal(4, await connection.ExecuteAsync("insert into execute_non_query(value) values(null), (null), ('one'), ('two');"));
84+
Assert.Equal(-1, await connection.ExecuteAsync("select value from execute_non_query;"));
85+
Assert.Equal(2, await connection.ExecuteAsync("delete from execute_non_query where value is null;"));
86+
Assert.Equal(1, await connection.ExecuteAsync("update execute_non_query set value = 'three' where value = 'one';"));
87+
}
88+
}
89+
6190
readonly DatabaseFixture m_database;
6291
}
6392
}

0 commit comments

Comments
 (0)