Skip to content

Commit 43745c9

Browse files
VladoKurucmbladel
authored andcommitted
HHH-18531 Fix for Informix timestamp literal error
1 parent b8b8f01 commit 43745c9

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;
@@ -718,6 +736,56 @@ public static Replacer datetimeFormat(String format) {
718736
.replace("S", "%F1");
719737
}
720738

739+
@Override
740+
public void appendDateTimeLiteral(
741+
SqlAppender appender,
742+
TemporalAccessor temporalAccessor,
743+
TemporalType precision,
744+
TimeZone jdbcTimeZone) {
745+
switch ( precision ) {
746+
case DATE:
747+
appender.appendSql( JDBC_ESCAPE_START_DATE );
748+
appendAsDate( appender, temporalAccessor );
749+
appender.appendSql( JDBC_ESCAPE_END );
750+
break;
751+
case TIME:
752+
appender.appendSql( JDBC_ESCAPE_START_TIME );
753+
appendAsTime( appender, temporalAccessor, supportsTemporalLiteralOffset(), jdbcTimeZone );
754+
appender.appendSql( JDBC_ESCAPE_END );
755+
break;
756+
case TIMESTAMP:
757+
appender.appendSql( JDBC_ESCAPE_START_TIMESTAMP );
758+
appendAsTimestampWithMicros( appender, temporalAccessor, supportsTemporalLiteralOffset(), jdbcTimeZone );
759+
appender.appendSql( JDBC_ESCAPE_END );
760+
break;
761+
default:
762+
throw new IllegalArgumentException();
763+
}
764+
}
765+
766+
@Override
767+
public void appendDateTimeLiteral(SqlAppender appender, Date date, TemporalType precision, TimeZone jdbcTimeZone) {
768+
switch ( precision ) {
769+
case DATE:
770+
appender.appendSql( JDBC_ESCAPE_START_DATE );
771+
appendAsDate( appender, date );
772+
appender.appendSql( JDBC_ESCAPE_END );
773+
break;
774+
case TIME:
775+
appender.appendSql( JDBC_ESCAPE_START_TIME );
776+
appendAsLocalTime( appender, date );
777+
appender.appendSql( JDBC_ESCAPE_END );
778+
break;
779+
case TIMESTAMP:
780+
appender.appendSql( JDBC_ESCAPE_START_TIMESTAMP );
781+
appendAsTimestampWithMicros( appender, date, jdbcTimeZone );
782+
appender.appendSql( JDBC_ESCAPE_END );
783+
break;
784+
default:
785+
throw new IllegalArgumentException();
786+
}
787+
}
788+
721789
@Override
722790
public String getSelectClauseNullString(int sqlType, TypeConfiguration typeConfiguration) {
723791
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
@@ -17,6 +17,7 @@
1717
import org.hibernate.annotations.FractionalSeconds;
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.community.dialect.DerbyDialect;
2223
import org.hibernate.dialect.Dialect;
@@ -128,6 +129,7 @@ void testUsage(SessionFactoryScope scope) {
128129
@SkipForDialect(dialectClass = HANADialect.class, reason = "HANA does not support specifying a precision on timestamps")
129130
@SkipForDialect(dialectClass = SybaseDialect.class, reason = "Because... Sybase...", matchSubTypes = true)
130131
@SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase does not support specifying a precision on timestamps")
132+
@SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix only supports precision from 1 to 5")
131133
void testUsage0(SessionFactoryScope scope) {
132134
final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect();
133135
final Instant start;
@@ -191,6 +193,7 @@ void testUsage3(SessionFactoryScope scope) {
191193
@SkipForDialect(dialectClass = PostgreSQLDialect.class, reason = "PostgreSQL only supports precision <= 6", matchSubTypes = true)
192194
@SkipForDialect(dialectClass = CockroachDialect.class, reason = "CockroachDB only supports precision <= 6")
193195
@SkipForDialect(dialectClass = HANADialect.class, reason = "HANA does not support specifying a precision on timestamps")
196+
@SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix only supports precision from 1 to 5")
194197
void testUsage9(SessionFactoryScope scope) {
195198
final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect();
196199
final Instant start;

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
@@ -18,6 +18,7 @@
1818
import org.hibernate.annotations.JdbcTypeCode;
1919
import org.hibernate.boot.spi.MetadataImplementor;
2020
import org.hibernate.community.dialect.AltibaseDialect;
21+
import org.hibernate.community.dialect.InformixDialect;
2122
import org.hibernate.dialect.CockroachDialect;
2223
import org.hibernate.community.dialect.DerbyDialect;
2324
import org.hibernate.dialect.Dialect;
@@ -130,6 +131,7 @@ void testUsage(SessionFactoryScope scope) {
130131
@SkipForDialect(dialectClass = HANADialect.class, reason = "HANA does not support specifying a precision on timestamps")
131132
@SkipForDialect(dialectClass = SybaseDialect.class, reason = "Because... Sybase...", matchSubTypes = true)
132133
@SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase does not support specifying a precision on timestamps")
134+
@SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix only supports precision from 1 to 5")
133135
void testUsage0(SessionFactoryScope scope) {
134136
final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect();
135137
final Instant start;
@@ -193,6 +195,7 @@ void testUsage3(SessionFactoryScope scope) {
193195
@SkipForDialect(dialectClass = PostgreSQLDialect.class, reason = "PostgreSQL only supports precision <= 6", matchSubTypes = true)
194196
@SkipForDialect(dialectClass = CockroachDialect.class, reason = "CockroachDB only supports precision <= 6")
195197
@SkipForDialect(dialectClass = HANADialect.class, reason = "HANA does not support specifying a precision on timestamps")
198+
@SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix only supports precision from 1 to 5")
196199
void testUsage9(SessionFactoryScope scope) {
197200
final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect();
198201
final Instant start;

0 commit comments

Comments
 (0)