Skip to content

Commit 9ac9637

Browse files
Tommy Svendsenmbellade
authored andcommitted
HHH-18518 change implementation to capture MySQL custom versions better
1 parent e039bbc commit 9ac9637

File tree

2 files changed

+104
-5
lines changed

2 files changed

+104
-5
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/MySQLDialect.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import java.util.Date;
1818
import java.util.TimeZone;
1919

20+
import java.util.regex.Matcher;
21+
import java.util.regex.Pattern;
2022
import org.hibernate.Length;
2123
import org.hibernate.LockOptions;
2224
import org.hibernate.PessimisticLockException;
@@ -212,12 +214,12 @@ protected static DatabaseVersion createVersion(DialectResolutionInfo info) {
212214
protected static DatabaseVersion createVersion(DialectResolutionInfo info, DatabaseVersion defaultVersion) {
213215
final String versionString = info.getDatabaseVersion();
214216
if ( versionString != null ) {
215-
final String[] components = versionString.split( "\\." );
216-
if ( components.length >= 3 ) {
217+
final Matcher matcher = Pattern.compile("^(\\d+)\\.(\\d+)\\.(\\d+).*").matcher(versionString);
218+
if ( matcher.matches() && matcher.groupCount() >= 3 ) {
217219
try {
218-
final int majorVersion = Integer.parseInt( components[0] );
219-
final int minorVersion = Integer.parseInt( components[1] );
220-
final int patchLevel = Integer.parseInt( components[2] );
220+
final int majorVersion = Integer.parseInt( matcher.group(1));
221+
final int minorVersion = Integer.parseInt( matcher.group(2) );
222+
final int patchLevel = Integer.parseInt( matcher.group(3) );
221223
return DatabaseVersion.make( majorVersion, minorVersion, patchLevel );
222224
}
223225
catch (NumberFormatException ex) {
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package org.hibernate.dialect;
2+
3+
import java.util.Map;
4+
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
5+
import org.hibernate.testing.RequiresDialect;
6+
import org.hibernate.testing.TestForIssue;
7+
import org.hibernate.testing.junit4.BaseUnitTestCase;
8+
import org.junit.Test;
9+
10+
11+
import static org.junit.Assert.assertEquals;
12+
13+
@RequiresDialect(MySQLDialect.class)
14+
@TestForIssue(jiraKey = "HHH-18518")
15+
public class MySQLDialectDatabaseVersionTest extends BaseUnitTestCase {
16+
17+
@Test
18+
public void versionWithSuffix() {
19+
String version = "8.0.37-azure";
20+
Dialect dialect = new MySQLDialect( new TestingMySQLDialectResolutionInfo( version ) );
21+
22+
assertEquals(8, dialect.getVersion().getMajor());
23+
assertEquals(0, dialect.getVersion().getMinor());
24+
assertEquals(37, dialect.getVersion().getMicro());
25+
}
26+
27+
@Test
28+
public void releaseVersion() {
29+
String version = "8.0.37";
30+
Dialect dialect = new MySQLDialect( new TestingMySQLDialectResolutionInfo( version ) );
31+
32+
assertEquals(8, dialect.getVersion().getMajor());
33+
assertEquals(0, dialect.getVersion().getMinor());
34+
assertEquals(37, dialect.getVersion().getMicro());
35+
}
36+
37+
static final class TestingMySQLDialectResolutionInfo implements DialectResolutionInfo {
38+
private final String databaseVersion;
39+
40+
TestingMySQLDialectResolutionInfo(String databaseVersion) {
41+
this.databaseVersion = databaseVersion;
42+
}
43+
44+
45+
@Override
46+
public String getDatabaseName() {
47+
return "MySQL";
48+
}
49+
50+
@Override
51+
public String getDatabaseVersion() {
52+
return this.databaseVersion;
53+
}
54+
55+
@Override
56+
public int getDatabaseMajorVersion() {
57+
return 8;
58+
}
59+
60+
@Override
61+
public int getDatabaseMinorVersion() {
62+
return 0;
63+
}
64+
65+
@Override
66+
public String getDriverName() {
67+
return "MySQL JDBC Driver";
68+
}
69+
70+
@Override
71+
public int getDriverMajorVersion() {
72+
return 8;
73+
}
74+
75+
@Override
76+
public int getDriverMinorVersion() {
77+
return 3;
78+
}
79+
80+
@Override
81+
public String getSQLKeywords() {
82+
return "";
83+
}
84+
85+
@Override
86+
public String toString() {
87+
return "8.3.0";
88+
}
89+
90+
@Override
91+
public Map<String, Object> getConfigurationValues() {
92+
return Map.of();
93+
}
94+
95+
}
96+
97+
}

0 commit comments

Comments
 (0)