From 7f4ef622f20733e46f00071b7ec9a9324169b9c2 Mon Sep 17 00:00:00 2001
From: Joe Conway <mail@joeconway.com>
Date: Sat, 7 Dec 2013 16:59:35 -0800
Subject: [PATCH] Fix performance regression in dblink connection speed.

Previous commit e5de601267d98c5d60df6de8d436685c7105d149 modified dblink
to ensure client encoding matched the server. However the added
PQsetClientEncoding() call added significant overhead. Restore original
performance in the common case where client encoding already matches
server encoding by doing nothing in that case. Applies to all active
branches.

Issue reported and work sponsored by Zonar Systems.
---
 contrib/dblink/dblink.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c
index 2cc7c8fefa1..10a347fe5fb 100644
--- a/contrib/dblink/dblink.c
+++ b/contrib/dblink/dblink.c
@@ -201,7 +201,8 @@ typedef struct remoteConnHashEnt
 							 errdetail_internal("%s", msg))); \
 				} \
 				dblink_security_check(conn, rconn); \
-				PQsetClientEncoding(conn, GetDatabaseEncodingName()); \
+				if (PQclientEncoding(conn) != GetDatabaseEncoding()) \
+					PQsetClientEncoding(conn, GetDatabaseEncodingName()); \
 				freeconn = true; \
 			} \
 	} while (0)
@@ -280,8 +281,9 @@ dblink_connect(PG_FUNCTION_ARGS)
 	/* check password actually used if not superuser */
 	dblink_security_check(conn, rconn);
 
-	/* attempt to set client encoding to match server encoding */
-	PQsetClientEncoding(conn, GetDatabaseEncodingName());
+	/* attempt to set client encoding to match server encoding, if needed */
+	if (PQclientEncoding(conn) != GetDatabaseEncoding())
+		PQsetClientEncoding(conn, GetDatabaseEncodingName());
 
 	if (connname)
 	{
-- 
GitLab