|
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