Re: REPACK (CONCURRENTLY) rewrites tables marked with user_catalog_table

From: Antonin Houska <ah(at)cybertec(dot)at>
To: Bharath Rupireddy <bharath(dot)rupireddyforpostgres(at)gmail(dot)com>
Cc: Nathan Bossart <nathandbossart(at)gmail(dot)com>, pgsql-hackers(at)postgresql(dot)org, alvherre(at)kurilemu(dot)de
Subject: Re: REPACK (CONCURRENTLY) rewrites tables marked with user_catalog_table
Date: 2026-08-29 11:23:51
Message-ID: 8445.1788002631@localhost
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Bharath Rupireddy <bharath(dot)rupireddyforpostgres(at)gmail(dot)com> wrote:

> Hi,
>
> On Thu, Aug 27, 2026 at 7:22 AM Nathan Bossart <nathandbossart(at)gmail(dot)com> wrote:
> >
> > IIUC this can cause problems for logical replication consumers, since the
> > CONCURRENTLY path doesn't go through the rewriteheap.c machinery like the
> > non-concurrent path does:
> >
> > CREATE TABLE t (a INT PRIMARY KEY, b TEXT) WITH (user_catalog_table = true);
> > ALTER TABLE t ALTER COLUMN b TYPE varchar(100); -- correctly fails
> > REPACK (CONCURRENTLY) t; -- should fail but doesn't
> >
> > I believe the fix for v19 is to add a check for
> > RelationIsUsedAsCatalogTable() in check_concurrent_repack_requirements()
> > (plus a corresponding update to the list of CONCURRENTLY limitations in the
> > docs).
>
> That's correct. I verified that concurrent repack doesn't write the
> pg_logical/mappings files, which decoding later needs to correctly map
> the old tuple locations to the new ones after a rewrite, unlike
> non-concurrent CLUSTER, VACUUM FULL and REPACK on a user catalog
> table. I think restricting user catalog tables, rather than making
> concurrent repack support them, is the right choice at this point in
> the release cycle.
>
> Please find attached a patch with the suggested doc change. I didn't
> add a test, I don't think we need one.

Thanks! I'm just thinking about this comment:

+ /* The CONCURRENTLY path does not write logical rewrite mappings. */

IMO it makes no sense to rewrite the logical mappings as long as REPACK
(CONCURRENTLY) changes visibility information (i.e. it's MVCC-unsafe). Once we
implement the MVCC-safety, we should not remove this check unless we implement
the rewriting of the mappings for user catalog tables - that might also be
worth mentioning in the comment.

So far, I'd consider the MVCC-unsafety the primary reason to prohibit REPACK
(CONCURRENTLY) (or anyother MVCC-unsafe command) on the user catalog tables,
because it can make the contents of those tables invisible to the output
plugin at some point.

--
Antonin Houska
Web: https://www.cybertec-postgresql.com

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Andrew Dunstan 2026-08-29 12:49:32 Re: locale / encoding / meson cleanup
Previous Message Hayato Kuroda (Fujitsu) 2026-08-29 11:16:04 RE: REASSIGN OWNED vs. relisshared dep on !relisshared