Skip to content

Commit 968cadf

Browse files
committed
Add test for multiple inserts in one prepared command.
Signed-off-by: Bradley Grainger <[email protected]>
1 parent 4638f17 commit 968cadf

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

src/MySqlConnector/MySqlDataReader.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,10 @@ internal async Task<bool> NextResultAsync(IOBehavior ioBehavior, CancellationTok
7474
Command = m_commandListPosition.CommandAt(m_commandListPosition.CommandIndex);
7575
using (Command.CancellableCommand.RegisterCancel(cancellationToken))
7676
{
77+
await m_payloadCreator!.WritePrologueAsync(Command.Connection!, m_commandListPosition, ioBehavior, cancellationToken).ConfigureAwait(false);
78+
7779
var writer = new ByteBufferWriter();
78-
if (!Command.Connection!.Session.IsCancelingQuery && m_payloadCreator!.WriteQueryCommand(ref m_commandListPosition, m_cachedProcedures!, writer, false))
80+
if (!Command.Connection!.Session.IsCancelingQuery && m_payloadCreator.WriteQueryCommand(ref m_commandListPosition, m_cachedProcedures!, writer, false))
7981
{
8082
using var payload = writer.ToPayloadData();
8183
await Command.Connection.Session.SendAsync(payload, ioBehavior, cancellationToken).ConfigureAwait(false);

tests/IntegrationTests/InsertTests.cs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,63 @@ public async Task SendLongData(int dataLength, int chunkLength, bool isAsync)
542542
Assert.True(data.AsSpan().SequenceEqual(readData)); // much faster than Assert.Equal
543543
}
544544
}
545+
546+
[Theory]
547+
[InlineData(false)]
548+
[InlineData(true)]
549+
public async Task SendLongDataMultipleStatements(bool isAsync)
550+
{
551+
using MySqlConnection connection = new MySqlConnection(AppConfig.ConnectionString);
552+
connection.Open();
553+
connection.Execute("""
554+
drop table if exists insert_mysql_long_data;
555+
create table insert_mysql_long_data(rowid integer not null primary key auto_increment, value longblob);
556+
""");
557+
558+
var data1 = new byte[1000];
559+
var data2 = new byte[2000];
560+
var data3 = new byte[3000];
561+
var random = new Random(1);
562+
random.NextBytes(data1);
563+
random.NextBytes(data2);
564+
random.NextBytes(data3);
565+
566+
using var chunkStream1 = new ChunkStream(data1, int.MaxValue);
567+
using var chunkStream2 = new ChunkStream(data2, int.MaxValue);
568+
using var chunkStream3 = new ChunkStream(data3, int.MaxValue);
569+
570+
using var writeCommand = new MySqlCommand("""
571+
insert into insert_mysql_long_data(rowid, value) values(1, @value1);
572+
insert into insert_mysql_long_data(rowid, value) values(2, @value2);
573+
insert into insert_mysql_long_data(rowid, value) values(3, @value3);
574+
""", connection);
575+
writeCommand.Parameters.AddWithValue("@value1", chunkStream1);
576+
writeCommand.Parameters.AddWithValue("@value2", chunkStream2);
577+
writeCommand.Parameters.AddWithValue("@value3", chunkStream3);
578+
writeCommand.Prepare();
579+
if (isAsync)
580+
await writeCommand.ExecuteNonQueryAsync();
581+
else
582+
writeCommand.ExecuteNonQuery();
583+
584+
using var readCommand = new MySqlCommand("select value from insert_mysql_long_data order by rowid;", connection);
585+
using (var reader = readCommand.ExecuteReader())
586+
{
587+
Assert.True(reader.Read());
588+
var readData = (byte[]) reader.GetValue(0);
589+
Assert.True(data1.AsSpan().SequenceEqual(readData));
590+
591+
Assert.True(reader.Read());
592+
readData = (byte[]) reader.GetValue(0);
593+
Assert.True(data2.AsSpan().SequenceEqual(readData));
594+
595+
Assert.True(reader.Read());
596+
readData = (byte[]) reader.GetValue(0);
597+
Assert.True(data3.AsSpan().SequenceEqual(readData));
598+
599+
Assert.False(reader.Read());
600+
}
601+
}
545602
#endif
546603

547604
[Theory]

0 commit comments

Comments
 (0)