v3-0002-Don-t-add-conflict-history-tables-to-publishable-.patch

application/octet-stream

Filename: v3-0002-Don-t-add-conflict-history-tables-to-publishable-.patch
Type: application/octet-stream
Part: 0
Message: Re: Proposal: Conflict log history table for Logical Replication

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: format-patch
Series: patch v3-0002
Subject: Don't add conflict history tables to publishable relation
File+
src/backend/catalog/pg_publication.c 3 0
src/backend/commands/subscriptioncmds.c 40 0
src/include/commands/subscriptioncmds.h 2 0
From 830477d8d5eb57aeda59c8e9c6850794bcd3e6ad Mon Sep 17 00:00:00 2001
From: Dilip Kumar <dilipkumarb@google.com>
Date: Wed, 12 Nov 2025 14:30:39 +0530
Subject: [PATCH v3 2/2] Don't add conflict history tables to publishable
 relation

When all table option is used with publication don't publish the
conflict history tables.
---
 src/backend/catalog/pg_publication.c    |  3 ++
 src/backend/commands/subscriptioncmds.c | 40 +++++++++++++++++++++++++
 src/include/commands/subscriptioncmds.h |  2 ++
 3 files changed, 45 insertions(+)

diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c
index ac2f4ee3561..41f9fe78f5c 100644
--- a/src/backend/catalog/pg_publication.c
+++ b/src/backend/catalog/pg_publication.c
@@ -31,6 +31,7 @@
 #include "catalog/pg_publication_rel.h"
 #include "catalog/pg_type.h"
 #include "commands/publicationcmds.h"
+#include "commands/subscriptioncmds.h"
 #include "funcapi.h"
 #include "utils/array.h"
 #include "utils/builtins.h"
@@ -890,7 +891,9 @@ GetAllPublicationRelations(char relkind, bool pubviaroot)
 		Form_pg_class relForm = (Form_pg_class) GETSTRUCT(tuple);
 		Oid			relid = relForm->oid;
 
+		/* conflict history tables are not published. */
 		if (is_publishable_class(relid, relForm) &&
+			!IsConflictHistoryRelid(relid) &&
 			!(relForm->relispartition && pubviaroot))
 			result = lappend_oid(result, relid);
 	}
diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c
index a5dc9a11c60..4eb140eb357 100644
--- a/src/backend/commands/subscriptioncmds.c
+++ b/src/backend/commands/subscriptioncmds.c
@@ -15,6 +15,7 @@
 #include "postgres.h"
 
 #include "access/commit_ts.h"
+#include "access/heapam.h"
 #include "access/htup_details.h"
 #include "access/table.h"
 #include "access/twophase.h"
@@ -3359,3 +3360,42 @@ DropConflictHistoryTable(Oid namespaceId, char *conflictrel)
 
 	pfree(querybuf.data);
 }
+
+/*
+ * Is relation used as a conflict history table
+ *
+ * Scan all the subscription and check whether the relation is used as
+ * conflict history table.
+ */
+bool
+IsConflictHistoryRelid(Oid relid)
+{
+	Relation		rel;
+	TableScanDesc	scan;
+	HeapTuple		tup;
+	bool			found = false;
+
+	rel = table_open(SubscriptionRelationId, AccessShareLock);
+	scan = table_beginscan_catalog(rel, 0, NULL);
+
+	while (HeapTupleIsValid(tup = heap_getnext(scan, ForwardScanDirection)))
+	{
+		Form_pg_subscription subform = (Form_pg_subscription) GETSTRUCT(tup);
+		Oid		nspid;
+		char   *relname;
+
+		relname = get_subscription_conflictrel(subform->oid, &nspid);
+		if (relname == NULL)
+			continue;
+		if (relid == get_relname_relid(relname, nspid))
+		{
+			found = true;
+			break;
+		}
+	}
+
+	table_endscan(scan);
+	table_close(rel, AccessShareLock);
+
+	return found;
+}
diff --git a/src/include/commands/subscriptioncmds.h b/src/include/commands/subscriptioncmds.h
index fb4e26a51a4..550af0bb034 100644
--- a/src/include/commands/subscriptioncmds.h
+++ b/src/include/commands/subscriptioncmds.h
@@ -36,4 +36,6 @@ extern void CheckSubDeadTupleRetention(bool check_guc, bool sub_disabled,
 									   bool retention_active,
 									   bool max_retention_set);
 
+extern bool IsConflictHistoryRelid(Oid relid);
+
 #endif							/* SUBSCRIPTIONCMDS_H */
-- 
2.49.0