Skip to content

Commit 0491998

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 4599906 commit 0491998

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
@@ -1906,6 +1906,15 @@ $$) AS (results agtype);
19061906
SELECT * FROM age_left('123456789', null);
19071907
SELECT * FROM age_left('123456789', -1);
19081908
SELECT * FROM age_left();
1909+
SELECT * FROM cypher('expr', $$
1910+
RETURN left('abcdef', -2147483648)
1911+
$$) AS (result agtype);
1912+
SELECT * FROM cypher('expr', $$
1913+
RETURN left('abcdef', -2147483649)
1914+
$$) AS (result agtype);
1915+
SELECT * FROM cypher('expr', $$
1916+
RETURN left('abcdef', 2147483649)
1917+
$$) AS (result agtype);
19091918
--right()
19101919
SELECT * FROM cypher('expr', $$
19111920
RETURN right("123456789", 1)
@@ -1939,6 +1948,15 @@ $$) AS (results agtype);
19391948
SELECT * FROM age_right('123456789', null);
19401949
SELECT * FROM age_right('123456789', -1);
19411950
SELECT * FROM age_right();
1951+
SELECT * FROM cypher('expr', $$
1952+
RETURN right('abcdef', -2147483648)
1953+
$$) AS (result agtype);
1954+
SELECT * FROM cypher('expr', $$
1955+
RETURN right('abcdef', -2147483649)
1956+
$$) AS (result agtype);
1957+
SELECT * FROM cypher('expr', $$
1958+
RETURN right('abcdef', 2147483649)
1959+
$$) AS (result agtype);
19421960
-- substring()
19431961
SELECT * FROM cypher('expr', $$
19441962
RETURN substring("0123456789", 0, 1)
@@ -1969,6 +1987,24 @@ $$) AS (results agtype);
19691987
SELECT * FROM age_substring(null, null, null);
19701988
SELECT * FROM age_substring(null, null);
19711989
SELECT * FROM age_substring(null, 1);
1990+
SELECT * FROM cypher('expr', $$
1991+
RETURN substring('abcdef', -2147483648, 0)
1992+
$$) AS (result agtype);
1993+
SELECT * FROM cypher('expr', $$
1994+
RETURN substring('abcdef', -2147483649, 0)
1995+
$$) AS (result agtype);
1996+
SELECT * FROM cypher('expr', $$
1997+
RETURN substring('abcdef', 2147483649, 0)
1998+
$$) AS (result agtype);
1999+
SELECT * FROM cypher('expr', $$
2000+
RETURN substring('abcdef', 0, -2147483648)
2001+
$$) AS (result agtype);
2002+
SELECT * FROM cypher('expr', $$
2003+
RETURN substring('abcdef', 0, -2147483649)
2004+
$$) AS (result agtype);
2005+
SELECT * FROM cypher('expr', $$
2006+
RETURN substring('abcdef', 0, 2147483649)
2007+
$$) AS (result agtype);
19722008
-- should fail
19732009
SELECT * FROM cypher('expr', $$
19742010
RETURN substring("123456789", null)

0 commit comments

Comments
 (0)