Re: REPACK CONCURRENTLY fails on tables with generated columns

Álvaro Herrera <alvherre@kurilemu.de>

From: Alvaro Herrera <alvherre@kurilemu.de>
To: Ewan Young <kdbase.hack@gmail.com>
Cc: Antonin Houska <ah@cybertec.at>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>, mihailnikalayeu@gmail.com
Date: 2026-07-03T11:12:39Z
Lists: pgsql-hackers

Attachments

Hello,

On 2026-Jun-22, Ewan Young wrote:

> I applied the patch and ran it through an injection-point reproducer
> (cassert). Without the fix the bug reproduces (ERROR: no generation
> expression found for column number 3 ...); with it, REPACK CONCURRENTLY
> succeeds under a concurrent non-HOT UPDATE for a STORED generated column, an
> index directly on the generated column, and a VIRTUAL column, with correct
> values afterwards. Your repack.spec change passes.
> 
> The approach is right and I've confirmed it fixes the bug, so +1 from me in
> this direction.

Cool, thanks for reviewing -- I have pushed this fix, with some
stylistic changes and one bigger change: these catalog rows are only
needed in concurrent mode, so there was no reason to copy them in the
other case.  So I restricted the copying to that case.

I've been looking at the other proposed change, and I agree with it.
Here's it, again with some style changes, and only one other proposed
change: for setting up updatedCols, ignore dropped columns.  I don't
think this should change anything in practice, but it just feels wrong
to claim that a dropped column is being changed by an update.

-- 
Álvaro Herrera         PostgreSQL Developer  —  https://www.EnterpriseDB.com/

Commits

  1. REPACK CONCURRENTLY: Initialize the range table more honestly

  2. Fix REPACK CONCURRENTLY for stored generated columns