Reading a large interval as TimeSpan returns a wrong value instead of throwing

Offen Anfängerfreundlich
#6,726 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 6 Tagen

@Mr444-dev arbeitet bereits daran.

Seit 03.11.2026.

  • #6739 von @Mr444-dev — offen

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
66/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Aktiv
Tech-Stack
csharp, postgresql
Bereich
backend, databases

Rechercherichtung

Beginne damit nachzuverfolgen, wie Npgsql PostgreSQL-Intervalle in TimeSpan einliest, und sieh dir anschließend die Tests in der Nähe zu Intervallkonvertierungen und Überlauffällen an. Reproduziere den Fehler mit der bereitgestellten Abfrage, die interval '300000000 hours' verwendet; fertig ist die Aufgabe, wenn Intervalle außerhalb des Wertebereichs eine Ausnahme auslösen, statt einen übergelaufenen Wert zurückzugeben, während unterstützte Intervalle weiterhin korrekt eingelesen werden.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Steps to reproduce
await using var dataSource = NpgsqlDataSource.Create("Host=localhost;Username=test;Password=test;Database=test");
await using var cmd = dataSource.CreateCommand("SELECT interval '300000000 hours'");
var value = (TimeSpan)(await cmd.ExecuteScalarAsync())!;
Console.WriteLine(value);
The issue

The interval is larger than TimeSpan.MaxValue, but reading it as TimeSpan doesn't throw. The tick computation overflows and the read returns a wrapped value with the wrong sign, -8850398.05:36:10.9551616. interval '-300000000 hours' comes back positive, and interval '20000000 days' wraps the same way. PostgreSQL itself returns 300000000:00:00.

Reading an interval that has months as TimeSpan already throws InvalidCastException. An interval outside the range of TimeSpan should throw too, instead of returning a wrong value.

Further technical details

Npgsql version: main at b35800b47764b9bb5e0fce3c6d06132ca8107c52
PostgreSQL version: 17.11
Operating system: Linux x86_64

Other details about my project setup: .NET SDK 10.0.403

Vorherrschende Sprache
C#
Sterne
3.7k
Forks
890
Ø Merge
4 T. 11 Std.
Gemergte PRs (30 T.)
19

Entwicklungsumgebung

In Codespaces öffnen

Startet den Dev-Container des Projekts im Browser, mit Ihrem eigenen GitHub-Konto.

  • Kein Dockerfile und keine Docker-Compose-Datei
  • Keine Pull-Request-Vorlage
  • Kein Beitragsleitfaden

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus npgsql/npgsql

Alle Issues in npgsql/npgsql

Ähnliche Issues

Weitere Issues zu C#

Neue Issues direkt in Ihr Postfach

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