From c5e7baf0022d06c99b8c965cf0c8b278cb7417d4 Mon Sep 17 00:00:00 2001 From: Shveta Malik Date: Mon, 9 Nov 2026 15:35:05 +0530 Subject: [PATCH] PG19 fix for get_rel_sync_entry crash --- src/backend/replication/pgoutput/pgoutput.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index b5b47a20dfb..70da17b977d 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -2103,7 +2103,8 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) ListCell *lc; Oid publish_as_relid = relid; int publish_ancestor_level = 0; - bool am_partition = get_rel_relispartition(relid); + List *ancestors = NIL; + bool am_partition; char relkind = get_rel_relkind(relid); List *rel_publications = NIL; @@ -2184,6 +2185,16 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->estate = NULL; memset(entry->exprstate, 0, sizeof(entry->exprstate)); + /* + * A partition whose concurrent detach has been committed but not + * finalized reports no ancestors, even though relispartition is still + * set. Treat such a partition as a standalone table, as after the + * detach is finalized. + */ + if (get_rel_relispartition(relid)) + ancestors = get_partition_ancestors(relid); + am_partition = (ancestors != NIL); + /* * Build publication cache. We can't use one provided by relcache as * relcache considers all publications that the given relation is in, @@ -2213,7 +2224,6 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) if (am_partition) { - List *ancestors = get_partition_ancestors(relid); Oid last_ancestor_relid = llast_oid(ancestors); /* @@ -2266,7 +2276,6 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) { Oid ancestor; int level; - List *ancestors = get_partition_ancestors(relid); ancestor = GetTopMostAncestorInPublication(pub->oid, ancestors, -- 2.34.1