diff --git a/doc/src/sgml/ref/create_publication.sgml b/doc/src/sgml/ref/create_publication.sgml index 0369b579c5c..521376ef4ba 100644 --- a/doc/src/sgml/ref/create_publication.sgml +++ b/doc/src/sgml/ref/create_publication.sgml @@ -75,6 +75,14 @@ CREATE PUBLICATION name Optionally, * can be specified after the table name to explicitly indicate that descendant tables are included. + + + Only persistent base tables can be part of a publication. Temporary + tables, unlogged tables, foreign tables, materialized views, regular + views, and partitioned tables cannot be part of a publication. To + replicate a partitioned table, add the individual partitions to the + publication. + diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 9330e2380af..15f68a915b6 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -50,6 +50,15 @@ static void check_publication_add_relation(Relation targetrel) { + /* Give more specific error for partitioned tables */ + if (RelationGetForm(targetrel)->relkind == RELKIND_PARTITIONED_TABLE) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("\"%s\" is a partitioned table", + RelationGetRelationName(targetrel)), + errdetail("Adding partitioned tables to publications is not supported."), + errhint("You can add the table partitions individually."))); + /* Must be table */ if (RelationGetForm(targetrel)->relkind != RELKIND_RELATION) ereport(ERROR, diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index 5b7fb674dad..f3a348d368c 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -37,6 +37,7 @@ CREATE SCHEMA pub_test; CREATE TABLE testpub_tbl1 (id serial primary key, data text); CREATE TABLE pub_test.testpub_nopk (foo int, bar int); CREATE VIEW testpub_view AS SELECT 1; +CREATE TABLE testpub_parted (a int) PARTITION BY LIST (a); CREATE PUBLICATION testpub_foralltables FOR ALL TABLES WITH (nopublish delete, nopublish update); ALTER PUBLICATION testpub_foralltables WITH (publish update); CREATE TABLE testpub_tbl2 (id serial primary key, data text); @@ -118,6 +119,11 @@ Tables: ALTER PUBLICATION testpub_default ADD TABLE testpub_view; ERROR: "testpub_view" is not a table DETAIL: Only tables can be added to publications. +-- fail - partitioned table +ALTER PUBLICATION testpub_fortbl ADD TABLE testpub_parted; +ERROR: "testpub_parted" is a partitioned table +DETAIL: Adding partitioned tables to publications is not supported. +HINT: You can add the table partitions individually. ALTER PUBLICATION testpub_default ADD TABLE testpub_tbl1; ALTER PUBLICATION testpub_default SET TABLE testpub_tbl1; ALTER PUBLICATION testpub_default ADD TABLE pub_test.testpub_nopk; @@ -188,6 +194,7 @@ ALTER PUBLICATION testpub2 ADD TABLE testpub_tbl1; -- ok DROP PUBLICATION testpub2; SET ROLE regress_publication_user; REVOKE CREATE ON DATABASE regression FROM regress_publication_user2; +DROP TABLE testpub_parted; DROP VIEW testpub_view; DROP TABLE testpub_tbl1; \dRp+ testpub_default diff --git a/src/test/regress/sql/publication.sql b/src/test/regress/sql/publication.sql index b118bc9906f..7d1cba5db3e 100644 --- a/src/test/regress/sql/publication.sql +++ b/src/test/regress/sql/publication.sql @@ -26,6 +26,7 @@ CREATE SCHEMA pub_test; CREATE TABLE testpub_tbl1 (id serial primary key, data text); CREATE TABLE pub_test.testpub_nopk (foo int, bar int); CREATE VIEW testpub_view AS SELECT 1; +CREATE TABLE testpub_parted (a int) PARTITION BY LIST (a); CREATE PUBLICATION testpub_foralltables FOR ALL TABLES WITH (nopublish delete, nopublish update); ALTER PUBLICATION testpub_foralltables WITH (publish update); @@ -66,6 +67,8 @@ CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_tbl1; -- fail - view ALTER PUBLICATION testpub_default ADD TABLE testpub_view; +-- fail - partitioned table +ALTER PUBLICATION testpub_fortbl ADD TABLE testpub_parted; ALTER PUBLICATION testpub_default ADD TABLE testpub_tbl1; ALTER PUBLICATION testpub_default SET TABLE testpub_tbl1; @@ -104,6 +107,7 @@ DROP PUBLICATION testpub2; SET ROLE regress_publication_user; REVOKE CREATE ON DATABASE regression FROM regress_publication_user2; +DROP TABLE testpub_parted; DROP VIEW testpub_view; DROP TABLE testpub_tbl1;