| From: | Amit Langote <amitlangote09(at)gmail(dot)com> |
|---|---|
| To: | Ewan Young <kdbase(dot)hack(at)gmail(dot)com> |
| Cc: | PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, Junwang Zhao <zhjwpku(at)gmail(dot)com> |
| Subject: | Re: Fast-path FK checks reject valid inserts for domain-typed FK columns |
| Date: | 2026-06-16 11:19:54 |
| Message-ID: | CA+HiwqH7VG3qJZH-w+Ng4L6fdA07vbQM7awdwdTsVFsVf8VGOA@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
Hi Ewan,
On Fri, Jun 12, 2026 at 1:02 PM Amit Langote <amitlangote09(at)gmail(dot)com> wrote:
> On Fri, Jun 12, 2026 at 12:36 PM Ewan Young <kdbase(dot)hack(at)gmail(dot)com> wrote:
> >
> > Hi,
> >
> > Commit 2da86c1 ("Add fast path for foreign key constraint checks") makes
> > a foreign-key column whose type is a domain over a type different from
> > the referenced PK reject every valid row:
> >
> > CREATE DOMAIN int8dom AS int8;
> > CREATE TABLE pk (a int4 PRIMARY KEY);
> > CREATE TABLE fk (b int8dom REFERENCES pk(a));
> > INSERT INTO fk VALUES (1);
> > ERROR: no conversion function from int8dom to integer
> >
> > It's new in v19 (verified by building 2da86c1^, where the insert
> > succeeds); no released version is affected. The SPI path still handles
> > it fine, e.g. with a partitioned PK.
> >
> > The fast path is the first caller to pass the cross-type pf_eq_oprs
> > operator to ri_HashCompareOp(). Its "no cast needed" test,
> >
> > if (typeid == righttype)
> >
> > fails when the FK column is a domain over righttype (typeid is the
> > domain OID), so it wrongly concludes no conversion exists and errors out.
> > Looking through the domain fixes it -- conpfeqop is chosen against the
> > FK base type, so getBaseType(typeid) == righttype holds for any valid FK:
> >
> > - if (typeid == righttype)
> > + if (getBaseType(typeid) == righttype)
> >
> > Patch attached, with a regression test in foreign_key.sql. make check
> > and the isolation suite pass.
>
> Thanks for the report and the patch. Will look next week.
Your analysis looks correct and the patch makes sense. I looked
through the code and convinced myself the new check is valid.
One nuance: "holds for any valid FK" is true when pfeqop comes
directly from the index opfamily (right-hand input
getBaseType(fktype)). The PK = PK fallback uses opcintype instead, but
there getBaseType can't equal it either, so the test still fails and
the existing cast lookup runs unchanged.
I polished it a bit for commit: tightened the message and trimmed the
code comment.
Will push to master tomorrow barring objections.
--
Thanks, Amit Langote
| Attachment | Content-Type | Size |
|---|---|---|
| v2-0001-Fix-RI-fast-path-for-domain-typed-FK-columns.patch | application/octet-stream | 4.9 KB |
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Álvaro Rodríguez | 2026-06-16 11:24:59 | Re: Unexpected reindex when altering column types for partitioned tables |
| Previous Message | Amit Kapila | 2026-06-16 11:08:03 | Re: Support EXCEPT for TABLES IN SCHEMA publications |