diff --git a/src/backend/replication/logical/relation.c b/src/backend/replication/logical/relation.c index 1f20df5680..905ca12fd8 100644 --- a/src/backend/replication/logical/relation.c +++ b/src/backend/replication/logical/relation.c @@ -425,7 +425,7 @@ logicalrep_typmap_gettypname(Oid remoteid) bool found; /* Internal types are mapped directly. */ - if (remoteid < FirstNormalObjectId) + if (remoteid < FirstBootstrapObjectId) { if (!get_typisdefined(remoteid)) { diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 86e0951a70..dc07420fa1 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -269,8 +269,12 @@ maybe_send_schema(LogicalDecodingContext *ctx, desc = RelationGetDescr(relation); /* - * Write out type info if needed. We do that only for user created - * types. + * Write out type info if needed. We do that only for user-created + * types. We use FirstBootstrapObjectId as the cutoff, so that we only + * consider objects with hand-assigned OIDs to be "built in", not for + * instance any function or type defined in the information_schema. + * This is important because only hand-assigned OIDs can be expected + * to remain stable across major versions. */ for (i = 0; i < desc->natts; i++) { @@ -279,7 +283,7 @@ maybe_send_schema(LogicalDecodingContext *ctx, if (att->attisdropped) continue; - if (att->atttypid < FirstNormalObjectId) + if (att->atttypid < FirstBootstrapObjectId) continue; OutputPluginPrepareWrite(ctx, false);