Skip to content

Commit

Permalink
HHH-17242 Partly revert original solution to retain correct expressio…
Browse files Browse the repository at this point in the history
…n types
  • Loading branch information
beikov committed Sep 26, 2023
1 parent 8af4882 commit 22ed479
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 86 deletions.
Expand Up @@ -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:
Expand All @@ -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'))" );
Expand Down
16 changes: 0 additions & 16 deletions hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java
Expand Up @@ -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" );
}
Expand Down
Expand Up @@ -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 );
Expand Down Expand Up @@ -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();
}
}
Expand Up @@ -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:
Expand All @@ -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'))" );
Expand Down
Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 22ed479

Please sign in to comment.