diff --git a/contrib/test_decoding/expected/repack.out b/contrib/test_decoding/expected/repack.out
index 5ddc63238c5..ce2cadfa222 100644
--- a/contrib/test_decoding/expected/repack.out
+++ b/contrib/test_decoding/expected/repack.out
@@ -61,6 +61,12 @@ HINT: Consider running the command on individual partitions.
REPACK (CONCURRENTLY) pg_class;
ERROR: cannot execute REPACK (CONCURRENTLY) on relation "pg_class"
HINT: REPACK (CONCURRENTLY) is not supported for catalog relations.
+-- Doesn't support tables used as catalog tables
+CREATE TABLE repack_conc_user_catalog (i int) WITH (user_catalog_table = true);
+REPACK (CONCURRENTLY) repack_conc_user_catalog;
+ERROR: cannot execute REPACK (CONCURRENTLY) on relation "repack_conc_user_catalog"
+DETAIL: This operation is not supported for user catalog tables.
+DROP TABLE repack_conc_user_catalog;
-- Doesn't support TOAST tables directly
CREATE TABLE repack_conc_toast (t text);
SELECT reltoastrelid::regclass AS toast_rel
diff --git a/contrib/test_decoding/sql/repack.sql b/contrib/test_decoding/sql/repack.sql
index f461f5479f4..eb891009baf 100644
--- a/contrib/test_decoding/sql/repack.sql
+++ b/contrib/test_decoding/sql/repack.sql
@@ -42,6 +42,11 @@ REPACK (CONCURRENTLY) clstrpart;
-- Disallowed in catalogs
REPACK (CONCURRENTLY) pg_class;
+-- Doesn't support tables used as catalog tables
+CREATE TABLE repack_conc_user_catalog (i int) WITH (user_catalog_table = true);
+REPACK (CONCURRENTLY) repack_conc_user_catalog;
+DROP TABLE repack_conc_user_catalog;
+
-- Doesn't support TOAST tables directly
CREATE TABLE repack_conc_toast (t text);
SELECT reltoastrelid::regclass AS toast_rel
diff --git a/doc/src/sgml/ref/repack.sgml b/doc/src/sgml/ref/repack.sgml
index 3c83f529298..f9fc45b9575 100644
--- a/doc/src/sgml/ref/repack.sgml
+++ b/doc/src/sgml/ref/repack.sgml
@@ -291,6 +291,14 @@ REPACK [ ( option [, ...] ) ] USING
+
+
+ The table is declared as a catalog table using the
+ user_catalog_table
+ storage parameter.
+
+
+
REPACK is executed inside a transaction block.
diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c
index 7cba8bece9c..57f28f1a420 100644
--- a/src/backend/commands/repack.c
+++ b/src/backend/commands/repack.c
@@ -911,6 +911,19 @@ check_concurrent_repack_requirements(Relation rel, Oid *ident_idx_p)
errhint("%s is not supported for catalog relations.",
"REPACK (CONCURRENTLY)"));
+ /*
+ * REPACK (CONCURRENTLY) is not MVCC-safe; it doesn't preserve visibility
+ * information, which logical decoding needs because it reads user catalog
+ * tables under a historic snapshot. Removing this check requires making
+ * it MVCC-safe and logical rewrite mappings.
+ */
+ if (RelationIsUsedAsCatalogTable(rel))
+ ereport(ERROR,
+ errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot execute %s on relation \"%s\"",
+ "REPACK (CONCURRENTLY)", RelationGetRelationName(rel)),
+ errdetail("This operation is not supported for user catalog tables."));
+
/*
* reorderbuffer.c does not seem to handle processing of TOAST relation
* alone.