mirror of
https://github.com/postgres/postgres.git
synced 2025-06-05 23:56:58 +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:
parent
297b9ccff4
commit
0d245d13c6
@ -561,6 +561,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,
|
||||
allow_system_table_mods);
|
||||
}
|
||||
else if (OidIsValid((att_typelem = get_element_type(atttypid))))
|
||||
{
|
||||
/*
|
||||
|
@ -1323,6 +1323,25 @@ select array[1,3] <@ arrayrange(array[1,2], array[2,1]);
|
||||
t
|
||||
(1 row)
|
||||
|
||||
--
|
||||
-- Ranges of composites
|
||||
--
|
||||
create type two_ints as (a int, b int);
|
||||
create type two_ints_range as range (subtype = two_ints);
|
||||
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);
|
||||
t | u
|
||||
-------------------+---------------
|
||||
["(1,2)","(3,4)") | {"a":3,"b":4}
|
||||
["(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
|
||||
--
|
||||
-- Check behavior when subtype lacks a hash function
|
||||
--
|
||||
|
@ -442,6 +442,22 @@ select arrayrange(ARRAY[2,1], ARRAY[1,2]); -- fail
|
||||
select array[1,1] <@ arrayrange(array[1,2], array[2,1]);
|
||||
select array[1,3] <@ arrayrange(array[1,2], array[2,1]);
|
||||
|
||||
--
|
||||
-- Ranges of composites
|
||||
--
|
||||
|
||||
create type two_ints as (a int, b int);
|
||||
create type two_ints_range as range (subtype = two_ints);
|
||||
|
||||
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;
|
||||
|
||||
--
|
||||
-- Check behavior when subtype lacks a hash function
|
||||
--
|
||||
|
Loading…
x
Reference in New Issue
Block a user