At Thu, 14 Mar 2019 11:30:12 +0900, Amit Langote 
<langote_amit...@lab.ntt.co.jp> wrote in 
<59e5a734-9e06-1035-385b-626717581...@lab.ntt.co.jp>
> On 2019/03/13 21:03, Peter Eisentraut wrote:
> > If a FOR ALL TABLES publication exists, unlogged tables are ignored
> > for publishing changes.  But CheckCmdReplicaIdentity() would still
> > check in that case that such a table has a replica identity set before
> > accepting updates.  That is useless, so check first whether the given
> > table is publishable and skip the check if not.
> > 
> > Example:
> > 
> > CREATE PUBLICATION pub FOR ALL TABLES;
> > CREATE UNLOGGED TABLE logical_replication_test AS SELECT 1 AS number;
> > UPDATE logical_replication_test SET number = 2;
> > ERROR:  cannot update table "logical_replication_test" because it does
> > not have a replica identity and publishes updates
> > 
> > Patch attached.
> 
> An email on -bugs earlier this morning complains of the same problem but
> for temporary tables.
> 
> https://www.postgresql.org/message-id/CAHOFxGr%3DmqPZXbAuoR7Nbq-bU4HxqVWHbTTUy5%3DPKQut_F0%3DXA%40mail.gmail.com
> 
> It seems your patch fixes their case too.

Is it the right thing that GetRelationPublicationsActions sets
wrong rd_publicatons for the relations?

regards.

-- 
Kyotaro Horiguchi
NTT Open Source Software Center
>From 2704c5fbb65ebfee144a37c6b34eccdd853033a0 Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyot...@lab.ntt.co.jp>
Date: Thu, 14 Mar 2019 15:02:20 +0900
Subject: [PATCH 1/2] step1

---
 src/backend/utils/cache/relcache.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index eba77491fd..a43fb040cb 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -5089,6 +5089,8 @@ GetRelationPublicationActions(Relation relation)
 		return memcpy(pubactions, relation->rd_pubactions,
 					  sizeof(PublicationActions));
 
+	if (is_publishable_relation(relation))
+	{
 	/* Fetch the publication membership info. */
 	puboids = GetRelationPublications(RelationGetRelid(relation));
 	puboids = list_concat_unique_oid(puboids, GetAllTablesPublications());
@@ -5121,6 +5123,7 @@ GetRelationPublicationActions(Relation relation)
 			pubactions->pubdelete && pubactions->pubtruncate)
 			break;
 	}
+	}
 
 	if (relation->rd_pubactions)
 	{
-- 
2.16.3

>From b0946c5b97857cf476975306ce78355f9316e722 Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyot...@lab.ntt.co.jp>
Date: Thu, 14 Mar 2019 15:02:54 +0900
Subject: [PATCH 2/2] step2: fix indentation

---
 src/backend/utils/cache/relcache.c | 50 +++++++++++++++++++-------------------
 1 file changed, 25 insertions(+), 25 deletions(-)

diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index a43fb040cb..f5dff5572e 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -5091,38 +5091,38 @@ GetRelationPublicationActions(Relation relation)
 
 	if (is_publishable_relation(relation))
 	{
-	/* Fetch the publication membership info. */
-	puboids = GetRelationPublications(RelationGetRelid(relation));
-	puboids = list_concat_unique_oid(puboids, GetAllTablesPublications());
+		/* Fetch the publication membership info. */
+		puboids = GetRelationPublications(RelationGetRelid(relation));
+		puboids = list_concat_unique_oid(puboids, GetAllTablesPublications());
 
-	foreach(lc, puboids)
-	{
-		Oid			pubid = lfirst_oid(lc);
-		HeapTuple	tup;
-		Form_pg_publication pubform;
+		foreach(lc, puboids)
+		{
+			Oid			pubid = lfirst_oid(lc);
+			HeapTuple	tup;
+			Form_pg_publication pubform;
 
-		tup = SearchSysCache1(PUBLICATIONOID, ObjectIdGetDatum(pubid));
+			tup = SearchSysCache1(PUBLICATIONOID, ObjectIdGetDatum(pubid));
 
-		if (!HeapTupleIsValid(tup))
-			elog(ERROR, "cache lookup failed for publication %u", pubid);
+			if (!HeapTupleIsValid(tup))
+				elog(ERROR, "cache lookup failed for publication %u", pubid);
 
-		pubform = (Form_pg_publication) GETSTRUCT(tup);
+			pubform = (Form_pg_publication) GETSTRUCT(tup);
 
-		pubactions->pubinsert |= pubform->pubinsert;
-		pubactions->pubupdate |= pubform->pubupdate;
-		pubactions->pubdelete |= pubform->pubdelete;
-		pubactions->pubtruncate |= pubform->pubtruncate;
+			pubactions->pubinsert |= pubform->pubinsert;
+			pubactions->pubupdate |= pubform->pubupdate;
+			pubactions->pubdelete |= pubform->pubdelete;
+			pubactions->pubtruncate |= pubform->pubtruncate;
 
-		ReleaseSysCache(tup);
+			ReleaseSysCache(tup);
 
-		/*
-		 * If we know everything is replicated, there is no point to check for
-		 * other publications.
-		 */
-		if (pubactions->pubinsert && pubactions->pubupdate &&
-			pubactions->pubdelete && pubactions->pubtruncate)
-			break;
-	}
+			/*
+			 * If we know everything is replicated, there is no point to check
+			 * for other publications.
+			 */
+			if (pubactions->pubinsert && pubactions->pubupdate &&
+				pubactions->pubdelete && pubactions->pubtruncate)
+				break;
+		}
 	}
 
 	if (relation->rd_pubactions)
-- 
2.16.3

Reply via email to