duckdb / duckdb/duckdb-java

DateTimeException: Invalid value for NanoOfDay raised when running test_all_types()

Offen
#448 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
C++
Sterne
127
Forks
80
Ø Merge
13 Std. 49 Min.
Gemergte PRs (30 T.)
48

Beschreibung

I found when running `FROM test_all_types()` the following exception was raised

```
Execution error (DateTimeException) at java.time.temporal.ValueRange/checkValidValue (ValueRange.java:319).
Invalid value for NanoOfDay (valid values 0 - 86399999999999): 86400000000000

java.time.temporal.ValueRange/checkValidValue (ValueRange.java:319)
java.time.temporal.ChronoField/checkValidValue (ChronoField.java:721)
java.time.LocalTime/ofNanoOfDay (LocalTime.java:410)
org.duckdb.DuckDBVector/getLocalTime (DuckDBVector.java:137)
org.duckdb.DuckDBVector/getObject (DuckDBVector.java:96)
org.duckdb.DuckDBResultSet/getObject (DuckDBResultSet.java:168)
[OMITTED APPLICATION FRAMES]
[...]
```

After looking at the results of `SELECT time FROM test_all_types();`

| time |
| ----- |
| 00:00:00 |
| 24:00:00 |
| NULL |

and looking at the [ISO 8601 wikipedia page](https://en.wikipedia.org/wiki/ISO_8601#Times) it looks like the `ISO 8601` standard has thrashed a little bit on if `24` is a valid value for an hour.

According to the [LocalTime.ofNanoOfDay(long)](https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/time/LocalTime.html#ofNanoOfDay(long)) docs the valid range is `from 0 to 24 * 60 * 60 * 1,000,000,000 - 1` which is the source of the exception being raised. I'm unfamiliar with alternative Java APIs that would conform to the current state of the 8601 spec that does allow `24` for an hour value.

Here is a test case that I think should exercise the issue with the `java.time.LocalTime#onNanoOfDay(long)` implementation.

```java
public class TestTimestamp {
public static void test_duckdb_time_boundaries() throws Exception {
try (Connection conn = DriverManager.getConnection(JDBC_URL); Statement stmt = conn.createStatement()) {
try (ResultSet rs = stmt.executeQuery("SELECT '00:00:00'::TIME, '24:00:00'::TIME")) {
rs.next();
assertEquals(rs.getTime(0), 0, "floor");
assertEquals(rs.getTime(1), 86400000000000, "ceil");
}
}
}
}
```

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Beginnen Sie mit org.duckdb.DuckDBVector.getLocalTime und getObject, wo der Stacktrace die fehlschlagende Konvertierung zeigt, und überprüfen Sie anschließend den TestTimestamp-Grenzfall im Issue. Prüfen Sie, wie SELECT TIME-Werte 00:00:00, 24:00:00 und NULL über JDBC zurückgegeben werden. Als abgeschlossen gilt die Aufgabe, wenn der Grenztest keine DateTimeException mehr auslöst und das beabsichtigte Verhalten von Unter- und Obergrenze überprüft.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
java, sql
Bereich
api, database
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.