Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,15 @@ public class StaleStateException extends HibernateException {
public StaleStateException(String message) {
super( message );
}

/**
* Constructs a {@code StaleStateException} using the supplied message
* and cause.
*
* @param message The message explaining the exception condition
* @param cause An exception to wrap
*/
public StaleStateException(String message, Exception cause) {
super( message, cause );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.JdbcExceptionHelper;
import org.hibernate.internal.util.config.ConfigurationHelper;
import org.hibernate.persister.entity.mutation.EntityMutationTarget;
import org.hibernate.query.SemanticException;
import org.hibernate.query.sqm.IntervalType;
import org.hibernate.query.sqm.TemporalUnit;
Expand All @@ -59,6 +60,9 @@
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
import org.hibernate.sql.ast.tree.Statement;
import org.hibernate.sql.exec.spi.JdbcOperation;
import org.hibernate.sql.model.MutationOperation;
import org.hibernate.sql.model.internal.OptionalTableUpdate;
import org.hibernate.sql.model.jdbc.OptionalTableUpdateWithUpsertOperation;
import org.hibernate.tool.schema.extract.spi.ColumnTypeInformation;
import org.hibernate.type.JavaObjectType;
import org.hibernate.type.descriptor.jdbc.BlobJdbcType;
Expand Down Expand Up @@ -658,6 +662,14 @@ protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(
};
}

@Override
public MutationOperation createOptionalTableUpdateOperation(
EntityMutationTarget mutationTarget,
OptionalTableUpdate optionalTableUpdate,
SessionFactoryImplementor factory) {
return new OptionalTableUpdateWithUpsertOperation( mutationTarget, optionalTableUpdate, factory );
}

@Override
public NationalizationSupport getNationalizationSupport() {
// TEXT / STRING inherently support nationalized data
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
import org.hibernate.sql.exec.internal.JdbcOperationQueryInsertImpl;
import org.hibernate.sql.exec.spi.JdbcOperation;
import org.hibernate.sql.exec.spi.JdbcOperationQueryInsert;
import org.hibernate.sql.model.internal.OptionalTableInsert;
import org.hibernate.sql.model.internal.TableInsertStandard;

/**
* A SQL AST translator for Cockroach.
Expand All @@ -49,6 +51,40 @@ public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeti
super.visitBinaryArithmeticExpression(arithmeticExpression);
}

@Override
public void visitStandardTableInsert(TableInsertStandard tableInsert) {
getCurrentClauseStack().push( Clause.INSERT );
try {
renderInsertInto( tableInsert );
if ( tableInsert instanceof OptionalTableInsert ) {
final OptionalTableInsert optionalTableInsert = (OptionalTableInsert) tableInsert;
appendSql( " on conflict " );
final String constraintName = optionalTableInsert.getConstraintName();
if ( constraintName != null ) {
appendSql( " on constraint " );
appendSql( constraintName );
}
else {
char separator = '(';
for ( String constraintColumnName : optionalTableInsert.getConstraintColumnNames() ) {
appendSql( separator );
appendSql( constraintColumnName );
separator = ',';
}
appendSql( ')' );
}
appendSql( " do nothing" );
}

if ( tableInsert.getNumberOfReturningColumns() > 0 ) {
visitReturningColumns( tableInsert::getReturningColumns );
}
}
finally {
getCurrentClauseStack().pop();
}
}

@Override
protected JdbcOperationQueryInsert translateInsert(InsertSelectStatement sqlAst) {
visitInsertStatement( sqlAst );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
import org.hibernate.sql.exec.spi.JdbcOperation;
import org.hibernate.sql.model.MutationOperation;
import org.hibernate.sql.model.internal.OptionalTableUpdate;
import org.hibernate.sql.model.jdbc.OptionalTableUpdateOperation;
import org.hibernate.sql.model.jdbc.OptionalTableUpdateWithUpsertOperation;
import org.hibernate.tool.schema.extract.spi.ColumnTypeInformation;
import org.hibernate.type.JavaObjectType;
import org.hibernate.type.descriptor.java.PrimitiveByteArrayJavaType;
Expand Down Expand Up @@ -1594,7 +1594,7 @@ private static MutationOperation withoutMerge(
EntityMutationTarget mutationTarget,
OptionalTableUpdate optionalTableUpdate,
SessionFactoryImplementor factory) {
return new OptionalTableUpdateOperation( mutationTarget, optionalTableUpdate, factory );
return new OptionalTableUpdateWithUpsertOperation( mutationTarget, optionalTableUpdate, factory );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.hibernate.sql.exec.internal.JdbcOperationQueryInsertImpl;
import org.hibernate.sql.exec.spi.JdbcOperation;
import org.hibernate.sql.exec.spi.JdbcOperationQueryInsert;
import org.hibernate.sql.model.internal.OptionalTableInsert;
import org.hibernate.sql.model.internal.TableInsertStandard;
import org.hibernate.type.SqlTypes;

Expand Down Expand Up @@ -60,6 +61,40 @@ protected String getArrayContainsFunction() {
return super.getArrayContainsFunction();
}

@Override
public void visitStandardTableInsert(TableInsertStandard tableInsert) {
getCurrentClauseStack().push( Clause.INSERT );
try {
renderInsertInto( tableInsert );
if ( tableInsert instanceof OptionalTableInsert ) {
final OptionalTableInsert optionalTableInsert = (OptionalTableInsert) tableInsert;
appendSql( " on conflict " );
final String constraintName = optionalTableInsert.getConstraintName();
if ( constraintName != null ) {
appendSql( " on constraint " );
appendSql( constraintName );
}
else {
char separator = '(';
for ( String constraintColumnName : optionalTableInsert.getConstraintColumnNames() ) {
appendSql( separator );
appendSql( constraintColumnName );
separator = ',';
}
appendSql( ')' );
}
appendSql( " do nothing" );
}

if ( tableInsert.getNumberOfReturningColumns() > 0 ) {
visitReturningColumns( tableInsert::getReturningColumns );
}
}
finally {
getCurrentClauseStack().pop();
}
}

@Override
protected void renderInsertIntoNoColumns(TableInsertStandard tableInsert) {
renderIntoIntoAndTable( tableInsert );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import org.hibernate.dialect.function.CommonFunctionFactory;
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.persister.entity.mutation.EntityMutationTarget;
import org.hibernate.query.sqm.CastType;
import org.hibernate.query.sqm.TemporalUnit;
import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers;
Expand All @@ -24,9 +23,6 @@
import org.hibernate.sql.ast.tree.Statement;
import org.hibernate.sql.ast.tree.expression.BinaryArithmeticExpression;
import org.hibernate.sql.exec.spi.JdbcOperation;
import org.hibernate.sql.model.MutationOperation;
import org.hibernate.sql.model.internal.OptionalTableUpdate;
import org.hibernate.sql.model.jdbc.OptionalTableUpdateOperation;

import jakarta.persistence.TemporalType;

Expand Down Expand Up @@ -136,16 +132,6 @@ public String getSelectGUIDString() {
return "select uuid_generate_v1";
}

@Override
public MutationOperation createOptionalTableUpdateOperation(
EntityMutationTarget mutationTarget,
OptionalTableUpdate optionalTableUpdate,
SessionFactoryImplementor factory) {
// Postgres Plus does not support full merge semantics -
// https://www.enterprisedb.com/docs/migrating/oracle/oracle_epas_comparison/notable_differences/
return new OptionalTableUpdateOperation( mutationTarget, optionalTableUpdate, factory );
}

@Override
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
return new StandardSqlAstTranslatorFactory() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
import org.hibernate.jdbc.Expectation;
import org.hibernate.sql.ast.tree.Statement;
import org.hibernate.sql.exec.spi.JdbcOperation;
import org.hibernate.sql.model.ast.ColumnValueBinding;
Expand Down Expand Up @@ -46,6 +47,10 @@ public MergeOperation createMergeOperation(OptionalTableUpdate optionalTableUpda
optionalTableUpdate.getMutatingTable().getTableMapping(),
optionalTableUpdate.getMutationTarget(),
getSql(),
// Without value bindings, the upsert may have an update count of 0
optionalTableUpdate.getValueBindings().isEmpty()
? new Expectation.OptionalRowCount()
: new Expectation.RowCount(),
getParameterBinders()
);
}
Expand Down Expand Up @@ -228,16 +233,18 @@ protected void renderMergeUpdate(OptionalTableUpdate optionalTableUpdate) {
final List<ColumnValueBinding> valueBindings = optionalTableUpdate.getValueBindings();
final List<ColumnValueBinding> optimisticLockBindings = optionalTableUpdate.getOptimisticLockBindings();

renderWhenMatched( optimisticLockBindings );
appendSql( " then update set " );
for ( int i = 0; i < valueBindings.size(); i++ ) {
final ColumnValueBinding binding = valueBindings.get( i );
if ( i > 0 ) {
appendSql( ", " );
if ( !valueBindings.isEmpty() ) {
renderWhenMatched( optimisticLockBindings );
appendSql( " then update set " );
for ( int i = 0; i < valueBindings.size(); i++ ) {
final ColumnValueBinding binding = valueBindings.get( i );
if ( i > 0 ) {
appendSql( ", " );
}
binding.getColumnReference().appendColumnForWrite( this, null );
appendSql( "=" );
binding.getColumnReference().appendColumnForWrite( this, "s" );
}
binding.getColumnReference().appendColumnForWrite( this, null );
appendSql( "=" );
binding.getColumnReference().appendColumnForWrite( this, "s" );
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.List;

import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.jdbc.Expectation;
import org.hibernate.persister.entity.mutation.EntityTableMapping;
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
import org.hibernate.sql.ast.tree.Statement;
Expand Down Expand Up @@ -39,6 +40,10 @@ public MutationOperation createMergeOperation(OptionalTableUpdate optionalTableU
optionalTableUpdate.getMutatingTable().getTableMapping(),
optionalTableUpdate.getMutationTarget(),
getSql(),
// Without value bindings, the upsert may have an update count of 0
optionalTableUpdate.getValueBindings().isEmpty()
? new Expectation.OptionalRowCount()
: new Expectation.RowCount(),
getParameterBinders()
);

Expand Down Expand Up @@ -193,17 +198,19 @@ protected void renderMergeUpdate(OptionalTableUpdate optionalTableUpdate) {
final List<ColumnValueBinding> valueBindings = optionalTableUpdate.getValueBindings();
final List<ColumnValueBinding> optimisticLockBindings = optionalTableUpdate.getOptimisticLockBindings();

appendSql( " when matched then update set " );
for ( int i = 0; i < valueBindings.size(); i++ ) {
final ColumnValueBinding binding = valueBindings.get( i );
if ( i > 0 ) {
appendSql( ", " );
if ( !valueBindings.isEmpty() ) {
appendSql( " when matched then update set " );
for ( int i = 0; i < valueBindings.size(); i++ ) {
final ColumnValueBinding binding = valueBindings.get( i );
if ( i > 0 ) {
appendSql( ", " );
}
binding.getColumnReference().appendColumnForWrite( this, "t" );
appendSql( "=" );
binding.getColumnReference().appendColumnForWrite( this, "s" );
}
binding.getColumnReference().appendColumnForWrite( this, "t" );
appendSql( "=" );
binding.getColumnReference().appendColumnForWrite( this, "s" );
renderMatchedWhere( optimisticLockBindings );
}
renderMatchedWhere( optimisticLockBindings );
}

private void renderMatchedWhere(List<ColumnValueBinding> optimisticLockBindings) {
Expand Down
Loading
Loading