Skip to content

Commit 54ced4f

Browse files
committed
Support Memory<float> as a parameter type.
Signed-off-by: Bradley Grainger <[email protected]>
1 parent f09fa2b commit 54ced4f

File tree

3 files changed

+29
-5
lines changed

3 files changed

+29
-5
lines changed

docs/content/troubleshooting/parameter-types.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,6 @@ In some cases, this may be as simple as calling `.ToString()` or `.ToString(Cult
3939
* .NET primitives: `bool`, `byte`, `char`, `double`, `float`, `int`, `long`, `sbyte`, `short`, `uint`, `ulong`, `ushort`
4040
* Common types: `BigInteger`, `DateOnly`, `DateTime`, `DateTimeOffset`, `decimal`, `enum`, `Guid`, `string`, `TimeOnly`, `TimeSpan`
4141
* BLOB types: `ArraySegment<byte>`, `byte[]`, `Memory<byte>`, `ReadOnlyMemory<byte>`
42+
* Vector types: `float[]`, `Memory<float>`, `ReadOnlyMemory<float>`
4243
* String types: `Memory<char>`, `ReadOnlyMemory<char>`, `StringBuilder`
4344
* Custom MySQL types: `MySqlDateTime`, `MySqlDecimal`, `MySqlGeometry`

src/MySqlConnector/MySqlParameter.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ internal void AppendSqlString(ByteBufferWriter writer, StatementPreparerOptions
285285
{
286286
writer.WriteString(ulongValue);
287287
}
288-
else if (Value is byte[] or ReadOnlyMemory<byte> or Memory<byte> or ArraySegment<byte> or MySqlGeometry or MemoryStream or float[])
288+
else if (Value is byte[] or ReadOnlyMemory<byte> or Memory<byte> or ArraySegment<byte> or MySqlGeometry or MemoryStream or float[] or ReadOnlyMemory<float> or Memory<float>)
289289
{
290290
var inputSpan = Value switch
291291
{
@@ -295,6 +295,8 @@ internal void AppendSqlString(ByteBufferWriter writer, StatementPreparerOptions
295295
MySqlGeometry geometry => geometry.ValueSpan,
296296
MemoryStream memoryStream => memoryStream.TryGetBuffer(out var streamBuffer) ? streamBuffer.AsSpan() : memoryStream.ToArray().AsSpan(),
297297
float[] floatArray => MemoryMarshal.AsBytes(floatArray.AsSpan()),
298+
Memory<float> memory => MemoryMarshal.AsBytes(memory.Span),
299+
ReadOnlyMemory<float> memory => MemoryMarshal.AsBytes(memory.Span),
298300
_ => ((ReadOnlyMemory<byte>) Value).Span,
299301
};
300302

@@ -738,6 +740,16 @@ private void AppendBinary(ByteBufferWriter writer, object value, StatementPrepar
738740
writer.WriteLengthEncodedInteger(unchecked((ulong) floatArrayValue.Length * 4));
739741
writer.Write(MemoryMarshal.AsBytes(floatArrayValue.AsSpan()));
740742
}
743+
else if (value is Memory<float> floatMemory)
744+
{
745+
writer.WriteLengthEncodedInteger(unchecked((ulong) floatMemory.Length * 4));
746+
writer.Write(MemoryMarshal.AsBytes(floatMemory.Span));
747+
}
748+
else if (value is ReadOnlyMemory<float> floatReadOnlyMemory)
749+
{
750+
writer.WriteLengthEncodedInteger(unchecked((ulong) floatReadOnlyMemory.Length * 4));
751+
writer.Write(MemoryMarshal.AsBytes(floatReadOnlyMemory.Span));
752+
}
741753
else if (value is decimal decimalValue)
742754
{
743755
writer.WriteLengthEncodedAsciiString(decimalValue.ToString(CultureInfo.InvariantCulture));

tests/IntegrationTests/QueryTests.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1691,9 +1691,13 @@ public void GetBytesByName()
16911691
#endif
16921692

16931693
[SkippableTheory(ServerFeatures.Vector)]
1694-
[InlineData(false)]
1695-
[InlineData(true)]
1696-
public void QueryVector(bool prepare)
1694+
[InlineData(false, 0)]
1695+
[InlineData(false, 1)]
1696+
[InlineData(false, 2)]
1697+
[InlineData(true, 0)]
1698+
[InlineData(true, 1)]
1699+
[InlineData(true, 2)]
1700+
public void QueryVector(bool prepare, int dataFormat)
16971701
{
16981702
using var connection = new MySqlConnection(AppConfig.ConnectionString);
16991703
connection.Open();
@@ -1715,8 +1719,15 @@ public void QueryVector(bool prepare)
17151719
#if MYSQL_DATA
17161720
// Connector/NET requires the float vector to be passed as a byte array
17171721
cmd.Parameters[0].Value = MemoryMarshal.AsBytes<float>(floatArray).ToArray();
1722+
Assert.InRange(dataFormat, 0, 2);
17181723
#else
1719-
cmd.Parameters[0].Value = floatArray;
1724+
cmd.Parameters[0].Value = dataFormat switch
1725+
{
1726+
0 => floatArray,
1727+
1 => new Memory<float>(floatArray),
1728+
2 => new ReadOnlyMemory<float>(floatArray),
1729+
_ => throw new NotSupportedException(),
1730+
};
17201731
#endif
17211732

17221733
if (prepare)

0 commit comments

Comments
 (0)