| From: | "Zhijie Hou (Fujitsu)" <houzj(dot)fnst(at)fujitsu(dot)com> |
|---|---|
| To: | Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com>, Nisha Moond <nisha(dot)moond412(at)gmail(dot)com> |
| Cc: | PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
| Subject: | RE: Bug: wrong relname in RemoveSubscriptionRel() error detail |
| Date: | 2026-03-30 08:14:07 |
| Message-ID: | TY4PR01MB1690715C2DD73955A5B8C1BD99452A@TY4PR01MB16907.jpnprd01.prod.outlook.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On Monday, March 30, 2026 2:33 PM Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com> wrote:
> > On Mar 30, 2026, at 14:16, Nisha Moond <nisha(dot)moond412(at)gmail(dot)com>
> wrote:
> >
> > On Fri, Mar 27, 2026 at 3:22 PM Chao Li <li(dot)evan(dot)chao(at)gmail(dot)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
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Peter Eisentraut | 2026-03-30 08:19:01 | Re: headerscheck: Avoid mutual inclusion of pg_config.h and c.h |
| Previous Message | jian he | 2026-03-30 08:09:24 | Re: implement CAST(expr AS type FORMAT 'template') |