mirror of
https://github.com/postgres/postgres.git
synced 2025-08-12 15:23:02 +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:
@@ -561,6 +561,15 @@ CheckAttributeType(const char *attname,
|
|||||||
|
|
||||||
containing_rowtypes = list_delete_first(containing_rowtypes);
|
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))))
|
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
|
t
|
||||||
(1 row)
|
(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
|
-- 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,1] <@ arrayrange(array[1,2], array[2,1]);
|
||||||
select array[1,3] <@ 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
|
-- Check behavior when subtype lacks a hash function
|
||||||
--
|
--
|
||||||
|
Reference in New Issue
Block a user