CheckAttributeType() forgot to recurse into multiranges

Heikki Linnakangas <hlinnaka@iki.fi>

From: Heikki Linnakangas <hlinnaka@iki.fi>
To: "pgsql-hackers@postgresql.org" <pgsql-hackers@postgresql.org>
Date: 2026-04-22T20:56:12Z
Lists: pgsql-hackers

Attachments

Happened to spot this little bug:

create type two_ints as (a int, b int);
create type two_ints_range as range (subtype = two_ints);

-- CheckAttributeType() forbids this:
alter type two_ints add attribute c two_ints_range;
ERROR:  composite type two_ints cannot be made a member of itself

-- But the same with a multirange is allowed:
alter type two_ints add attribute c two_ints_multirange;
ALTER TYPE

That looks like a straightforward oversight in CheckAttributeType(). 
When multiranges were introduced, it didn't get the memo.

Fix attached. Assuming no objections, I'll commit and backpatch that.

While working on the fix, I noticed that in case of dropped columns, 
CheckAttributeType() is called with InvalidOid. It tolerates that, but 
it seems accidental and it performs a bunch of futile syscache lookups 
with InvalidOid, so it would be better to not do that. The second patch 
fixes that.

- Heikki

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Don't allow composite type to be member of itself via multirange

  2. Don't call CheckAttributeType() with InvalidOid on dropped cols