HHH-17242 Partly revert original solution to retain correct expression types
This commit is contained in:
parent
7f19de0332
commit
59d254cae1
|
@ -473,15 +473,6 @@ public class OracleLegacyDialect extends Dialect {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType) {
|
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();
|
final StringBuilder pattern = new StringBuilder();
|
||||||
switch ( unit ) {
|
switch ( unit ) {
|
||||||
case YEAR:
|
case YEAR:
|
||||||
|
@ -494,23 +485,22 @@ public class OracleLegacyDialect extends Dialect {
|
||||||
pattern.append( ADD_MONTH_EXPRESSION );
|
pattern.append( ADD_MONTH_EXPRESSION );
|
||||||
break;
|
break;
|
||||||
case WEEK:
|
case WEEK:
|
||||||
if ( hasTimeZone ) {
|
if ( temporalType != TemporalType.DATE ) {
|
||||||
pattern.append( "(?3+numtodsinterval(?2*7,'day'))" );
|
pattern.append( "(?3+numtodsinterval((?2)*7,'day'))" );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
pattern.append( "(?3+?2" ).append( unit.conversionFactor( DAY, this ) ).append( ")" );
|
pattern.append( "(?3+(?2)" ).append( unit.conversionFactor( DAY, this ) ).append( ")" );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DAY:
|
case DAY:
|
||||||
|
if ( temporalType == TemporalType.DATE ) {
|
||||||
|
pattern.append( "(?3+(?2))" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
case HOUR:
|
case HOUR:
|
||||||
case MINUTE:
|
case MINUTE:
|
||||||
case SECOND:
|
case SECOND:
|
||||||
if ( hasTimeZone ) {
|
pattern.append( "(?3+numtodsinterval(?2,'?1'))" );
|
||||||
pattern.append( "(?3+numtodsinterval(?2,'?1'))" );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pattern.append( "(?3+?2" ).append( unit.conversionFactor( DAY, this ) ).append( ")" );
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case NANOSECOND:
|
case NANOSECOND:
|
||||||
pattern.append( "(?3+numtodsinterval((?2)/1e9,'second'))" );
|
pattern.append( "(?3+numtodsinterval((?2)/1e9,'second'))" );
|
||||||
|
|
|
@ -1493,22 +1493,6 @@ public abstract class Dialect implements ConversionContext, TypeContributor, Fun
|
||||||
* @param temporalType The type of 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
|
* @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) {
|
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType) {
|
||||||
throw new UnsupportedOperationException( "`" + getClass().getName() + "` does not yet support #timestampaddPattern" );
|
throw new UnsupportedOperationException( "`" + getClass().getName() + "` does not yet support #timestampaddPattern" );
|
||||||
}
|
}
|
||||||
|
|
|
@ -300,15 +300,6 @@ public class DialectDelegateWrapper extends Dialect {
|
||||||
return wrapped.timestampdiffPattern( unit, fromTemporalType, toTemporalType );
|
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
|
@Override
|
||||||
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType) {
|
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType) {
|
||||||
return wrapped.timestampaddPattern( unit, temporalType, intervalType );
|
return wrapped.timestampaddPattern( unit, temporalType, intervalType );
|
||||||
|
@ -1641,14 +1632,4 @@ public class DialectDelegateWrapper extends Dialect {
|
||||||
public String getRowIdColumnString(String rowId) {
|
public String getRowIdColumnString(String rowId) {
|
||||||
return wrapped.getRowIdColumnString( rowId );
|
return wrapped.getRowIdColumnString( rowId );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean useArrayForMultiValuedParameters() {
|
|
||||||
return wrapped.useArrayForMultiValuedParameters();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DmlTargetColumnQualifierSupport getDmlTargetColumnQualifierSupport() {
|
|
||||||
return wrapped.getDmlTargetColumnQualifierSupport();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -514,15 +514,6 @@ public class OracleDialect extends Dialect {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType) {
|
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();
|
final StringBuilder pattern = new StringBuilder();
|
||||||
switch ( unit ) {
|
switch ( unit ) {
|
||||||
case YEAR:
|
case YEAR:
|
||||||
|
@ -535,23 +526,22 @@ public class OracleDialect extends Dialect {
|
||||||
pattern.append( ADD_MONTH_EXPRESSION );
|
pattern.append( ADD_MONTH_EXPRESSION );
|
||||||
break;
|
break;
|
||||||
case WEEK:
|
case WEEK:
|
||||||
if ( hasTimeZone ) {
|
if ( temporalType != TemporalType.DATE ) {
|
||||||
pattern.append( "(?3+numtodsinterval(?2*7,'day'))" );
|
pattern.append( "(?3+numtodsinterval((?2)*7,'day'))" );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
pattern.append( "(?3+?2" ).append( unit.conversionFactor( DAY, this ) ).append( ")" );
|
pattern.append( "(?3+(?2)" ).append( unit.conversionFactor( DAY, this ) ).append( ")" );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DAY:
|
case DAY:
|
||||||
|
if ( temporalType == TemporalType.DATE ) {
|
||||||
|
pattern.append( "(?3+(?2))" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
case HOUR:
|
case HOUR:
|
||||||
case MINUTE:
|
case MINUTE:
|
||||||
case SECOND:
|
case SECOND:
|
||||||
if ( hasTimeZone ) {
|
pattern.append( "(?3+numtodsinterval(?2,'?1'))" );
|
||||||
pattern.append( "(?3+numtodsinterval(?2,'?1'))" );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pattern.append( "(?3+?2" ).append( unit.conversionFactor( DAY, this ) ).append( ")" );
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case NANOSECOND:
|
case NANOSECOND:
|
||||||
pattern.append( "(?3+numtodsinterval((?2)/1e9,'second'))" );
|
pattern.append( "(?3+numtodsinterval((?2)/1e9,'second'))" );
|
||||||
|
|
|
@ -23,7 +23,6 @@ import org.hibernate.sql.ast.spi.SqlAppender;
|
||||||
import org.hibernate.sql.ast.tree.SqlAstNode;
|
import org.hibernate.sql.ast.tree.SqlAstNode;
|
||||||
import org.hibernate.sql.ast.tree.expression.DurationUnit;
|
import org.hibernate.sql.ast.tree.expression.DurationUnit;
|
||||||
import org.hibernate.sql.ast.tree.expression.Expression;
|
import org.hibernate.sql.ast.tree.expression.Expression;
|
||||||
import org.hibernate.type.SqlTypes;
|
|
||||||
import org.hibernate.type.spi.TypeConfiguration;
|
import org.hibernate.type.spi.TypeConfiguration;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -39,7 +38,7 @@ import static org.hibernate.type.spi.TypeConfiguration.getSqlTemporalType;
|
||||||
* The {@code timestampadd()} or {@code dateadd()} function has a funny
|
* The {@code timestampadd()} or {@code dateadd()} function has a funny
|
||||||
* syntax which accepts a {@link TemporalUnit} as the first argument,
|
* syntax which accepts a {@link TemporalUnit} as the first argument,
|
||||||
* and the actual set of accepted units varies widely. This class uses
|
* 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.
|
* to abstract these differences.
|
||||||
*
|
*
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
|
@ -78,19 +77,7 @@ public class TimestampaddFunction
|
||||||
PatternRenderer patternRenderer(TemporalUnit unit, Expression interval, Expression to) {
|
PatternRenderer patternRenderer(TemporalUnit unit, Expression interval, Expression to) {
|
||||||
TemporalType temporalType = getSqlTemporalType( to.getExpressionType() );
|
TemporalType temporalType = getSqlTemporalType( to.getExpressionType() );
|
||||||
IntervalType intervalType = getSqlIntervalType( interval.getExpressionType().getSingleJdbcMapping() );
|
IntervalType intervalType = getSqlIntervalType( interval.getExpressionType().getSingleJdbcMapping() );
|
||||||
boolean withTimeZone = hasTimeZone( to.getExpressionType().getSingleJdbcMapping().getJdbcType().getDefaultSqlTypeCode() );
|
return new PatternRenderer( dialect.timestampaddPattern( unit, temporalType, intervalType ) );
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Override
|
// @Override
|
||||||
|
|
Loading…
Reference in New Issue