Hello,
We are using a custom time converter (from Timestamp to joda DateTime),
using MARIADB. The converter code is attached below. We have discovered
the following bug:
- When inserting records into the DB, a DateTime object is provided
- If you apply breakpoints, you can see that the converter is doing the
correct conversion (based off of millis)
- If you step thru the code up until the SQL is generated
(DefaultBinding.toSQL()), you will see that it resolves as a string,
similar to *timestamp '2017-05-09 20:33:32.122'*
- The bug is that the date string which is fetched is grabbed from the
Timestamp.toString() method... which is dependent on the java timezone that
is set. The correct implementation should be to use something like
*FROM_UNIXTIME(millis)*
DefaultBinding trace point
else if (type == Timestamp.class) {
// The SQLite JDBC driver does not implement the escape
syntax
// [#1253] SQL Server and Sybase do not implement timestamp
literals
if (asList(SQLITE).contains(family)) {
render.sql('\'').sql(escape(val, render)).sql('\'');
}
// [#1253] Derby doesn't support the standard literal
else if (family == DERBY) {
render.keyword("timestamp('").sql(escape(val,
render)).sql("')");
}
// CUBRID timestamps have no fractional seconds
else if (family == CUBRID) {
render.keyword("datetime '").sql(escape(val,
render)).sql('\'');
}
// [#3648] Circumvent a MySQL bug related to date literals
else if (family == MYSQL) {
render.keyword("{ts '").sql(escape(val,
render)).sql("'}");
}
// Most dialects implement SQL standard timestamp literals
else {
*render.keyword("timestamp '").sql(escape(val,
render)).sql('\'');*
}
}
Converter code
public static class TimestampConverter implements Converter<Timestamp,
DateTime> {
private static final long serialVersionUID = 1L;
@Override
public DateTime from(Timestamp x) {
try {
if (x == null) {
return null;
}
else {
return new DateTime(x.getTime());
}
}
catch (Exception e){
return null;
}
}
@Override
public Class<Timestamp> fromType() {
return Timestamp.class;
}
@Override
public Timestamp to(DateTime x) {
try {
if (x == null) {
return null;
}
else {
long milli = x.getMillis();
Timestamp t = new Timestamp(milli);
return t;
}
}
catch (Exception e){
return null;
}
}
@Override
public Class<DateTime> toType() {
return DateTime.class;
}
}
--
You received this message because you are subscribed to the Google Groups "jOOQ
User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.