diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 03d65a2d8a..ad8fec1d80 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -573,6 +573,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)))) { /* diff --git a/src/test/regress/expected/rangetypes.out b/src/test/regress/expected/rangetypes.out index 6fd16bddd1..5ed6ae47ec 100644 --- a/src/test/regress/expected/rangetypes.out +++ b/src/test/regress/expected/rangetypes.out @@ -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 -- diff --git a/src/test/regress/sql/rangetypes.sql b/src/test/regress/sql/rangetypes.sql index 8960add976..2d0ec8964e 100644 --- a/src/test/regress/sql/rangetypes.sql +++ b/src/test/regress/sql/rangetypes.sql @@ -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; --