Skip to content

Commit 4d2e300

Browse files
committed
Improve MariaDB version parsing. Fixes #617
1 parent a6b5d69 commit 4d2e300

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

src/MySqlConnector/Core/ServerVersion.cs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,27 @@ public ServerVersion(ReadOnlySpan<byte> versionString)
2424
Version = new Version(major, minor, build);
2525

2626
// check for MariaDB version appended to a fake MySQL version
27-
if (versionString.Length != 0 && versionString[0] == 0x2D && versionString.IndexOf(MariaDb) != -1)
27+
if (versionString.Length != 0 && versionString[0] == 0x2D)
2828
{
2929
versionString = versionString.Slice(1);
30-
if (Utf8Parser.TryParse(versionString, out major, out bytesConsumed) && versionString[bytesConsumed] == 0x2E)
30+
var mariaDbIndex = versionString.IndexOf(MariaDb);
31+
if (mariaDbIndex != -1)
3132
{
32-
versionString = versionString.Slice(bytesConsumed + 1);
33-
if (Utf8Parser.TryParse(versionString, out minor, out bytesConsumed) && versionString[bytesConsumed] == 0x2E)
33+
var totalBytesRead = 0;
34+
if (Utf8Parser.TryParse(versionString, out major, out bytesConsumed) && versionString[bytesConsumed] == 0x2E)
3435
{
3536
versionString = versionString.Slice(bytesConsumed + 1);
36-
if (Utf8Parser.TryParse(versionString, out build, out bytesConsumed) && versionString[bytesConsumed] == 0x2D)
37+
totalBytesRead += bytesConsumed + 1;
38+
if (Utf8Parser.TryParse(versionString, out minor, out bytesConsumed) && versionString[bytesConsumed] == 0x2E)
3739
{
38-
MariaDbVersion = new Version(major, minor, build);
40+
versionString = versionString.Slice(bytesConsumed + 1);
41+
totalBytesRead += bytesConsumed + 1;
42+
if (Utf8Parser.TryParse(versionString, out build, out bytesConsumed) && versionString[bytesConsumed] == 0x2D)
43+
{
44+
totalBytesRead += bytesConsumed;
45+
if (totalBytesRead == mariaDbIndex)
46+
MariaDbVersion = new Version(major, minor, build);
47+
}
3948
}
4049
}
4150
}
@@ -46,6 +55,6 @@ public ServerVersion(ReadOnlySpan<byte> versionString)
4655
public Version Version { get; }
4756
public Version MariaDbVersion { get; }
4857

49-
static ReadOnlySpan<byte> MariaDb => new byte[] { 0x2D, 0x4D, 0x61, 0x72, 0x69, 0x61, 0x44, 0x42, 0x2D }; // -MariaDB-
58+
static ReadOnlySpan<byte> MariaDb => new byte[] { 0x2D, 0x4D, 0x61, 0x72, 0x69, 0x61, 0x44, 0x42 }; // -MariaDB
5059
}
5160
}

tests/MySqlConnector.Tests/ServerVersionTests.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,16 @@ public class ServerVersionTests
99
{
1010
[Theory]
1111
[InlineData("5.5.5-10.1.38-MariaDB-1~bionic", "5.5.5", "10.1.38")]
12+
[InlineData("5.5.5-10.2.13-MariaDB", "5.5.5", "10.2.13")]
1213
[InlineData("5.5.5-10.2.19-MariaDB-1:10.2.19+maria~bionic", "5.5.5", "10.2.19")]
1314
[InlineData("5.5.5-10.3.13-MariaDB-1:10.3.13+maria~bionic", "5.5.5", "10.3.13")]
1415
[InlineData("5.7.21-log", "5.7.21", null)]
1516
[InlineData("8.0.13", "8.0.13", null)]
1617
[InlineData("5.7.25-28", "5.7.25", null)]
18+
[InlineData("5.7.25-", "5.7.25", null)]
19+
[InlineData("5.7.25-10.2.3", "5.7.25", null)]
20+
[InlineData("5.7.25-MariaDB-10.2.3", "5.7.25", null)]
21+
[InlineData("5.7.25-10.2.3-10.3.19-MariaDB-1", "5.7.25", null)]
1722
public void ParseServerVersion(string input, string expectedString, string expectedMariaDbString)
1823
{
1924
var serverVersion = new ServerVersion(Encoding.UTF8.GetBytes(input));

0 commit comments

Comments
 (0)