Silent overflow of interval type
Nick Babadzhanian <pgnickb@gmail.com>
From: Nikolai <pgnickb@gmail.com>
To: pgsql-hackers@lists.postgresql.org
Date: 2023-02-15T15:07:45Z
Lists: pgsql-hackers
Attachments
- 0001-Fix-interval-silent-overflow.patch (text/x-patch) patch 0001
Hello hackers, I've been testing various edge-cases of timestamptz and related types and noticed that despite being a 16-byte wide type, interval overflows for some timestamptz (8-byte) subtractions (timestamp_mi). A simple example of this would be: select timestamptz'294276-12-31 23:59:59 UTC' - timestamptz'1582-10-15 00:00:00 UTC'; Yielding: interval'-106599615 days -08:01:50.551616' This makes sense from the implementation point of view, since both timestamptz and Interval->TimeOffset are int64. The patch attached simply throws an error when an overflow is detected. However I'm not sure this is a reasonable approach for a code path that could be very hot in some workloads. Another consideration is that regardless of the values of the timestamps, the absolute value of the difference can be stored in a uint64. However that observation has little practical value. That being said I'm willing to work on a fix that makes sense and making it commit ready (or step aside if someone else wants to take over) but I'd also understand if this is marked as "not worth fixing". Regards, Nick
Commits
-
Detect overflow in timestamp[tz] subtraction.
- 8028e294b456 16.0 landed