diff --git a/src/backend/replication/logical/proto.c b/src/backend/replication/logical/proto.c index f308713275..a038f80dbd 100644 --- a/src/backend/replication/logical/proto.c +++ b/src/backend/replication/logical/proto.c @@ -1213,9 +1213,11 @@ logicalrep_read_stream_abort(StringInfo in, /* * Get string representing LogicalRepMsgType. */ -char * +const char * logicalrep_message_type(LogicalRepMsgType action) { + char *err_unknown; + switch (action) { case LOGICAL_REP_MSG_BEGIN: @@ -1258,7 +1260,12 @@ logicalrep_message_type(LogicalRepMsgType action) return "STREAM PREPARE"; } - elog(ERROR, "invalid logical replication message type \"%c\"", action); + /* + * This function is called to provide 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. + */ + err_unknown = psprintf("??? (%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 dd353fd1cb..cb6659fc61 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -3367,7 +3367,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 0ea2df5088..c5be981eae 100644 --- a/src/include/replication/logicalproto.h +++ b/src/include/replication/logicalproto.h @@ -269,6 +269,6 @@ extern void logicalrep_write_stream_abort(StringInfo out, TransactionId xid, extern void logicalrep_read_stream_abort(StringInfo in, LogicalRepStreamAbortData *abort_data, bool read_abort_info); -extern char *logicalrep_message_type(LogicalRepMsgType action); +extern const char *logicalrep_message_type(LogicalRepMsgType action); #endif /* LOGICAL_PROTO_H */