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
- 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.
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
@@ -24,6 +24,7 @@
@@ -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
@@ -33,6 +33,8 @@
@@ -87,6 +89,17 @@ CheckLogicalDecodingRequirements(void)
errmsg("logical decoding requires a database connection")));
+ * Currently logical replication refuses subscription that requires
+ * chacater conversion.
+ if (pg_get_client_encoding() != GetDatabaseEncoding())
+ errmsg("logical replication requires consistent encodings on both side (publisher = %s, subscriber = %s)",
* TODO: We got to change that someday soon...
Sent via pgsql-hackers mailing list (email@example.com)
To make changes to your subscription: