7
7
package org .hibernate .community .dialect ;
8
8
9
9
import java .sql .DatabaseMetaData ;
10
+ import java .sql .ResultSet ;
10
11
import java .sql .SQLException ;
11
12
import java .sql .Types ;
12
13
import java .time .temporal .TemporalAccessor ;
13
14
import java .util .Calendar ;
14
15
import java .util .Date ;
15
16
import java .util .Map ;
16
17
import java .util .TimeZone ;
18
+ import java .util .regex .Matcher ;
19
+ import java .util .regex .Pattern ;
17
20
18
21
import jakarta .persistence .TemporalType ;
19
22
30
33
import org .hibernate .dialect .PostgreSQLJsonbJdbcType ;
31
34
import org .hibernate .dialect .PostgreSQLPGObjectJdbcType ;
32
35
import org .hibernate .dialect .RowLockStrategy ;
36
+ import org .hibernate .dialect .SimpleDatabaseVersion ;
33
37
import org .hibernate .dialect .SpannerDialect ;
34
38
import org .hibernate .dialect .TimeZoneSupport ;
35
39
import org .hibernate .dialect .function .CommonFunctionFactory ;
46
50
import org .hibernate .engine .jdbc .env .spi .IdentifierHelperBuilder ;
47
51
import org .hibernate .engine .jdbc .env .spi .NameQualifierSupport ;
48
52
import org .hibernate .engine .spi .SessionFactoryImplementor ;
53
+ import org .hibernate .internal .CoreMessageLogger ;
49
54
import org .hibernate .metamodel .mapping .EntityMappingType ;
50
55
import org .hibernate .metamodel .spi .RuntimeModelCreationContext ;
51
56
import org .hibernate .query .spi .QueryEngine ;
75
80
import org .hibernate .type .descriptor .sql .internal .Scale6IntervalSecondDdlType ;
76
81
import org .hibernate .type .descriptor .sql .spi .DdlTypeRegistry ;
77
82
83
+ import org .jboss .logging .Logger ;
84
+
78
85
import static org .hibernate .query .sqm .TemporalUnit .DAY ;
79
86
import static org .hibernate .query .sqm .TemporalUnit .NATIVE ;
80
87
import static org .hibernate .type .SqlTypes .*;
89
96
*/
90
97
public class CockroachLegacyDialect extends Dialect {
91
98
99
+ private static final CoreMessageLogger LOG = Logger .getMessageLogger ( CoreMessageLogger .class , CockroachLegacyDialect .class .getName () );
92
100
private static final CockroachDBIdentityColumnSupport IDENTITY_COLUMN_SUPPORT = new CockroachDBIdentityColumnSupport ();
93
101
// KNOWN LIMITATIONS:
94
102
// * no support for java.sql.Clob
95
103
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 );
96
107
private final PostgreSQLDriverKind driverKind ;
97
108
98
109
public CockroachLegacyDialect () {
99
- this ( DatabaseVersion . make ( 19 , 2 ) );
110
+ this ( DEFAULT_VERSION );
100
111
}
101
112
102
113
public CockroachLegacyDialect (DialectResolutionInfo info ) {
103
- super ( info );
104
- driverKind = PostgreSQLDriverKind . determineKind ( info );
114
+ this ( fetchDataBaseVersion ( info ), PostgreSQLDriverKind . determineKind ( info ) );
115
+ registerKeywords ( info );
105
116
}
106
117
107
118
public CockroachLegacyDialect (DatabaseVersion version ) {
@@ -113,6 +124,47 @@ public CockroachLegacyDialect(DatabaseVersion version, PostgreSQLDriverKind driv
113
124
super (version );
114
125
this .driverKind = driverKind ;
115
126
}
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
+
116
168
117
169
@ Override
118
170
protected String columnType (int sqlTypeCode ) {
0 commit comments