HHH-15046: handle db2 luw and db2z/i version differently

This commit is contained in:
Atgoogat 2022-01-21 15:03:30 +01:00 committed by Christian Beikov
parent d9bae6f31e
commit ff09336594
4 changed files with 45 additions and 32 deletions

View File

@ -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 {

View File

@ -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();
}
}

View File

@ -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)

View File

@ -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;