]> granicus.if.org Git - postgresql/commitdiff
Improve error messages for incorrect types of logical replication targets
authorMichael Paquier <michael@paquier.xyz>
Sun, 13 Jan 2019 07:39:49 +0000 (16:39 +0900)
committerMichael Paquier <michael@paquier.xyz>
Sun, 13 Jan 2019 07:39:49 +0000 (16:39 +0900)
If trying to use something else than a plain table as logical
replication target, a rather-generic error message gets used to report
the problem.  This can be confusing when it comes to foreign tables and
partitioned tables, so use more dedicated messages in these cases.

Author: Amit Langote
Reviewed-by: Peter Eisentraut, Magnus Hagander, Michael Paquier
Discussion: https://postgr.es/m/41799bee-40eb-7bb5-80b1-325ce17518bc@lab.ntt.co.jp

src/backend/executor/execReplication.c

index e9c1beb1b76ce1d363ff4e3453bafd46dd5efdc2..bb1ab575952bfa8dcccd882fca77375a6c63bc34 100644 (file)
@@ -609,11 +609,29 @@ CheckSubscriptionRelkind(char relkind, const char *nspname,
                                                 const char *relname)
 {
        /*
-        * We currently only support writing to regular tables.
+        * We currently only support writing to regular tables.  However, give
+        * a more specific error for partitioned and foreign tables.
         */
+       if (relkind == RELKIND_PARTITIONED_TABLE)
+               ereport(ERROR,
+                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                                errmsg("cannot use relation \"%s.%s\" as logical replication target",
+                                               nspname, relname),
+                                errdetail("\"%s.%s\" is a partitioned table.",
+                                               nspname, relname)));
+       else if (relkind == RELKIND_FOREIGN_TABLE)
+               ereport(ERROR,
+                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                                errmsg("cannot use relation \"%s.%s\" as logical replication",
+                                               nspname, relname),
+                                errdetail("\"%s.%s\" is a foreign table.",
+                                               nspname, relname)));
+
        if (relkind != RELKIND_RELATION)
                ereport(ERROR,
                                (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                errmsg("logical replication target relation \"%s.%s\" is not a table",
+                                errmsg("cannot use relation \"%s.%s\" as logical replication target",
+                                               nspname, relname),
+                                errdetail("\"%s.%s\" is not a table.",
                                                nspname, relname)));
 }