1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-15 19:15:29 +03:00

Prevent a rowtype from being included in itself via a range.

We probably should have thought of this case when ranges were added,
but we didn't.  (It's not the fault of commit eb51af71f, because
ranges didn't exist then.)

It's an old bug, so back-patch to all supported branches.

Discussion: https://postgr.es/m/7782.1577051475@sss.pgh.pa.us
This commit is contained in:
Tom Lane 2019-12-23 12:08:23 -05:00
parent e1c056cc4d
commit 976cb11f6c
3 changed files with 15 additions and 0 deletions

View File

@ -656,6 +656,15 @@ CheckAttributeType(const char *attname,
containing_rowtypes = list_delete_first(containing_rowtypes);
}
else if (att_typtype == TYPTYPE_RANGE)
{
/*
* If it's a range, recurse to check its subtype.
*/
CheckAttributeType(attname, get_range_subtype(atttypid), attcollation,
containing_rowtypes,
flags);
}
else if (OidIsValid((att_typelem = get_element_type(atttypid))))
{
/*

View File

@ -1375,6 +1375,9 @@ select *, row_to_json(upper(t)) as u from
["(5,6)","(7,8)") | {"a":7,"b":8}
(2 rows)
-- this must be rejected to avoid self-inclusion issues:
alter type two_ints add attribute c two_ints_range;
ERROR: composite type two_ints cannot be made a member of itself
drop type two_ints cascade;
NOTICE: drop cascades to type two_ints_range
--

View File

@ -463,6 +463,9 @@ select *, row_to_json(upper(t)) as u from
(values (two_ints_range(row(1,2), row(3,4))),
(two_ints_range(row(5,6), row(7,8)))) v(t);
-- this must be rejected to avoid self-inclusion issues:
alter type two_ints add attribute c two_ints_range;
drop type two_ints cascade;
--