Skip to content

Commit 08a7b2f

Browse files
committed
get rid of use of sum() in Informix date/time arithmetic
This complicates the handling of pure dates, but unbreaks it when there is more than one row returned by the query!
1 parent 85b2c70 commit 08a7b2f

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105

106106
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
107107
import static org.hibernate.internal.util.JdbcExceptionHelper.extractErrorCode;
108+
import static org.hibernate.query.common.TemporalUnit.DAY;
108109
import static org.hibernate.query.sqm.produce.function.FunctionParameterType.STRING;
109110
import static org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers.impliedOrInvariant;
110111
import static org.hibernate.type.SqlTypes.BINARY;
@@ -437,7 +438,7 @@ public String extractPattern(TemporalUnit unit) {
437438
case HOUR -> "to_number(to_char(?2,'%H'))";
438439
case DAY_OF_WEEK -> "(weekday(?2)+1)";
439440
case DAY_OF_MONTH -> "day(?2)";
440-
case EPOCH -> "(to_number(cast(cast(sum(?2-datetime(1970-1-1) year to day) as interval day(9) to day) as varchar(12)))*86400+to_number(cast(cast(sum(cast(?2 as datetime hour to second)-datetime(00:00:00) hour to second) as interval second(6) to second) as varchar(9))))";
441+
case EPOCH -> "(to_number(cast(cast((?2-datetime(1970-1-1) year to day) as interval day(9) to day) as varchar(12)))*86400+to_number(cast(cast((cast(?2 as datetime hour to second)-datetime(00:00:00) hour to second) as interval second(6) to second) as varchar(9))))";
441442
default -> "?1(?2)";
442443
};
443444
}
@@ -730,15 +731,25 @@ public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalT
730731
return "(?3-?2)";
731732
}
732733
else {
734+
if ( fromTemporalType == TemporalType.DATE && toTemporalType == TemporalType.DATE ) {
735+
// special case: subtraction of two dates results in an integer number of days
736+
return switch ( unit ) {
737+
case NATIVE -> "to_number(cast(?3-?2 as lvarchar))*86400";
738+
case YEAR, MONTH -> "to_number(cast(cast(extend(?3,year to month)-extend(?2,year to month) as interval ?1(9) to ?1) as varchar(12)))";
739+
case DAY -> "to_number(cast(?3-?2 as lvarchar))";
740+
case WEEK -> "floor(to_number(cast(?3-?2 as lvarchar))/7)";
741+
default -> "to_number(cast(?3-?2 as lvarchar))" + DAY.conversionFactor( unit, this );
742+
};
743+
}
733744
return switch ( unit ) {
734745
case NATIVE ->
735746
fromTemporalType == TemporalType.TIME
736747
// arguably, we don't really need to retain the milliseconds for a time, since times don't usually come with millis
737-
? "(mod(to_number(cast(cast(sum(?3-?2) as interval second(6) to second) as varchar(9))),86400)+to_number(cast(cast(sum(?3-?2) as interval fraction to fraction) as varchar(6))))"
738-
: "(to_number(cast(cast(sum(?3-?2) as interval day(9) to day) as varchar(12)))*86400+mod(to_number(cast(cast(sum(?3-?2) as interval second(6) to second) as varchar(9))),86400)+to_number(cast(cast(sum(?3-?2) as interval fraction to fraction) as varchar(6))))";
739-
case SECOND -> "to_number(cast(cast(sum(?3-?2) as interval second(9) to fraction) as varchar(15)))";
740-
case NANOSECOND -> "(to_number(cast(cast(sum(?3-?2) as interval second(9) to fraction) as varchar(15)))*1e9)";
741-
default -> "to_number(cast(cast(sum(?3-?2) as interval ?1(9) to ?1) as varchar(12)))";
748+
? "(mod(to_number(cast(cast(?3-?2 as interval second(6) to second) as varchar(9))),86400)+to_number(cast(cast(?3-?2 as interval fraction to fraction) as varchar(6))))"
749+
: "(to_number(cast(cast(?3-?2 as interval day(9) to day) as varchar(12)))*86400+mod(to_number(cast(cast(?3-?2 as interval second(6) to second) as varchar(9))),86400)+to_number(cast(cast(?3-?2 as interval fraction to fraction) as varchar(6))))";
750+
case SECOND -> "to_number(cast(cast(?3-?2 as interval second(9) to fraction) as varchar(15)))";
751+
case NANOSECOND -> "(to_number(cast(cast(?3-?2 as interval second(9) to fraction) as varchar(15)))*1e9)";
752+
default -> "to_number(cast(cast(?3-?2 as interval ?1(9) to ?1) as varchar(12)))";
742753
};
743754
}
744755
}

local-build-plugins/src/main/groovy/local.code-quality.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ tasks.compileJava.dependsOn tasks.spotlessJavaApply
107107

108108
checkerFramework {
109109
excludeTests = true
110+
skipCheckerFramework = true
110111
checkers = [
111112
'org.checkerframework.checker.nullness.NullnessChecker'
112113
]

0 commit comments

Comments
 (0)