Skip to content

Commit 4f9ff5c

Browse files
jrenaatbeikov
authored andcommitted
HHH-15511 - fix version determination also for the CockroachDB legacy dialect
Signed-off-by: Jan Schatteman <[email protected]>
1 parent 8a88603 commit 4f9ff5c

File tree

1 file changed

+55
-3
lines changed

1 file changed

+55
-3
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/CockroachLegacyDialect.java

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@
77
package org.hibernate.community.dialect;
88

99
import java.sql.DatabaseMetaData;
10+
import java.sql.ResultSet;
1011
import java.sql.SQLException;
1112
import java.sql.Types;
1213
import java.time.temporal.TemporalAccessor;
1314
import java.util.Calendar;
1415
import java.util.Date;
1516
import java.util.Map;
1617
import java.util.TimeZone;
18+
import java.util.regex.Matcher;
19+
import java.util.regex.Pattern;
1720

1821
import jakarta.persistence.TemporalType;
1922

@@ -30,6 +33,7 @@
3033
import org.hibernate.dialect.PostgreSQLJsonbJdbcType;
3134
import org.hibernate.dialect.PostgreSQLPGObjectJdbcType;
3235
import org.hibernate.dialect.RowLockStrategy;
36+
import org.hibernate.dialect.SimpleDatabaseVersion;
3337
import org.hibernate.dialect.SpannerDialect;
3438
import org.hibernate.dialect.TimeZoneSupport;
3539
import org.hibernate.dialect.function.CommonFunctionFactory;
@@ -46,6 +50,7 @@
4650
import org.hibernate.engine.jdbc.env.spi.IdentifierHelperBuilder;
4751
import org.hibernate.engine.jdbc.env.spi.NameQualifierSupport;
4852
import org.hibernate.engine.spi.SessionFactoryImplementor;
53+
import org.hibernate.internal.CoreMessageLogger;
4954
import org.hibernate.metamodel.mapping.EntityMappingType;
5055
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
5156
import org.hibernate.query.spi.QueryEngine;
@@ -75,6 +80,8 @@
7580
import org.hibernate.type.descriptor.sql.internal.Scale6IntervalSecondDdlType;
7681
import org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry;
7782

83+
import org.jboss.logging.Logger;
84+
7885
import static org.hibernate.query.sqm.TemporalUnit.DAY;
7986
import static org.hibernate.query.sqm.TemporalUnit.NATIVE;
8087
import static org.hibernate.type.SqlTypes.*;
@@ -89,19 +96,23 @@
8996
*/
9097
public class CockroachLegacyDialect extends Dialect {
9198

99+
private static final CoreMessageLogger LOG = Logger.getMessageLogger( CoreMessageLogger.class, CockroachLegacyDialect.class.getName() );
92100
private static final CockroachDBIdentityColumnSupport IDENTITY_COLUMN_SUPPORT = new CockroachDBIdentityColumnSupport();
93101
// KNOWN LIMITATIONS:
94102
// * no support for java.sql.Clob
95103

104+
// Pre-compile and reuse pattern
105+
private static final Pattern CRDB_VERSION_PATTERN = Pattern.compile( "v[\\d]+(\\.[\\d]+)?(\\.[\\d]+)?" );
106+
private static final DatabaseVersion DEFAULT_VERSION = DatabaseVersion.make( 19, 2 );
96107
private final PostgreSQLDriverKind driverKind;
97108

98109
public CockroachLegacyDialect() {
99-
this( DatabaseVersion.make( 19, 2 ) );
110+
this( DEFAULT_VERSION );
100111
}
101112

102113
public CockroachLegacyDialect(DialectResolutionInfo info) {
103-
super(info);
104-
driverKind = PostgreSQLDriverKind.determineKind( info );
114+
this( fetchDataBaseVersion( info ), PostgreSQLDriverKind.determineKind( info ) );
115+
registerKeywords( info );
105116
}
106117

107118
public CockroachLegacyDialect(DatabaseVersion version) {
@@ -113,6 +124,47 @@ public CockroachLegacyDialect(DatabaseVersion version, PostgreSQLDriverKind driv
113124
super(version);
114125
this.driverKind = driverKind;
115126
}
127+
protected static DatabaseVersion fetchDataBaseVersion( DialectResolutionInfo info ) {
128+
String versionString = null;
129+
if ( info.getDatabaseMetadata() != null ) {
130+
try (java.sql.Statement s = info.getDatabaseMetadata().getConnection().createStatement() ) {
131+
final ResultSet rs = s.executeQuery( "SELECT version()" );
132+
if ( rs.next() ) {
133+
versionString = rs.getString( 1 );
134+
}
135+
}
136+
catch (SQLException ex) {
137+
// Ignore
138+
}
139+
}
140+
return parseVersion( versionString );
141+
}
142+
143+
protected static DatabaseVersion parseVersion(String versionString ) {
144+
DatabaseVersion databaseVersion = null;
145+
// What the DB select returns is similar to "CockroachDB CCL v21.2.10 (x86_64-unknown-linux-gnu, built 2022/05/02 17:38:58, go1.16.6)"
146+
Matcher m = CRDB_VERSION_PATTERN.matcher( versionString == null ? "" : versionString );
147+
if ( m.find() ) {
148+
String[] versionParts = m.group().substring( 1 ).split( "\\." );
149+
// if we got to this point, there is at least a major version, so no need to check [].length > 0
150+
int majorVersion = Integer.parseInt( versionParts[0] );
151+
int minorVersion = versionParts.length > 1 ? Integer.parseInt( versionParts[1] ) : 0;
152+
int microVersion = versionParts.length > 2 ? Integer.parseInt( versionParts[2] ) : 0;
153+
154+
databaseVersion= new SimpleDatabaseVersion( majorVersion, minorVersion, microVersion);
155+
}
156+
if ( databaseVersion == null ) {
157+
// Recur to the default version of the no-args constructor
158+
LOG.unableToDetermineCockroachDatabaseVersion(
159+
DEFAULT_VERSION.getDatabaseMajorVersion() + "." +
160+
DEFAULT_VERSION.getDatabaseMinorVersion() + "." +
161+
DEFAULT_VERSION.getDatabaseMicroVersion()
162+
);
163+
databaseVersion = DEFAULT_VERSION;
164+
}
165+
return databaseVersion;
166+
}
167+
116168

117169
@Override
118170
protected String columnType(int sqlTypeCode) {

0 commit comments

Comments
 (0)