Skip to content

Commit e28e2a5

Browse files
rusherbgrainger
authored andcommitted
MariaDB version parsing evolution
fix #1259 Since MariaDB server 11.0.1 (MDEV-28910) won't have "5.5.5-" prefix anymore. This PR propose to evolve server identification accordingly based on 2 principles: * version is stripped of "5.5.5-" prefix and identified as MariaDB (The only server that use 'x.y.z-' prefix is percona, but first percona 5.5 server was 5.5.7). MySQL use "x.y.z", alibaba and aurora use x.y.z.a notation) * server version string contains "MariaDB" (All mariadb connectors use/will use that exact same behavior for mariadb identification) Signed-off-by: rusher <[email protected]> (cherry picked from commit 275b3e8)
1 parent 3638c11 commit e28e2a5

File tree

4 files changed

+41
-64
lines changed

4 files changed

+41
-64
lines changed

src/MySqlConnector/Core/CachedProcedure.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ internal sealed class CachedProcedure
1111
public static async Task<CachedProcedure?> FillAsync(IOBehavior ioBehavior, MySqlConnection connection, string schema, string component, CancellationToken cancellationToken)
1212
{
1313
// try to use mysql.proc first, as it is much faster
14-
if (connection.Session.ServerVersion.Version < ServerVersions.RemovesMySqlProcTable && !connection.Session.ProcAccessDenied)
14+
if (!connection.Session.ServerVersion.MariaDb
15+
&& connection.Session.ServerVersion.Version < ServerVersions.RemovesMySqlProcTable
16+
&& !connection.Session.ProcAccessDenied)
1517
{
1618
try
1719
{
@@ -127,7 +129,7 @@ internal MySqlParameterCollection AlignParamsWithDb(MySqlParameterCollection? pa
127129
if (!alignParam.HasSetDbType)
128130
alignParam.MySqlDbType = cachedParam.MySqlDbType;
129131

130-
// cached parameters are oredered by ordinal position
132+
// cached parameters are ordered by ordinal position
131133
alignedParams.Add(alignParam);
132134
}
133135

src/MySqlConnector/Core/ServerSession.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,9 @@ public async Task<bool> TryResetConnectionAsync(ConnectionSettings cs, MySqlConn
613613
ClearPreparedStatements();
614614

615615
PayloadData payload;
616-
if (DatabaseOverride is null && (ServerVersion.Version.CompareTo(ServerVersions.SupportsResetConnection) >= 0 || ServerVersion.MariaDbVersion?.CompareTo(ServerVersions.MariaDbSupportsResetConnection) >= 0))
616+
if (DatabaseOverride is null
617+
&& ((!ServerVersion.MariaDb && ServerVersion.Version.CompareTo(ServerVersions.SupportsResetConnection) >= 0)
618+
|| (ServerVersion.MariaDb && ServerVersion.Version.CompareTo(ServerVersions.MariaDbSupportsResetConnection) >= 0)))
617619
{
618620
m_logArguments[1] = ServerVersion.OriginalString;
619621

src/MySqlConnector/Core/ServerVersion.cs

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@ internal sealed class ServerVersion
99
public ServerVersion(ReadOnlySpan<byte> versionString)
1010
{
1111
OriginalString = Encoding.ASCII.GetString(versionString);
12+
if (versionString.IndexOf("5.5.5-"u8) == 0)
13+
{
14+
// for MariaDB < 11.0.1
15+
versionString = versionString[6..];
16+
MariaDb = true;
17+
}
18+
else if (versionString.IndexOf("MariaDB"u8) != -1)
19+
{
20+
MariaDb = true;
21+
}
1222

1323
var minor = 0;
1424
var build = 0;
@@ -34,39 +44,11 @@ public ServerVersion(ReadOnlySpan<byte> versionString)
3444
}
3545

3646
Version = new Version(major, minor, build);
37-
38-
// check for MariaDB version appended to a fake MySQL version
39-
if (versionString is [ 0x2D, .. ])
40-
{
41-
versionString = versionString[1..];
42-
ReadOnlySpan<byte> mariaDb = "-MariaDB"u8;
43-
var mariaDbIndex = versionString.IndexOf(mariaDb);
44-
if (mariaDbIndex != -1)
45-
{
46-
var totalBytesRead = 0;
47-
if (Utf8Parser.TryParse(versionString, out major, out bytesConsumed) && versionString[bytesConsumed] == 0x2E)
48-
{
49-
versionString = versionString[(bytesConsumed + 1)..];
50-
totalBytesRead += bytesConsumed + 1;
51-
if (Utf8Parser.TryParse(versionString, out minor, out bytesConsumed) && versionString[bytesConsumed] == 0x2E)
52-
{
53-
versionString = versionString[(bytesConsumed + 1)..];
54-
totalBytesRead += bytesConsumed + 1;
55-
if (Utf8Parser.TryParse(versionString, out build, out bytesConsumed) && versionString[bytesConsumed] == 0x2D)
56-
{
57-
totalBytesRead += bytesConsumed;
58-
if (totalBytesRead == mariaDbIndex)
59-
MariaDbVersion = new(major, minor, build);
60-
}
61-
}
62-
}
63-
}
64-
}
6547
}
6648

49+
public bool MariaDb { get; }
6750
public string OriginalString { get; }
6851
public Version Version { get; }
69-
public Version? MariaDbVersion { get; }
7052

7153
public static ServerVersion Empty { get; } = new();
7254

tests/MySqlConnector.Tests/ServerVersionTests.cs

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,41 +8,32 @@ namespace MySqlConnector.Tests;
88
public class ServerVersionTests
99
{
1010
[Theory]
11-
[InlineData("5.5.5-10.1.38-MariaDB-1~bionic", "5.5.5", "10.1.38")]
12-
[InlineData("5.5.5-10-MariaDB", "5.5.5", null)]
13-
[InlineData("5.5.5-10.2-MariaDB", "5.5.5", null)]
14-
[InlineData("5.5.5-10.2.13-MariaDB", "5.5.5", "10.2.13")]
15-
[InlineData("5.5.5-10.2.19-MariaDB-1:10.2.19+maria~bionic", "5.5.5", "10.2.19")]
16-
[InlineData("5.5.5-10.3.13-MariaDB-1:10.3.13+maria~bionic", "5.5.5", "10.3.13")]
17-
[InlineData("5.7.21-log", "5.7.21", null)]
18-
[InlineData("8.0.13", "8.0.13", null)]
19-
[InlineData("5.7.25-28", "5.7.25", null)]
20-
[InlineData("5.7.25-", "5.7.25", null)]
21-
[InlineData("5.7.25-10.2.3", "5.7.25", null)]
22-
[InlineData("5.7.25-MariaDB-10.2.3", "5.7.25", null)]
23-
[InlineData("5.7.25-10.2.3-10.3.19-MariaDB-1", "5.7.25", null)]
24-
[InlineData("a.b.c", "0.0.0", null)]
25-
[InlineData("1", "1.0.0", null)]
26-
[InlineData("1.", "1.0.0", null)]
27-
[InlineData("1.2", "1.2.0", null)]
28-
[InlineData("1.2.", "1.2.0", null)]
29-
[InlineData("1.2.3", "1.2.3", null)]
30-
[InlineData("1.2.3.", "1.2.3", null)]
31-
[InlineData("1.2.3-", "1.2.3", null)]
32-
public void ParseServerVersion(string input, string expectedString, string expectedMariaDbString)
11+
[InlineData("5.5.5-10.1.38-MariaDB-1~bionic", "10.1.38", true)]
12+
[InlineData("5.5.5-10.2.13-MariaDB", "10.2.13", true)]
13+
[InlineData("5.5.5-10.2.19-MariaDB-1:10.2.19+maria~bionic", "10.2.19", true)]
14+
[InlineData("5.5.5-10.3.13-MariaDB-1:10.3.13+maria~bionic", "10.3.13", true)]
15+
[InlineData("11.0.1-MariaDB-1:11.0.1+maria~bionic", "11.0.1", true)]
16+
[InlineData("10.3.13-MariaDB-1:10.3.13+maria~bionic", "10.3.13", true)]
17+
[InlineData("5.7.21-log", "5.7.21", false)]
18+
[InlineData("8.0.13", "8.0.13", false)]
19+
[InlineData("5.7.25-28", "5.7.25", false)]
20+
[InlineData("5.7.25-", "5.7.25", false)]
21+
[InlineData("5.7.25-10.2.3", "5.7.25", false)]
22+
[InlineData("5.7.25-MariaDB-10.2.3", "5.7.25", true)]
23+
[InlineData("5.7.25-10.2.3-10.3.19-MariaDB-1", "5.7.25", true)]
24+
[InlineData("a.b.c", "0.0.0", false)]
25+
[InlineData("1", "1.0.0", false)]
26+
[InlineData("1.", "1.0.0", false)]
27+
[InlineData("1.2", "1.2.0", false)]
28+
[InlineData("1.2.", "1.2.0", false)]
29+
[InlineData("1.2.3", "1.2.3", false)]
30+
[InlineData("1.2.3.", "1.2.3", false)]
31+
[InlineData("1.2.3-", "1.2.3", false)]
32+
public void ParseServerVersion(string input, string expectedString, bool expectedMariaDb)
3333
{
3434
var serverVersion = new ServerVersion(Encoding.UTF8.GetBytes(input));
3535
var expected = Version.Parse(expectedString);
3636
Assert.Equal(expected, serverVersion.Version);
37-
38-
if (expectedMariaDbString is null)
39-
{
40-
Assert.Equal(default(Version), serverVersion.MariaDbVersion);
41-
}
42-
else
43-
{
44-
var expectedMariaDb = Version.Parse(expectedMariaDbString);
45-
Assert.Equal(expectedMariaDb, serverVersion.MariaDbVersion);
46-
}
37+
Assert.Equal(expectedMariaDb, serverVersion.MariaDb);
4738
}
4839
}

0 commit comments

Comments
 (0)