Skip to content

Commit 8ddb40f

Browse files
VladoKurucmbellade
authored andcommitted
HHH-18531 Fix for Informix timestamp literal error
1 parent c85efaa commit 8ddb40f

File tree

3 files changed

+74
-0
lines changed

3 files changed

+74
-0
lines changed

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

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
package org.hibernate.community.dialect;
88

99
import java.sql.Types;
10+
import java.time.temporal.TemporalAccessor;
11+
import java.util.Date;
12+
import java.util.TimeZone;
1013

1114
import org.hibernate.boot.Metadata;
1215
import org.hibernate.boot.model.FunctionContributions;
@@ -74,6 +77,8 @@
7477
import org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry;
7578
import org.hibernate.type.spi.TypeConfiguration;
7679

80+
import jakarta.persistence.TemporalType;
81+
7782
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
7883
import static org.hibernate.type.SqlTypes.BIGINT;
7984
import static org.hibernate.type.SqlTypes.BINARY;
@@ -88,6 +93,14 @@
8893
import static org.hibernate.type.SqlTypes.TINYINT;
8994
import static org.hibernate.type.SqlTypes.VARBINARY;
9095
import static org.hibernate.type.SqlTypes.VARCHAR;
96+
import static org.hibernate.type.descriptor.DateTimeUtils.JDBC_ESCAPE_END;
97+
import static org.hibernate.type.descriptor.DateTimeUtils.JDBC_ESCAPE_START_DATE;
98+
import static org.hibernate.type.descriptor.DateTimeUtils.JDBC_ESCAPE_START_TIME;
99+
import static org.hibernate.type.descriptor.DateTimeUtils.JDBC_ESCAPE_START_TIMESTAMP;
100+
import static org.hibernate.type.descriptor.DateTimeUtils.appendAsDate;
101+
import static org.hibernate.type.descriptor.DateTimeUtils.appendAsLocalTime;
102+
import static org.hibernate.type.descriptor.DateTimeUtils.appendAsTime;
103+
import static org.hibernate.type.descriptor.DateTimeUtils.appendAsTimestampWithMicros;
91104

92105
/**
93106
* Dialect for Informix 7.31.UD3 with Informix
@@ -234,6 +247,11 @@ public int getDefaultTimestampPrecision() {
234247
return 5;
235248
}
236249

250+
@Override
251+
public boolean doesRoundTemporalOnOverflow() {
252+
return false;
253+
}
254+
237255
@Override
238256
public int getFloatPrecision() {
239257
return 8;
@@ -713,6 +731,56 @@ public static Replacer datetimeFormat(String format) {
713731
.replace("S", "%F1");
714732
}
715733

734+
@Override
735+
public void appendDateTimeLiteral(
736+
SqlAppender appender,
737+
TemporalAccessor temporalAccessor,
738+
TemporalType precision,
739+
TimeZone jdbcTimeZone) {
740+
switch ( precision ) {
741+
case DATE:
742+
appender.appendSql( JDBC_ESCAPE_START_DATE );
743+
appendAsDate( appender, temporalAccessor );
744+
appender.appendSql( JDBC_ESCAPE_END );
745+
break;
746+
case TIME:
747+
appender.appendSql( JDBC_ESCAPE_START_TIME );
748+
appendAsTime( appender, temporalAccessor, supportsTemporalLiteralOffset(), jdbcTimeZone );
749+
appender.appendSql( JDBC_ESCAPE_END );
750+
break;
751+
case TIMESTAMP:
752+
appender.appendSql( JDBC_ESCAPE_START_TIMESTAMP );
753+
appendAsTimestampWithMicros( appender, temporalAccessor, supportsTemporalLiteralOffset(), jdbcTimeZone );
754+
appender.appendSql( JDBC_ESCAPE_END );
755+
break;
756+
default:
757+
throw new IllegalArgumentException();
758+
}
759+
}
760+
761+
@Override
762+
public void appendDateTimeLiteral(SqlAppender appender, Date date, TemporalType precision, TimeZone jdbcTimeZone) {
763+
switch ( precision ) {
764+
case DATE:
765+
appender.appendSql( JDBC_ESCAPE_START_DATE );
766+
appendAsDate( appender, date );
767+
appender.appendSql( JDBC_ESCAPE_END );
768+
break;
769+
case TIME:
770+
appender.appendSql( JDBC_ESCAPE_START_TIME );
771+
appendAsLocalTime( appender, date );
772+
appender.appendSql( JDBC_ESCAPE_END );
773+
break;
774+
case TIMESTAMP:
775+
appender.appendSql( JDBC_ESCAPE_START_TIMESTAMP );
776+
appendAsTimestampWithMicros( appender, date, jdbcTimeZone );
777+
appender.appendSql( JDBC_ESCAPE_END );
778+
break;
779+
default:
780+
throw new IllegalArgumentException();
781+
}
782+
}
783+
716784
@Override
717785
public String getSelectClauseNullString(int sqlType, TypeConfiguration typeConfiguration) {
718786
DdlType descriptor = typeConfiguration.getDdlTypeRegistry().getDescriptor( sqlType );

hibernate-core/src/test/java/org/hibernate/orm/test/temporal/FractionalSecondsTests.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.hibernate.annotations.FractionalSeconds;
1717
import org.hibernate.boot.spi.MetadataImplementor;
1818
import org.hibernate.community.dialect.AltibaseDialect;
19+
import org.hibernate.community.dialect.InformixDialect;
1920
import org.hibernate.dialect.CockroachDialect;
2021
import org.hibernate.dialect.DerbyDialect;
2122
import org.hibernate.dialect.Dialect;
@@ -121,6 +122,7 @@ void testUsage(SessionFactoryScope scope) {
121122
@SkipForDialect(dialectClass = HANADialect.class, reason = "HANA does not support specifying a precision on timestamps")
122123
@SkipForDialect(dialectClass = SybaseDialect.class, reason = "Because... Sybase...", matchSubTypes = true)
123124
@SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase does not support specifying a precision on timestamps")
125+
@SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix only supports precision from 1 to 5")
124126
void testUsage0(SessionFactoryScope scope) {
125127
final Instant start = Instant.now();
126128

@@ -172,6 +174,7 @@ void testUsage3(SessionFactoryScope scope) {
172174
@SkipForDialect(dialectClass = PostgreSQLDialect.class, reason = "PostgreSQL only supports precision <= 6", matchSubTypes = true)
173175
@SkipForDialect(dialectClass = CockroachDialect.class, reason = "CockroachDB only supports precision <= 6")
174176
@SkipForDialect(dialectClass = HANADialect.class, reason = "HANA does not support specifying a precision on timestamps")
177+
@SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix only supports precision from 1 to 5")
175178
void testUsage9(SessionFactoryScope scope) {
176179
final Instant start = Instant.now();
177180

hibernate-core/src/test/java/org/hibernate/orm/test/temporal/JavaTimeFractionalSecondsTests.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.hibernate.annotations.JdbcTypeCode;
1818
import org.hibernate.boot.spi.MetadataImplementor;
1919
import org.hibernate.community.dialect.AltibaseDialect;
20+
import org.hibernate.community.dialect.InformixDialect;
2021
import org.hibernate.dialect.CockroachDialect;
2122
import org.hibernate.dialect.DerbyDialect;
2223
import org.hibernate.dialect.Dialect;
@@ -123,6 +124,7 @@ void testUsage(SessionFactoryScope scope) {
123124
@SkipForDialect(dialectClass = HANADialect.class, reason = "HANA does not support specifying a precision on timestamps")
124125
@SkipForDialect(dialectClass = SybaseDialect.class, reason = "Because... Sybase...", matchSubTypes = true)
125126
@SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase does not support specifying a precision on timestamps")
127+
@SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix only supports precision from 1 to 5")
126128
void testUsage0(SessionFactoryScope scope) {
127129
final Instant start = Instant.now();
128130

@@ -174,6 +176,7 @@ void testUsage3(SessionFactoryScope scope) {
174176
@SkipForDialect(dialectClass = PostgreSQLDialect.class, reason = "PostgreSQL only supports precision <= 6", matchSubTypes = true)
175177
@SkipForDialect(dialectClass = CockroachDialect.class, reason = "CockroachDB only supports precision <= 6")
176178
@SkipForDialect(dialectClass = HANADialect.class, reason = "HANA does not support specifying a precision on timestamps")
179+
@SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix only supports precision from 1 to 5")
177180
void testUsage9(SessionFactoryScope scope) {
178181
final Instant start = Instant.now();
179182

0 commit comments

Comments
 (0)