Re: CheckAttributeType() forgot to recurse into multiranges
Heikki Linnakangas <hlinnaka@iki.fi>
From: Heikki Linnakangas <hlinnaka@iki.fi>
To: Chao Li <li.evan.chao@gmail.com>
Cc: "pgsql-hackers@postgresql.org" <pgsql-hackers@postgresql.org>
Date: 2026-04-23T18:49:04Z
Lists: pgsql-hackers
On 23/04/2026 06:24, Chao Li wrote:
> I traced this patch set, 0002 looks good, but I have a suspicion about 0001.
>
> ```
> + else if (att_typtype == TYPTYPE_MULTIRANGE)
> + {
> + /*
> + * If it's a multirange, recurse to check its plain range type.
> + */
> + CheckAttributeType(attname, get_multirange_range(atttypid),
> + get_range_collation(atttypid),
> + containing_rowtypes,
> + flags);
> + }
> ```
>
> Looking at get_range_collation(), it only searches for RANGETYPE, so get_range_collation(atttypid) here will always return InvalidOid. This does not seem to cause a problem, because CheckAttributeType() will recurse into the TYPTYPE_RANGE path, and the collation will be evaluated there.
>
> But to make the logic clearer, I think we could just pass InvalidOid as the collation OID in the TYPTYPE_MULTIRANGE case. If we really want to pass the actual collation OID here, I think it would need to be done more like this:
>
> ```
> else if (att_typtype == TYPTYPE_MULTIRANGE)
> {
> Oid multirange_range_typid = get_multirange_range(atttypid);
> Oid collation = get_range_collation(multirange_range_typid);
> /*
> * If it's a multirange, recurse to check its plain range type.
> */
> CheckAttributeType(attname, multirange_range_typid,
> collation,
> containing_rowtypes,
> flags);
> }
> ```
Oh, good catch, this is subtle. I'll change it to InvalidOid. As long as
range types are not collatable, that'll do the right thing. If range
types were collatable, I'm not sure what the right thing would be. It
depends on what exactly the collation of a range type would mean.
So, pushed with InvalidOid. Thanks for the review!
- Heikki
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Don't allow composite type to be member of itself via multirange
- c7a1d5fc6513 14.23 landed
- 34ebeb15c8b1 15.18 landed
- 06e304524d5c 16.14 landed
- 54343f6f9046 17.10 landed
- ff8f27d6eae2 18.4 landed
- dd4069197650 19 (unreleased) landed
-
Don't call CheckAttributeType() with InvalidOid on dropped cols
- d2f58c42a261 14.23 landed
- e1830ebf5219 15.18 landed
- 526d9ca619cc 16.14 landed
- d54e75441518 17.10 landed
- 01db3f0398fd 18.4 landed
- 713bce9484de 19 (unreleased) landed