Skip to content

Commit f178f0f

Browse files
committed
try using MERGE on Db2
1 parent 7bae44e commit f178f0f

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

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

Lines changed: 43 additions & 1 deletion
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,9 @@
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;
70+
import org.hibernate.sql.model.jdbc.OptionalTableUpdateOperation;
6671
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorDB2DatabaseImpl;
6772
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorNoOpImpl;
6873
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
@@ -169,16 +174,20 @@ protected void applyAggregateColumnCheck(StringBuilder buf, AggregateColumn aggr
169174
}
170175
};
171176

177+
private final OptionalTableUpdateStrategy optionalTableUpdateStrategy;
178+
172179
public DB2Dialect() {
173180
this( MINIMUM_VERSION );
174181
}
175182

176183
public DB2Dialect(DialectResolutionInfo info) {
177-
super( info );
184+
this( info.makeCopyOrDefault( MINIMUM_VERSION ) );
185+
registerKeywords( info );
178186
}
179187

180188
public DB2Dialect(DatabaseVersion version) {
181189
super( version );
190+
optionalTableUpdateStrategy = DB2Dialect::usingMerge;
182191
}
183192

184193
@Override
@@ -253,6 +262,39 @@ protected void registerColumnTypes(TypeContributions typeContributions, ServiceR
253262
);
254263
}
255264

265+
@FunctionalInterface
266+
private interface OptionalTableUpdateStrategy {
267+
MutationOperation buildMutationOperation(
268+
EntityMutationTarget mutationTarget,
269+
OptionalTableUpdate optionalTableUpdate,
270+
SessionFactoryImplementor factory);
271+
}
272+
273+
@Override
274+
public MutationOperation createOptionalTableUpdateOperation(
275+
EntityMutationTarget mutationTarget,
276+
OptionalTableUpdate optionalTableUpdate,
277+
SessionFactoryImplementor factory) {
278+
return optionalTableUpdateStrategy.buildMutationOperation( mutationTarget, optionalTableUpdate, factory );
279+
}
280+
281+
private static MutationOperation usingMerge(
282+
EntityMutationTarget mutationTarget,
283+
OptionalTableUpdate optionalTableUpdate,
284+
SessionFactoryImplementor factory) {
285+
final PostgreSQLSqlAstTranslator<?> translator = new PostgreSQLSqlAstTranslator<>( factory, optionalTableUpdate );
286+
return translator.createMergeOperation( optionalTableUpdate );
287+
}
288+
289+
private static MutationOperation withoutMerge(
290+
EntityMutationTarget mutationTarget,
291+
OptionalTableUpdate optionalTableUpdate,
292+
SessionFactoryImplementor factory) {
293+
return new OptionalTableUpdateOperation( mutationTarget, optionalTableUpdate, factory );
294+
}
295+
296+
297+
256298
protected UniqueDelegate createUniqueDelegate() {
257299
return new AlterTableUniqueIndexDelegate( this );
258300
}

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)