Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LocalDateTime has invalid string serialization #1390

Closed
kdubb opened this issue Jan 18, 2019 · 8 comments · Fixed by #2852
Closed

LocalDateTime has invalid string serialization #1390

kdubb opened this issue Jan 18, 2019 · 8 comments · Fixed by #2852
Assignees
Milestone

Comments

@kdubb
Copy link
Contributor

kdubb commented Jan 18, 2019

The following shows that a LocalDateTime is always always tethered to the current time zone during insertion.

// LocalDateTime is always passed with time zone so backend can decide between timestamp and timestamptz

This is incorrect. A timestamp column has no timezone and therefore should never be altered during insertion/retrieval to a timestamp column. Tethering it to a time zone on insertion can (and does!) cause changes to the inserted time which are then apparent during retrieval.

The specific example is SetObject310Text.testSetLocalDateTime which tests a number of time zones including Europe/Moscow.

In that time zone it tests a time that exists in a one hour time void at 2000-03-26 2:00 (i.e 2:00 to 2:59 doesn't exist in Moscow on this date). During insertion the LocalDateTime value of 2000-03-26 2:00 is tethered to Moscow time and then formatted as a string which results in 2000-03-26 3:00 being inserted into the database due to the void.

The test itself even has to tether the LocalDateTime to a time zone just to test the value correctly.

String expected = localDateTime.atZone(zone)

Two issues

  1. The time is still inserted without a time zone so the tethering to Moscow time only affected the string conversion and then disappears.
  2. This is a local date/time and the column it's inserting into is a timestamp (also local). If 2000-03-26 2:00 is inserted as 2000-03-26 3:00 in Moscow and read back in a different time zone it will have the wrong value for no explicable reason.
@vlsi
Copy link
Member

vlsi commented Jan 18, 2019

Tethering it to a time zone on insertion can (and does!) cause changes to the inserted time which are then apparent during retrieval.

@kdubb , would you please provide a test case with expected/actual output?

@kdubb
Copy link
Contributor Author

kdubb commented Jan 18, 2019

The reference test SetObject310Text.testSetLocalDateTime is already in place and does it, as explained above. The issue is that it tests the incorrect value. #1391 contains the proposed fix and alteration to the test to make it correct.

@vlsi
Copy link
Member

vlsi commented Jan 18, 2019

It is not clear which JDBC call sequence produces wrong result.
In #1391 you alter both implementation and the test code at once, so it is not clear which bug do you fix.

I appreciate you dig into timezone issues (which is not wildly understood), however I would like to have a trivial test-case before we introduce yet another breaking change.

Note: pgjdbc always sends timstamps as UNSPECIFIED type, and it appends timezone just in case.
Have you seen this:

// We must use UNSPECIFIED here, or inserting a Date-with-timezone into a
// timestamptz field does an unexpected rotation by the server's TimeZone:
//
// We want to interpret 2005/01/01 with calendar +0100 as
// "local midnight in +0100", but if we go via date it interprets it
// as local midnight in the server's timezone:
// template1=# select '2005-01-01+0100'::timestamptz;
// timestamptz
// ------------------------
// 2005-01-01 02:00:00+03
// (1 row)
// template1=# select '2005-01-01+0100'::date::timestamptz;
// timestamptz
// ------------------------
// 2005-01-01 00:00:00+03
// (1 row)
?

@kdubb
Copy link
Contributor Author

kdubb commented Jan 18, 2019

Use #1391, but discard the changes in TimestampUtils.java and you'll see the error.

It attempts to insert a LocalDateTime value of 2000-03-26 2:00 but the database receives 2000-03-26 3:00 (i.e. time jumped by 1 hour).

I believe that's the invalid "call sequence" you're looking for.

@mpilone
Copy link

mpilone commented Mar 10, 2019

I added a comment to #1108 (comment) about this same issue. My comment would probably be more correct on this ticket but it applied to TZ handling in the driver in general.

I provided a test case on #1108 that shows this exact issue with LocalDateTime. If you're in a TZ that honor DST, you end up with an hour of the year (depending on your TZ rules) where timestamp insertions are incorrectly shifted.

@alexbishop1
Copy link

Here’s a test case:

public static void main(String[] args) throws SQLException {
    String url = "jdbc:postgresql://localhost/test?user=me";

    String createTableSql = "CREATE TABLE IF NOT EXISTS dates_and_times (" +
            "id SERIAL PRIMARY KEY, " +
            "date_time TIMESTAMP WITHOUT TIME ZONE" +
            ")";

    String insertSql = "INSERT INTO dates_and_times(date_time) VALUES(?)";

    try (Connection conn = getConnection(url);
         Statement createTableStmt = conn.createStatement();
         PreparedStatement insertTimestampPs = conn.prepareStatement(insertSql)
    ) {
        createTableStmt.execute(createTableSql);

        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Paris"));

        // This time did not exist in the Europe/Paris time zone because it
        // fell into the hour skipped when Paris transitioned from Central
        // European Time to Central European Summer Time
        LocalDateTime localDateTime = LocalDateTime.parse("2020-03-29T02:30");

        insertTimestampPs.setObject(1, localDateTime);
        insertTimestampPs.executeUpdate();

        // If we go and look in the database now, the timestamp will be
        // 2020-03-29 03:30:00 rather than the expected 2020-03-29 02:30:00
    }

}

We can see how this happens in the code:

// LocalDateTime is always passed with time zone so backend can decide between timestamp and timestamptz
java.time.ZonedDateTime zonedDateTime = localDateTime.atZone(getDefaultTz().toZoneId());
return toString(zonedDateTime.toOffsetDateTime());

We start off with a LocalDateTime of 2020-03-29T02:30. This then gets combined with the default time zone (Europe/Paris, in this case) to create a ZonedDateTime. Since there was no such time as 2020-03-29T02:30 in the Europe/Paris time zone, it gets adjusted and we end up with a ZonedDateTime of 2020-03-29T03:30+02:00[Europe/Paris]. This then gets converted to an OffsetDateTime of 2020-03-29T03:30+02:00. After a bit more finessing, it gets passed to the backend, where I understand the offset gets dropped because it’s a TIMESTAMP WITHOUT TIME ZONE column, leaving just 2020-03-29 03:30:00 to be stored.

This only happens during that hour. If our LocalDateTime was an hour earlier, then 2020-03-29T01:30 would become 2020-03-29T01:30+01:00[Europe/Paris], then 2020-03-29T01:30+01:00 and eventually 2020-03-29 01:30:00.

I know JDBC requires that the default time zone be used whenever one is required but I don’t think that applies in this case. Both LocalDateTime and TIMESTAMP WITHOUT TIME ZONE represent year-month-day-hour-minute-second values so a time zone should not be required to convert between one and the other. The fact that an offset has to be passed to the backend is really just an implementation detail of Postgres.

If UTC was always used for the offset, this would solve the problem because UTC always has a consistent offset, so every LocalDateTime can be converted to an ZonedDateTime without the local time changing. However, the comments on #1391 indicate there’s a bit more to it than that. I think this would also change how a LocalDateTime gets stored in a TIMESTAMP WITH TIME ZONE column (not part of the JDBC spec as far as I’m aware but it does seem to be supported).

The Java time API can always provide an offset for a LocalDateTime in a given time zone, even if that time did not exist (so for 2020-03-29T02:30 combined with Europe/Paris, it gives +01:00). This means it might be possible to fix this while still using the default time zone by skipping the intermediate ZonedDateTime and going straight to the OffsetDateTime. Something like this:

java.time.ZoneOffset zoneOffset = getDefaultTz().toZoneId().getRules().getOffset(localDateTime);
return toString(localDateTime.atOffset(zoneOffset));

I think this would work for putting a LocalDateTime in a TIMESTAMP WITHOUT TIME ZONE column (because the offset is always thrown away) but I’m not certain about the other cases that use this code.

@findepi
Copy link

findepi commented Sep 25, 2020

@alexbishop1 FWIW you can workaround this by instantiating PGobject and doing the serialization yourself (which requires nothing more than calling toString())
see https://github.com/prestosql/presto/blob/be2b97a8480f657f311e673fa38867c8faf4e2df/presto-postgresql/src/main/java/io/prestosql/plugin/postgresql/TypeUtils.java#L231-L238

@davecramer
Copy link
Member

Well as you aptly pointed out the JDBC spec doesn't contemplate both a timestamp with and without a TZ so ultimately we end up getting it right most of the time and wrong sometimes. If I changed it to the behaviour you wanted I would undoubtedly get another issue from someone wanting the behaviour the way it is right now. Timezones are an abomination...

alexbishop1 added a commit to alphagov/pay-java-commons that referenced this issue Dec 24, 2020
Add a JPA AttributeConverter that converts between an Instant
entity attribute and a LocalDateTime (assumed to be in UTC) for
storing in a database column and vice versa.

Per JDBC 4.2, LocalDateTime maps to database columns of the type
TIMESTAMP WITHOUT TIME ZONE.

This class is intended to be a replacement for
UTCDateTimeConverter (found in connector and other services)
except that it works with Instants rather than ZonedDateTimes.

Contrary to its name, UTCDateTimeConverter’s actually stores
dates and times in the database using the default time zone.
The input ZonedDateTime gets converted to a Timestamp, which is
effectively just a count of nanoseconds since the epoch. The
database driver then has to store this TIMESTAMP in a TIMESTAMP
WITHOUT TIME ZONE database column. It does this by converting the
Timestamp into the equivalent local date and time in the default
time zone. This is fine if the default time zone is UTC. However,
if the default time zone is, say, Europe/London and it’s British
Summer Time then all times will be shifted forward an hour and
10:00 will become 11:00.

This class can also replace connector’s LocalDateTimeConverter
(again, except that it works with Instants rather than
ZonedDateTimes), which was created to work like
UTCDateTimeConverter but without the default time zone issue.

Since both LocalDateTime and TIMESTAMP WITHOUT TIME ZONE are just
dates and times with no time zone information, the default time
zone is not required to convert between one and the other.[1]

Since our production Java servers have always used UTC as their
default time zone, there will be no change to how existing
dates and times in the database are interpreted. There may be
changes in environments that use a different default time zone,
such as developer machines, but such environments will only have
unimportant test data.

If we ever change our database columns to be of type TIMESTAMP
WITH TIME ZONE (which some would recommend), we would have to
use a converter that works with OffsetDateTimes instead of
LocalDateTimes.

[1] Unfortunately, this is not actually true. The PostgreSQL JDBC
    driver does actually use the default time zone when storing a
    LocalDateTime in a TIMESTAMP WITHOUT TIME ZONE database
    column.[2] However, this only causes the date and time to be
    changed if the LocalDateTime falls in an hour that doesn’t
    exist in the default time zone (e.g. the hour that’s skipped
    when the clocks go forward). Fortunately, this doesn’t happen
    very often.

[2] See pgjdbc/pgjdbc#1390 (comment)
    for my attempt to persuade the developers to make it not do
    this.
alexbishop1 added a commit to alphagov/pay-java-commons that referenced this issue Dec 24, 2020
Add a JPA AttributeConverter that converts between an Instant
entity attribute and a LocalDateTime (assumed to be in UTC) for
storing in a database column and vice versa.

Per JDBC 4.2, LocalDateTime maps to database columns of the type
TIMESTAMP WITHOUT TIME ZONE.

This class is intended to be a replacement for
UTCDateTimeConverter (found in connector and other services)
except that it works with Instants rather than ZonedDateTimes.

Contrary to its name, UTCDateTimeConverter’s actually stores
dates and times in the database using the default time zone.
The input ZonedDateTime gets converted to a Timestamp, which is
effectively just a count of nanoseconds since the epoch. The
database driver then has to store this Timestamp in a TIMESTAMP
WITHOUT TIME ZONE database column. It does this by converting the
Timestamp into the equivalent local date and time in the default
time zone. This is fine if the default time zone is UTC. However,
if the default time zone is, say, Europe/London and it’s British
Summer Time then all times will be shifted forward an hour and
10:00 will become 11:00.

This class can also replace connector’s LocalDateTimeConverter
(again, except that it works with Instants rather than
ZonedDateTimes), which was created to work like
UTCDateTimeConverter but without the default time zone issue.

Since both LocalDateTime and TIMESTAMP WITHOUT TIME ZONE are just
dates and times with no time zone information, the default time
zone is not required to convert between one and the other.[1]

Since our production Java servers have always used UTC as their
default time zone, there will be no change to how existing
dates and times in the database are interpreted. There may be
changes in environments that use a different default time zone,
such as developer machines, but such environments will only have
unimportant test data.

If we ever change our database columns to be of type TIMESTAMP
WITH TIME ZONE (which some would recommend), we would have to
use a converter that works with OffsetDateTimes instead of
LocalDateTimes.

[1] Unfortunately, this is not actually true. The PostgreSQL JDBC
    driver does actually use the default time zone when storing a
    LocalDateTime in a TIMESTAMP WITHOUT TIME ZONE database
    column.[2] However, this only causes the date and time to be
    changed if the LocalDateTime falls in an hour that doesn’t
    exist in the default time zone (e.g. the hour that’s skipped
    when the clocks go forward). Fortunately, this doesn’t happen
    very often.

[2] See pgjdbc/pgjdbc#1390 (comment)
    for my attempt to persuade the developers to make it not do
    this.
alexbishop1 added a commit to alphagov/pay-java-commons that referenced this issue Dec 24, 2020
Add a JPA AttributeConverter that converts between an Instant
entity attribute and a LocalDateTime (assumed to be in UTC) for
storing in a database column and vice versa.

Per JDBC 4.2, LocalDateTime maps to database columns of the type
TIMESTAMP WITHOUT TIME ZONE.

This class is intended to be a replacement for
UTCDateTimeConverter (found in connector and other services)
except that it works with Instants rather than ZonedDateTimes.

Contrary to its name, UTCDateTimeConverter’s actually stores
dates and times in the database using the default time zone.
The input ZonedDateTime gets converted to a Timestamp, which is
effectively just a count of nanoseconds since the epoch. The
database driver then has to store this Timestamp in a TIMESTAMP
WITHOUT TIME ZONE database column. It does this by converting the
Timestamp into the equivalent local date and time in the default
time zone. This is fine if the default time zone is UTC. However,
if the default time zone is, say, Europe/London and it’s British
Summer Time then all times will be shifted forward an hour and
10:00 will become 11:00.

This class can also replace connector’s LocalDateTimeConverter
(again, except that it works with Instants rather than
ZonedDateTimes), which was created to work like
UTCDateTimeConverter but without the default time zone issue.

Since both LocalDateTime and TIMESTAMP WITHOUT TIME ZONE are just
dates and times with no time zone information, the default time
zone is not required to convert between one and the other.[1]

Since our production Java servers have always used UTC as their
default time zone, there will be no change to how existing
dates and times in the database are interpreted. There may be
changes in environments that use a different default time zone,
such as developer machines, but such environments will only have
unimportant test data.

If we ever change our database columns to be of type TIMESTAMP
WITH TIME ZONE (which some would recommend), we would have to
use a converter that works with OffsetDateTimes instead of
LocalDateTimes.

[1] Unfortunately, this is not actually true. The PostgreSQL JDBC
    driver does actually use the default time zone when storing a
    LocalDateTime in a TIMESTAMP WITHOUT TIME ZONE database
    column.[2] However, this only causes the date and time to be
    changed if the LocalDateTime that doesn’t exist in the default
    time zone (e.g. the hour that’s skipped when the clocks go
    forward). Fortunately, this doesn’t happen very often.

[2] See pgjdbc/pgjdbc#1390 (comment)
    for my attempt to persuade the developers to make it not do
    this.
vlsi added a commit to vlsi/pgjdbc that referenced this issue Mar 15, 2023
…abase

Previously, LocalDateTime was converted to OffsetDateTime using the default
timezone, which made certain values unrepresentable.
For instance, 2023-03-12T02:00 in America/New_York is hard to represent
as it undergoes DST change.

It does not change resultSet.getObject(int | string), and resultSet.getString(int | string)
and those methods would still have issues when accessing timestamps
like 2023-03-12T02:00 when the client time zone is America/New_York

Co-authored-by: Kevin Wooten <kevin@wooten.com>

Fixes pgjdbc#1390
Fixes pgjdbc#2850
Closes pgjdbc#1391
@vlsi vlsi closed this as completed in c1a851c Dec 6, 2023
@vlsi vlsi added this to the 42.7.1 milestone Dec 6, 2023
redalogobject pushed a commit to logobject/pgjdbc that referenced this issue Dec 7, 2023
…abase

Previously, LocalDateTime was converted to OffsetDateTime using the default
timezone, which made certain values unrepresentable.
For instance, 2023-03-12T02:00 in America/New_York is hard to represent
as it undergoes DST change.

It does not change resultSet.getObject(int | string), and resultSet.getString(int | string)
and those methods would still have issues when accessing timestamps
like 2023-03-12T02:00 when the client time zone is America/New_York

Co-authored-by: Kevin Wooten <kevin@wooten.com>

Fixes pgjdbc#1390
Fixes pgjdbc#2850
Closes pgjdbc#1391
benkard pushed a commit to benkard/mulkcms2 that referenced this issue Dec 23, 2023
This MR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [flow-bin](https://github.com/flowtype/flow-bin) ([changelog](https://github.com/facebook/flow/blob/master/Changelog.md)) | devDependencies | minor | [`^0.223.0` -> `^0.224.0`](https://renovatebot.com/diffs/npm/flow-bin/0.223.0/0.224.0) |
| [org.postgresql:postgresql](https://jdbc.postgresql.org) ([source](https://github.com/pgjdbc/pgjdbc)) | build | patch | `42.7.0` -> `42.7.1` |
| [net.java.dev.jna:jna](https://github.com/java-native-access/jna) | compile | minor | `5.13.0` -> `5.14.0` |
| [org.hibernate.orm:hibernate-envers](https://hibernate.org/orm) ([source](https://github.com/hibernate/hibernate-orm)) | build | patch | `6.4.0.Final` -> `6.4.1.Final` |
| [org.hibernate.orm:hibernate-core](https://hibernate.org/orm) ([source](https://github.com/hibernate/hibernate-orm)) | build | patch | `6.4.0.Final` -> `6.4.1.Final` |
| [com.diffplug.spotless:spotless-maven-plugin](https://github.com/diffplug/spotless) | build | patch | `2.41.0` -> `2.41.1` |
| [io.quarkus:quarkus-maven-plugin](https://github.com/quarkusio/quarkus) | build | patch | `3.6.0` -> `3.6.3` |
| [io.quarkus:quarkus-universe-bom](https://github.com/quarkusio/quarkus-platform) | import | patch | `3.6.0` -> `3.6.3` |

---

### Release Notes

<details>
<summary>flowtype/flow-bin</summary>

### [`v0.224.0`](flow/flow-bin@e730887...e6104a1)

[Compare Source](flow/flow-bin@e730887...e6104a1)

### [`v0.223.3`](flow/flow-bin@6e1e3f7...e730887)

[Compare Source](flow/flow-bin@6e1e3f7...e730887)

### [`v0.223.2`](flow/flow-bin@5bb7bcf...6e1e3f7)

[Compare Source](flow/flow-bin@5bb7bcf...6e1e3f7)

</details>

<details>
<summary>pgjdbc/pgjdbc</summary>

### [`v42.7.1`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#&#8203;4271-2023-12-06-083400--0500)

##### Changed

-   perf: improve performance of PreparedStatement.setBlob, BlobInputStream, and BlobOutputStream with dynamic buffer sizing [MR #&#8203;3044](pgjdbc/pgjdbc#3044)

##### Fixed

-   fix: Apply connectTimeout before SSLSocket.startHandshake to avoid infinite wait in case the connection is broken [MR #&#8203;3040](pgjdbc/pgjdbc#3040)
-   fix: support waffle-jna 2.x and 3.x by using reflective approach for ManagedSecBufferDesc [MR #&#8203;2720](pgjdbc/pgjdbc#2720) Fixes [Issue #&#8203;2690](pgjdbc/pgjdbc#2720).
-   fix: NoSuchMethodError on ByteBuffer#position When Running on Java 8  when accessing arrays, fixes [Issue #&#8203;3014](pgjdbc/pgjdbc#3014)
-   Revert "[MR #&#8203;2925](pgjdbc/pgjdbc#2925) Use canonical DateStyle name" [MR #&#8203;3035](pgjdbc/pgjdbc#3035)
    Fixes  [Issue #&#8203;3008](pgjdbc/pgjdbc#3008)
-   Revert "[MR ##&#8203;2973](pgjdbc/pgjdbc#2973) feat: support SET statements combining with other queries with semicolon in PreparedStatement" [MR #&#8203;3010](pgjdbc/pgjdbc#3010)
    Fixes [Issue #&#8203;3007](pgjdbc/pgjdbc#3007)
-   fix: avoid timezone conversions when sending LocalDateTime to the database [#&#8203;2852](pgjdbc/pgjdbc#3010)  Fixes [Issue #&#8203;1390](pgjdbc/pgjdbc#1390)
    ,[Issue #&#8203;2850](pgjdbc/pgjdbc#2850)
    Closes \[Issue [#&#8203;1391](pgjdbc/pgjdbc#1391)

</details>

<details>
<summary>java-native-access/jna</summary>

### [`v5.14.0`](https://github.com/java-native-access/jna/blob/HEAD/CHANGES.md#Release-5140)

[Compare Source](java-native-access/jna@5.13.0...5.14.0)

\==============

## Features

-   [#&#8203;1556](java-native-access/jna#1556): Add `SetJob`, `SetPrinter` to `c.s.j.p.w.Winspool` - [@&#8203;tresf](https://github.com/tresf).
-   [#&#8203;1534](java-native-access/jna#1534): Add `GetMethod`, `Put`, `SpawnInstance` to `c.s.j.p.win32.COM.WbemCli#IWbemClassObject` and `ExecMethod` to `c.s.j.p.win32.COM.WbemCli#IWbemServices` - [@&#8203;faddom](https://github.com/faddom).
-   [#&#8203;1544](java-native-access/jna#1544): Add `GetPriorityClass`, `SetPriorityClass`, `GetThreadPriority`, `SetThreadPriority` and associated constants to `c.s.j.p.win32.Kernel32` - [@&#8203;dEajL3kA](https://github.com/dEajL3kA).
-   [#&#8203;1548](java-native-access/jna#1548): Make interface `c.s.j.p.mac.XAttr public` - [@&#8203;matthiasblaesing](https://github.com/matthiasblaesing).
-   [#&#8203;1551](java-native-access/jna#1551): Add `c.s.j.p.bsd.ExtAttr` and `c.s.j.p.bsd.ExtAttrUtil` to wrap BSD [\<sys/extattr.h>](https://man.freebsd.org/cgi/man.cgi?query=extattr\&sektion=2) system calls. [@&#8203;rednoah](https://github.com/rednoah).
-   [#&#8203;1517](java-native-access/jna#1517): Add missing `O_*` (e.g. `O_APPEND`, `O_SYNC`, `O_DIRECT`, ...) to `c.s.j.p.linux.Fcntl` - [@&#8203;matthiasblaesing](https://github.com/matthiasblaesing).
-   [#&#8203;1521](java-native-access/jna#1521): Shutdown CleanerThread once the last cleanable is removed - [@&#8203;matthiasblaesing](https://github.com/matthiasblaesing).
-   [#&#8203;1557](java-native-access/jna#1557): Build linux-riscv64 on Ubuntu focal to improve compatibility with older glibc versions - [@&#8203;matthiasblaesing](https://github.com/matthiasblaesing).

## Bug Fixes

-   [#&#8203;1501](java-native-access/jna#1501): `Library.OPTION_STRING_ENCODING` is ignore for string arguments function calls - [@&#8203;matthiasblaesing](https://github.com/matthiasblaesing).
-   [#&#8203;1504](java-native-access/jna#1504): Increase maximum supported fixed args on varargs calls from 3 to 255 - [@&#8203;andrew-nowak](https://github.com/andrew-nowak).
-   [#&#8203;1545](java-native-access/jna#1545): Fix Java 6 incompatibility in `c.s.j.p.win32.Kerne32Util` and `c.s.j.p.win32.DBT` - [@&#8203;matthiasblaesing](https://github.com/matthiasblaesing).

## Important Changes

-   The interfaces between Java and native code have changed, so `libjnidispatch`
    must be rebuilt to be compatible with this release.
-   Release drops support for JDKs 6 + 7, so you'll need at least JDK 8 to
    update to use this version.

</details>

<details>
<summary>hibernate/hibernate-orm</summary>

### [`v6.4.1.Final`](https://github.com/hibernate/hibernate-orm/blob/HEAD/changelog.txt#Changes-in-641Final-December-15-2023)

[Compare Source](hibernate/hibernate-orm@6.4.0...6.4.1)

https://hibernate.atlassian.net/projects/HHH/versions/32216

\*\* Bug
\* \[HHH-17570] - Wrong name provided when checking Oracle autonomous JSON database
\* \[HHH-17561] - NullPointerException at OracleServerConfiguration class
\* \[HHH-17555] - equals hashcode combined with naturalId
\* \[HHH-17553] - java.util.ConcurrentModificationException: null when loading an entity
\* \[HHH-17551] - Gradle Enterprise improvements
\* \[HHH-17528] - Explicit selection of an [@&#8203;Embeddable](https://github.com/Embeddable) property containing associated collections doesn't work
\* \[HHH-17525] - StackOverflowError when using [@&#8203;ManyToMany](https://github.com/ManyToMany) with composite id
\* \[HHH-17520] - Schema creation fails with interval second data type on PostgreSQL
\* \[HHH-17519] - Initializing a lazy association with a non aggregate id causes a NPE
\* \[HHH-17515] - DynamicInstantiationResult wrong java type constructor selected
\* \[HHH-17499] - SemanticException when querying embedded id entity with positional parameter
\* \[HHH-17494] - Metamodel generator produces an uncompilable class when an EntityGraph name contains a comma
\* \[HHH-17491] - UnknownEntityTypeException thrown when multiple subclasses define an attribute with the same name and one is a MappedSuperclass
\* \[HHH-17489] - ConcurrentModificationException after upgrading to 6.4.0
\* \[HHH-17466] - Exception on query: Could not convert 'java.util.Locale' to 'java.util.Locale' using 'org.hibernate.type.descriptor.java.LocaleJavaType' to wrap
\* \[HHH-17464] - 6.4.0 regression: NullPointerException in DefaultEvictEventListener#onEvict
\* \[HHH-17456] - java.util.UnknownFormatConversionException thrown why logging set to TRACE
\* \[HHH-17445] - Subquery correlated path expressions do not work with nullness predicates
\* \[HHH-17418] - Bytecode enchanced read accessor for a final field uses "missing" writer method
\* \[HHH-17416] - Using tuples in WHERE clause throws SemanticException
\* \[HHH-17413] - Invalid SQL with TYPE() function and CASE expression in SELECT clause
\* \[HHH-17408] - Unproxying leads to uninitialized one-to-one associations in some cases involving polymorphism
\* \[HHH-17407] - AssertionError when using JpaEntityJoin with correlated subqery if criteria copy tree is enabled
\* \[HHH-17405] - Cannot resolve path of generic mapped-superclass association path
\* \[HHH-17402] - UnknownEntityTypeException: Unable to locate persister - when comparing generic interface ToOne attribute to parameter
\* \[HHH-17397] - Count with right join returns count on the left entity although requested by the right one
\* \[HHH-17395] - Refresh with PESSIMISTIC_WRITE ignored for lazy loaded entity
\* \[HHH-17393] - Incorrect return type for List attribute, wrap in additional list
\* \[HHH-17392] - UnsupportedOperationException when using row_number() window function without top level GROUP BY
\* \[HHH-17391] - AssertionError when using row_number() window function with ORDER BY
\* \[HHH-17387] - Can't use EAGER ManyToOne on parent abstract class of joined table entity
\* \[HHH-17379] - Right join does not return records from the right table if there is condition on ID field and there's no matching record in the from clause
\* \[HHH-17359] - Query Cache contains null values for entity associations when entity was already loaded
\* \[HHH-17334] - Duplicated columns when updating indexed [@&#8203;ElementCollection](https://github.com/ElementCollection) with non updatable fields
\* \[HHH-17293] - Schema validation fails on postgres interval seconds type
\* \[HHH-17280] - UnknownTableReferenceException in subquery selecting embeddable foreign key
\* \[HHH-16967] - Missing join on inheritance parent table to validate [@&#8203;Where](https://github.com/Where) condition
\* \[HHH-16756] - orphanRemoval does not work when bytecode enhancement is enabled
\* \[HHH-16306] - CountExpressionTest.testCountDistinctTuple fails on Sybase
\* \[HHH-16100] - Dynamic-map entity mode does not register a column for one-to-one associations
\* \[HHH-1645] - refresh with LockMode on an unitialized proxy does not work

\*\* Improvement
\* \[HHH-17554] - No join on the table of the parent class with JOINED inheritance strategy when the select not contains a column used in [@&#8203;Where](https://github.com/Where) or [@&#8203;SQLRestriction](https://github.com/SQLRestriction)
\* \[HHH-16809] - Add JavaType#createArray

\*\* Task
\* \[HHH-17565] - Add testing for JDK 22-ea
\* \[HHH-17546] - Update Cockroach CI testing to 23.1.12
\* \[HHH-17545] - Update SAP HANA JDBC driver to 2.19.11
\* \[HHH-17544] - Update SAP HANA CI testing to 2.00.072.00.20231123.1
\* \[HHH-17543] - Update DB2 CI testing to 11.5.9.0
\* \[HHH-17542] - Update DB2 JDBC driver to 11.5.9.0
\* \[HHH-17541] - Update SQL Server JDBC driver to 12.4.2

</details>

<details>
<summary>quarkusio/quarkus</summary>

### [`v3.6.3`](https://github.com/quarkusio/quarkus/releases/tag/3.6.3)

[Compare Source](quarkusio/quarkus@3.6.2...3.6.3)

##### Complete changelog

-   [#&#8203;37690](quarkusio/quarkus#37690) - Regression in 3.6.2: ConfigDiagnostic `NullPointerException: Cannot invoke "java.lang.CharSequence.toString()" because "s" is null`
-   [#&#8203;37688](quarkusio/quarkus#37688) - Do not use build cache when releasing
-   [#&#8203;37669](quarkusio/quarkus#37669) - OIDC: Fix DEV UI startup when OIDC or Keycloak Dev Services is disabled
-   [#&#8203;37667](quarkusio/quarkus#37667) - Disabling of Dev Services for Keycloak leads to startup error
-   [#&#8203;37651](quarkusio/quarkus#37651) - Fix GraalVM version checker in order to accept other implementations
-   [#&#8203;37563](quarkusio/quarkus#37563) - Consistent file URI for folders and jars
-   [#&#8203;37559](quarkusio/quarkus#37559) - Quarkus throws NPE when trying to match unknown config files

### [`v3.6.2`](https://github.com/quarkusio/quarkus/releases/tag/3.6.2)

[Compare Source](quarkusio/quarkus@3.6.1...3.6.2)

##### Complete changelog

-   [#&#8203;37686](quarkusio/quarkus#37686) - Use standard URL when updating the website
-   [#&#8203;37653](quarkusio/quarkus#37653) - Improve error message in REST Client when no matching readers found
-   [#&#8203;37640](quarkusio/quarkus#37640) - Handle expireAfterWrite properly in the redis-cache config
-   [#&#8203;37639](quarkusio/quarkus#37639) - Logging docs include build time config reference
-   [#&#8203;37638](quarkusio/quarkus#37638) - Add scope tag to all injected MP Metrics
-   [#&#8203;37623](quarkusio/quarkus#37623) - Add quarkus-funqy-amazon-lambda-deployment to the quarkus-bom
-   [#&#8203;37617](quarkusio/quarkus#37617) - SmallRye GraphQL 2.6.1
-   [#&#8203;37611](quarkusio/quarkus#37611) - Fix configuration of custom port for Elasticsearch dev services
-   [#&#8203;37610](quarkusio/quarkus#37610) - Elasticsearch devservice port incorrect binding
-   [#&#8203;37605](quarkusio/quarkus#37605) - Fix type in HeartbeatFilter example of rest-client-reactive doc
-   [#&#8203;37599](quarkusio/quarkus#37599) - Bump kafka3.version from 3.6.0 to 3.6.1
-   [#&#8203;37594](quarkusio/quarkus#37594) - Bump org.jetbrains.kotlinx:kotlinx-serialization-json from 1.6.1 to 1.6.2
-   [#&#8203;37590](quarkusio/quarkus#37590) - Microprofile Metric Missing "Scope" Tag Only When Using Constructor Injection
-   [#&#8203;37588](quarkusio/quarkus#37588) - Update the import.cypher script to use newer syntax
-   [#&#8203;37581](quarkusio/quarkus#37581) - Support using commas to add extensions with CLI
-   [#&#8203;37570](quarkusio/quarkus#37570) - Prevent concurrently running Jacoco ReportCreators to avoid report corruption
-   [#&#8203;37565](quarkusio/quarkus#37565) - ArC: prevent duplicate bean discovery & detect duplicate bean identifiers
-   [#&#8203;37564](quarkusio/quarkus#37564) - Invalid documentation for 'quarkus extension add'
-   [#&#8203;37557](quarkusio/quarkus#37557) - Make docs/sync-web-site.sh recoverable
-   [#&#8203;37553](quarkusio/quarkus#37553) - Register OpenAPI custom filters for reflection
-   [#&#8203;37549](quarkusio/quarkus#37549) - Bump commons-io:commons-io from 2.15.0 to 2.15.1
-   [#&#8203;37546](quarkusio/quarkus#37546) - Bump io.quarkus:quarkus-platform-bom-maven-plugin from 0.0.99 to 0.0.100
-   [#&#8203;37545](quarkusio/quarkus#37545) - Bump org.junit.jupiter:junit-jupiter from 5.10.0 to 5.10.1
-   [#&#8203;37536](quarkusio/quarkus#37536) - Fix != expression in `@PreAuthorize` check
-   [#&#8203;37535](quarkusio/quarkus#37535) - Fix Snappy note about native
-   [#&#8203;37526](quarkusio/quarkus#37526) - Spring security annotatiton PreAuthorize process equals and not equals in the same way
-   [#&#8203;37520](quarkusio/quarkus#37520) - Properly match unknown config files for Windows
-   [#&#8203;37513](quarkusio/quarkus#37513) - Save pathParamValues encoded and perform decoding when requested
-   [#&#8203;37505](quarkusio/quarkus#37505) - Bump org.jboss.logmanager:log4j2-jboss-logmanager from 1.1.1.Final to 1.1.2.Final
-   [#&#8203;37496](quarkusio/quarkus#37496) - Quarkus 3.6.0 generate wrong jacoco xml
-   [#&#8203;37493](quarkusio/quarkus#37493) - upgrading from quarkus 3.5.3 to 3.6.0  java.lang.IllegalArgumentException: A case block for the string value already exist
-   [#&#8203;37479](quarkusio/quarkus#37479) - Redis Cache ttl default value invalid setting
-   [#&#8203;37357](quarkusio/quarkus#37357) - Runtime OpenAPI filters are not registered for reflection
-   [#&#8203;37298](quarkusio/quarkus#37298) - Bump Keycloak version to 23.0.0
-   [#&#8203;37187](quarkusio/quarkus#37187) - Bump org.apache.commons:commons-compress from 1.24.0 to 1.25.0
-   [#&#8203;37129](quarkusio/quarkus#37129) - Bump org.jetbrains.kotlinx:kotlinx-serialization-json from 1.6.0 to 1.6.1
-   [#&#8203;37128](quarkusio/quarkus#37128) - Bump org.junit:junit-bom from 5.10.0 to 5.10.1
-   [#&#8203;37035](quarkusio/quarkus#37035) - Register methods of RESTeasy reactive parameter containers for reflection
-   [#&#8203;36986](quarkusio/quarkus#36986) - Native not index method with SSE and throw NoSuchMethodException
-   [#&#8203;36813](quarkusio/quarkus#36813) - config-yaml warning - unrecognized configuration file on Windows
-   [#&#8203;36773](quarkusio/quarkus#36773) - "Unrecognized configuration file" when using YAML
-   [#&#8203;35960](quarkusio/quarkus#35960) - PathParam URL encoded in quarkus-resteasy-reactive since quarkus 3.2.x

### [`v3.6.1`](https://github.com/quarkusio/quarkus/releases/tag/3.6.1)

[Compare Source](quarkusio/quarkus@3.6.0...3.6.1)

##### Complete changelog

-   [#&#8203;37486](quarkusio/quarkus#37486) - Revert "Unlist quarkus-resteasy-qute and quarkus-resteasy-reactive-qute"
-   [#&#8203;37478](quarkusio/quarkus#37478) - Qute resteasy change in 3.6.0
-   [#&#8203;37454](quarkusio/quarkus#37454) - Config: detect injected config value mismatch for missing values
-   [#&#8203;37453](quarkusio/quarkus#37453) - Fix Panache bytecode enhancement for `@Embeddable` records
-   [#&#8203;37449](quarkusio/quarkus#37449) - Update Apache Maven to 3.9.6
-   [#&#8203;37447](quarkusio/quarkus#37447) - Add Content-Range header to 206 Partial Content file response
-   [#&#8203;37444](quarkusio/quarkus#37444) - Injecting ConfigProperty of type Optional\<List<String>> not working in the native mode
-   [#&#8203;37436](quarkusio/quarkus#37436) - Respect comma escapes in property value for `@RolesAllowed.`
-   [#&#8203;37428](quarkusio/quarkus#37428) - Fix various minor issues in quarkus update
-   [#&#8203;37426](quarkusio/quarkus#37426) - Fix typo configMapRefKey -> configMapKeyRef
-   [#&#8203;37421](quarkusio/quarkus#37421) - Scheduler: register ApplicationNotRunning as bean even if quartz is used
-   [#&#8203;37417](quarkusio/quarkus#37417) - Build fails when using the Quartz extension and `@Scheduled`(..., skipExecutionIf = Scheduled.ApplicationNotRunning.class)
-   [#&#8203;37415](quarkusio/quarkus#37415) - Make Truffle from GraalVM 23.1 work in all Quarkus modes
-   [#&#8203;37401](quarkusio/quarkus#37401) - Print correct profiles in native image
-   [#&#8203;37400](quarkusio/quarkus#37400) - Improve reliability when downloading builder images from Quay.io
-   [#&#8203;37398](quarkusio/quarkus#37398) - Revert "Build cache - Upload quarkus-ide-launcher-999-SNAPSHOT.jar"
-   [#&#8203;37395](quarkusio/quarkus#37395) - Update Gradle to 8.5
-   [#&#8203;37393](quarkusio/quarkus#37393) - Disable new Http2RSTFloodProtectionConfigTest on Windows
-   [#&#8203;37392](quarkusio/quarkus#37392) - Update gradle to 8.5 and backport if possible to finish Java 21 dependencies
-   [#&#8203;37384](quarkusio/quarkus#37384) - Stop disabling unsafe in netty at native-executable runtime
-   [#&#8203;37382](quarkusio/quarkus#37382) - Update MAX_LTS_SUPPORTED_BY_KOTLIN to 21
-   [#&#8203;37367](quarkusio/quarkus#37367) - Documentation: security auth mechanism guide must also list runtime form auth properties alongside build-time ones
-   [#&#8203;37366](quarkusio/quarkus#37366) - Documentation: Fix OIDC credentials reference to secret key
-   [#&#8203;37364](quarkusio/quarkus#37364) - Improve Docker Desktop detection
-   [#&#8203;37361](quarkusio/quarkus#37361) - Do not fail the request in OidcClient filters if OidcClient is disabled
-   [#&#8203;37360](quarkusio/quarkus#37360) - Disable OidcClientFilter at runtime for simpler application testing
-   [#&#8203;37359](quarkusio/quarkus#37359) - Fix incorrect log dependency
-   [#&#8203;37354](quarkusio/quarkus#37354) - Update Boucycastle to 1.77 and Boucycastle FIPS to 1.0.2.4
-   [#&#8203;37351](quarkusio/quarkus#37351) - Upgrade to Jandex 3.1.6
-   [#&#8203;37350](quarkusio/quarkus#37350) - Unlist quarkus-resteasy-reactive-qute and quarkus-resteasy-qute
-   [#&#8203;37347](quarkusio/quarkus#37347) - Runtime (re)initialize Netty's PlatformDependent classes
-   [#&#8203;37318](quarkusio/quarkus#37318) - Use batch mode for update-version.sh
-   [#&#8203;37317](quarkusio/quarkus#37317) - Avoid asking for GPG passphrase on CI
-   [#&#8203;37314](quarkusio/quarkus#37314) - Fix deprecated dev-v1 url with dev-ui in a few places
-   [#&#8203;37300](quarkusio/quarkus#37300) - Prepare docs/sync-web-site.sh for automated releases
-   [#&#8203;37294](quarkusio/quarkus#37294) - Fix the major version of Java 21
-   [#&#8203;37292](quarkusio/quarkus#37292) - Bump testcontainers to 1.19.3 and use docker-java-bom
-   [#&#8203;37291](quarkusio/quarkus#37291) - Bump org.jetbrains.kotlin:kotlin-gradle-plugin-api from 1.9.20 to 1.9.21 in /devtools/gradle
-   [#&#8203;37280](quarkusio/quarkus#37280) - Bump Microsoft SQL Server JDBC driver to 12.4.2
-   [#&#8203;37279](quarkusio/quarkus#37279) - Bump Microsoft SQL Server JDBC driver to 12.4.2
-   [#&#8203;37271](quarkusio/quarkus#37271) - Docs: add keywords to Vert.x guides
-   [#&#8203;37270](quarkusio/quarkus#37270) - Vert.x: report exception for blocking message consumer methods
-   [#&#8203;37268](quarkusio/quarkus#37268) - Reactive REST Client: check for ClientRequestFilter when skipping `@Provider` auto-discovery
-   [#&#8203;37252](quarkusio/quarkus#37252) - Use the default tenant resolver if the custom one does not resolve a tenant
-   [#&#8203;37251](quarkusio/quarkus#37251) - Add a test showing how OIDC ID token can be propagated
-   [#&#8203;37247](quarkusio/quarkus#37247) - Update kindcontainer to 1.4.4
-   [#&#8203;37244](quarkusio/quarkus#37244) - Always execute a JPA password action
-   [#&#8203;37228](quarkusio/quarkus#37228) - Add classes from additional JPA model build items to pre-generate proxies
-   [#&#8203;37224](quarkusio/quarkus#37224) - Qute: dev mode - debug a problem with no-restart-template
-   [#&#8203;37222](quarkusio/quarkus#37222) - RuntimeException in vertx is silently swallowed for blocking ConsumeEvents
-   [#&#8203;37177](quarkusio/quarkus#37177) - QUARKUS_MROFILE=dev and '-Dquarkus.profile=dev' not working for native image
-   [#&#8203;37108](quarkusio/quarkus#37108) - Warning about build time generated proxy for entity OutboxEvent in Hibernate Search
-   [#&#8203;36892](quarkusio/quarkus#36892) - Update Kotlin to version 1.9.21, Mockito to 5.7.0
-   [#&#8203;36747](quarkusio/quarkus#36747) - NoSuchMethodException when reading `@Embeddable` record
-   [#&#8203;36735](quarkusio/quarkus#36735) - Failure to bump BouncyCastle FIPS version to 1.0.2.4 due to a native build failure
-   [#&#8203;36242](quarkusio/quarkus#36242) - Quarkus cannot load Truffle/polyglot languages with the custom class loader.
-   [#&#8203;17839](quarkusio/quarkus#17839) - Invalid memory configuration for netty maxDirectMemory in native image

</details>

<details>
<summary>quarkusio/quarkus-platform</summary>

### [`v3.6.3`](quarkusio/quarkus-platform@3.6.2...3.6.3)

[Compare Source](quarkusio/quarkus-platform@3.6.2...3.6.3)

### [`v3.6.2`](quarkusio/quarkus-platform@3.6.1...3.6.2)

[Compare Source](quarkusio/quarkus-platform@3.6.1...3.6.2)

### [`v3.6.1`](quarkusio/quarkus-platform@3.6.0...3.6.1)

[Compare Source](quarkusio/quarkus-platform@3.6.0...3.6.1)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever MR is behind base branch, or you tick the rebase/retry checkbox.

👻 **Immortal**: This MR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4yNC4wIiwidXBkYXRlZEluVmVyIjoiMzQuMjQuMCJ9-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants