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.