Re: Bug: GiST index-only scans can use tuple descriptor with incorrect alignment when deforming

From: Peter Geoghegan <pg(at)bowt(dot)ie>
To: Tomas Vondra <tomas(at)vondra(dot)me>
Cc: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: Bug: GiST index-only scans can use tuple descriptor with incorrect alignment when deforming
Date: 2026-07-17 19:56:46
Message-ID: CAH2-Wzk7BdmSjRUo-e+R6TLj+rHGzFX=4NYy9=wvMgL0SDza=w@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Wed, Jul 15, 2026 at 7:06 AM Tomas Vondra <tomas(at)vondra(dot)me> wrote:
> Thanks. I took a look at the v2 fix, and I think it's correct / fine. It
> does surprise me a bit we've never seen any reports of failures, but I
> guess the problematic opclasses are not used very often. Or not with an
> index that would trigger it.

Yeah, it's quite a narrow issue.

Pushed a slightly improved version of this fix just now, backpatching
all the way. I improved the comments in line with your feedback.

> I think moving the logic to StoreIndexTuple is a clear improvement.

Yes, it's definitely better this way. We're literally doing exactly
the same thing when we handle the xs_itup and xs_hitup cases, so it
makes no sense to handle the xs_hitup directly while only having
xs_itup-related logic in the separate StoreIndexTuple helper function.

> A couple comment nitpicks:
>
> * In either case we must deform the tuple using the tupdesc the AM
> * formed it with (xs_hitupdesc or xs_itupdesc), not the slot's tupdesc.
> * An AM builds that descriptor from its opclass, so a column's type
> * there can differ ...
>
> It's not entirely clear which descriptior "that descriptor" refers to.

I fixed that. I also cut down the comments quite a bit in the committed patch.

> Maybe this should say "may not match"?

Agreed.

> * anyrange forms its tuples with that type's alignment, which need not
> * match the alignment of the actual type.
>
> I wonder if we want to mention particular opclasses in comments,
> references like this are easy to go stale / obsolete. But it's probably
> worth it, not sure.

The committed version has comments mentioning rare cases involving
nonmatching column alignment. We no longer mention any opclass by name
(except for btree's name_ops, which StoreIndexTuple must handle as a
special case).

I concluded that discussing the specific issue in detail wasn't
necessary. There's likely to be nbtree opclasses that we'd have subtly
broken if we somehow made the same mistake with nbtree/xs_itup (which
never happened, likely because doing so would break name_ops in an
obvious way). It would make about as much sense to mention these
never-affected nbtree opclasses as it would to mention the historical
issue with gist/anyrange. Let's mention neither.

Thanks for the review!
--
Peter Geoghegan

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 2026-07-17 20:04:28 Re: First draft of PG 19 release notes
Previous Message Sami Imseih 2026-07-17 19:24:19 Re: Report index currently being vacuumed in pg_stat_progress_vacuum