Modify message when partitioned table is added to publication
authorPeter Eisentraut <peter_e@gmx.net>
Thu, 20 Apr 2017 18:18:33 +0000 (14:18 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Thu, 20 Apr 2017 18:18:33 +0000 (14:18 -0400)
Give a more specific error message than "xyz is not a table".

Also document in CREATE PUBLICATION which kinds of relations are not
supported.

based on patch by Amit Langote <Langote_Amit_f8@lab.ntt.co.jp>

doc/src/sgml/ref/create_publication.sgml
src/backend/catalog/pg_publication.c
src/test/regress/expected/publication.out
src/test/regress/sql/publication.sql

index 0369b579c5c386741fa64c1587c0899d82a68b6f..521376ef4ba984a8074722db2f8a7c59edb2dab1 100644 (file)
@@ -75,6 +75,14 @@ CREATE PUBLICATION <replaceable class="parameter">name</replaceable>
       Optionally, <literal>*</> can be specified after the table name to
       explicitly indicate that descendant tables are included.
      </para>
+
+     <para>
+      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.
+     </para>
     </listitem>
    </varlistentry>
 
index 9330e2380af5264b6c0817f77aa64c4c3f558766..15f68a915b691ea0560600e297da80931d0bdd1a 100644 (file)
 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,
index 5b7fb674dad6b2819a7478cafedc2a24f071a755..f3a348d368ce4aca84324f2072461aa50ab6aafd 100644 (file)
@@ -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
index b118bc9906f3fd7c435a60987db5dc422be9e5e6..7d1cba5db3eeaac4d452bbe49ed33a718801c0f3 100644 (file)
@@ -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;