Skip to content

Commit bceb6b1

Browse files
committed
HHH-19494 use MERGE on Db2
and eliminate unnecessary use of anon function
1 parent f97aa74 commit bceb6b1

File tree

5 files changed

+43
-74
lines changed

5 files changed

+43
-74
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/DB2Dialect.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.hibernate.dialect.sequence.DB2SequenceSupport;
2727
import org.hibernate.dialect.sequence.SequenceSupport;
2828
import org.hibernate.dialect.sql.ast.DB2SqlAstTranslator;
29+
import org.hibernate.dialect.sql.ast.PostgreSQLSqlAstTranslator;
2930
import org.hibernate.dialect.type.DB2StructJdbcType;
3031
import org.hibernate.dialect.unique.AlterTableUniqueIndexDelegate;
3132
import org.hibernate.dialect.unique.UniqueDelegate;
@@ -45,6 +46,7 @@
4546
import org.hibernate.mapping.Table;
4647
import org.hibernate.metamodel.mapping.EntityMappingType;
4748
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
49+
import org.hibernate.persister.entity.mutation.EntityMutationTarget;
4850
import org.hibernate.procedure.internal.DB2CallableStatementSupport;
4951
import org.hibernate.procedure.spi.CallableStatementSupport;
5052
import org.hibernate.query.common.TemporalUnit;
@@ -63,6 +65,8 @@
6365
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
6466
import org.hibernate.sql.ast.tree.Statement;
6567
import org.hibernate.sql.exec.spi.JdbcOperation;
68+
import org.hibernate.sql.model.MutationOperation;
69+
import org.hibernate.sql.model.internal.OptionalTableUpdate;
6670
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorDB2DatabaseImpl;
6771
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorNoOpImpl;
6872
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
@@ -153,19 +157,18 @@ public class DB2Dialect extends Dialect {
153157
private static final String FOR_SHARE_SKIP_LOCKED_SQL = FOR_SHARE_SQL + SKIP_LOCKED_SQL;
154158
private static final String FOR_UPDATE_SKIP_LOCKED_SQL = FOR_UPDATE_SQL + SKIP_LOCKED_SQL;
155159

156-
private final LimitHandler limitHandler = getDB2Version().isBefore( 11, 1 )
157-
? LegacyDB2LimitHandler.INSTANCE
158-
: DB2LimitHandler.INSTANCE;
160+
private final LimitHandler limitHandler =
161+
getDB2Version().isBefore( 11, 1 )
162+
? LegacyDB2LimitHandler.INSTANCE
163+
: DB2LimitHandler.INSTANCE;
159164
private final UniqueDelegate uniqueDelegate = createUniqueDelegate();
160165
private final StandardTableExporter db2TableExporter = new StandardTableExporter( this ) {
161166
@Override
162167
protected void applyAggregateColumnCheck(StringBuilder buf, AggregateColumn aggregateColumn) {
163168
final JdbcType jdbcType = aggregateColumn.getType().getJdbcType();
164-
if ( jdbcType.isLob() || jdbcType.isXml() ) {
165-
// LOB or XML columns can't have check constraints
166-
return;
169+
if ( !jdbcType.isLob() && !jdbcType.isXml() ) { // LOB or XML columns can't have check constraints
170+
super.applyAggregateColumnCheck( buf, aggregateColumn );
167171
}
168-
super.applyAggregateColumnCheck( buf, aggregateColumn );
169172
}
170173
};
171174

@@ -174,7 +177,8 @@ public DB2Dialect() {
174177
}
175178

176179
public DB2Dialect(DialectResolutionInfo info) {
177-
super( info );
180+
this( info.makeCopyOrDefault( MINIMUM_VERSION ) );
181+
registerKeywords( info );
178182
}
179183

180184
public DB2Dialect(DatabaseVersion version) {
@@ -253,6 +257,14 @@ protected void registerColumnTypes(TypeContributions typeContributions, ServiceR
253257
);
254258
}
255259

260+
@Override
261+
public MutationOperation createOptionalTableUpdateOperation(
262+
EntityMutationTarget mutationTarget,
263+
OptionalTableUpdate optionalTableUpdate,
264+
SessionFactoryImplementor factory) {
265+
return new PostgreSQLSqlAstTranslator<>( factory, optionalTableUpdate )
266+
.createMergeOperation( optionalTableUpdate );
267+
}
256268
protected UniqueDelegate createUniqueDelegate() {
257269
return new AlterTableUniqueIndexDelegate( this );
258270
}

hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,6 @@ public class H2Dialect extends Dialect {
134134
private final String querySequenceString;
135135
private final UniqueDelegate uniqueDelegate = new CreateTableUniqueDelegate(this);
136136

137-
private final OptionalTableUpdateStrategy optionalTableUpdateStrategy;
138-
139137
public H2Dialect(DialectResolutionInfo info) {
140138
this( staticDetermineDatabaseVersion( info ) );
141139
registerKeywords( info );
@@ -159,7 +157,6 @@ public H2Dialect(DatabaseVersion version) {
159157

160158
this.sequenceInformationExtractor = SequenceInformationExtractorLegacyImpl.INSTANCE;
161159
this.querySequenceString = "select * from INFORMATION_SCHEMA.SEQUENCES";
162-
this.optionalTableUpdateStrategy = H2Dialect::usingMerge;
163160
}
164161

165162
@Override
@@ -169,11 +166,10 @@ public DatabaseVersion determineDatabaseVersion(DialectResolutionInfo info) {
169166

170167
// Static version necessary to call from constructor
171168
private static DatabaseVersion staticDetermineDatabaseVersion(DialectResolutionInfo info) {
172-
DatabaseVersion version = info.makeCopyOrDefault( MINIMUM_VERSION );
173-
if ( info.getDatabaseVersion() != null ) {
174-
version = DatabaseVersion.make( version.getMajor(), version.getMinor(), parseBuildId( info ) );
175-
}
176-
return version;
169+
final DatabaseVersion version = info.makeCopyOrDefault( MINIMUM_VERSION );
170+
return info.getDatabaseVersion() != null
171+
? DatabaseVersion.make( version.getMajor(), version.getMinor(), parseBuildId( info ) )
172+
: version;
177173
}
178174

179175
private static int parseBuildId(DialectResolutionInfo info) {
@@ -1012,28 +1008,13 @@ public int rowIdSqlType() {
10121008
return BIGINT;
10131009
}
10141010

1015-
@FunctionalInterface
1016-
private interface OptionalTableUpdateStrategy {
1017-
MutationOperation buildMutationOperation(
1018-
EntityMutationTarget mutationTarget,
1019-
OptionalTableUpdate optionalTableUpdate,
1020-
SessionFactoryImplementor factory);
1021-
}
1022-
10231011
@Override
10241012
public MutationOperation createOptionalTableUpdateOperation(
10251013
EntityMutationTarget mutationTarget,
10261014
OptionalTableUpdate optionalTableUpdate,
10271015
SessionFactoryImplementor factory) {
1028-
return optionalTableUpdateStrategy.buildMutationOperation( mutationTarget, optionalTableUpdate, factory );
1029-
}
1030-
1031-
private static MutationOperation usingMerge(
1032-
EntityMutationTarget mutationTarget,
1033-
OptionalTableUpdate optionalTableUpdate,
1034-
SessionFactoryImplementor factory) {
1035-
final H2SqlAstTranslator<?> translator = new H2SqlAstTranslator<>( factory, optionalTableUpdate );
1036-
return translator.createMergeOperation( optionalTableUpdate );
1016+
return new H2SqlAstTranslator<>( factory, optionalTableUpdate )
1017+
.createMergeOperation( optionalTableUpdate );
10371018
}
10381019

10391020
// private static MutationOperation withoutMerge(

hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@
8181
import org.hibernate.sql.exec.spi.JdbcOperation;
8282
import org.hibernate.sql.model.MutationOperation;
8383
import org.hibernate.sql.model.internal.OptionalTableUpdate;
84-
import org.hibernate.sql.model.jdbc.OptionalTableUpdateOperation;
8584
import org.hibernate.tool.schema.extract.spi.ColumnTypeInformation;
8685
import org.hibernate.tool.schema.internal.StandardTableExporter;
8786
import org.hibernate.tool.schema.spi.Exporter;
@@ -180,8 +179,8 @@ protected void applyAggregateColumnCheck(StringBuilder buf, AggregateColumn aggr
180179
};
181180

182181
protected final PostgreSQLDriverKind driverKind;
183-
private final OptionalTableUpdateStrategy optionalTableUpdateStrategy;
184182
private final ParameterMarkerStrategy parameterRenderer;
183+
private final boolean supportsMerge;
185184

186185
public PostgreSQLDialect() {
187186
this( MINIMUM_VERSION );
@@ -200,16 +199,11 @@ public PostgreSQLDialect(DatabaseVersion version, PostgreSQLDriverKind driverKin
200199
super( version );
201200

202201
this.driverKind = driverKind;
203-
this.optionalTableUpdateStrategy = determineOptionalTableUpdateStrategy( version );
204-
this.parameterRenderer = driverKind == PostgreSQLDriverKind.VERT_X
205-
? NativeParameterMarkers.INSTANCE
206-
: super.getNativeParameterMarkerStrategy();
207-
}
208-
209-
private static OptionalTableUpdateStrategy determineOptionalTableUpdateStrategy(DatabaseVersion version) {
210-
return version.isSameOrAfter( DatabaseVersion.make( 15, 0 ) )
211-
? PostgreSQLDialect::usingMerge
212-
: PostgreSQLDialect::withoutMerge;
202+
this.parameterRenderer =
203+
driverKind == PostgreSQLDriverKind.VERT_X
204+
? NativeParameterMarkers.INSTANCE
205+
: super.getNativeParameterMarkerStrategy();
206+
this.supportsMerge = version.isSameOrAfter( DatabaseVersion.make( 15, 0 ) );
213207
}
214208

215209
@Override
@@ -1582,35 +1576,18 @@ public String addSqlHintOrComment(String sql, QueryOptions queryOptions, boolean
15821576
return sql;
15831577
}
15841578

1585-
@FunctionalInterface
1586-
private interface OptionalTableUpdateStrategy {
1587-
MutationOperation buildMutationOperation(
1588-
EntityMutationTarget mutationTarget,
1589-
OptionalTableUpdate optionalTableUpdate,
1590-
SessionFactoryImplementor factory);
1591-
}
1592-
15931579
@Override
15941580
public MutationOperation createOptionalTableUpdateOperation(
15951581
EntityMutationTarget mutationTarget,
15961582
OptionalTableUpdate optionalTableUpdate,
15971583
SessionFactoryImplementor factory) {
1598-
return optionalTableUpdateStrategy.buildMutationOperation( mutationTarget, optionalTableUpdate, factory );
1599-
}
1600-
1601-
private static MutationOperation usingMerge(
1602-
EntityMutationTarget mutationTarget,
1603-
OptionalTableUpdate optionalTableUpdate,
1604-
SessionFactoryImplementor factory) {
1605-
final PostgreSQLSqlAstTranslator<?> translator = new PostgreSQLSqlAstTranslator<>( factory, optionalTableUpdate );
1606-
return translator.createMergeOperation( optionalTableUpdate );
1607-
}
1608-
1609-
private static MutationOperation withoutMerge(
1610-
EntityMutationTarget mutationTarget,
1611-
OptionalTableUpdate optionalTableUpdate,
1612-
SessionFactoryImplementor factory) {
1613-
return new OptionalTableUpdateOperation( mutationTarget, optionalTableUpdate, factory );
1584+
if ( supportsMerge ) {
1585+
return new PostgreSQLSqlAstTranslator<>( factory, optionalTableUpdate )
1586+
.createMergeOperation( optionalTableUpdate );
1587+
}
1588+
else {
1589+
return super.createOptionalTableUpdateOperation( mutationTarget, optionalTableUpdate, factory );
1590+
}
16141591
}
16151592

16161593
@Override

hibernate-core/src/main/java/org/hibernate/dialect/SQLServerDialect.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,9 +1200,8 @@ public MutationOperation createOptionalTableUpdateOperation(
12001200
EntityMutationTarget mutationTarget,
12011201
OptionalTableUpdate optionalTableUpdate,
12021202
SessionFactoryImplementor factory) {
1203-
final SQLServerSqlAstTranslator<JdbcOperation> translator =
1204-
new SQLServerSqlAstTranslator<>( factory, optionalTableUpdate );
1205-
return translator.createMergeOperation( optionalTableUpdate );
1203+
return new SQLServerSqlAstTranslator<>( factory, optionalTableUpdate )
1204+
.createMergeOperation( optionalTableUpdate );
12061205
}
12071206

12081207
@Override

hibernate-core/src/main/java/org/hibernate/dialect/sql/ast/DB2SqlAstTranslator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import org.hibernate.query.common.FetchClauseType;
2020
import org.hibernate.sql.ast.Clause;
2121
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
22-
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
22+
import org.hibernate.sql.ast.spi.SqlAstTranslatorWithMerge;
2323
import org.hibernate.sql.ast.spi.SqlSelection;
2424
import org.hibernate.sql.ast.tree.MutationStatement;
2525
import org.hibernate.sql.ast.tree.SqlAstNode;
@@ -60,7 +60,7 @@
6060
*
6161
* @author Christian Beikov
6262
*/
63-
public class DB2SqlAstTranslator<T extends JdbcOperation> extends AbstractSqlAstTranslator<T> {
63+
public class DB2SqlAstTranslator<T extends JdbcOperation> extends SqlAstTranslatorWithMerge<T> {
6464

6565
// We have to track whether we are in a later query for applying lateral during window emulation
6666
private boolean inLateral;

0 commit comments

Comments
 (0)