mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-02-27 14:30:16 +00:00
HHH-15046: handle db2 luw and db2z/i version differently
This commit is contained in:
parent
d9bae6f31e
commit
ff09336594
@ -6,6 +6,7 @@
|
||||
*/
|
||||
package org.hibernate.dialect;
|
||||
|
||||
import jakarta.persistence.TemporalType;
|
||||
import org.hibernate.LockOptions;
|
||||
import org.hibernate.boot.model.TypeContributions;
|
||||
import org.hibernate.dialect.function.CommonFunctionFactory;
|
||||
@ -54,13 +55,7 @@
|
||||
import org.hibernate.type.descriptor.jdbc.*;
|
||||
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry;
|
||||
|
||||
import java.sql.CallableStatement;
|
||||
import java.sql.DatabaseMetaData;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Types;
|
||||
|
||||
import jakarta.persistence.TemporalType;
|
||||
import java.sql.*;
|
||||
|
||||
import static org.hibernate.type.SqlTypes.*;
|
||||
|
||||
@ -80,7 +75,7 @@ public class DB2Dialect extends Dialect {
|
||||
private static final String FOR_SHARE_SKIP_LOCKED_SQL = FOR_SHARE_SQL + SKIP_LOCKED_SQL;
|
||||
private static final String FOR_UPDATE_SKIP_LOCKED_SQL = FOR_UPDATE_SQL + SKIP_LOCKED_SQL;
|
||||
|
||||
private final LimitHandler limitHandler = getVersion().isBefore( 11, 1 )
|
||||
private final LimitHandler limitHandler = getDB2Version().isBefore( 11, 1 )
|
||||
? LegacyDB2LimitHandler.INSTANCE
|
||||
: DB2LimitHandler.INSTANCE;
|
||||
private final UniqueDelegate uniqueDelegate = createUniqueDelegate();
|
||||
@ -112,6 +107,13 @@ private void registerDB2Keywords() {
|
||||
registerKeyword( "only" );
|
||||
}
|
||||
|
||||
/**
|
||||
* DB2 LUW Version
|
||||
*/
|
||||
public DatabaseVersion getDB2Version() {
|
||||
return this.getVersion();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDefaultStatementBatchSize() {
|
||||
return 0;
|
||||
@ -119,7 +121,7 @@ public int getDefaultStatementBatchSize() {
|
||||
|
||||
@Override
|
||||
protected String columnType(int jdbcTypeCode) {
|
||||
if ( getVersion().isBefore( 11 ) ) {
|
||||
if ( getDB2Version().isBefore( 11 ) ) {
|
||||
switch (jdbcTypeCode) {
|
||||
case BOOLEAN:
|
||||
// prior to DB2 11, the 'boolean' type existed,
|
||||
@ -156,7 +158,7 @@ protected String columnType(int jdbcTypeCode) {
|
||||
protected void registerDefaultColumnTypes() {
|
||||
// Note: the 'long varchar' data type was deprecated in DB2 and shouldn't be used anymore
|
||||
super.registerDefaultColumnTypes();
|
||||
if ( getVersion().isBefore( 11 ) ) {
|
||||
if ( getDB2Version().isBefore( 11 ) ) {
|
||||
// should use 'binary' since version 11
|
||||
registerColumnType( BINARY, 254, "char($l) for bit data" );
|
||||
}
|
||||
@ -365,7 +367,7 @@ public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType,
|
||||
|
||||
@Override
|
||||
public String getLowercaseFunction() {
|
||||
return getVersion().isBefore( 9, 7 ) ? "lcase" : super.getLowercaseFunction();
|
||||
return getDB2Version().isBefore( 9, 7 ) ? "lcase" : super.getLowercaseFunction();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -375,7 +377,7 @@ public boolean dropConstraints() {
|
||||
|
||||
@Override
|
||||
public SequenceSupport getSequenceSupport() {
|
||||
return getVersion().isBefore( 9, 7 )
|
||||
return getDB2Version().isBefore( 9, 7 )
|
||||
? LegacyDB2SequenceSupport.INSTANCE
|
||||
: DB2SequenceSupport.INSTANCE;
|
||||
}
|
||||
@ -403,7 +405,7 @@ public String getForUpdateString() {
|
||||
@Override
|
||||
public boolean supportsSkipLocked() {
|
||||
// Introduced in 11.5: https://www.ibm.com/docs/en/db2/11.5?topic=statement-concurrent-access-resolution-clause
|
||||
return getVersion().isSameOrAfter( 11, 5 );
|
||||
return getDB2Version().isSameOrAfter( 11, 5 );
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -560,11 +562,11 @@ public void contributeTypes(TypeContributions typeContributions, ServiceRegistry
|
||||
|
||||
final JdbcTypeRegistry jdbcTypeRegistry = typeContributions.getTypeConfiguration().getJdbcTypeRegistry();
|
||||
|
||||
if ( getVersion().isBefore( 11 ) ) {
|
||||
if ( getDB2Version().isBefore( 11 ) ) {
|
||||
jdbcTypeRegistry.addDescriptor( Types.BOOLEAN, SmallIntJdbcType.INSTANCE );
|
||||
// Binary literals were only added in 11. See https://www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000731.html#d79816e393
|
||||
jdbcTypeRegistry.addDescriptor( Types.VARBINARY, VarbinaryJdbcType.INSTANCE_WITHOUT_LITERALS );
|
||||
if ( getVersion().isBefore( 9, 7 ) ) {
|
||||
if ( getDB2Version().isBefore( 9, 7 ) ) {
|
||||
jdbcTypeRegistry.addDescriptor( Types.NUMERIC, DecimalJdbcType.INSTANCE );
|
||||
}
|
||||
}
|
||||
@ -680,7 +682,7 @@ public boolean supportsWindowFunctions() {
|
||||
|
||||
@Override
|
||||
public boolean supportsLateral() {
|
||||
return getVersion().isSameOrAfter( 9, 1 );
|
||||
return getDB2Version().isSameOrAfter( 9, 1 );
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -702,7 +704,7 @@ public String translateExtractField(TemporalUnit unit) {
|
||||
|
||||
@Override
|
||||
public void appendBooleanValueString(SqlAppender appender, boolean bool) {
|
||||
if ( getVersion().isBefore( 11 ) ) {
|
||||
if ( getDB2Version().isBefore( 11 ) ) {
|
||||
appender.appendSql( bool ? '1' : '0' );
|
||||
}
|
||||
else {
|
||||
|
@ -6,9 +6,6 @@
|
||||
*/
|
||||
package org.hibernate.dialect;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||
import org.hibernate.query.sqm.ComparisonOperator;
|
||||
import org.hibernate.query.sqm.FetchClauseType;
|
||||
@ -18,13 +15,7 @@
|
||||
import org.hibernate.sql.ast.tree.MutationStatement;
|
||||
import org.hibernate.sql.ast.tree.Statement;
|
||||
import org.hibernate.sql.ast.tree.delete.DeleteStatement;
|
||||
import org.hibernate.sql.ast.tree.expression.CaseSearchedExpression;
|
||||
import org.hibernate.sql.ast.tree.expression.CaseSimpleExpression;
|
||||
import org.hibernate.sql.ast.tree.expression.ColumnReference;
|
||||
import org.hibernate.sql.ast.tree.expression.Expression;
|
||||
import org.hibernate.sql.ast.tree.expression.Literal;
|
||||
import org.hibernate.sql.ast.tree.expression.SqlTuple;
|
||||
import org.hibernate.sql.ast.tree.expression.Summarization;
|
||||
import org.hibernate.sql.ast.tree.expression.*;
|
||||
import org.hibernate.sql.ast.tree.insert.InsertStatement;
|
||||
import org.hibernate.sql.ast.tree.predicate.BooleanExpressionPredicate;
|
||||
import org.hibernate.sql.ast.tree.select.QueryGroup;
|
||||
@ -33,6 +24,9 @@
|
||||
import org.hibernate.sql.ast.tree.update.UpdateStatement;
|
||||
import org.hibernate.sql.exec.spi.JdbcOperation;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* A SQL AST translator for DB2.
|
||||
*
|
||||
@ -51,7 +45,7 @@ protected void renderExpressionAsClauseItem(Expression expression) {
|
||||
|
||||
@Override
|
||||
public void visitBooleanExpressionPredicate(BooleanExpressionPredicate booleanExpressionPredicate) {
|
||||
if ( getDialect().getVersion().isSameOrAfter( 11 ) ) {
|
||||
if ( getDialectVersion().isSameOrAfter( 11 ) ) {
|
||||
booleanExpressionPredicate.getExpression().accept( this );
|
||||
}
|
||||
else {
|
||||
@ -132,12 +126,12 @@ protected boolean shouldEmulateFetchClause(QueryPart queryPart) {
|
||||
// Check if current query part is already row numbering to avoid infinite recursion
|
||||
return getQueryPartForRowNumbering() != queryPart && (
|
||||
useOffsetFetchClause( queryPart ) && !isRowsOnlyFetchClauseType( queryPart )
|
||||
|| getDialect().getVersion().isBefore( 11, 1 ) && ( queryPart.isRoot() && hasLimit() || !( queryPart.getFetchClauseExpression() instanceof Literal ) )
|
||||
|| getDialectVersion().isBefore( 11, 1 ) && ( queryPart.isRoot() && hasLimit() || !( queryPart.getFetchClauseExpression() instanceof Literal ) )
|
||||
);
|
||||
}
|
||||
|
||||
protected boolean supportsOffsetClause() {
|
||||
return getDialect().getVersion().isSameOrAfter( 11, 1 );
|
||||
return getDialectVersion().isSameOrAfter( 11, 1 );
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -228,7 +222,7 @@ protected boolean renderReturningClause(MutationStatement statement) {
|
||||
|
||||
@Override
|
||||
protected void renderComparison(Expression lhs, ComparisonOperator operator, Expression rhs) {
|
||||
if ( getDialect().getVersion().isSameOrAfter( 11, 1 ) ) {
|
||||
if ( getDialectVersion().isSameOrAfter( 11, 1 ) ) {
|
||||
renderComparisonStandard( lhs, operator, rhs );
|
||||
}
|
||||
else {
|
||||
@ -296,4 +290,12 @@ protected void visitReturningColumns(MutationStatement mutationStatement) {
|
||||
// For DB2 we use #renderReturningClause to render a wrapper around the DML statement
|
||||
}
|
||||
|
||||
private DatabaseVersion getDialectVersion() {
|
||||
final var dialect = getDialect();
|
||||
if (dialect instanceof DB2Dialect) {
|
||||
return ((DB2Dialect) dialect).getDB2Version();
|
||||
}
|
||||
return dialect.getVersion();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -46,6 +46,11 @@ public DB2iDialect(DatabaseVersion version) {
|
||||
super(version);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseVersion getDB2Version() {
|
||||
return DatabaseVersion.make(9, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected UniqueDelegate createUniqueDelegate() {
|
||||
return getVersion().isSameOrAfter(7, 3)
|
||||
|
@ -7,7 +7,6 @@
|
||||
package org.hibernate.dialect;
|
||||
|
||||
import jakarta.persistence.TemporalType;
|
||||
|
||||
import org.hibernate.dialect.identity.DB2390IdentityColumnSupport;
|
||||
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
||||
import org.hibernate.dialect.pagination.FetchLimitHandler;
|
||||
@ -57,6 +56,11 @@ protected String columnType(int jdbcTypeCode) {
|
||||
return super.columnType(jdbcTypeCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseVersion getDB2Version() {
|
||||
return DatabaseVersion.make(9, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TimeZoneSupport getTimeZoneSupport() {
|
||||
return getVersion().isAfter(10) ? TimeZoneSupport.NATIVE : TimeZoneSupport.NONE;
|
||||
|
Loading…
x
Reference in New Issue
Block a user