On 2018/12/05 10:28, Amit Langote wrote:
> On 2018/12/05 10:20, Michael Paquier wrote:
>> On Tue, Dec 04, 2018 at 09:25:09AM +0100, Magnus Hagander wrote:
>>> I think more people would directly understand the "is not a table" for a
>>> foreign table than a partitioned one (for example, it does now show up in
>>> \dt or under tables in pgadmin, but partitioned ones do). That said, if
>>> it's not too complicated, I think including foreign tables as well would
>>> definitely be useful, because it has table in the name. For the other
>>> types, I agree they don't need to be special-cased, they are fine the way
>>> they are.
>>
>> relkind is directly available in this code path, so it is not that hard
>> to add. As you suggest, foreign tables make sense to add as those are
>> actually *tables*. And it seems to me that we should also add toast
>> tables for clarity for the same reason.
>
> Considering toast tables here seems like a stretch to me, because they're
> not user defined. Chances of users adding a table to a publication whose
> name matches that of a toast table's on the subscription side seems thin
> too. Partitioned tables and foreign tables are user-defined and something
> they'd expect to be handled appropriately.
Attached updated patch that adds the check for foreign tables.
Thanks,
Amit
diff --git a/src/backend/executor/execReplication.c
b/src/backend/executor/execReplication.c
index 5bd3bbc35e..93c74986a9 100644
--- a/src/backend/executor/execReplication.c
+++ b/src/backend/executor/execReplication.c
@@ -608,6 +608,20 @@ void
CheckSubscriptionRelkind(char relkind, const char *nspname,
const char *relname)
{
+ /* Give more specific error for partitioned and foreign tables. */
+ if (relkind == RELKIND_PARTITIONED_TABLE)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s.%s\" is a partitioned table",
+ nspname, relname),
+ errdetail("Partitioned tables are not
supported as logical replication targets.")));
+ if (relkind == RELKIND_FOREIGN_TABLE)
+ ereport(ERROR,
+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("\"%s.%s\" is a foreign table",
+ nspname, relname),
+ errdetail("Foreign tables are not supported as
logical replication targets.")));
+
/*
* We currently only support writing to regular tables.
*/