Skip to content

Commit 6d73d95

Browse files
committed
Add ServerFeatures.Vector and simple test.
Signed-off-by: Bradley Grainger <[email protected]>
1 parent c3b65a5 commit 6d73d95

File tree

8 files changed

+60
-24
lines changed

8 files changed

+60
-24
lines changed

azure-pipelines.yml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ jobs:
5151
arguments: 'tests\IntegrationTests\IntegrationTests.csproj -c MySqlData'
5252
testRunTitle: 'MySql.Data integration tests'
5353
env:
54-
DATA__UNSUPPORTEDFEATURES: 'Ed25519,QueryAttributes,StreamingResults,TlsFingerprintValidation,UnixDomainSocket'
54+
DATA__UNSUPPORTEDFEATURES: 'Ed25519,QueryAttributes,StreamingResults,TlsFingerprintValidation,UnixDomainSocket,Vector'
5555
DATA__CONNECTIONSTRING: 'server=localhost;port=3306;user id=root;password=test;database=mysqltest;ssl mode=none;DefaultCommandTimeout=3600'
5656
DATA__CERTIFICATESPATH: '$(Build.Repository.LocalPath)\.ci\server\certs\'
5757
DATA__MYSQLBULKLOADERLOCALCSVFILE: '$(Build.Repository.LocalPath)\tests\TestData\LoadData_UTF8_BOM_Unix.CSV'
@@ -120,7 +120,7 @@ jobs:
120120
arguments: '-c Release --no-restore -p:TestTfmsInParallel=false'
121121
testRunTitle: ${{ format('{0}, $(Agent.OS), {1}, {2}', 'mysql:8.0', 'net481/net9.0', 'No SSL') }}
122122
env:
123-
DATA__UNSUPPORTEDFEATURES: 'Ed25519,QueryAttributes,Redirection,StreamingResults,Tls11,TlsFingerprintValidation,UnixDomainSocket'
123+
DATA__UNSUPPORTEDFEATURES: 'Ed25519,QueryAttributes,Redirection,StreamingResults,Tls11,TlsFingerprintValidation,UnixDomainSocket,Vector'
124124
DATA__CONNECTIONSTRING: 'server=localhost;port=3306;user id=mysqltest;password=test;database=mysqltest;ssl mode=none;DefaultCommandTimeout=3600;AllowPublicKeyRetrieval=True;UseCompression=True'
125125

126126
- job: windows_integration_tests_2
@@ -158,7 +158,7 @@ jobs:
158158
arguments: '-c Release --no-restore -p:TestTfmsInParallel=false'
159159
testRunTitle: ${{ format('{0}, $(Agent.OS), {1}, {2}', 'mysql:8.0', 'net8.0', 'No SSL') }}
160160
env:
161-
DATA__UNSUPPORTEDFEATURES: 'Ed25519,QueryAttributes,Redirection,StreamingResults,Tls11,TlsFingerprintValidation,UnixDomainSocket'
161+
DATA__UNSUPPORTEDFEATURES: 'Ed25519,QueryAttributes,Redirection,StreamingResults,Tls11,TlsFingerprintValidation,UnixDomainSocket,Vector'
162162
DATA__CONNECTIONSTRING: 'server=localhost;port=3306;user id=mysqltest;password=test;database=mysqltest;ssl mode=none;DefaultCommandTimeout=3600;AllowPublicKeyRetrieval=True'
163163

164164
- job: linux_integration_tests
@@ -171,31 +171,31 @@ jobs:
171171
'MySQL 8.0':
172172
image: 'mysql:8.0'
173173
connectionStringExtra: 'AllowPublicKeyRetrieval=True'
174-
unsupportedFeatures: 'Ed25519,Redirection,StreamingResults,Tls11,TlsFingerprintValidation,ZeroDateTime'
174+
unsupportedFeatures: 'Ed25519,Redirection,StreamingResults,Tls11,TlsFingerprintValidation,Vector,ZeroDateTime'
175175
'MySQL 8.4':
176176
image: 'mysql:8.4'
177177
connectionStringExtra: 'AllowPublicKeyRetrieval=True'
178-
unsupportedFeatures: 'Ed25519,Redirection,StreamingResults,Tls11,TlsFingerprintValidation,ZeroDateTime'
178+
unsupportedFeatures: 'Ed25519,Redirection,StreamingResults,Tls11,TlsFingerprintValidation,Vector,ZeroDateTime'
179179
'MySQL 9.2':
180180
image: 'mysql:9.2'
181181
connectionStringExtra: 'AllowPublicKeyRetrieval=True'
182182
unsupportedFeatures: 'Ed25519,Redirection,StreamingResults,Tls11,TlsFingerprintValidation,ZeroDateTime'
183183
'MariaDB 10.6':
184184
image: 'mariadb:10.6'
185185
connectionStringExtra: ''
186-
unsupportedFeatures: 'CachingSha2Password,CancelSleepSuccessfully,Json,RoundDateTime,QueryAttributes,Redirection,Sha256Password,Tls11,TlsFingerprintValidation,UuidToBin'
186+
unsupportedFeatures: 'CachingSha2Password,CancelSleepSuccessfully,Json,RoundDateTime,QueryAttributes,Redirection,Sha256Password,Tls11,TlsFingerprintValidation,UuidToBin,Vector'
187187
'MariaDB 10.11':
188188
image: 'mariadb:10.11'
189189
connectionStringExtra: ''
190-
unsupportedFeatures: 'CachingSha2Password,CancelSleepSuccessfully,Json,RoundDateTime,QueryAttributes,Redirection,Sha256Password,Tls11,TlsFingerprintValidation,UuidToBin'
190+
unsupportedFeatures: 'CachingSha2Password,CancelSleepSuccessfully,Json,RoundDateTime,QueryAttributes,Redirection,Sha256Password,Tls11,TlsFingerprintValidation,UuidToBin,Vector'
191191
'MariaDB 11.4':
192192
image: 'mariadb:11.4'
193193
connectionStringExtra: ''
194-
unsupportedFeatures: 'CachingSha2Password,CancelSleepSuccessfully,Json,RoundDateTime,QueryAttributes,Sha256Password,Tls11,UuidToBin,Redirection'
194+
unsupportedFeatures: 'CachingSha2Password,CancelSleepSuccessfully,Json,RoundDateTime,QueryAttributes,Redirection,Sha256Password,Tls11,UuidToBin,Vector'
195195
'MariaDB 11.6':
196196
image: 'mariadb:11.6'
197197
connectionStringExtra: ''
198-
unsupportedFeatures: 'CachingSha2Password,CancelSleepSuccessfully,Json,RoundDateTime,QueryAttributes,Redirection,Sha256Password,Tls11,UuidToBin'
198+
unsupportedFeatures: 'CachingSha2Password,CancelSleepSuccessfully,Json,RoundDateTime,QueryAttributes,Redirection,Sha256Password,Tls11,UuidToBin,Vector'
199199
steps:
200200
- template: '.ci/integration-tests-steps.yml'
201201
parameters:

src/MySqlConnector/ColumnReaders/ColumnReader.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ public static ColumnReader Create(bool isBinary, ColumnDefinitionPayload columnD
113113
case ColumnType.Null:
114114
return NullColumnReader.Instance;
115115

116+
case ColumnType.Vector:
117+
return VectorColumnReader.Instance;
118+
116119
default:
117120
throw new NotImplementedException($"Reading {columnDefinition.ColumnType} not implemented");
118121
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System.Runtime.InteropServices;
2+
using MySqlConnector.Protocol.Payloads;
3+
4+
namespace MySqlConnector.ColumnReaders;
5+
6+
internal sealed class VectorColumnReader : ColumnReader
7+
{
8+
public static VectorColumnReader Instance { get; } = new();
9+
10+
public override object ReadValue(ReadOnlySpan<byte> data, ColumnDefinitionPayload columnDefinition) =>
11+
MemoryMarshal.Cast<byte, float>(data).ToArray();
12+
}

src/MySqlConnector/Core/Row.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ private void CheckBinaryColumn(int ordinal)
455455
if ((column.ColumnFlags & ColumnFlags.Binary) == 0 ||
456456
(columnType != ColumnType.String && columnType != ColumnType.VarString && columnType != ColumnType.TinyBlob &&
457457
columnType != ColumnType.Blob && columnType != ColumnType.MediumBlob && columnType != ColumnType.LongBlob &&
458-
columnType != ColumnType.Geometry))
458+
columnType != ColumnType.Geometry && columnType != ColumnType.Vector))
459459
{
460460
throw new InvalidCastException($"Can't convert {columnType} to bytes.");
461461
}

src/MySqlConnector/packages.lock.json

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -300,15 +300,6 @@
300300
"System.Memory": "4.5.5"
301301
}
302302
},
303-
"Microsoft.NETFramework.ReferenceAssemblies": {
304-
"type": "Direct",
305-
"requested": "[1.0.3, )",
306-
"resolved": "1.0.3",
307-
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
308-
"dependencies": {
309-
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
310-
}
311-
},
312303
"Microsoft.SourceLink.GitHub": {
313304
"type": "Direct",
314305
"requested": "[8.0.0, )",
@@ -366,11 +357,6 @@
366357
"resolved": "8.0.0",
367358
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
368359
},
369-
"Microsoft.NETFramework.ReferenceAssemblies.net48": {
370-
"type": "Transitive",
371-
"resolved": "1.0.3",
372-
"contentHash": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ=="
373-
},
374360
"Microsoft.SourceLink.Common": {
375361
"type": "Transitive",
376362
"resolved": "8.0.0",

tests/IntegrationTests/DataTypes.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,6 +1599,18 @@ public void QueryJson(string column, string[] expected)
15991599
DoQuery("json_core", column, dataTypeName, expected, reader => reader.GetString(0), omitWhereTest: true);
16001600
}
16011601

1602+
#if !MYSQL_DATA
1603+
[SkippableTheory(ServerFeatures.Vector)]
1604+
[InlineData("value", new[] { null, "0,0,0", "1,1,1", "1,2,3", "3.40282347E+38,3.40282347E+38,3.40282347E+38" })]
1605+
public void QueryVector(string column, string[] expected)
1606+
{
1607+
string dataTypeName = "VECTOR";
1608+
DoQuery("vector", column, dataTypeName,
1609+
expected.Select(x => x?.Split(',').Select(x => float.Parse(x, CultureInfo.InvariantCulture)).ToArray()).ToArray(),
1610+
static x => (float[]) x.GetValue(0), omitWhereTest: true);
1611+
}
1612+
#endif
1613+
16021614
[SkippableTheory(MySqlData = "https://bugs.mysql.com/bug.php?id=97067")]
16031615
[InlineData(false, "MIN", 0)]
16041616
[InlineData(false, "MAX", uint.MaxValue)]

tests/IntegrationTests/DataTypesFixture.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,24 @@ insert into datatypes_json_core (value)
242242
('{""a"": ""b""}');
243243
");
244244
}
245+
246+
if (AppConfig.SupportedFeatures.HasFlag(ServerFeatures.Vector))
247+
{
248+
Connection.Execute("""
249+
drop table if exists datatypes_vector;
250+
create table datatypes_vector (
251+
rowid integer not null primary key auto_increment,
252+
value vector(3) null
253+
);
254+
insert into datatypes_vector (value)
255+
values
256+
(null),
257+
(STRING_TO_VECTOR('[0, 0, 0]')),
258+
(STRING_TO_VECTOR('[1, 1, 1]')),
259+
(STRING_TO_VECTOR('[1, 2, 3]')),
260+
(STRING_TO_VECTOR('[3.40282347E+38, 3.40282347E+38, 3.40282347E+38]'));
261+
""");
262+
}
245263
Connection.Close();
246264
}
247265
}

tests/IntegrationTests/ServerFeatures.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,9 @@ public enum ServerFeatures
4545
/// Server provides hash of TLS certificate in first OK packet.
4646
/// </summary>
4747
TlsFingerprintValidation = 0x100_0000,
48+
49+
/// <summary>
50+
/// Server supports the <c>VECTOR</c> data type.
51+
/// </summary>
52+
Vector = 0x200_0000,
4853
}

0 commit comments

Comments
 (0)