summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorDean Rasheed2023-10-29 15:46:04 +0000
committerDean Rasheed2023-10-29 15:51:53 +0000
commitb2d55447a563036579d6777f64a7483dceeab6ea (patch)
tree4bb29b19a118c7fac9a02d57ec080b3e87e066b6 /src/test
parent849172ff4883d44168f96f39d3fde96d0aa34c99 (diff)
Guard against overflow in make_interval().
The original code did very little to guard against integer or floating point overflow when computing the interval's fields. Detect any such overflows and error out, rather than silently returning bogus results. Joseph Koshakow, reviewed by Ashutosh Bapat and me. Discussion: https://postgr.es/m/CAAvxfHcm1TPwH_zaGWuFoL8pZBestbRZTU6Z%3D-RvAdSXTPbKfg%40mail.gmail.com
Diffstat (limited to 'src/test')
-rw-r--r--src/test/regress/expected/interval.out27
-rw-r--r--src/test/regress/sql/interval.sql15
2 files changed, 42 insertions, 0 deletions
diff --git a/src/test/regress/expected/interval.out b/src/test/regress/expected/interval.out
index c0ca8e041b1..75d19d65949 100644
--- a/src/test/regress/expected/interval.out
+++ b/src/test/regress/expected/interval.out
@@ -1587,6 +1587,33 @@ select interval '-2147483648 months -2147483648 days -9223372036854775808 micros
ERROR: interval field value out of range: "-2147483648 months -2147483648 days -9223372036854775808 microseconds ago"
LINE 1: select interval '-2147483648 months -2147483648 days -922337...
^
+-- overflowing using make_interval
+select make_interval(years := 178956971);
+ERROR: interval out of range
+select make_interval(years := -178956971);
+ERROR: interval out of range
+select make_interval(years := 1, months := 2147483647);
+ERROR: interval out of range
+select make_interval(years := -1, months := -2147483648);
+ERROR: interval out of range
+select make_interval(weeks := 306783379);
+ERROR: interval out of range
+select make_interval(weeks := -306783379);
+ERROR: interval out of range
+select make_interval(weeks := 1, days := 2147483647);
+ERROR: interval out of range
+select make_interval(weeks := -1, days := -2147483648);
+ERROR: interval out of range
+select make_interval(secs := 1e308);
+ERROR: value out of range: overflow
+select make_interval(secs := 1e18);
+ERROR: interval out of range
+select make_interval(secs := -1e18);
+ERROR: interval out of range
+select make_interval(mins := 1, secs := 9223372036800.0);
+ERROR: interval out of range
+select make_interval(mins := -1, secs := -9223372036800.0);
+ERROR: interval out of range
-- test that INT_MIN number is formatted properly
SET IntervalStyle to postgres;
select interval '-2147483648 months -2147483648 days -9223372036854775808 us';
diff --git a/src/test/regress/sql/interval.sql b/src/test/regress/sql/interval.sql
index 038fc508d0c..a0a373f08bd 100644
--- a/src/test/regress/sql/interval.sql
+++ b/src/test/regress/sql/interval.sql
@@ -511,6 +511,21 @@ select interval '-2147483648 days ago';
select interval '-9223372036854775808 microseconds ago';
select interval '-2147483648 months -2147483648 days -9223372036854775808 microseconds ago';
+-- overflowing using make_interval
+select make_interval(years := 178956971);
+select make_interval(years := -178956971);
+select make_interval(years := 1, months := 2147483647);
+select make_interval(years := -1, months := -2147483648);
+select make_interval(weeks := 306783379);
+select make_interval(weeks := -306783379);
+select make_interval(weeks := 1, days := 2147483647);
+select make_interval(weeks := -1, days := -2147483648);
+select make_interval(secs := 1e308);
+select make_interval(secs := 1e18);
+select make_interval(secs := -1e18);
+select make_interval(mins := 1, secs := 9223372036800.0);
+select make_interval(mins := -1, secs := -9223372036800.0);
+
-- test that INT_MIN number is formatted properly
SET IntervalStyle to postgres;
select interval '-2147483648 months -2147483648 days -9223372036854775808 us';