diff --git a/src/backend/replication/logical/proto.c b/src/backend/replication/logical/proto.c index f5f2bc24d8..a041937ce9 100644 --- a/src/backend/replication/logical/proto.c +++ b/src/backend/replication/logical/proto.c @@ -1194,9 +1194,11 @@ logicalrep_read_stream_abort(StringInfo in, TransactionId *xid, /* * Get string representing LogicalRepMsgType. */ -char * +const char * logicalrep_message_type(LogicalRepMsgType action) { + static char err_unknown[20]; + switch (action) { case LOGICAL_REP_MSG_BEGIN: @@ -1239,7 +1241,12 @@ logicalrep_message_type(LogicalRepMsgType action) return "STREAM PREPARE"; } - elog(ERROR, "invalid logical replication message type \"%c\"", action); + /* + * This message provides context in the error raised when applying a + * logical message. So we can't throw an error here. Return an unknown + * indicator value so that the original error is still reported. + */ + snprintf(err_unknown, sizeof(err_unknown), "??? (%d)", action); - return NULL; /* keep compiler quiet */ + return err_unknown; } diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index cc6b079fcd..dcc3fdf6c7 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -2579,7 +2579,7 @@ apply_dispatch(StringInfo s) default: ereport(ERROR, (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("invalid logical replication message type \"%c\"", action))); + errmsg("invalid logical replication message type \"??? (%d)\"", action))); } /* Reset the current command */ diff --git a/src/include/replication/logicalproto.h b/src/include/replication/logicalproto.h index 04e1cd89cf..8cdc04a65f 100644 --- a/src/include/replication/logicalproto.h +++ b/src/include/replication/logicalproto.h @@ -249,6 +249,6 @@ extern void logicalrep_write_stream_abort(StringInfo out, TransactionId xid, TransactionId subxid); extern void logicalrep_read_stream_abort(StringInfo in, TransactionId *xid, TransactionId *subxid); -extern char *logicalrep_message_type(LogicalRepMsgType action); +extern const char *logicalrep_message_type(LogicalRepMsgType action); #endif /* LOGICAL_PROTO_H */