]> granicus.if.org Git - postgresql/commitdiff
Warn if wal_level is too low when creating a publication.
authorThomas Munro <tmunro@postgresql.org>
Fri, 12 Jul 2019 22:35:34 +0000 (10:35 +1200)
committerThomas Munro <tmunro@postgresql.org>
Fri, 12 Jul 2019 22:35:34 +0000 (10:35 +1200)
Provide a hint to users that they need to increase wal_level before
subscriptions can work.

Author: Lucas Viecelli, with some adjustments by Thomas Munro
Reviewed-by: Tom Lane
Discussion: https://postgr.es/m/CAPjy-57rn5Y9g4e5u--eSOP-7P4QrE9uOZmT2ZcUebF8qxsYhg%40mail.gmail.com

src/backend/commands/publicationcmds.c
src/test/regress/expected/object_address.out
src/test/regress/expected/publication.out
src/test/regress/sql/object_address.sql
src/test/regress/sql/publication.sql

index 1ac1a71bd95e63dd8dadc16fda9849140525547c..f115d4bf805b8c557a2d74c5625806ab08a29a80 100644 (file)
@@ -232,6 +232,14 @@ CreatePublication(CreatePublicationStmt *stmt)
 
        InvokeObjectPostCreateHook(PublicationRelationId, puboid, 0);
 
+       if (wal_level != WAL_LEVEL_LOGICAL)
+       {
+               ereport(WARNING,
+                               (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+                                errmsg("wal_level is insufficient to publish logical changes"),
+                                errhint("Set wal_level to logical before creating subscriptions.")));
+       }
+
        return myself;
 }
 
index cdbde2950252c4aa2470d4832ab3a15d59757194..d6d147015631a1ec4e913c1f9d396c45920d0a8f 100644 (file)
@@ -42,7 +42,10 @@ ALTER DEFAULT PRIVILEGES FOR ROLE regress_addr_user REVOKE DELETE ON TABLES FROM
 CREATE TRANSFORM FOR int LANGUAGE SQL (
        FROM SQL WITH FUNCTION prsd_lextype(internal),
        TO SQL WITH FUNCTION int4recv(internal));
+-- suppress warning that depends on wal_level
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION addr_pub FOR TABLE addr_nsp.gentable;
+RESET client_min_messages;
 CREATE SUBSCRIPTION regress_addr_sub CONNECTION '' PUBLICATION bar WITH (connect = false, slot_name = NONE);
 WARNING:  tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables
 CREATE STATISTICS addr_nsp.gentable_stat ON a, b FROM addr_nsp.gentable;
index 0e5e8f2b929335b16b9d8624df3fae55710a09dd..feb51e4add7f592154a9eb9467858f9857a822a8 100644 (file)
@@ -5,7 +5,10 @@ CREATE ROLE regress_publication_user LOGIN SUPERUSER;
 CREATE ROLE regress_publication_user2;
 CREATE ROLE regress_publication_user_dummy LOGIN NOSUPERUSER;
 SET SESSION AUTHORIZATION 'regress_publication_user';
+-- suppress warning that depends on wal_level
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION testpub_default;
+RESET client_min_messages;
 COMMENT ON PUBLICATION testpub_default IS 'test publication';
 SELECT obj_description(p.oid, 'pg_publication') FROM pg_publication p;
  obj_description  
@@ -13,7 +16,9 @@ SELECT obj_description(p.oid, 'pg_publication') FROM pg_publication p;
  test publication
 (1 row)
 
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION testpib_ins_trunct WITH (publish = insert);
+RESET client_min_messages;
 ALTER PUBLICATION testpub_default SET (publish = update);
 -- error cases
 CREATE PUBLICATION testpub_xxx WITH (foo);
@@ -43,7 +48,9 @@ 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);
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION testpub_foralltables FOR ALL TABLES WITH (publish = 'insert');
+RESET client_min_messages;
 ALTER PUBLICATION testpub_foralltables SET (publish = 'insert, update');
 CREATE TABLE testpub_tbl2 (id serial primary key, data text);
 -- fail - can't add to for all tables publication
@@ -86,8 +93,10 @@ DROP TABLE testpub_tbl2;
 DROP PUBLICATION testpub_foralltables;
 CREATE TABLE testpub_tbl3 (a int);
 CREATE TABLE testpub_tbl3a (b text) INHERITS (testpub_tbl3);
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION testpub3 FOR TABLE testpub_tbl3;
 CREATE PUBLICATION testpub4 FOR TABLE ONLY testpub_tbl3;
+RESET client_min_messages;
 \dRp+ testpub3
                               Publication testpub3
           Owner           | All tables | Inserts | Updates | Deletes | Truncates 
@@ -111,7 +120,9 @@ DROP PUBLICATION testpub3, testpub4;
 CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_view;
 ERROR:  "testpub_view" is not a table
 DETAIL:  Only tables can be added to publications.
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_tbl1, pub_test.testpub_nopk;
+RESET client_min_messages;
 -- fail - already added
 ALTER PUBLICATION testpub_fortbl ADD TABLE testpub_tbl1;
 ERROR:  relation "testpub_tbl1" is already member of publication "testpub_fortbl"
@@ -196,7 +207,9 @@ ERROR:  permission denied for database regression
 SET ROLE regress_publication_user;
 GRANT CREATE ON DATABASE regression TO regress_publication_user2;
 SET ROLE regress_publication_user2;
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION testpub2;  -- ok
+RESET client_min_messages;
 ALTER PUBLICATION testpub2 ADD TABLE testpub_tbl1;  -- fail
 ERROR:  must be owner of table testpub_tbl1
 SET ROLE regress_publication_user;
index 725bc39b50b490446e45f43109852731bc2f6dc5..8e06248eb5e5ae755e6973e4158834749f8d1a95 100644 (file)
@@ -45,7 +45,10 @@ ALTER DEFAULT PRIVILEGES FOR ROLE regress_addr_user REVOKE DELETE ON TABLES FROM
 CREATE TRANSFORM FOR int LANGUAGE SQL (
        FROM SQL WITH FUNCTION prsd_lextype(internal),
        TO SQL WITH FUNCTION int4recv(internal));
+-- suppress warning that depends on wal_level
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION addr_pub FOR TABLE addr_nsp.gentable;
+RESET client_min_messages;
 CREATE SUBSCRIPTION regress_addr_sub CONNECTION '' PUBLICATION bar WITH (connect = false, slot_name = NONE);
 CREATE STATISTICS addr_nsp.gentable_stat ON a, b FROM addr_nsp.gentable;
 
index 815410b3c5a8354917a3fb3e0621af439b8f4047..5773a755cf3a8e8cbf8a4bd041cd09873e702fe0 100644 (file)
@@ -6,12 +6,17 @@ CREATE ROLE regress_publication_user2;
 CREATE ROLE regress_publication_user_dummy LOGIN NOSUPERUSER;
 SET SESSION AUTHORIZATION 'regress_publication_user';
 
+-- suppress warning that depends on wal_level
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION testpub_default;
+RESET client_min_messages;
 
 COMMENT ON PUBLICATION testpub_default IS 'test publication';
 SELECT obj_description(p.oid, 'pg_publication') FROM pg_publication p;
 
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION testpib_ins_trunct WITH (publish = insert);
+RESET client_min_messages;
 
 ALTER PUBLICATION testpub_default SET (publish = update);
 
@@ -32,7 +37,9 @@ 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);
 
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION testpub_foralltables FOR ALL TABLES WITH (publish = 'insert');
+RESET client_min_messages;
 ALTER PUBLICATION testpub_foralltables SET (publish = 'insert, update');
 
 CREATE TABLE testpub_tbl2 (id serial primary key, data text);
@@ -52,8 +59,10 @@ DROP PUBLICATION testpub_foralltables;
 
 CREATE TABLE testpub_tbl3 (a int);
 CREATE TABLE testpub_tbl3a (b text) INHERITS (testpub_tbl3);
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION testpub3 FOR TABLE testpub_tbl3;
 CREATE PUBLICATION testpub4 FOR TABLE ONLY testpub_tbl3;
+RESET client_min_messages;
 \dRp+ testpub3
 \dRp+ testpub4
 
@@ -62,7 +71,9 @@ DROP PUBLICATION testpub3, testpub4;
 
 -- fail - view
 CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_view;
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_tbl1, pub_test.testpub_nopk;
+RESET client_min_messages;
 -- fail - already added
 ALTER PUBLICATION testpub_fortbl ADD TABLE testpub_tbl1;
 -- fail - already added
@@ -98,7 +109,9 @@ CREATE PUBLICATION testpub2;  -- fail
 SET ROLE regress_publication_user;
 GRANT CREATE ON DATABASE regression TO regress_publication_user2;
 SET ROLE regress_publication_user2;
+SET client_min_messages = 'ERROR';
 CREATE PUBLICATION testpub2;  -- ok
+RESET client_min_messages;
 
 ALTER PUBLICATION testpub2 ADD TABLE testpub_tbl1;  -- fail