|
7 | 7 | package org.hibernate.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.ChronoField;
|
|
40 | 41 | import org.hibernate.dialect.unique.AlterTableUniqueIndexDelegate;
|
41 | 42 | import org.hibernate.dialect.unique.UniqueDelegate;
|
42 | 43 | import org.hibernate.engine.jdbc.Size;
|
| 44 | +import org.hibernate.engine.jdbc.dialect.spi.BasicSQLExceptionConverter; |
43 | 45 | import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
44 | 46 | import org.hibernate.engine.jdbc.env.spi.IdentifierCaseStrategy;
|
45 | 47 | import org.hibernate.engine.jdbc.env.spi.IdentifierHelper;
|
|
52 | 54 | import org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor;
|
53 | 55 | import org.hibernate.exception.spi.ViolatedConstraintNameExtractor;
|
54 | 56 | import org.hibernate.internal.util.JdbcExceptionHelper;
|
| 57 | +import org.hibernate.internal.util.config.ConfigurationHelper; |
55 | 58 | import org.hibernate.mapping.Column;
|
56 | 59 | import org.hibernate.persister.entity.mutation.EntityMutationTarget;
|
57 | 60 | import org.hibernate.procedure.internal.SQLServerCallableStatementSupport;
|
|
89 | 92 |
|
90 | 93 | import jakarta.persistence.TemporalType;
|
91 | 94 |
|
| 95 | +import static org.hibernate.cfg.DialectSpecificSettings.SQL_SERVER_COMPATIBILITY_LEVEL; |
92 | 96 | import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
|
93 | 97 | import static org.hibernate.query.sqm.TemporalUnit.NANOSECOND;
|
94 | 98 | import static org.hibernate.query.sqm.produce.function.FunctionParameterType.INTEGER;
|
@@ -174,8 +178,36 @@ public SQLServerDialect(DatabaseVersion version) {
|
174 | 178 | }
|
175 | 179 |
|
176 | 180 | public SQLServerDialect(DialectResolutionInfo info) {
|
177 |
| - super(info); |
178 |
| - exporter = createSequenceExporter(info); |
| 181 | + this( determineDatabaseVersion( info ) ); |
| 182 | + registerKeywords( info ); |
| 183 | + } |
| 184 | + |
| 185 | + private static DatabaseVersion determineDatabaseVersion(DialectResolutionInfo info) { |
| 186 | + final Integer compatibilityLevel = getCompatibilityLevel( info ); |
| 187 | + if ( compatibilityLevel != null ) { |
| 188 | + final int majorVersion = compatibilityLevel / 10; |
| 189 | + final int minorVersion = compatibilityLevel % 10; |
| 190 | + return DatabaseVersion.make( majorVersion, minorVersion ); |
| 191 | + } |
| 192 | + return info.makeCopyOrDefault( MINIMUM_VERSION ); |
| 193 | + } |
| 194 | + |
| 195 | + private static Integer getCompatibilityLevel(DialectResolutionInfo info) { |
| 196 | + final DatabaseMetaData databaseMetaData = info.getDatabaseMetadata(); |
| 197 | + if ( databaseMetaData != null ) { |
| 198 | + try ( java.sql.Statement statement = databaseMetaData.getConnection().createStatement() ) { |
| 199 | + final ResultSet rs = statement.executeQuery( "SELECT compatibility_level FROM sys.databases where name = db_name();" ); |
| 200 | + if ( rs.next() ) { |
| 201 | + return rs.getInt( 1 ); |
| 202 | + } |
| 203 | + } |
| 204 | + catch (SQLException e) { |
| 205 | + throw BasicSQLExceptionConverter.INSTANCE.convert( e ); |
| 206 | + } |
| 207 | + } |
| 208 | + |
| 209 | + // default to the dialect-specific configuration setting |
| 210 | + return ConfigurationHelper.getInteger( SQL_SERVER_COMPATIBILITY_LEVEL, info.getConfigurationValues() ); |
179 | 211 | }
|
180 | 212 |
|
181 | 213 | private StandardSequenceExporter createSequenceExporter(DatabaseVersion version) {
|
|
0 commit comments