RE: Bug: wrong relname in RemoveSubscriptionRel() error detail - Mailing list pgsql-hackers

From Zhijie Hou (Fujitsu)
Subject RE: Bug: wrong relname in RemoveSubscriptionRel() error detail
Date
Msg-id TY4PR01MB1690715C2DD73955A5B8C1BD99452A@TY4PR01MB16907.jpnprd01.prod.outlook.com
Whole thread Raw
In response to Re: Bug: wrong relname in RemoveSubscriptionRel() error detail  (Chao Li <li.evan.chao@gmail.com>)
Responses Re: Bug: wrong relname in RemoveSubscriptionRel() error detail
List pgsql-hackers
On Monday, March 30, 2026 2:33 PM Chao Li <li.evan.chao@gmail.com> wrote:
> > On Mar 30, 2026, at 14:16, Nisha Moond <nisha.moond412@gmail.com>
> wrote:
> >
> > On Fri, Mar 27, 2026 at 3:22 PM Chao Li <li.evan.chao@gmail.com> wrote:
> > > This looks like a first-day bug introducing by ce0fdbf, so I think it’s worth
> > > back-patching.
> > >
> > I tried reproducing the said bug on HEAD, but it doesn’t seem to exist
> > in the current code.
> >
> > To hit the mentioned error, the subid has to be invalid -
> >   if (!OidIsValid(subid) &&  <==
> > And currently, the only path that uses an invalid subid is via
> > heap_drop_with_catalog() :
> > …
> > /*
> >   * Remove any associated relation synchronization states.
> >   */
> >  RemoveSubscriptionRel(InvalidOid, relid);
> > …
> >
> > But here relid is always a valid OID (it's the table being dropped).
> > The corresponding pg_class row is deleted after
> > RemoveSubscriptionRel(), i.e. via a later call to
> > DeleteRelationTuple(relid);
> >
> > It can only happen with a hypothetical future caller of
> > RemoveSubscriptionRel(InvalidOid, InvalidOid). And in that case, using
> > "subrel->srrelid" would be correct.
> >
> > So this doesn’t appear to be a real issue in the current code, and
> > doesn’t look like a bug to fix now. IMO, if such a caller is added in
> > the future, we can add a guard at that point.
> >
> > --
> > Thanks,
> > Nisha
> 
> Hi Nisha,
> 
> Thanks for your review.
> 
> I think one current call site may have been overlooked. In DropSubscription(),
> we have:
> ```
>     /* Remove any associated relation synchronization states. */
>     RemoveSubscriptionRel(subid, InvalidOid);
> ```

This won't trigger the bug either, since it passes a valid subscription OID to
the function, while the function only reports an error when an invalid OID is
passed.

> 
> I agree this is an edge-case bug and may be difficult to reproduce in practice.
> But from the function’s semantics, it seems clear to me that the wrong
> relation OID is used in the error detail, regardless of how easy it is to trigger
> today.

Since this is a public function, I think it should be OK to fix it as it's good
to make the function future-proof anyway. I'm slightly unsure, however, whether
it's worth backpatching, since this is purely a theoretical issue at the moment.

Best Regards,
Hou zj 

pgsql-hackers by date:

Previous
From: jian he
Date:
Subject: Re: implement CAST(expr AS type FORMAT 'template')
Next
From: Peter Eisentraut
Date:
Subject: Re: headerscheck: Avoid mutual inclusion of pg_config.h and c.h