Skip to content

Commit c38ac06

Browse files
jrgemignaniMuhammadTahaNaveed
authored andcommitted
fix issue 2205: left doesn't catch overflow (#2207)
Fixed issue 2205 where large int values aren't detected. The following functions were fixed - left, right, and substring modified: regress/expected/expr.out modified: regress/sql/expr.sql modified: src/backend/utils/adt/agtype.c Added regression tests.
1 parent a2e608c commit c38ac06

File tree

3 files changed

+216
-11
lines changed

3 files changed

+216
-11
lines changed

regress/expected/expr.out

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4556,6 +4556,18 @@ ERROR: function age_left() does not exist
45564556
LINE 1: SELECT * FROM age_left();
45574557
^
45584558
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
4559+
SELECT * FROM cypher('expr', $$
4560+
RETURN left('abcdef', -2147483648)
4561+
$$) AS (result agtype);
4562+
ERROR: left() negative values are not supported for length
4563+
SELECT * FROM cypher('expr', $$
4564+
RETURN left('abcdef', -2147483649)
4565+
$$) AS (result agtype);
4566+
ERROR: left() length value is out of INT range
4567+
SELECT * FROM cypher('expr', $$
4568+
RETURN left('abcdef', 2147483649)
4569+
$$) AS (result agtype);
4570+
ERROR: left() length value is out of INT range
45594571
--right()
45604572
SELECT * FROM cypher('expr', $$
45614573
RETURN right("123456789", 1)
@@ -4636,6 +4648,18 @@ ERROR: function age_right() does not exist
46364648
LINE 1: SELECT * FROM age_right();
46374649
^
46384650
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
4651+
SELECT * FROM cypher('expr', $$
4652+
RETURN right('abcdef', -2147483648)
4653+
$$) AS (result agtype);
4654+
ERROR: right() negative values are not supported for length
4655+
SELECT * FROM cypher('expr', $$
4656+
RETURN right('abcdef', -2147483649)
4657+
$$) AS (result agtype);
4658+
ERROR: right() length value is out of INT range
4659+
SELECT * FROM cypher('expr', $$
4660+
RETURN right('abcdef', 2147483649)
4661+
$$) AS (result agtype);
4662+
ERROR: right() length value is out of INT range
46394663
-- substring()
46404664
SELECT * FROM cypher('expr', $$
46414665
RETURN substring("0123456789", 0, 1)
@@ -4731,6 +4755,30 @@ SELECT * FROM age_substring(null, 1);
47314755

47324756
(1 row)
47334757

4758+
SELECT * FROM cypher('expr', $$
4759+
RETURN substring('abcdef', -2147483648, 0)
4760+
$$) AS (result agtype);
4761+
ERROR: substring() negative values are not supported for offset or length
4762+
SELECT * FROM cypher('expr', $$
4763+
RETURN substring('abcdef', -2147483649, 0)
4764+
$$) AS (result agtype);
4765+
ERROR: substring() parameter value is out of INT range
4766+
SELECT * FROM cypher('expr', $$
4767+
RETURN substring('abcdef', 2147483649, 0)
4768+
$$) AS (result agtype);
4769+
ERROR: substring() parameter value is out of INT range
4770+
SELECT * FROM cypher('expr', $$
4771+
RETURN substring('abcdef', 0, -2147483648)
4772+
$$) AS (result agtype);
4773+
ERROR: substring() negative values are not supported for offset or length
4774+
SELECT * FROM cypher('expr', $$
4775+
RETURN substring('abcdef', 0, -2147483649)
4776+
$$) AS (result agtype);
4777+
ERROR: substring() parameter value is out of INT range
4778+
SELECT * FROM cypher('expr', $$
4779+
RETURN substring('abcdef', 0, 2147483649)
4780+
$$) AS (result agtype);
4781+
ERROR: substring() parameter value is out of INT range
47344782
-- should fail
47354783
SELECT * FROM cypher('expr', $$
47364784
RETURN substring("123456789", null)

regress/sql/expr.sql

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1905,6 +1905,15 @@ $$) AS (results agtype);
19051905
SELECT * FROM age_left('123456789', null);
19061906
SELECT * FROM age_left('123456789', -1);
19071907
SELECT * FROM age_left();
1908+
SELECT * FROM cypher('expr', $$
1909+
RETURN left('abcdef', -2147483648)
1910+
$$) AS (result agtype);
1911+
SELECT * FROM cypher('expr', $$
1912+
RETURN left('abcdef', -2147483649)
1913+
$$) AS (result agtype);
1914+
SELECT * FROM cypher('expr', $$
1915+
RETURN left('abcdef', 2147483649)
1916+
$$) AS (result agtype);
19081917
--right()
19091918
SELECT * FROM cypher('expr', $$
19101919
RETURN right("123456789", 1)
@@ -1938,6 +1947,15 @@ $$) AS (results agtype);
19381947
SELECT * FROM age_right('123456789', null);
19391948
SELECT * FROM age_right('123456789', -1);
19401949
SELECT * FROM age_right();
1950+
SELECT * FROM cypher('expr', $$
1951+
RETURN right('abcdef', -2147483648)
1952+
$$) AS (result agtype);
1953+
SELECT * FROM cypher('expr', $$
1954+
RETURN right('abcdef', -2147483649)
1955+
$$) AS (result agtype);
1956+
SELECT * FROM cypher('expr', $$
1957+
RETURN right('abcdef', 2147483649)
1958+
$$) AS (result agtype);
19411959
-- substring()
19421960
SELECT * FROM cypher('expr', $$
19431961
RETURN substring("0123456789", 0, 1)
@@ -1968,6 +1986,24 @@ $$) AS (results agtype);
19681986
SELECT * FROM age_substring(null, null, null);
19691987
SELECT * FROM age_substring(null, null);
19701988
SELECT * FROM age_substring(null, 1);
1989+
SELECT * FROM cypher('expr', $$
1990+
RETURN substring('abcdef', -2147483648, 0)
1991+
$$) AS (result agtype);
1992+
SELECT * FROM cypher('expr', $$
1993+
RETURN substring('abcdef', -2147483649, 0)
1994+
$$) AS (result agtype);
1995+
SELECT * FROM cypher('expr', $$
1996+
RETURN substring('abcdef', 2147483649, 0)
1997+
$$) AS (result agtype);
1998+
SELECT * FROM cypher('expr', $$
1999+
RETURN substring('abcdef', 0, -2147483648)
2000+
$$) AS (result agtype);
2001+
SELECT * FROM cypher('expr', $$
2002+
RETURN substring('abcdef', 0, -2147483649)
2003+
$$) AS (result agtype);
2004+
SELECT * FROM cypher('expr', $$
2005+
RETURN substring('abcdef', 0, 2147483649)
2006+
$$) AS (result agtype);
19712007
-- should fail
19722008
SELECT * FROM cypher('expr', $$
19732009
RETURN substring("123456789", null)

0 commit comments

Comments
 (0)