diff options
| author | Dean Rasheed | 2023-11-09 12:10:14 +0000 |
|---|---|---|
| committer | Dean Rasheed | 2023-11-09 12:10:14 +0000 |
| commit | 3850d4dec1d91c4fdce274f42986840444d5593e (patch) | |
| tree | 0a9284641c901c15d11fe5329dd3530369a9ddac /src/test | |
| parent | a4f7d33a904fcd4da7a12d249416dd2c5c5f2c1c (diff) | |
Avoid integer overflow hazard in interval_time().
When casting an interval to a time, the original code suffered from
64-bit integer overflow for inputs with a sufficiently large negative
"time" field, leading to bogus results.
Fix by rewriting the algorithm in a simpler form, that more obviously
cannot overflow. While at it, improve the test coverage to include
negative interval inputs.
Discussion: https://postgr.es/m/CAEZATCXoUKHkcuq4q63hkiPsKZJd0kZWzgKtU%2BNT0aU4wbf_Pw%40mail.gmail.com
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/regress/expected/horology.out | 12 | ||||
| -rw-r--r-- | src/test/regress/sql/horology.sql | 2 |
2 files changed, 14 insertions, 0 deletions
diff --git a/src/test/regress/expected/horology.out b/src/test/regress/expected/horology.out index e63e5b30fee..8f52661096f 100644 --- a/src/test/regress/expected/horology.out +++ b/src/test/regress/expected/horology.out @@ -981,6 +981,18 @@ SELECT CAST(interval '02:03' AS time) AS "02:03:00"; 02:03:00 (1 row) +SELECT CAST(interval '-02:03' AS time) AS "21:57:00"; + 21:57:00 +---------- + 21:57:00 +(1 row) + +SELECT CAST(interval '-9223372022400000000 us' AS time) AS "00:00:00"; + 00:00:00 +---------- + 00:00:00 +(1 row) + SELECT time '01:30' + interval '02:01' AS "03:31:00"; 03:31:00 ---------- diff --git a/src/test/regress/sql/horology.sql b/src/test/regress/sql/horology.sql index f7f8c8d2dd9..39a35a6b7ce 100644 --- a/src/test/regress/sql/horology.sql +++ b/src/test/regress/sql/horology.sql @@ -182,6 +182,8 @@ SELECT d1 - interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; SELECT CAST(time '01:02' AS interval) AS "+01:02"; SELECT CAST(interval '02:03' AS time) AS "02:03:00"; +SELECT CAST(interval '-02:03' AS time) AS "21:57:00"; +SELECT CAST(interval '-9223372022400000000 us' AS time) AS "00:00:00"; SELECT time '01:30' + interval '02:01' AS "03:31:00"; SELECT time '01:30' - interval '02:01' AS "23:29:00"; SELECT time '02:30' + interval '36:01' AS "14:31:00"; |
