From b84f805f1e1d9609279ff8efb9e4cfe58d72762f Mon Sep 17 00:00:00 2001
From: "Andrey V. Lepikhov" <a.lepikhov@postgrespro.ru>
Date: Mon, 4 Nov 2019 07:20:51 +0500
Subject: [PATCH] Fix the problem of logical replication with domain NOT VALID
 constraint.

---
 src/backend/replication/logical/worker.c | 16 ++++++++++++++--
 src/backend/utils/adt/domains.c          |  5 +++++
 src/include/utils/builtins.h             |  1 +
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c
index ff62303638..1bba32cc6c 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -709,8 +709,20 @@ apply_handle_update(StringInfo s)
 
 	/* Build the search tuple. */
 	oldctx = MemoryContextSwitchTo(GetPerTupleMemoryContext(estate));
-	slot_store_cstrings(remoteslot, rel,
-						has_oldtup ? oldtup.values : newtup.values);
+
+	suppress_constraints = has_oldtup ? true : false;
+	PG_TRY();
+	{
+		slot_store_cstrings(remoteslot, rel,
+							has_oldtup ? oldtup.values : newtup.values);
+	}
+	PG_CATCH();
+	{
+		suppress_constraints = false;
+		PG_RE_THROW();
+	}
+	PG_END_TRY();
+	suppress_constraints = false;
 	MemoryContextSwitchTo(oldctx);
 
 	/*
diff --git a/src/backend/utils/adt/domains.c b/src/backend/utils/adt/domains.c
index 6553a67ea1..2c08b21244 100644
--- a/src/backend/utils/adt/domains.c
+++ b/src/backend/utils/adt/domains.c
@@ -61,6 +61,8 @@ typedef struct DomainIOData
 } DomainIOData;
 
 
+bool suppress_constraints = false;
+
 /*
  * domain_state_setup - initialize the cache for a new domain type.
  *
@@ -133,6 +135,9 @@ domain_check_input(Datum value, bool isnull, DomainIOData *my_extra)
 	ExprContext *econtext = my_extra->econtext;
 	ListCell   *l;
 
+	if (suppress_constraints)
+		return;
+
 	/* Make sure we have up-to-date constraints */
 	UpdateDomainConstraintRef(&my_extra->constraint_ref);
 
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 937ddb7ef0..409c4377f3 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -24,6 +24,7 @@ extern bool parse_bool(const char *value, bool *result);
 extern bool parse_bool_with_len(const char *value, size_t len, bool *result);
 
 /* domains.c */
+extern bool suppress_constraints;
 extern void domain_check(Datum value, bool isnull, Oid domainType,
 						 void **extra, MemoryContext mcxt);
 extern int	errdatatype(Oid datatypeOid);
-- 
2.17.1

