From 22ed4793b9bccec71e0f99abea1796aa7e730ca3 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Tue, 26 Sep 2023 15:45:04 +0200 Subject: [PATCH] HHH-17242 Partly revert original solution to retain correct expression types --- .../dialect/OracleLegacyDialect.java | 26 ++++++------------- .../java/org/hibernate/dialect/Dialect.java | 16 ------------ .../dialect/DialectDelegateWrapper.java | 19 -------------- .../org/hibernate/dialect/OracleDialect.java | 26 ++++++------------- .../function/TimestampaddFunction.java | 17 ++---------- 5 files changed, 18 insertions(+), 86 deletions(-) diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/OracleLegacyDialect.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/OracleLegacyDialect.java index 25874915e401..4806052e79c1 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/OracleLegacyDialect.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/OracleLegacyDialect.java @@ -473,15 +473,6 @@ public String extractPattern(TemporalUnit unit) { @Override public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType) { - return timestampaddPattern( unit, temporalType, intervalType, false ); - } - - @Override - public String timestampaddPattern( - TemporalUnit unit, - TemporalType temporalType, - IntervalType intervalType, - boolean hasTimeZone) { final StringBuilder pattern = new StringBuilder(); switch ( unit ) { case YEAR: @@ -494,23 +485,22 @@ public String timestampaddPattern( pattern.append( ADD_MONTH_EXPRESSION ); break; case WEEK: - if ( hasTimeZone ) { - pattern.append( "(?3+numtodsinterval(?2*7,'day'))" ); + if ( temporalType != TemporalType.DATE ) { + pattern.append( "(?3+numtodsinterval((?2)*7,'day'))" ); } else { - pattern.append( "(?3+?2" ).append( unit.conversionFactor( DAY, this ) ).append( ")" ); + pattern.append( "(?3+(?2)" ).append( unit.conversionFactor( DAY, this ) ).append( ")" ); } break; case DAY: + if ( temporalType == TemporalType.DATE ) { + pattern.append( "(?3+(?2))" ); + break; + } case HOUR: case MINUTE: case SECOND: - if ( hasTimeZone ) { - pattern.append( "(?3+numtodsinterval(?2,'?1'))" ); - } - else { - pattern.append( "(?3+?2" ).append( unit.conversionFactor( DAY, this ) ).append( ")" ); - } + pattern.append( "(?3+numtodsinterval(?2,'?1'))" ); break; case NANOSECOND: pattern.append( "(?3+numtodsinterval((?2)/1e9,'second'))" ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java index e55f5348488e..2ff97b578166 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java @@ -1441,22 +1441,6 @@ public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalT * @param temporalType The type of the temporal * @param intervalType The type of interval to add or null if it's not a native interval */ - public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType, boolean withTimeZone) { - return timestampaddPattern( unit, temporalType, intervalType ); - } - - /** - * Obtain a pattern for the SQL equivalent to a - * {@code timestampadd()} function call. The resulting - * pattern must contain ?1, ?2, and ?3 placeholders - * for the arguments. - * - * @param unit The unit to add to the temporal - * @param temporalType The type of the temporal - * @param intervalType The type of interval to add or null if it's not a native interval - * @deprecated use {@link #timestampaddPattern(TemporalUnit, TemporalType, IntervalType, boolean)} instead - */ - @Deprecated public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType) { throw new UnsupportedOperationException( "`" + getClass().getName() + "` does not yet support #timestampaddPattern" ); } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/DialectDelegateWrapper.java b/hibernate-core/src/main/java/org/hibernate/dialect/DialectDelegateWrapper.java index 686ac7c89256..eebbd4358696 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/DialectDelegateWrapper.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/DialectDelegateWrapper.java @@ -302,15 +302,6 @@ public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalT return wrapped.timestampdiffPattern( unit, fromTemporalType, toTemporalType ); } - @Override - public String timestampaddPattern( - TemporalUnit unit, - TemporalType temporalType, - IntervalType intervalType, - boolean withTimeZone) { - return wrapped.timestampaddPattern( unit, temporalType, intervalType, withTimeZone ); - } - @Override public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType) { return wrapped.timestampaddPattern( unit, temporalType, intervalType ); @@ -1649,14 +1640,4 @@ public int rowIdSqlType() { public String getRowIdColumnString(String rowId) { return wrapped.getRowIdColumnString( rowId ); } - - @Override - public boolean useArrayForMultiValuedParameters() { - return wrapped.useArrayForMultiValuedParameters(); - } - - @Override - public DmlTargetColumnQualifierSupport getDmlTargetColumnQualifierSupport() { - return wrapped.getDmlTargetColumnQualifierSupport(); - } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java index 0b3c4f0a2677..a052864af303 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java @@ -494,15 +494,6 @@ public String extractPattern(TemporalUnit unit) { @Override public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType) { - return timestampaddPattern( unit, temporalType, intervalType, false ); - } - - @Override - public String timestampaddPattern( - TemporalUnit unit, - TemporalType temporalType, - IntervalType intervalType, - boolean hasTimeZone) { final StringBuilder pattern = new StringBuilder(); switch ( unit ) { case YEAR: @@ -515,23 +506,22 @@ public String timestampaddPattern( pattern.append( ADD_MONTH_EXPRESSION ); break; case WEEK: - if ( hasTimeZone ) { - pattern.append( "(?3+numtodsinterval(?2*7,'day'))" ); + if ( temporalType != TemporalType.DATE ) { + pattern.append( "(?3+numtodsinterval((?2)*7,'day'))" ); } else { - pattern.append( "(?3+?2" ).append( unit.conversionFactor( DAY, this ) ).append( ")" ); + pattern.append( "(?3+(?2)" ).append( unit.conversionFactor( DAY, this ) ).append( ")" ); } break; case DAY: + if ( temporalType == TemporalType.DATE ) { + pattern.append( "(?3+(?2))" ); + break; + } case HOUR: case MINUTE: case SECOND: - if ( hasTimeZone ) { - pattern.append( "(?3+numtodsinterval(?2,'?1'))" ); - } - else { - pattern.append( "(?3+?2" ).append( unit.conversionFactor( DAY, this ) ).append( ")" ); - } + pattern.append( "(?3+numtodsinterval(?2,'?1'))" ); break; case NANOSECOND: pattern.append( "(?3+numtodsinterval((?2)/1e9,'second'))" ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/TimestampaddFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/TimestampaddFunction.java index b3c3229ebeeb..05c159a53e25 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/TimestampaddFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/TimestampaddFunction.java @@ -23,7 +23,6 @@ import org.hibernate.sql.ast.tree.SqlAstNode; import org.hibernate.sql.ast.tree.expression.DurationUnit; import org.hibernate.sql.ast.tree.expression.Expression; -import org.hibernate.type.SqlTypes; import org.hibernate.type.spi.TypeConfiguration; import java.util.List; @@ -39,7 +38,7 @@ * The {@code timestampadd()} or {@code dateadd()} function has a funny * syntax which accepts a {@link TemporalUnit} as the first argument, * and the actual set of accepted units varies widely. This class uses - * {@link Dialect#timestampaddPattern(TemporalUnit, TemporalType, IntervalType, boolean)} + * {@link Dialect#timestampaddPattern(TemporalUnit, TemporalType, IntervalType)} * to abstract these differences. * * @author Gavin King @@ -78,19 +77,7 @@ public void render( PatternRenderer patternRenderer(TemporalUnit unit, Expression interval, Expression to) { TemporalType temporalType = getSqlTemporalType( to.getExpressionType() ); IntervalType intervalType = getSqlIntervalType( interval.getExpressionType().getSingleJdbcMapping() ); - boolean withTimeZone = hasTimeZone( to.getExpressionType().getSingleJdbcMapping().getJdbcType().getDefaultSqlTypeCode() ); - return new PatternRenderer( dialect.timestampaddPattern( unit, temporalType, intervalType, withTimeZone ) ); - } - - private boolean hasTimeZone(int sqlTypeCode) { - switch ( sqlTypeCode ) { - case SqlTypes.TIME_UTC: - case SqlTypes.TIME_WITH_TIMEZONE: - case SqlTypes.TIMESTAMP_UTC: - case SqlTypes.TIMESTAMP_WITH_TIMEZONE: - return true; - } - return false; + return new PatternRenderer( dialect.timestampaddPattern( unit, temporalType, intervalType ) ); } // @Override