At Sat, 4 Feb 2017 21:27:32 +0100, Petr Jelinek <petr.jeli...@2ndquadrant.com> wrote in <bcc7f7e9-f558-b19e-b544-000ba7cf2...@2ndquadrant.com> > Hmm I wonder if we should just make the subscriber send the > client_encoding always (based on server encoding of the subscriber). > That should solve the issue in combination with your patch no?
Yeah, right. I considered that a subscriber might want to set its own value for that but that is useless. The attached patch does the following things to just prevent making a logical replication connection between databases with inconsistent encodings. - added client_encoding with subscriber(or standby)'s encoding at the last of options in libpqrcv_connect. - CheckLogicalDecodingRequirements refuses connection for a request with inconsistent encodings. > ERROR: logical replication requires consistent encodings on both side > (publisher = UTF8, subscriber = EUC_JP) We could check this earlier if involving physical replication but I think this is a matter of logical replication. regards, -- Kyotaro Horiguchi NTT Open Source Software Center
>From e8233c47d174261a331718e9434d5fc825523305 Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi <horiguchi.kyot...@lab.ntt.co.jp> Date: Tue, 14 Feb 2017 11:18:20 +0900 Subject: [PATCH] Refuse logical replication with inconsistent encodings Logical replication requires encoding conversion of characters if the publisher and subscriber are on different encodings. We could add character conversion on-the-fly but we just hinhibit a connection for the case as the first step. --- .../replication/libpqwalreceiver/libpqwalreceiver.c | 14 ++++++++++++++ src/backend/replication/logical/logical.c | 13 +++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c index 44a89c7..550a76d 100644 --- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c +++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c @@ -24,6 +24,7 @@ #include "access/xlog.h" #include "miscadmin.h" #include "pgstat.h" +#include "mb/pg_wchar.h" #include "replication/logicalproto.h" #include "replication/walreceiver.h" #include "storage/proc.h" @@ -134,9 +135,22 @@ libpqrcv_connect(const char *conninfo, bool logical, const char *appname, } keys[++i] = "fallback_application_name"; vals[i] = appname; + + /* + * Override clinet_encoding with the database encoding for logical + * replication. + */ + if (logical) + { + keys[++i] = "client_encoding"; + vals[i] = GetDatabaseEncodingName(); + } + keys[++i] = NULL; vals[i] = NULL; + Assert(i < 5); /* size of keys/vals */ + conn = palloc0(sizeof(WalReceiverConn)); conn->streamConn = PQconnectdbParams(keys, vals, /* expand_dbname = */ true); if (PQstatus(conn->streamConn) != CONNECTION_OK) diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index 5529ac8..fc74ff1 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -33,6 +33,8 @@ #include "access/xact.h" #include "access/xlog_internal.h" +#include "mb/pg_wchar.h" + #include "replication/decode.h" #include "replication/logical.h" #include "replication/reorderbuffer.h" @@ -87,6 +89,17 @@ CheckLogicalDecodingRequirements(void) (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("logical decoding requires a database connection"))); + /* + * Currently logical replication refuses subscription that requires + * chacater conversion. + */ + if (pg_get_client_encoding() != GetDatabaseEncoding()) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("logical replication requires consistent encodings on both side (publisher = %s, subscriber = %s)", + GetDatabaseEncodingName(), + pg_get_client_encoding_name()))); + /* ---- * TODO: We got to change that someday soon... * -- 2.9.2
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers