Skip to content

Commit 54278c5

Browse files
committed
[#1546] Replace SqlServerDialect version
When using a dialect for SqlServer with version higher or equal to 11, Vert.x cannot run the query for retrieving the information about the sequences. While we wait for the bug to be fixed, we rely on the dialect version 10.
1 parent 2977b0d commit 54278c5

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/logging/impl/Log.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.hibernate.HibernateException;
1515
import org.hibernate.LazyInitializationException;
1616
import org.hibernate.cache.CacheException;
17+
import org.hibernate.dialect.Dialect;
1718
import org.hibernate.id.IdentifierGenerationException;
1819

1920
import org.jboss.logging.BasicLogger;
@@ -284,6 +285,10 @@ public interface Log extends BasicLogger {
284285
@Message(id = 353, value = "Could not release a cache lock : %s" )
285286
void unableToReleaseCacheLock(CacheException ce);
286287

288+
@LogMessage(level = WARN)
289+
@Message(id = 400, value= "Changing dialect '%1$s' to '%2$s'")
290+
void replacingDialect(Dialect from, Dialect to);
291+
287292
// Same method that exists in CoreMessageLogger
288293
@LogMessage(level = WARN)
289294
@Message(id = 447, value= "Explicit use of UPGRADE_SKIPLOCKED in lock() calls is not recommended; use normal UPGRADE locking instead")

hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/NoJdbcEnvironmentInitiator.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,15 @@
99
import java.util.concurrent.CompletionStage;
1010

1111
import org.hibernate.boot.registry.StandardServiceInitiator;
12+
import org.hibernate.dialect.DatabaseVersion;
1213
import org.hibernate.dialect.Dialect;
14+
import org.hibernate.dialect.SQLServerDialect;
1315
import org.hibernate.engine.jdbc.dialect.spi.DialectFactory;
1416
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
1517
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
1618
import org.hibernate.reactive.engine.jdbc.env.internal.ReactiveJdbcEnvironment;
19+
import org.hibernate.reactive.logging.impl.Log;
20+
import org.hibernate.reactive.logging.impl.LogCategory;
1721
import org.hibernate.reactive.pool.ReactiveConnection;
1822
import org.hibernate.reactive.pool.ReactiveConnectionPool;
1923
import org.hibernate.reactive.provider.Settings;
@@ -23,6 +27,7 @@
2327

2428
import io.vertx.sqlclient.spi.DatabaseMetadata;
2529

30+
import static org.hibernate.reactive.logging.impl.LoggerFactory.make;
2631
import static org.hibernate.reactive.util.impl.CompletionStages.failedFuture;
2732

2833
/**
@@ -32,6 +37,11 @@
3237
*/
3338
public class NoJdbcEnvironmentInitiator implements StandardServiceInitiator<JdbcEnvironment> {
3439

40+
/**
41+
* I'm using the same logger category used in {@link org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl}
42+
*/
43+
private static final Log LOG = make( Log.class, new LogCategory( "SQL dialect" ) );
44+
3545
public static final NoJdbcEnvironmentInitiator INSTANCE = new NoJdbcEnvironmentInitiator();
3646

3747
@Override
@@ -63,7 +73,25 @@ public DialectBuilder(Map<String, Object> configurationValues, ServiceRegistry r
6373

6474
public Dialect build() {
6575
DialectFactory dialectFactory = registry.getService( DialectFactory.class );
66-
return dialectFactory.buildDialect( configurationValues, this::dialectResolutionInfo );
76+
Dialect dialect = dialectFactory.buildDialect( configurationValues, this::dialectResolutionInfo );
77+
dialect = checkDialect( dialect );
78+
return dialect;
79+
}
80+
81+
/**
82+
* Workaround for <a href="https://github.com/eclipse-vertx/vertx-sql-client/issues/1312">vertx-sql-client#1312</a>
83+
* <p>
84+
* For extracting the information about sequences, the Sql Server dialect 11+ uses the following query:
85+
* <pre>{@code select * from INFORMATION_SCHEMA.SEQUENCES}</pre>
86+
* But, the Vert.x MSSQL client throws an exception when running it.
87+
*/
88+
private static Dialect checkDialect(Dialect dialect) {
89+
if ( dialect instanceof SQLServerDialect && dialect.getVersion().isSameOrAfter( 11 ) ) {
90+
SQLServerDialect sqlServerDialect = new SQLServerDialect( DatabaseVersion.make( 10 ) );
91+
LOG.replacingDialect( dialect, sqlServerDialect );
92+
return sqlServerDialect;
93+
}
94+
return dialect;
6795
}
6896

6997
private DialectResolutionInfo dialectResolutionInfo() {

0 commit comments

Comments
 (0)