public inbox for [email protected]  
help / color / mirror / Atom feed
Re: Using defines for protocol characters
18+ messages / 8 participants
[nested] [flat]

* Re: Using defines for protocol characters
@ 2023-08-07 17:19 Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  0 siblings, 1 reply; 18+ messages in thread

From: Dave Cramer @ 2023-08-07 17:19 UTC (permalink / raw)
  To: Alvaro Herrera <[email protected]>; +Cc: Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]

On Mon, 7 Aug 2023 at 03:10, Alvaro Herrera <[email protected]> wrote:

> On 2023-Aug-07, Peter Smith wrote:
>
> > I guess, your patch would not be much different; you can still have
> > all the nice names and assign the appropriate values to the enum
> > values same as now, but using an enum you might also gain
> > type-checking in the code and also get warnings for the "switch"
> > statements if there are any cases accidentally omitted.
>
> Hmm, I think omitting a 'default' clause (which is needed when you want
> warnings for missing clauses) in a switch that handles protocol traffic
> is not great, because the switch would misbehave when the network
> counterpart sends a broken message.  I'm not sure we want to do that.
> It could become a serious security problem if confronted with a
> malicious libpq.
>
>
Any other changes required ?

Dave

> --
> Álvaro Herrera         PostgreSQL Developer  —
> https://www.EnterpriseDB.com/
>


^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
@ 2023-08-07 17:36 ` Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  0 siblings, 1 reply; 18+ messages in thread

From: Robert Haas @ 2023-08-07 17:36 UTC (permalink / raw)
  To: Dave Cramer <[email protected]>; +Cc: Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]

On Mon, Aug 7, 2023 at 1:19 PM Dave Cramer <[email protected]> wrote:
> Any other changes required ?

IMHO, the correspondence between the names in the patch and the
traditional names in the documentation could be stronger. For example,
the documentation mentions EmptyQueryResponse and
NegotiateProtocolVersion, but in this patch those become
PQMSG_RESP_NEGOTIATE_PROTOCOL and PQMSG_RESP_EMPTY_QUERY. I think we
could consider directly using the names from the documentation, right
down to capitalization, perhaps with a prefix, but I'm also totally
fine with this use of uppercase letters and underscores. But why not
do a strict translation, like EmptyQueryResponse ->
PQMSG_EMPTY_QUERY_RESPONSE, NegotiateProtocolVersion ->
PQMSG_NEGOTIATE_PROTOCOL_VERSION? To me at least, the current patch is
inventing new and slightly different names for things that already
have names...

-- 
Robert Haas
EDB: http://www.enterprisedb.com






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
@ 2023-08-07 18:24   ` Tom Lane <[email protected]>
  2023-08-07 18:38     ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
  2023-08-07 18:59     ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  0 siblings, 2 replies; 18+ messages in thread

From: Tom Lane @ 2023-08-07 18:24 UTC (permalink / raw)
  To: Robert Haas <[email protected]>; +Cc: Dave Cramer <[email protected]>; Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]

Robert Haas <[email protected]> writes:
> IMHO, the correspondence between the names in the patch and the
> traditional names in the documentation could be stronger. For example,
> the documentation mentions EmptyQueryResponse and
> NegotiateProtocolVersion, but in this patch those become
> PQMSG_RESP_NEGOTIATE_PROTOCOL and PQMSG_RESP_EMPTY_QUERY. I think we
> could consider directly using the names from the documentation, right
> down to capitalization, perhaps with a prefix, but I'm also totally
> fine with this use of uppercase letters and underscores. But why not
> do a strict translation, like EmptyQueryResponse ->
> PQMSG_EMPTY_QUERY_RESPONSE, NegotiateProtocolVersion ->
> PQMSG_NEGOTIATE_PROTOCOL_VERSION? To me at least, the current patch is
> inventing new and slightly different names for things that already
> have names...

+1.  For ease of greppability, maybe even PQMSG_EmptyQueryResponse
and so on?  Then one grep would find both uses of the constants and
code/docs references.  Not sure if the prefix should be all-caps or
not if we go this way.

			regards, tom lane






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
@ 2023-08-07 18:38     ` Nathan Bossart <[email protected]>
  1 sibling, 0 replies; 18+ messages in thread

From: Nathan Bossart @ 2023-08-07 18:38 UTC (permalink / raw)
  To: Tom Lane <[email protected]>; +Cc: Robert Haas <[email protected]>; Dave Cramer <[email protected]>; Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]

On Mon, Aug 07, 2023 at 02:24:58PM -0400, Tom Lane wrote:
> Robert Haas <[email protected]> writes:
>> IMHO, the correspondence between the names in the patch and the
>> traditional names in the documentation could be stronger. For example,
>> the documentation mentions EmptyQueryResponse and
>> NegotiateProtocolVersion, but in this patch those become
>> PQMSG_RESP_NEGOTIATE_PROTOCOL and PQMSG_RESP_EMPTY_QUERY. I think we
>> could consider directly using the names from the documentation, right
>> down to capitalization, perhaps with a prefix, but I'm also totally
>> fine with this use of uppercase letters and underscores. But why not
>> do a strict translation, like EmptyQueryResponse ->
>> PQMSG_EMPTY_QUERY_RESPONSE, NegotiateProtocolVersion ->
>> PQMSG_NEGOTIATE_PROTOCOL_VERSION? To me at least, the current patch is
>> inventing new and slightly different names for things that already
>> have names...
> 
> +1.  For ease of greppability, maybe even PQMSG_EmptyQueryResponse
> and so on?  Then one grep would find both uses of the constants and
> code/docs references.  Not sure if the prefix should be all-caps or
> not if we go this way.

+1 for Tom's suggestion.  I have no strong opinion about the prefix, but I
do think easing greppability is worthwhile.

As mentioned earlier [0], I think we should also consider putting the
definitions in pqcomm.h.

[0] https://postgr.es/m/20230803185356.GA1144430%40nathanxps13

-- 
Nathan Bossart
Amazon Web Services: https://aws.amazon.com






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
@ 2023-08-07 18:59     ` Robert Haas <[email protected]>
  2023-08-07 20:00       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  1 sibling, 1 reply; 18+ messages in thread

From: Robert Haas @ 2023-08-07 18:59 UTC (permalink / raw)
  To: Tom Lane <[email protected]>; +Cc: Dave Cramer <[email protected]>; Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]

On Mon, Aug 7, 2023 at 2:25 PM Tom Lane <[email protected]> wrote:
> +1.  For ease of greppability, maybe even PQMSG_EmptyQueryResponse
> and so on?  Then one grep would find both uses of the constants and
> code/docs references.  Not sure if the prefix should be all-caps or
> not if we go this way.

PqMsgEmptyQueryResponse or something like that seems better, if we
want to keep the current capitalization. I'm not a huge fan of the way
we vary our capitalization conventions so much all over the code base,
but I think we would at least do well to keep it consistent from one
end of a certain identifier to the other.

-- 
Robert Haas
EDB: http://www.enterprisedb.com






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 18:59     ` Re: Using defines for protocol characters Robert Haas <[email protected]>
@ 2023-08-07 20:00       ` Dave Cramer <[email protected]>
  2023-08-07 20:02         ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  0 siblings, 1 reply; 18+ messages in thread

From: Dave Cramer @ 2023-08-07 20:00 UTC (permalink / raw)
  To: Robert Haas <[email protected]>; +Cc: Tom Lane <[email protected]>; Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]

On Mon, 7 Aug 2023 at 12:59, Robert Haas <[email protected]> wrote:

> On Mon, Aug 7, 2023 at 2:25 PM Tom Lane <[email protected]> wrote:
> > +1.  For ease of greppability, maybe even PQMSG_EmptyQueryResponse
> > and so on?  Then one grep would find both uses of the constants and
> > code/docs references.  Not sure if the prefix should be all-caps or
> > not if we go this way.
>
> PqMsgEmptyQueryResponse or something like that seems better, if we
> want to keep the current capitalization. I'm not a huge fan of the way
> we vary our capitalization conventions so much all over the code base,
> but I think we would at least do well to keep it consistent from one
> end of a certain identifier to the other.
>

I don't have a strong preference, but before I make the changes I'd like to
get consensus.

Can we vote or whatever it takes to decide on a naming pattern that is
acceptable ?

Dave


^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 18:59     ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 20:00       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
@ 2023-08-07 20:02         ` Tom Lane <[email protected]>
  2023-08-07 21:47           ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
  0 siblings, 1 reply; 18+ messages in thread

From: Tom Lane @ 2023-08-07 20:02 UTC (permalink / raw)
  To: Dave Cramer <[email protected]>; +Cc: Robert Haas <[email protected]>; Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]

Dave Cramer <[email protected]> writes:
> On Mon, 7 Aug 2023 at 12:59, Robert Haas <[email protected]> wrote:
>> PqMsgEmptyQueryResponse or something like that seems better, if we
>> want to keep the current capitalization. I'm not a huge fan of the way
>> we vary our capitalization conventions so much all over the code base,
>> but I think we would at least do well to keep it consistent from one
>> end of a certain identifier to the other.

> I don't have a strong preference, but before I make the changes I'd like to
> get consensus.
> Can we vote or whatever it takes to decide on a naming pattern that is
> acceptable ?

I'm good with Robert's proposal above.

			regards, tom lane






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 18:59     ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 20:00       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 20:02         ` Re: Using defines for protocol characters Tom Lane <[email protected]>
@ 2023-08-07 21:47           ` Nathan Bossart <[email protected]>
  2023-08-07 22:49             ` Re: Using defines for protocol characters Tatsuo Ishii <[email protected]>
  2023-08-08 06:27             ` Re: Using defines for protocol characters Alvaro Herrera <[email protected]>
  0 siblings, 2 replies; 18+ messages in thread

From: Nathan Bossart @ 2023-08-07 21:47 UTC (permalink / raw)
  To: Tom Lane <[email protected]>; +Cc: Dave Cramer <[email protected]>; Robert Haas <[email protected]>; Alvaro Herrera <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]

On Mon, Aug 07, 2023 at 04:02:08PM -0400, Tom Lane wrote:
> Dave Cramer <[email protected]> writes:
>> On Mon, 7 Aug 2023 at 12:59, Robert Haas <[email protected]> wrote:
>>> PqMsgEmptyQueryResponse or something like that seems better, if we
>>> want to keep the current capitalization. I'm not a huge fan of the way
>>> we vary our capitalization conventions so much all over the code base,
>>> but I think we would at least do well to keep it consistent from one
>>> end of a certain identifier to the other.
> 
>> I don't have a strong preference, but before I make the changes I'd like to
>> get consensus.
>> Can we vote or whatever it takes to decide on a naming pattern that is
>> acceptable ?
> 
> I'm good with Robert's proposal above.

+1

-- 
Nathan Bossart
Amazon Web Services: https://aws.amazon.com






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 18:59     ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 20:00       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 20:02         ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 21:47           ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
@ 2023-08-07 22:49             ` Tatsuo Ishii <[email protected]>
  2023-08-07 23:55               ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  1 sibling, 1 reply; 18+ messages in thread

From: Tatsuo Ishii @ 2023-08-07 22:49 UTC (permalink / raw)
  To: [email protected]; +Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]

> On Mon, Aug 07, 2023 at 04:02:08PM -0400, Tom Lane wrote:
>> Dave Cramer <[email protected]> writes:
>>> On Mon, 7 Aug 2023 at 12:59, Robert Haas <[email protected]> wrote:
>>>> PqMsgEmptyQueryResponse or something like that seems better, if we
>>>> want to keep the current capitalization. I'm not a huge fan of the way
>>>> we vary our capitalization conventions so much all over the code base,
>>>> but I think we would at least do well to keep it consistent from one
>>>> end of a certain identifier to the other.
>> 
>>> I don't have a strong preference, but before I make the changes I'd like to
>>> get consensus.
>>> Can we vote or whatever it takes to decide on a naming pattern that is
>>> acceptable ?
>> 
>> I'm good with Robert's proposal above.
> 
> +1

+1.

Also we need to decide what to do with them:

> #define PQMSG_REQ_PREPARED 'S'
> #define PQMSG_REQ_PORTAL 'P'

If we go "PqMsgEmptyQueryResponse", probably we should go something
like for these?

#define PqMsgReqPrepared 'S'
#define PqMsgReqPortal 'P'

Best reagards,
--
Tatsuo Ishii
SRA OSS LLC
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 18:59     ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 20:00       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 20:02         ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 21:47           ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
  2023-08-07 22:49             ` Re: Using defines for protocol characters Tatsuo Ishii <[email protected]>
@ 2023-08-07 23:55               ` Dave Cramer <[email protected]>
  2023-08-08 00:37                 ` Re: Using defines for protocol characters Tatsuo Ishii <[email protected]>
  2023-08-09 15:19                 ` Re: Using defines for protocol characters Peter Eisentraut <[email protected]>
  0 siblings, 2 replies; 18+ messages in thread

From: Dave Cramer @ 2023-08-07 23:55 UTC (permalink / raw)
  To: Tatsuo Ishii <[email protected]>; +Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]

On Mon, 7 Aug 2023 at 16:50, Tatsuo Ishii <[email protected]> wrote:

> > On Mon, Aug 07, 2023 at 04:02:08PM -0400, Tom Lane wrote:
> >> Dave Cramer <[email protected]> writes:
> >>> On Mon, 7 Aug 2023 at 12:59, Robert Haas <[email protected]>
> wrote:
> >>>> PqMsgEmptyQueryResponse or something like that seems better, if we
> >>>> want to keep the current capitalization. I'm not a huge fan of the way
> >>>> we vary our capitalization conventions so much all over the code base,
> >>>> but I think we would at least do well to keep it consistent from one
> >>>> end of a certain identifier to the other.
> >>
> >>> I don't have a strong preference, but before I make the changes I'd
> like to
> >>> get consensus.
> >>> Can we vote or whatever it takes to decide on a naming pattern that is
> >>> acceptable ?
> >>
> >> I'm good with Robert's proposal above.
> >
> > +1
>
> +1.
>
> Also we need to decide what to do with them:
>
> > #define PQMSG_REQ_PREPARED 'S'
> > #define PQMSG_REQ_PORTAL 'P'
>
> If we go "PqMsgEmptyQueryResponse", probably we should go something
> like for these?
>
> #define PqMsgReqPrepared 'S'
> #define PqMsgReqPortal 'P'
>

I went with PqMsgPortalSubCommand and PqMsgPreparedSubCommand

See attached patch

Dave


Attachments:

  [application/octet-stream] 0001-Created-protocol.h.patch (60.3K, ../../CADK3HHJgZWCh8Kwvc41=B3nAXyP_iX0bFewe7+7q6qp1hXiW5g@mail.gmail.com/3-0001-Created-protocol.h.patch)
  download | inline diff:
From 1b613d3c96991a1616786d1ca4b1f5365b68f74a Mon Sep 17 00:00:00 2001
From: Dave Cramer <[email protected]>
Date: Thu, 20 Apr 2023 15:40:03 -0400
Subject: [PATCH] Created protocol.h Protocol.h has defines for every protocol
 message both backend and frontend Instead of using hardcoded values for each
 protocol message use defines to make code easier to read

Use commands for documenting fe-trace.c
More commands instead of characters

Change name to
PqMsg<name>Request|Response
---
 src/backend/access/common/printsimple.c       |   5 +-
 src/backend/access/transam/parallel.c         |  17 +--
 src/backend/backup/basebackup_copy.c          |  21 ++--
 src/backend/commands/async.c                  |   3 +-
 src/backend/commands/copyfromparse.c          |  23 ++--
 src/backend/commands/copyto.c                 |   7 +-
 src/backend/libpq/auth-sasl.c                 |   3 +-
 src/backend/libpq/auth.c                      |   9 +-
 src/backend/postmaster/postmaster.c           |   3 +-
 src/backend/replication/walsender.c           |  19 ++--
 src/backend/tcop/dest.c                       |   9 +-
 src/backend/tcop/fastpath.c                   |   3 +-
 src/backend/tcop/postgres.c                   |  77 ++++++-------
 src/backend/utils/activity/backend_progress.c |   3 +-
 src/backend/utils/error/elog.c                |   3 +-
 src/backend/utils/misc/guc.c                  |   3 +-
 src/include/protocol.h                        |  60 +++++++++++
 src/interfaces/libpq/fe-auth.c                |   3 +-
 src/interfaces/libpq/fe-connect.c             |  15 +--
 src/interfaces/libpq/fe-exec.c                |  53 ++++-----
 src/interfaces/libpq/fe-protocol3.c           |  66 ++++++------
 src/interfaces/libpq/fe-trace.c               | 101 +++++++++---------
 22 files changed, 294 insertions(+), 212 deletions(-)
 create mode 100644 src/include/protocol.h

diff --git a/src/backend/access/common/printsimple.c b/src/backend/access/common/printsimple.c
index ef818228ac..54052b1bb7 100644
--- a/src/backend/access/common/printsimple.c
+++ b/src/backend/access/common/printsimple.c
@@ -21,6 +21,7 @@
 #include "access/printsimple.h"
 #include "catalog/pg_type.h"
 #include "libpq/pqformat.h"
+#include "protocol.h"
 #include "utils/builtins.h"
 
 /*
@@ -32,7 +33,7 @@ printsimple_startup(DestReceiver *self, int operation, TupleDesc tupdesc)
 	StringInfoData buf;
 	int			i;
 
-	pq_beginmessage(&buf, 'T'); /* RowDescription */
+	pq_beginmessage(&buf, PqMsgRowDescriptionResponse);
 	pq_sendint16(&buf, tupdesc->natts);
 
 	for (i = 0; i < tupdesc->natts; ++i)
@@ -65,7 +66,7 @@ printsimple(TupleTableSlot *slot, DestReceiver *self)
 	slot_getallattrs(slot);
 
 	/* Prepare and send message */
-	pq_beginmessage(&buf, 'D');
+	pq_beginmessage(&buf, PqMsgDataRowResponse);
 	pq_sendint16(&buf, tupdesc->natts);
 
 	for (i = 0; i < tupdesc->natts; ++i)
diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c
index 1738aecf1f..dd7c8290f4 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -33,6 +33,7 @@
 #include "miscadmin.h"
 #include "optimizer/optimizer.h"
 #include "pgstat.h"
+#include "protocol.h"
 #include "storage/ipc.h"
 #include "storage/predicate.h"
 #include "storage/sinval.h"
@@ -1127,7 +1128,7 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg)
 
 	switch (msgtype)
 	{
-		case 'K':				/* BackendKeyData */
+		case PqMsgBackendKeyDataRequest:
 			{
 				int32		pid = pq_getmsgint(msg, 4);
 
@@ -1137,8 +1138,8 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg)
 				break;
 			}
 
-		case 'E':				/* ErrorResponse */
-		case 'N':				/* NoticeResponse */
+		case PqMsgErrorResponse:
+		case PqMsgNoticeResponse:
 			{
 				ErrorData	edata;
 				ErrorContextCallback *save_error_context_stack;
@@ -1183,7 +1184,7 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg)
 				break;
 			}
 
-		case 'A':				/* NotifyResponse */
+		case PqMsgNotifyResponse:
 			{
 				/* Propagate NotifyResponse. */
 				int32		pid;
@@ -1200,7 +1201,7 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg)
 				break;
 			}
 
-		case 'P':				/* Parallel progress reporting */
+		case PqMsgParallelProgressResponse:
 			{
 				/*
 				 * Only incremental progress reporting is currently supported.
@@ -1217,7 +1218,7 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg)
 				break;
 			}
 
-		case 'X':				/* Terminate, indicating clean exit */
+		case PqMsgTerminateRequest:	/* Terminate, indicating clean exit */
 			{
 				shm_mq_detach(pcxt->worker[i].error_mqh);
 				pcxt->worker[i].error_mqh = NULL;
@@ -1372,7 +1373,7 @@ ParallelWorkerMain(Datum main_arg)
 	 * protocol message is defined, but it won't actually be used for anything
 	 * in this case.
 	 */
-	pq_beginmessage(&msgbuf, 'K');
+	pq_beginmessage(&msgbuf, PqMsgBackendKeyDataRequest);
 	pq_sendint32(&msgbuf, (int32) MyProcPid);
 	pq_sendint32(&msgbuf, (int32) MyCancelKey);
 	pq_endmessage(&msgbuf);
@@ -1550,7 +1551,7 @@ ParallelWorkerMain(Datum main_arg)
 	DetachSession();
 
 	/* Report success. */
-	pq_putmessage('X', NULL, 0);
+	pq_putmessage(PqMsgTerminateRequest, NULL, 0);
 }
 
 /*
diff --git a/src/backend/backup/basebackup_copy.c b/src/backend/backup/basebackup_copy.c
index 1db80cde1b..e44189b171 100644
--- a/src/backend/backup/basebackup_copy.c
+++ b/src/backend/backup/basebackup_copy.c
@@ -32,6 +32,7 @@
 #include "executor/executor.h"
 #include "libpq/libpq.h"
 #include "libpq/pqformat.h"
+#include "protocol.h"
 #include "tcop/dest.h"
 #include "utils/builtins.h"
 #include "utils/timestamp.h"
@@ -152,7 +153,7 @@ bbsink_copystream_begin_backup(bbsink *sink)
 	SendTablespaceList(state->tablespaces);
 
 	/* Send a CommandComplete message */
-	pq_puttextmessage('C', "SELECT");
+	pq_puttextmessage(PqMsgCommandCompleteResponse, "SELECT");
 
 	/* Begin COPY stream. This will be used for all archives + manifest. */
 	SendCopyOutResponse();
@@ -169,7 +170,7 @@ bbsink_copystream_begin_archive(bbsink *sink, const char *archive_name)
 	StringInfoData buf;
 
 	ti = list_nth(state->tablespaces, state->tablespace_num);
-	pq_beginmessage(&buf, 'd'); /* CopyData */
+	pq_beginmessage(&buf, PqMsgCopyDataRequest);
 	pq_sendbyte(&buf, 'n');		/* New archive */
 	pq_sendstring(&buf, archive_name);
 	pq_sendstring(&buf, ti->path == NULL ? "" : ti->path);
@@ -220,8 +221,8 @@ bbsink_copystream_archive_contents(bbsink *sink, size_t len)
 		{
 			mysink->last_progress_report_time = now;
 
-			pq_beginmessage(&buf, 'd'); /* CopyData */
-			pq_sendbyte(&buf, 'p'); /* Progress report */
+			pq_beginmessage(&buf, PqMsgCopyDataRequest);
+			pq_sendbyte(&buf, PqMsgCopyProgressRequest);
 			pq_sendint64(&buf, state->bytes_done);
 			pq_endmessage(&buf);
 			pq_flush_if_writable();
@@ -246,8 +247,8 @@ bbsink_copystream_end_archive(bbsink *sink)
 
 	mysink->bytes_done_at_last_time_check = state->bytes_done;
 	mysink->last_progress_report_time = GetCurrentTimestamp();
-	pq_beginmessage(&buf, 'd'); /* CopyData */
-	pq_sendbyte(&buf, 'p');		/* Progress report */
+	pq_beginmessage(&buf, PqMsgCopyDataRequest);
+	pq_sendbyte(&buf, PqMsgCopyProgressRequest);
 	pq_sendint64(&buf, state->bytes_done);
 	pq_endmessage(&buf);
 	pq_flush_if_writable();
@@ -261,7 +262,7 @@ bbsink_copystream_begin_manifest(bbsink *sink)
 {
 	StringInfoData buf;
 
-	pq_beginmessage(&buf, 'd'); /* CopyData */
+	pq_beginmessage(&buf, PqMsgCopyDataRequest);
 	pq_sendbyte(&buf, 'm');		/* Manifest */
 	pq_endmessage(&buf);
 }
@@ -318,7 +319,7 @@ SendCopyOutResponse(void)
 {
 	StringInfoData buf;
 
-	pq_beginmessage(&buf, 'H');
+	pq_beginmessage(&buf, PqMsgCopyOutResponse);
 	pq_sendbyte(&buf, 0);		/* overall format */
 	pq_sendint16(&buf, 0);		/* natts */
 	pq_endmessage(&buf);
@@ -330,7 +331,7 @@ SendCopyOutResponse(void)
 static void
 SendCopyDone(void)
 {
-	pq_putemptymessage('c');
+	pq_putemptymessage(PqMsgCopyDoneRequest);
 }
 
 /*
@@ -368,7 +369,7 @@ SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli)
 	end_tup_output(tstate);
 
 	/* Send a CommandComplete message */
-	pq_puttextmessage('C', "SELECT");
+	pq_puttextmessage(PqMsgCommandCompleteResponse, "SELECT");
 }
 
 /*
diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c
index ef909cf4e0..27e2401601 100644
--- a/src/backend/commands/async.c
+++ b/src/backend/commands/async.c
@@ -141,6 +141,7 @@
 #include "libpq/libpq.h"
 #include "libpq/pqformat.h"
 #include "miscadmin.h"
+#include "protocol.h"
 #include "storage/ipc.h"
 #include "storage/lmgr.h"
 #include "storage/proc.h"
@@ -2281,7 +2282,7 @@ NotifyMyFrontEnd(const char *channel, const char *payload, int32 srcPid)
 	{
 		StringInfoData buf;
 
-		pq_beginmessage(&buf, 'A');
+		pq_beginmessage(&buf, PqMsgNotifyResponse);
 		pq_sendint32(&buf, srcPid);
 		pq_sendstring(&buf, channel);
 		pq_sendstring(&buf, payload);
diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c
index 232768a6e1..7e90e2da5d 100644
--- a/src/backend/commands/copyfromparse.c
+++ b/src/backend/commands/copyfromparse.c
@@ -72,6 +72,7 @@
 #include "miscadmin.h"
 #include "pgstat.h"
 #include "port/pg_bswap.h"
+#include "protocol.h"
 #include "utils/builtins.h"
 #include "utils/memutils.h"
 #include "utils/rel.h"
@@ -174,7 +175,7 @@ ReceiveCopyBegin(CopyFromState cstate)
 	int16		format = (cstate->opts.binary ? 1 : 0);
 	int			i;
 
-	pq_beginmessage(&buf, 'G');
+	pq_beginmessage(&buf, PqMsgCopyInResponse);
 	pq_sendbyte(&buf, format);	/* overall format */
 	pq_sendint16(&buf, natts);
 	for (i = 0; i < natts; i++)
@@ -279,13 +280,13 @@ CopyGetData(CopyFromState cstate, void *databuf, int minread, int maxread)
 					/* Validate message type and set packet size limit */
 					switch (mtype)
 					{
-						case 'd':	/* CopyData */
+						case PqMsgCopyDataRequest:
 							maxmsglen = PQ_LARGE_MESSAGE_LIMIT;
 							break;
-						case 'c':	/* CopyDone */
-						case 'f':	/* CopyFail */
-						case 'H':	/* Flush */
-						case 'S':	/* Sync */
+						case PqMsgCopyDoneRequest:
+						case PqMsgCopyFailRequest:
+						case PqMsgFlushDataRequest:
+						case PqMsgSyncDataRequest:
 							maxmsglen = PQ_SMALL_MESSAGE_LIMIT;
 							break;
 						default:
@@ -305,20 +306,20 @@ CopyGetData(CopyFromState cstate, void *databuf, int minread, int maxread)
 					/* ... and process it */
 					switch (mtype)
 					{
-						case 'd':	/* CopyData */
+						case PqMsgCopyDataRequest:
 							break;
-						case 'c':	/* CopyDone */
+						case PqMsgCopyDoneRequest:
 							/* COPY IN correctly terminated by frontend */
 							cstate->raw_reached_eof = true;
 							return bytesread;
-						case 'f':	/* CopyFail */
+						case PqMsgCopyFailRequest:
 							ereport(ERROR,
 									(errcode(ERRCODE_QUERY_CANCELED),
 									 errmsg("COPY from stdin failed: %s",
 											pq_getmsgstring(cstate->fe_msgbuf))));
 							break;
-						case 'H':	/* Flush */
-						case 'S':	/* Sync */
+						case PqMsgFlushDataRequest:
+						case PqMsgSyncDataRequest:
 
 							/*
 							 * Ignore Flush/Sync for the convenience of client
diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c
index 9e4b2437a5..2b832bed1e 100644
--- a/src/backend/commands/copyto.c
+++ b/src/backend/commands/copyto.c
@@ -34,6 +34,7 @@
 #include "miscadmin.h"
 #include "optimizer/optimizer.h"
 #include "pgstat.h"
+#include "protocol.h"
 #include "rewrite/rewriteHandler.h"
 #include "storage/fd.h"
 #include "tcop/tcopprot.h"
@@ -144,7 +145,7 @@ SendCopyBegin(CopyToState cstate)
 	int16		format = (cstate->opts.binary ? 1 : 0);
 	int			i;
 
-	pq_beginmessage(&buf, 'H');
+	pq_beginmessage(&buf, PqMsgCopyOutResponse);
 	pq_sendbyte(&buf, format);	/* overall format */
 	pq_sendint16(&buf, natts);
 	for (i = 0; i < natts; i++)
@@ -159,7 +160,7 @@ SendCopyEnd(CopyToState cstate)
 	/* Shouldn't have any unsent data */
 	Assert(cstate->fe_msgbuf->len == 0);
 	/* Send Copy Done message */
-	pq_putemptymessage('c');
+	pq_putemptymessage(PqMsgCopyDoneRequest);
 }
 
 /*----------
@@ -247,7 +248,7 @@ CopySendEndOfRow(CopyToState cstate)
 				CopySendChar(cstate, '\n');
 
 			/* Dump the accumulated row as one CopyData message */
-			(void) pq_putmessage('d', fe_msgbuf->data, fe_msgbuf->len);
+			(void) pq_putmessage(PqMsgCopyDataRequest, fe_msgbuf->data, fe_msgbuf->len);
 			break;
 		case COPY_CALLBACK:
 			cstate->data_dest_cb(fe_msgbuf->data, fe_msgbuf->len);
diff --git a/src/backend/libpq/auth-sasl.c b/src/backend/libpq/auth-sasl.c
index 684680897b..7327b7316c 100644
--- a/src/backend/libpq/auth-sasl.c
+++ b/src/backend/libpq/auth-sasl.c
@@ -19,6 +19,7 @@
 #include "libpq/libpq.h"
 #include "libpq/pqformat.h"
 #include "libpq/sasl.h"
+#include "protocol.h"
 
 /*
  * Maximum accepted size of SASL messages.
@@ -87,7 +88,7 @@ CheckSASLAuth(const pg_be_sasl_mech *mech, Port *port, char *shadow_pass,
 	{
 		pq_startmsgread();
 		mtype = pq_getbyte();
-		if (mtype != 'p')
+		if (mtype != PqMsgPasswordResponse)
 		{
 			/* Only log error if client didn't disconnect. */
 			if (mtype != EOF)
diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c
index 315a24bb3f..fb572cfe8c 100644
--- a/src/backend/libpq/auth.c
+++ b/src/backend/libpq/auth.c
@@ -34,6 +34,7 @@
 #include "libpq/scram.h"
 #include "miscadmin.h"
 #include "port/pg_bswap.h"
+#include "protocol.h"
 #include "postmaster/postmaster.h"
 #include "replication/walsender.h"
 #include "storage/ipc.h"
@@ -665,7 +666,7 @@ sendAuthRequest(Port *port, AuthRequest areq, const char *extradata, int extrale
 
 	CHECK_FOR_INTERRUPTS();
 
-	pq_beginmessage(&buf, 'R');
+	pq_beginmessage(&buf, PqMsgAuthenticationRequest);
 	pq_sendint32(&buf, (int32) areq);
 	if (extralen > 0)
 		pq_sendbytes(&buf, extradata, extralen);
@@ -698,7 +699,7 @@ recv_password_packet(Port *port)
 
 	/* Expect 'p' message type */
 	mtype = pq_getbyte();
-	if (mtype != 'p')
+	if (mtype != PqMsgPasswordResponse)
 	{
 		/*
 		 * If the client just disconnects without offering a password, don't
@@ -961,7 +962,7 @@ pg_GSS_recvauth(Port *port)
 		CHECK_FOR_INTERRUPTS();
 
 		mtype = pq_getbyte();
-		if (mtype != 'p')
+		if (mtype != PqMsgPasswordResponse)
 		{
 			/* Only log error if client didn't disconnect. */
 			if (mtype != EOF)
@@ -1232,7 +1233,7 @@ pg_SSPI_recvauth(Port *port)
 	{
 		pq_startmsgread();
 		mtype = pq_getbyte();
-		if (mtype != 'p')
+		if (mtype != PqMsgPasswordResponse)
 		{
 			if (sspictx != NULL)
 			{
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 9c8ec779f9..d4c8c40596 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -114,6 +114,7 @@
 #include "postmaster/pgarch.h"
 #include "postmaster/postmaster.h"
 #include "postmaster/syslogger.h"
+#include "protocol.h"
 #include "replication/logicallauncher.h"
 #include "replication/walsender.h"
 #include "storage/fd.h"
@@ -2357,7 +2358,7 @@ SendNegotiateProtocolVersion(List *unrecognized_protocol_options)
 	StringInfoData buf;
 	ListCell   *lc;
 
-	pq_beginmessage(&buf, 'v'); /* NegotiateProtocolVersion */
+	pq_beginmessage(&buf, PqMsgNegotiateProtocolResponse);
 	pq_sendint32(&buf, PG_PROTOCOL_LATEST);
 	pq_sendint32(&buf, list_length(unrecognized_protocol_options));
 	foreach(lc, unrecognized_protocol_options)
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index d27ef2985d..99f357519a 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -69,6 +69,7 @@
 #include "nodes/replnodes.h"
 #include "pgstat.h"
 #include "postmaster/interrupt.h"
+#include "protocol.h"
 #include "replication/decode.h"
 #include "replication/logical.h"
 #include "replication/slot.h"
@@ -603,7 +604,7 @@ SendTimeLineHistory(TimeLineHistoryCmd *cmd)
 	dest->rStartup(dest, CMD_SELECT, tupdesc);
 
 	/* Send a DataRow message */
-	pq_beginmessage(&buf, 'D');
+	pq_beginmessage(&buf, PqMsgDataRowResponse);
 	pq_sendint16(&buf, 2);		/* # of columns */
 	len = strlen(histfname);
 	pq_sendint32(&buf, len);	/* col1 len */
@@ -801,7 +802,7 @@ StartReplication(StartReplicationCmd *cmd)
 		WalSndSetState(WALSNDSTATE_CATCHUP);
 
 		/* Send a CopyBothResponse message, and start streaming */
-		pq_beginmessage(&buf, 'W');
+		pq_beginmessage(&buf, PqMsgCopyBothResponse);
 		pq_sendbyte(&buf, 0);
 		pq_sendint16(&buf, 0);
 		pq_endmessage(&buf);
@@ -1294,7 +1295,7 @@ StartLogicalReplication(StartReplicationCmd *cmd)
 	WalSndSetState(WALSNDSTATE_CATCHUP);
 
 	/* Send a CopyBothResponse message, and start streaming */
-	pq_beginmessage(&buf, 'W');
+	pq_beginmessage(&buf, PqMsgCopyBothResponse);
 	pq_sendbyte(&buf, 0);
 	pq_sendint16(&buf, 0);
 	pq_endmessage(&buf);
@@ -1923,11 +1924,11 @@ ProcessRepliesIfAny(void)
 		/* Validate message type and set packet size limit */
 		switch (firstchar)
 		{
-			case 'd':
+			case PqMsgCopyDataRequest:
 				maxmsglen = PQ_LARGE_MESSAGE_LIMIT;
 				break;
-			case 'c':
-			case 'X':
+			case PqMsgCopyDoneRequest:
+			case PqMsgTerminateRequest:
 				maxmsglen = PQ_SMALL_MESSAGE_LIMIT;
 				break;
 			default:
@@ -1955,7 +1956,7 @@ ProcessRepliesIfAny(void)
 				/*
 				 * 'd' means a standby reply wrapped in a CopyData packet.
 				 */
-			case 'd':
+			case PqMsgCopyDataRequest:
 				ProcessStandbyMessage();
 				received = true;
 				break;
@@ -1964,7 +1965,7 @@ ProcessRepliesIfAny(void)
 				 * CopyDone means the standby requested to finish streaming.
 				 * Reply with CopyDone, if we had not sent that already.
 				 */
-			case 'c':
+			case PqMsgCopyDoneRequest:
 				if (!streamingDoneSending)
 				{
 					pq_putmessage_noblock('c', NULL, 0);
@@ -1978,7 +1979,7 @@ ProcessRepliesIfAny(void)
 				/*
 				 * 'X' means that the standby is closing down the socket.
 				 */
-			case 'X':
+			case PqMsgTerminateRequest:
 				proc_exit(0);
 
 			default:
diff --git a/src/backend/tcop/dest.c b/src/backend/tcop/dest.c
index c0406e2ee5..2f95678b41 100644
--- a/src/backend/tcop/dest.c
+++ b/src/backend/tcop/dest.c
@@ -39,6 +39,7 @@
 #include "executor/tstoreReceiver.h"
 #include "libpq/libpq.h"
 #include "libpq/pqformat.h"
+#include "protocol.h"
 #include "utils/portal.h"
 
 
@@ -176,7 +177,7 @@ EndCommand(const QueryCompletion *qc, CommandDest dest, bool force_undecorated_o
 
 			len = BuildQueryCompletionString(completionTag, qc,
 											 force_undecorated_output);
-			pq_putmessage('C', completionTag, len + 1);
+			pq_putmessage(PqMsgCloseRequest, completionTag, len + 1);
 
 		case DestNone:
 		case DestDebug:
@@ -200,7 +201,7 @@ EndCommand(const QueryCompletion *qc, CommandDest dest, bool force_undecorated_o
 void
 EndReplicationCommand(const char *commandTag)
 {
-	pq_putmessage('C', commandTag, strlen(commandTag) + 1);
+	pq_putmessage(PqMsgCloseRequest, commandTag, strlen(commandTag) + 1);
 }
 
 /* ----------------
@@ -220,7 +221,7 @@ NullCommand(CommandDest dest)
 		case DestRemoteSimple:
 
 			/* Tell the FE that we saw an empty query string */
-			pq_putemptymessage('I');
+			pq_putemptymessage(PqMsgEmptyQueryResponse);
 			break;
 
 		case DestNone:
@@ -258,7 +259,7 @@ ReadyForQuery(CommandDest dest)
 			{
 				StringInfoData buf;
 
-				pq_beginmessage(&buf, 'Z');
+				pq_beginmessage(&buf, PqMsgReadyForQueryResponse);
 				pq_sendbyte(&buf, TransactionBlockStatusCode());
 				pq_endmessage(&buf);
 			}
diff --git a/src/backend/tcop/fastpath.c b/src/backend/tcop/fastpath.c
index 2f70ebd5fa..51d5957b7b 100644
--- a/src/backend/tcop/fastpath.c
+++ b/src/backend/tcop/fastpath.c
@@ -27,6 +27,7 @@
 #include "mb/pg_wchar.h"
 #include "miscadmin.h"
 #include "port/pg_bswap.h"
+#include "protocol.h"
 #include "tcop/fastpath.h"
 #include "tcop/tcopprot.h"
 #include "utils/acl.h"
@@ -69,7 +70,7 @@ SendFunctionResult(Datum retval, bool isnull, Oid rettype, int16 format)
 {
 	StringInfoData buf;
 
-	pq_beginmessage(&buf, 'V');
+	pq_beginmessage(&buf, PqMsgFunctionCallResponse);
 
 	if (isnull)
 	{
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 36cc99ec9c..849e51f4d1 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -55,6 +55,7 @@
 #include "postmaster/autovacuum.h"
 #include "postmaster/interrupt.h"
 #include "postmaster/postmaster.h"
+#include "protocol.h"
 #include "replication/logicallauncher.h"
 #include "replication/logicalworker.h"
 #include "replication/slot.h"
@@ -402,37 +403,37 @@ SocketBackend(StringInfo inBuf)
 	 */
 	switch (qtype)
 	{
-		case 'Q':				/* simple query */
+		case PqMsgSimpleQueryRequest:
 			maxmsglen = PQ_LARGE_MESSAGE_LIMIT;
 			doing_extended_query_message = false;
 			break;
 
-		case 'F':				/* fastpath function call */
+		case PqMsgFunctionCallRequest:
 			maxmsglen = PQ_LARGE_MESSAGE_LIMIT;
 			doing_extended_query_message = false;
 			break;
 
-		case 'X':				/* terminate */
+		case PqMsgTerminateRequest:
 			maxmsglen = PQ_SMALL_MESSAGE_LIMIT;
 			doing_extended_query_message = false;
 			ignore_till_sync = false;
 			break;
 
-		case 'B':				/* bind */
-		case 'P':				/* parse */
+		case PqMsgBindRequest :
+		case PqMsgParseRequest:
 			maxmsglen = PQ_LARGE_MESSAGE_LIMIT;
 			doing_extended_query_message = true;
 			break;
 
-		case 'C':				/* close */
-		case 'D':				/* describe */
-		case 'E':				/* execute */
-		case 'H':				/* flush */
+		case PqMsgCloseRequest:
+		case PqMsgDescribeRequest:
+		case PqMsgExecuteRequest:
+		case PqMsgFlushDataRequest:
 			maxmsglen = PQ_SMALL_MESSAGE_LIMIT;
 			doing_extended_query_message = true;
 			break;
 
-		case 'S':				/* sync */
+		case PqMsgSyncDataRequest:
 			maxmsglen = PQ_SMALL_MESSAGE_LIMIT;
 			/* stop any active skip-till-Sync */
 			ignore_till_sync = false;
@@ -440,13 +441,13 @@ SocketBackend(StringInfo inBuf)
 			doing_extended_query_message = false;
 			break;
 
-		case 'd':				/* copy data */
+		case PqMsgCopyDataRequest:
 			maxmsglen = PQ_LARGE_MESSAGE_LIMIT;
 			doing_extended_query_message = false;
 			break;
 
-		case 'c':				/* copy done */
-		case 'f':				/* copy fail */
+		case PqMsgCopyDoneRequest:
+		case PqMsgCopyFailRequest:
 			maxmsglen = PQ_SMALL_MESSAGE_LIMIT;
 			doing_extended_query_message = false;
 			break;
@@ -1589,7 +1590,7 @@ exec_parse_message(const char *query_string,	/* string to execute */
 	 * Send ParseComplete.
 	 */
 	if (whereToSendOutput == DestRemote)
-		pq_putemptymessage('1');
+		pq_putemptymessage(PqMsgParseCompleteResponse);
 
 	/*
 	 * Emit duration logging if appropriate.
@@ -2047,7 +2048,7 @@ exec_bind_message(StringInfo input_message)
 	 * Send BindComplete.
 	 */
 	if (whereToSendOutput == DestRemote)
-		pq_putemptymessage('2');
+		pq_putemptymessage(PqMsgBindCompleteResponse);
 
 	/*
 	 * Emit duration logging if appropriate.
@@ -2290,7 +2291,7 @@ exec_execute_message(const char *portal_name, long max_rows)
 	{
 		/* Portal run not complete, so send PortalSuspended */
 		if (whereToSendOutput == DestRemote)
-			pq_putemptymessage('s');
+			pq_putemptymessage(PqMsgPortalSuspendedResponse);
 
 		/*
 		 * Set XACT_FLAGS_PIPELINING whenever we suspend an Execute message,
@@ -2683,7 +2684,7 @@ exec_describe_statement_message(const char *stmt_name)
 								  NULL);
 	}
 	else
-		pq_putemptymessage('n');	/* NoData */
+		pq_putemptymessage(PqMsgNoDataResponse);
 }
 
 /*
@@ -2736,7 +2737,7 @@ exec_describe_portal_message(const char *portal_name)
 								  FetchPortalTargetList(portal),
 								  portal->formats);
 	else
-		pq_putemptymessage('n');	/* NoData */
+		pq_putemptymessage(PqMsgNoDataResponse);
 }
 
 
@@ -4239,7 +4240,7 @@ PostgresMain(const char *dbname, const char *username)
 	{
 		StringInfoData buf;
 
-		pq_beginmessage(&buf, 'K');
+		pq_beginmessage(&buf, PqMsgBackendKeyDataRequest);
 		pq_sendint32(&buf, (int32) MyProcPid);
 		pq_sendint32(&buf, (int32) MyCancelKey);
 		pq_endmessage(&buf);
@@ -4618,7 +4619,7 @@ PostgresMain(const char *dbname, const char *username)
 
 		switch (firstchar)
 		{
-			case 'Q':			/* simple query */
+			case PqMsgSimpleQueryRequest:
 				{
 					const char *query_string;
 
@@ -4642,7 +4643,7 @@ PostgresMain(const char *dbname, const char *username)
 				}
 				break;
 
-			case 'P':			/* parse */
+			case PqMsgParseRequest:
 				{
 					const char *stmt_name;
 					const char *query_string;
@@ -4672,7 +4673,7 @@ PostgresMain(const char *dbname, const char *username)
 				}
 				break;
 
-			case 'B':			/* bind */
+			case PqMsgBindRequest:
 				forbidden_in_wal_sender(firstchar);
 
 				/* Set statement_timestamp() */
@@ -4687,7 +4688,7 @@ PostgresMain(const char *dbname, const char *username)
 				/* exec_bind_message does valgrind_report_error_query */
 				break;
 
-			case 'E':			/* execute */
+			case PqMsgExecuteRequest:
 				{
 					const char *portal_name;
 					int			max_rows;
@@ -4707,7 +4708,7 @@ PostgresMain(const char *dbname, const char *username)
 				}
 				break;
 
-			case 'F':			/* fastpath function call */
+			case PqMsgFunctionCallRequest:
 				forbidden_in_wal_sender(firstchar);
 
 				/* Set statement_timestamp() */
@@ -4742,7 +4743,7 @@ PostgresMain(const char *dbname, const char *username)
 				send_ready_for_query = true;
 				break;
 
-			case 'C':			/* close */
+			case PqMsgCloseRequest:
 				{
 					int			close_type;
 					const char *close_target;
@@ -4755,7 +4756,7 @@ PostgresMain(const char *dbname, const char *username)
 
 					switch (close_type)
 					{
-						case 'S':
+						case PqMsgPreparedSubCommand:
 							if (close_target[0] != '\0')
 								DropPreparedStatement(close_target, false);
 							else
@@ -4764,7 +4765,7 @@ PostgresMain(const char *dbname, const char *username)
 								drop_unnamed_stmt();
 							}
 							break;
-						case 'P':
+						case PqMsgPortalSubCommand:
 							{
 								Portal		portal;
 
@@ -4782,13 +4783,13 @@ PostgresMain(const char *dbname, const char *username)
 					}
 
 					if (whereToSendOutput == DestRemote)
-						pq_putemptymessage('3');	/* CloseComplete */
+						pq_putemptymessage(PqMsgCloseCompleteResponse);
 
 					valgrind_report_error_query("CLOSE message");
 				}
 				break;
 
-			case 'D':			/* describe */
+			case PqMsgDescribeRequest:
 				{
 					int			describe_type;
 					const char *describe_target;
@@ -4804,10 +4805,10 @@ PostgresMain(const char *dbname, const char *username)
 
 					switch (describe_type)
 					{
-						case 'S':
+						case PqMsgPreparedSubCommand:
 							exec_describe_statement_message(describe_target);
 							break;
-						case 'P':
+						case PqMsgPortalSubCommand:
 							exec_describe_portal_message(describe_target);
 							break;
 						default:
@@ -4822,13 +4823,13 @@ PostgresMain(const char *dbname, const char *username)
 				}
 				break;
 
-			case 'H':			/* flush */
+			case PqMsgFlushDataRequest:
 				pq_getmsgend(&input_message);
 				if (whereToSendOutput == DestRemote)
 					pq_flush();
 				break;
 
-			case 'S':			/* sync */
+			case PqMsgSyncDataRequest:
 				pq_getmsgend(&input_message);
 				finish_xact_command();
 				valgrind_report_error_query("SYNC message");
@@ -4847,7 +4848,7 @@ PostgresMain(const char *dbname, const char *username)
 
 				/* FALLTHROUGH */
 
-			case 'X':
+			case PqMsgTerminateRequest:
 
 				/*
 				 * Reset whereToSendOutput to prevent ereport from attempting
@@ -4865,9 +4866,9 @@ PostgresMain(const char *dbname, const char *username)
 				 */
 				proc_exit(0);
 
-			case 'd':			/* copy data */
-			case 'c':			/* copy done */
-			case 'f':			/* copy fail */
+			case PqMsgCopyDataRequest:
+			case PqMsgCopyDoneRequest:
+			case PqMsgCopyFailRequest:
 
 				/*
 				 * Accept but ignore these messages, per protocol spec; we
@@ -4897,7 +4898,7 @@ forbidden_in_wal_sender(char firstchar)
 {
 	if (am_walsender)
 	{
-		if (firstchar == 'F')
+		if (firstchar == PqMsgFunctionCallRequest)
 			ereport(ERROR,
 					(errcode(ERRCODE_PROTOCOL_VIOLATION),
 					 errmsg("fastpath function calls not supported in a replication connection")));
diff --git a/src/backend/utils/activity/backend_progress.c b/src/backend/utils/activity/backend_progress.c
index 67447ef03a..1059677857 100644
--- a/src/backend/utils/activity/backend_progress.c
+++ b/src/backend/utils/activity/backend_progress.c
@@ -10,6 +10,7 @@
  */
 #include "postgres.h"
 
+#include "protocol.h"
 #include "access/parallel.h"
 #include "libpq/pqformat.h"
 #include "port/atomics.h"		/* for memory barriers */
@@ -102,7 +103,7 @@ pgstat_progress_parallel_incr_param(int index, int64 incr)
 
 		initStringInfo(&progress_message);
 
-		pq_beginmessage(&progress_message, 'P');
+		pq_beginmessage(&progress_message, PqMsgParallelProgressResponse);
 		pq_sendint32(&progress_message, index);
 		pq_sendint64(&progress_message, incr);
 		pq_endmessage(&progress_message);
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 5898100acb..7c1dc4e69b 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -77,6 +77,7 @@
 #include "postmaster/bgworker.h"
 #include "postmaster/postmaster.h"
 #include "postmaster/syslogger.h"
+#include "protocol.h"
 #include "storage/ipc.h"
 #include "storage/proc.h"
 #include "tcop/tcopprot.h"
@@ -3465,7 +3466,7 @@ send_message_to_frontend(ErrorData *edata)
 		char		tbuf[12];
 
 		/* 'N' (Notice) is for nonfatal conditions, 'E' is for errors */
-		pq_beginmessage(&msgbuf, (edata->elevel < ERROR) ? 'N' : 'E');
+		pq_beginmessage(&msgbuf, (edata->elevel < ERROR) ? PqMsgNoticeResponse : PqMsgErrorResponse);
 
 		sev = error_severity(edata->elevel);
 		pq_sendbyte(&msgbuf, PG_DIAG_SEVERITY);
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 5308896c87..55b9b8bbed 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -37,6 +37,7 @@
 #include "libpq/pqformat.h"
 #include "parser/scansup.h"
 #include "port/pg_bitutils.h"
+#include "protocol.h"
 #include "storage/fd.h"
 #include "storage/lwlock.h"
 #include "storage/shmem.h"
@@ -2593,7 +2594,7 @@ ReportGUCOption(struct config_generic *record)
 	{
 		StringInfoData msgbuf;
 
-		pq_beginmessage(&msgbuf, 'S');
+		pq_beginmessage(&msgbuf, PqMsgParameterStatusResponse);
 		pq_sendstring(&msgbuf, record->name);
 		pq_sendstring(&msgbuf, val);
 		pq_endmessage(&msgbuf);
diff --git a/src/include/protocol.h b/src/include/protocol.h
new file mode 100644
index 0000000000..b26f6a04f3
--- /dev/null
+++ b/src/include/protocol.h
@@ -0,0 +1,60 @@
+/*-------------------------------------------------------------------------
+ *
+ * protocol.h
+ *	  Exports from postmaster/postmaster.c.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * src/include/protocol.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _PROTOCOL_H
+#define _PROTOCOL_H
+
+#define PqMsgBindRequest            'B'
+#define PqMsgCloseRequest           'C'
+#define PqMsgDescribeRequest        'D'
+#define PqMsgExecuteRequest         'E'
+#define PqMsgFunctionCallRequest    'F'
+#define PqMsgFlushDataRequest       'H'
+#define PqMsgBackendKeyDataRequest  'K'
+#define PqMsgParseRequest           'P'
+#define PqMsgAuthenticationRequest  'R'
+#define PqMsgSyncDataRequest        'S'
+#define PqMsgSimpleQueryRequest     'Q'
+#define PqMsgTerminateRequest       'X'
+#define PqMsgCopyFailRequest        'f'
+#define PqMsgCopyDoneRequest        'c'
+#define PqMsgCopyDataRequest        'd'
+#define PqMsgCopyProgressRequest    'p'
+#define PqMsgPreparedSubCommand     'S'
+#define PqMsgPortalSubCommand       'P'
+
+
+/*
+Responses
+*/
+#define PqMsgParseCompleteResponse    '1'
+#define PqMsgBindCompleteResponse     '2'
+#define PqMsgCloseCompleteResponse    '3'
+#define PqMsgNotifyResponse           'A'
+#define PqMsgCommandCompleteResponse  'C'
+#define PqMsgDataRowResponse          'D'
+#define PqMsgErrorResponse            'E'
+#define PqMsgCopyInResponse           'G'
+#define PqMsgCopyOutResponse          'H'
+#define PqMsgEmptyQueryResponse       'I'
+#define PqMsgNoticeResponse           'N'
+#define PqMsgParallelProgressResponse 'P'
+#define PqMsgFunctionCallResponse     'V'
+#define PqMsgParameterStatusResponse  'S'
+#define PqMsgRowDescriptionResponse   'T'
+#define PqMsgCopyBothResponse         'W'
+#define PqMsgReadyForQueryResponse    'Z'
+#define PqMsgNoDataResponse           'n'
+#define PqMsgPasswordResponse         'p'
+#define PqMsgPortalSuspendedResponse  's'
+#define PqMsgParameterDescriptionResponse 't'
+#define PqMsgNegotiateProtocolResponse    'v'
+#endif
\ No newline at end of file
diff --git a/src/interfaces/libpq/fe-auth.c b/src/interfaces/libpq/fe-auth.c
index 887ca5e9e1..0ee48112cb 100644
--- a/src/interfaces/libpq/fe-auth.c
+++ b/src/interfaces/libpq/fe-auth.c
@@ -43,6 +43,7 @@
 #include "fe-auth.h"
 #include "fe-auth-sasl.h"
 #include "libpq-fe.h"
+#include "protocol.h"
 
 #ifdef ENABLE_GSS
 /*
@@ -586,7 +587,7 @@ pg_SASL_init(PGconn *conn, int payloadlen)
 	/*
 	 * Build a SASLInitialResponse message, and send it.
 	 */
-	if (pqPutMsgStart('p', conn))
+	if (pqPutMsgStart(PqMsgPasswordResponse, conn))
 		goto error;
 	if (pqPuts(selected_mechanism, conn))
 		goto error;
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 837c5321aa..b2a90adea4 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -32,6 +32,7 @@
 #include "mb/pg_wchar.h"
 #include "pg_config_paths.h"
 #include "port/pg_bswap.h"
+#include "protocol.h"
 
 #ifdef WIN32
 #include "win32.h"
@@ -3591,7 +3592,7 @@ keep_going:						/* We will come back to here until there is
 				 * Anything else probably means it's not Postgres on the other
 				 * end at all.
 				 */
-				if (!(beresp == 'R' || beresp == 'v' || beresp == 'E'))
+				if (!(beresp == PqMsgAuthenticationRequest || beresp == PqMsgNegotiateProtocolResponse || beresp == PqMsgErrorResponse))
 				{
 					libpq_append_conn_error(conn, "expected authentication request from server, but received %c",
 											beresp);
@@ -3618,19 +3619,19 @@ keep_going:						/* We will come back to here until there is
 				 * version 14, the server also used the old protocol for
 				 * errors that happened before processing the startup packet.)
 				 */
-				if (beresp == 'R' && (msgLength < 8 || msgLength > 2000))
+				if (beresp == PqMsgAuthenticationRequest && (msgLength < 8 || msgLength > 2000))
 				{
 					libpq_append_conn_error(conn, "received invalid authentication request");
 					goto error_return;
 				}
-				if (beresp == 'v' && (msgLength < 8 || msgLength > 2000))
+				if (beresp == PqMsgNegotiateProtocolResponse && (msgLength < 8 || msgLength > 2000))
 				{
 					libpq_append_conn_error(conn, "received invalid protocol negotiation message");
 					goto error_return;
 				}
 
 #define MAX_ERRLEN 30000
-				if (beresp == 'E' && (msgLength < 8 || msgLength > MAX_ERRLEN))
+				if (beresp == PqMsgErrorResponse && (msgLength < 8 || msgLength > MAX_ERRLEN))
 				{
 					/* Handle error from a pre-3.0 server */
 					conn->inCursor = conn->inStart + 1; /* reread data */
@@ -3693,7 +3694,7 @@ keep_going:						/* We will come back to here until there is
 				}
 
 				/* Handle errors. */
-				if (beresp == 'E')
+				if (beresp == PqMsgErrorResponse)
 				{
 					if (pqGetErrorNotice3(conn, true))
 					{
@@ -3770,7 +3771,7 @@ keep_going:						/* We will come back to here until there is
 
 					goto error_return;
 				}
-				else if (beresp == 'v')
+				else if (beresp == PqMsgNegotiateProtocolResponse)
 				{
 					if (pqGetNegotiateProtocolVersion3(conn))
 					{
@@ -4540,7 +4541,7 @@ sendTerminateConn(PGconn *conn)
 		 * Try to send "close connection" message to backend. Ignore any
 		 * error.
 		 */
-		pqPutMsgStart('X', conn);
+		pqPutMsgStart(PqMsgTerminateRequest, conn);
 		pqPutMsgEnd(conn);
 		(void) pqFlush(conn);
 	}
diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c
index a868284ff8..67ed8e3682 100644
--- a/src/interfaces/libpq/fe-exec.c
+++ b/src/interfaces/libpq/fe-exec.c
@@ -27,6 +27,7 @@
 #include "libpq-fe.h"
 #include "libpq-int.h"
 #include "mb/pg_wchar.h"
+#include "protocol.h"
 
 /* keep this in same order as ExecStatusType in libpq-fe.h */
 char	   *const pgresStatus[] = {
@@ -1458,7 +1459,7 @@ PQsendQueryInternal(PGconn *conn, const char *query, bool newQuery)
 
 	/* Send the query message(s) */
 	/* construct the outgoing Query message */
-	if (pqPutMsgStart('Q', conn) < 0 ||
+	if (pqPutMsgStart(PqMsgSimpleQueryRequest, conn) < 0 ||
 		pqPuts(query, conn) < 0 ||
 		pqPutMsgEnd(conn) < 0)
 	{
@@ -1571,7 +1572,7 @@ PQsendPrepare(PGconn *conn,
 		return 0;				/* error msg already set */
 
 	/* construct the Parse message */
-	if (pqPutMsgStart('P', conn) < 0 ||
+	if (pqPutMsgStart(PqMsgParseRequest, conn) < 0 ||
 		pqPuts(stmtName, conn) < 0 ||
 		pqPuts(query, conn) < 0)
 		goto sendFailed;
@@ -1599,7 +1600,7 @@ PQsendPrepare(PGconn *conn,
 	/* Add a Sync, unless in pipeline mode. */
 	if (conn->pipelineStatus == PQ_PIPELINE_OFF)
 	{
-		if (pqPutMsgStart('S', conn) < 0 ||
+		if (pqPutMsgStart(PqMsgSyncDataRequest, conn) < 0 ||
 			pqPutMsgEnd(conn) < 0)
 			goto sendFailed;
 	}
@@ -1784,7 +1785,7 @@ PQsendQueryGuts(PGconn *conn,
 	if (command)
 	{
 		/* construct the Parse message */
-		if (pqPutMsgStart('P', conn) < 0 ||
+		if (pqPutMsgStart(PqMsgParseRequest, conn) < 0 ||
 			pqPuts(stmtName, conn) < 0 ||
 			pqPuts(command, conn) < 0)
 			goto sendFailed;
@@ -1808,7 +1809,7 @@ PQsendQueryGuts(PGconn *conn,
 	}
 
 	/* Construct the Bind message */
-	if (pqPutMsgStart('B', conn) < 0 ||
+	if (pqPutMsgStart(PqMsgBindRequest, conn) < 0 ||
 		pqPuts("", conn) < 0 ||
 		pqPuts(stmtName, conn) < 0)
 		goto sendFailed;
@@ -1874,14 +1875,14 @@ PQsendQueryGuts(PGconn *conn,
 		goto sendFailed;
 
 	/* construct the Describe Portal message */
-	if (pqPutMsgStart('D', conn) < 0 ||
-		pqPutc('P', conn) < 0 ||
+	if (pqPutMsgStart(PqMsgDescribeRequest, conn) < 0 ||
+		pqPutc(PqMsgPortalSubCommand, conn) < 0 ||
 		pqPuts("", conn) < 0 ||
 		pqPutMsgEnd(conn) < 0)
 		goto sendFailed;
 
 	/* construct the Execute message */
-	if (pqPutMsgStart('E', conn) < 0 ||
+	if (pqPutMsgStart(PqMsgExecuteRequest, conn) < 0 ||
 		pqPuts("", conn) < 0 ||
 		pqPutInt(0, 4, conn) < 0 ||
 		pqPutMsgEnd(conn) < 0)
@@ -1890,7 +1891,7 @@ PQsendQueryGuts(PGconn *conn,
 	/* construct the Sync message if not in pipeline mode */
 	if (conn->pipelineStatus == PQ_PIPELINE_OFF)
 	{
-		if (pqPutMsgStart('S', conn) < 0 ||
+		if (pqPutMsgStart(PqMsgSyncDataRequest, conn) < 0 ||
 			pqPutMsgEnd(conn) < 0)
 			goto sendFailed;
 	}
@@ -2422,7 +2423,7 @@ PQdescribePrepared(PGconn *conn, const char *stmt)
 {
 	if (!PQexecStart(conn))
 		return NULL;
-	if (!PQsendTypedCommand(conn, 'D', 'S', stmt))
+	if (!PQsendTypedCommand(conn, PqMsgDescribeRequest, PqMsgPreparedSubCommand, stmt))
 		return NULL;
 	return PQexecFinish(conn);
 }
@@ -2441,7 +2442,7 @@ PQdescribePortal(PGconn *conn, const char *portal)
 {
 	if (!PQexecStart(conn))
 		return NULL;
-	if (!PQsendTypedCommand(conn, 'D', 'P', portal))
+	if (!PQsendTypedCommand(conn, PqMsgDescribeRequest, PqMsgPortalSubCommand, portal))
 		return NULL;
 	return PQexecFinish(conn);
 }
@@ -2456,7 +2457,7 @@ PQdescribePortal(PGconn *conn, const char *portal)
 int
 PQsendDescribePrepared(PGconn *conn, const char *stmt)
 {
-	return PQsendTypedCommand(conn, 'D', 'S', stmt);
+	return PQsendTypedCommand(conn, PqMsgDescribeRequest, PqMsgPreparedSubCommand, stmt);
 }
 
 /*
@@ -2469,7 +2470,7 @@ PQsendDescribePrepared(PGconn *conn, const char *stmt)
 int
 PQsendDescribePortal(PGconn *conn, const char *portal)
 {
-	return PQsendTypedCommand(conn, 'D', 'P', portal);
+	return PQsendTypedCommand(conn, PqMsgDescribeRequest, PqMsgPortalSubCommand, portal);
 }
 
 /*
@@ -2488,7 +2489,7 @@ PQclosePrepared(PGconn *conn, const char *stmt)
 {
 	if (!PQexecStart(conn))
 		return NULL;
-	if (!PQsendTypedCommand(conn, 'C', 'S', stmt))
+	if (!PQsendTypedCommand(conn, PqMsgCloseRequest, PqMsgPreparedSubCommand, stmt))
 		return NULL;
 	return PQexecFinish(conn);
 }
@@ -2506,7 +2507,7 @@ PQclosePortal(PGconn *conn, const char *portal)
 {
 	if (!PQexecStart(conn))
 		return NULL;
-	if (!PQsendTypedCommand(conn, 'C', 'P', portal))
+	if (!PQsendTypedCommand(conn, PqMsgCloseRequest, PqMsgPortalSubCommand, portal))
 		return NULL;
 	return PQexecFinish(conn);
 }
@@ -2521,7 +2522,7 @@ PQclosePortal(PGconn *conn, const char *portal)
 int
 PQsendClosePrepared(PGconn *conn, const char *stmt)
 {
-	return PQsendTypedCommand(conn, 'C', 'S', stmt);
+	return PQsendTypedCommand(conn, PqMsgCloseRequest, PqMsgPreparedSubCommand, stmt);
 }
 
 /*
@@ -2534,7 +2535,7 @@ PQsendClosePrepared(PGconn *conn, const char *stmt)
 int
 PQsendClosePortal(PGconn *conn, const char *portal)
 {
-	return PQsendTypedCommand(conn, 'C', 'P', portal);
+	return PQsendTypedCommand(conn, PqMsgCloseRequest, PqMsgPortalSubCommand, portal);
 }
 
 /*
@@ -2577,17 +2578,17 @@ PQsendTypedCommand(PGconn *conn, char command, char type, const char *target)
 	/* construct the Sync message */
 	if (conn->pipelineStatus == PQ_PIPELINE_OFF)
 	{
-		if (pqPutMsgStart('S', conn) < 0 ||
+		if (pqPutMsgStart(PqMsgSyncDataRequest, conn) < 0 ||
 			pqPutMsgEnd(conn) < 0)
 			goto sendFailed;
 	}
 
 	/* remember if we are doing a Close or a Describe */
-	if (command == 'C')
+	if (command == PqMsgCloseRequest)
 	{
 		entry->queryclass = PGQUERY_CLOSE;
 	}
-	else if (command == 'D')
+	else if (command == PqMsgDescribeRequest)
 	{
 		entry->queryclass = PGQUERY_DESCRIBE;
 	}
@@ -2696,7 +2697,7 @@ PQputCopyData(PGconn *conn, const char *buffer, int nbytes)
 				return pqIsnonblocking(conn) ? 0 : -1;
 		}
 		/* Send the data (too simple to delegate to fe-protocol files) */
-		if (pqPutMsgStart('d', conn) < 0 ||
+		if (pqPutMsgStart(PqMsgCopyDataRequest, conn) < 0 ||
 			pqPutnchar(buffer, nbytes, conn) < 0 ||
 			pqPutMsgEnd(conn) < 0)
 			return -1;
@@ -2731,7 +2732,7 @@ PQputCopyEnd(PGconn *conn, const char *errormsg)
 	if (errormsg)
 	{
 		/* Send COPY FAIL */
-		if (pqPutMsgStart('f', conn) < 0 ||
+		if (pqPutMsgStart(PqMsgCopyFailRequest, conn) < 0 ||
 			pqPuts(errormsg, conn) < 0 ||
 			pqPutMsgEnd(conn) < 0)
 			return -1;
@@ -2739,7 +2740,7 @@ PQputCopyEnd(PGconn *conn, const char *errormsg)
 	else
 	{
 		/* Send COPY DONE */
-		if (pqPutMsgStart('c', conn) < 0 ||
+		if (pqPutMsgStart(PqMsgCopyDoneRequest, conn) < 0 ||
 			pqPutMsgEnd(conn) < 0)
 			return -1;
 	}
@@ -2751,7 +2752,7 @@ PQputCopyEnd(PGconn *conn, const char *errormsg)
 	if (conn->cmd_queue_head &&
 		conn->cmd_queue_head->queryclass != PGQUERY_SIMPLE)
 	{
-		if (pqPutMsgStart('S', conn) < 0 ||
+		if (pqPutMsgStart(PqMsgSyncDataRequest, conn) < 0 ||
 			pqPutMsgEnd(conn) < 0)
 			return -1;
 	}
@@ -3263,7 +3264,7 @@ PQpipelineSync(PGconn *conn)
 	entry->query = NULL;
 
 	/* construct the Sync message */
-	if (pqPutMsgStart('S', conn) < 0 ||
+	if (pqPutMsgStart(PqMsgSyncDataRequest, conn) < 0 ||
 		pqPutMsgEnd(conn) < 0)
 		goto sendFailed;
 
@@ -3311,7 +3312,7 @@ PQsendFlushRequest(PGconn *conn)
 		return 0;
 	}
 
-	if (pqPutMsgStart('H', conn) < 0 ||
+	if (pqPutMsgStart(PqMsgFlushDataRequest, conn) < 0 ||
 		pqPutMsgEnd(conn) < 0)
 	{
 		return 0;
diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c
index 7bc6355d17..c7c1b079ac 100644
--- a/src/interfaces/libpq/fe-protocol3.c
+++ b/src/interfaces/libpq/fe-protocol3.c
@@ -28,14 +28,16 @@
 #include "libpq-int.h"
 #include "mb/pg_wchar.h"
 #include "port/pg_bswap.h"
+#include "protocol.h"
 
 /*
  * This macro lists the backend message types that could be "long" (more
  * than a couple of kilobytes).
  */
 #define VALID_LONG_MESSAGE_TYPE(id) \
-	((id) == 'T' || (id) == 'D' || (id) == 'd' || (id) == 'V' || \
-	 (id) == 'E' || (id) == 'N' || (id) == 'A')
+	((id) == PqMsgRowDescriptionResponse || (id) == PqMsgDataRowResponse || (id) == PqMsgCopyDataRequest || \
+	 (id) == PqMsgFunctionCallResponse ||  (id) == PqMsgErrorResponse || (id) == PqMsgNoticeResponse || \
+	 (id) == PqMsgNotifyResponse)
 
 
 static void handleSyncLoss(PGconn *conn, char id, int msgLength);
@@ -140,12 +142,12 @@ pqParseInput3(PGconn *conn)
 		 * from config file due to SIGHUP), but otherwise we hold off until
 		 * BUSY state.
 		 */
-		if (id == 'A')
+		if (id == PqMsgNotifyResponse)
 		{
 			if (getNotify(conn))
 				return;
 		}
-		else if (id == 'N')
+		else if (id == PqMsgNoticeResponse)
 		{
 			if (pqGetErrorNotice3(conn, false))
 				return;
@@ -165,12 +167,12 @@ pqParseInput3(PGconn *conn)
 			 * it is about to close the connection, so we don't want to just
 			 * discard it...)
 			 */
-			if (id == 'E')
+			if (id == PqMsgErrorResponse)
 			{
 				if (pqGetErrorNotice3(conn, false /* treat as notice */ ))
 					return;
 			}
-			else if (id == 'S')
+			else if (id == PqMsgParameterStatusResponse)
 			{
 				if (getParameterStatus(conn))
 					return;
@@ -192,7 +194,7 @@ pqParseInput3(PGconn *conn)
 			 */
 			switch (id)
 			{
-				case 'C':		/* command complete */
+				case PqMsgCommandCompleteResponse:
 					if (pqGets(&conn->workBuffer, conn))
 						return;
 					if (!pgHavePendingResult(conn))
@@ -210,12 +212,12 @@ pqParseInput3(PGconn *conn)
 								CMDSTATUS_LEN);
 					conn->asyncStatus = PGASYNC_READY;
 					break;
-				case 'E':		/* error return */
+				case PqMsgErrorResponse:
 					if (pqGetErrorNotice3(conn, true))
 						return;
 					conn->asyncStatus = PGASYNC_READY;
 					break;
-				case 'Z':		/* sync response, backend is ready for new
+				case PqMsgReadyForQueryResponse:		/* sync response, backend is ready for new
 								 * query */
 					if (getReadyForQuery(conn))
 						return;
@@ -246,7 +248,7 @@ pqParseInput3(PGconn *conn)
 						conn->asyncStatus = PGASYNC_IDLE;
 					}
 					break;
-				case 'I':		/* empty query */
+				case PqMsgEmptyQueryResponse:
 					if (!pgHavePendingResult(conn))
 					{
 						conn->result = PQmakeEmptyPGresult(conn,
@@ -259,7 +261,7 @@ pqParseInput3(PGconn *conn)
 					}
 					conn->asyncStatus = PGASYNC_READY;
 					break;
-				case '1':		/* Parse Complete */
+				case PqMsgParseCompleteResponse:
 					/* If we're doing PQprepare, we're done; else ignore */
 					if (conn->cmd_queue_head &&
 						conn->cmd_queue_head->queryclass == PGQUERY_PREPARE)
@@ -277,10 +279,10 @@ pqParseInput3(PGconn *conn)
 						conn->asyncStatus = PGASYNC_READY;
 					}
 					break;
-				case '2':		/* Bind Complete */
+				case PqMsgBindCompleteResponse:
 					/* Nothing to do for this message type */
 					break;
-				case '3':		/* Close Complete */
+				case PqMsgCloseCompleteResponse:
 					/* If we're doing PQsendClose, we're done; else ignore */
 					if (conn->cmd_queue_head &&
 						conn->cmd_queue_head->queryclass == PGQUERY_CLOSE)
@@ -298,11 +300,11 @@ pqParseInput3(PGconn *conn)
 						conn->asyncStatus = PGASYNC_READY;
 					}
 					break;
-				case 'S':		/* parameter status */
+				case PqMsgParameterStatusResponse:
 					if (getParameterStatus(conn))
 						return;
 					break;
-				case 'K':		/* secret key data from the backend */
+				case PqMsgBackendKeyDataRequest:		/* secret key data from the backend */
 
 					/*
 					 * This is expected only during backend startup, but it's
@@ -314,7 +316,7 @@ pqParseInput3(PGconn *conn)
 					if (pqGetInt(&(conn->be_key), 4, conn))
 						return;
 					break;
-				case 'T':		/* Row Description */
+				case PqMsgRowDescriptionResponse:
 					if (conn->error_result ||
 						(conn->result != NULL &&
 						 conn->result->resultStatus == PGRES_FATAL_ERROR))
@@ -346,7 +348,7 @@ pqParseInput3(PGconn *conn)
 						return;
 					}
 					break;
-				case 'n':		/* No Data */
+				case PqMsgNoDataResponse:
 
 					/*
 					 * NoData indicates that we will not be seeing a
@@ -374,11 +376,11 @@ pqParseInput3(PGconn *conn)
 						conn->asyncStatus = PGASYNC_READY;
 					}
 					break;
-				case 't':		/* Parameter Description */
+				case PqMsgParameterDescriptionResponse:
 					if (getParamDescriptions(conn, msgLength))
 						return;
 					break;
-				case 'D':		/* Data Row */
+				case PqMsgDataRowResponse:
 					if (conn->result != NULL &&
 						conn->result->resultStatus == PGRES_TUPLES_OK)
 					{
@@ -405,24 +407,24 @@ pqParseInput3(PGconn *conn)
 						conn->inCursor += msgLength;
 					}
 					break;
-				case 'G':		/* Start Copy In */
+				case PqMsgCopyInResponse:
 					if (getCopyStart(conn, PGRES_COPY_IN))
 						return;
 					conn->asyncStatus = PGASYNC_COPY_IN;
 					break;
-				case 'H':		/* Start Copy Out */
+				case PqMsgCopyOutResponse:
 					if (getCopyStart(conn, PGRES_COPY_OUT))
 						return;
 					conn->asyncStatus = PGASYNC_COPY_OUT;
 					conn->copy_already_done = 0;
 					break;
-				case 'W':		/* Start Copy Both */
+				case PqMsgCopyBothResponse:
 					if (getCopyStart(conn, PGRES_COPY_BOTH))
 						return;
 					conn->asyncStatus = PGASYNC_COPY_BOTH;
 					conn->copy_already_done = 0;
 					break;
-				case 'd':		/* Copy Data */
+				case PqMsgCopyDataRequest:
 
 					/*
 					 * If we see Copy Data, just silently drop it.  This would
@@ -431,7 +433,7 @@ pqParseInput3(PGconn *conn)
 					 */
 					conn->inCursor += msgLength;
 					break;
-				case 'c':		/* Copy Done */
+				case PqMsgCopyDoneRequest:
 
 					/*
 					 * If we see Copy Done, just silently drop it.  This is
@@ -1692,21 +1694,21 @@ getCopyDataMessage(PGconn *conn)
 		 */
 		switch (id)
 		{
-			case 'A':			/* NOTIFY */
+			case PqMsgNotifyResponse:
 				if (getNotify(conn))
 					return 0;
 				break;
-			case 'N':			/* NOTICE */
+			case PqMsgNoticeResponse:
 				if (pqGetErrorNotice3(conn, false))
 					return 0;
 				break;
-			case 'S':			/* ParameterStatus */
+			case PqMsgParameterStatusResponse:
 				if (getParameterStatus(conn))
 					return 0;
 				break;
-			case 'd':			/* Copy Data, pass it back to caller */
+			case PqMsgCopyDataRequest:			/* Copy Data, pass it back to caller */
 				return msgLength;
-			case 'c':
+			case PqMsgCopyDoneRequest:
 
 				/*
 				 * If this is a CopyDone message, exit COPY_OUT mode and let
@@ -1929,7 +1931,7 @@ pqEndcopy3(PGconn *conn)
 	if (conn->asyncStatus == PGASYNC_COPY_IN ||
 		conn->asyncStatus == PGASYNC_COPY_BOTH)
 	{
-		if (pqPutMsgStart('c', conn) < 0 ||
+		if (pqPutMsgStart(PqMsgCopyDoneRequest, conn) < 0 ||
 			pqPutMsgEnd(conn) < 0)
 			return 1;
 
@@ -1940,7 +1942,7 @@ pqEndcopy3(PGconn *conn)
 		if (conn->cmd_queue_head &&
 			conn->cmd_queue_head->queryclass != PGQUERY_SIMPLE)
 		{
-			if (pqPutMsgStart('S', conn) < 0 ||
+			if (pqPutMsgStart(PqMsgSyncDataRequest, conn) < 0 ||
 				pqPutMsgEnd(conn) < 0)
 				return 1;
 		}
@@ -2023,7 +2025,7 @@ pqFunctionCall3(PGconn *conn, Oid fnid,
 
 	/* PQfn already validated connection state */
 
-	if (pqPutMsgStart('F', conn) < 0 || /* function call msg */
+	if (pqPutMsgStart(PqMsgFunctionCallRequest, conn) < 0 || /* function call msg */
 		pqPutInt(fnid, 4, conn) < 0 ||	/* function id */
 		pqPutInt(1, 2, conn) < 0 || /* # of format codes */
 		pqPutInt(1, 2, conn) < 0 || /* format code: BINARY */
diff --git a/src/interfaces/libpq/fe-trace.c b/src/interfaces/libpq/fe-trace.c
index 402784f40e..8414418a5c 100644
--- a/src/interfaces/libpq/fe-trace.c
+++ b/src/interfaces/libpq/fe-trace.c
@@ -28,6 +28,7 @@
 #include "libpq-fe.h"
 #include "libpq-int.h"
 #include "port/pg_bswap.h"
+#include "protocol.h"
 
 
 /* Enable tracing */
@@ -215,7 +216,7 @@ pqTraceOutputNchar(FILE *pfdebug, int len, const char *data, int *cursor)
  * Output functions by protocol message type
  */
 
-/* NotificationResponse */
+/* PqMsgNotifyResponse */
 static void
 pqTraceOutputA(FILE *f, const char *message, int *cursor, bool regress)
 {
@@ -225,7 +226,7 @@ pqTraceOutputA(FILE *f, const char *message, int *cursor, bool regress)
 	pqTraceOutputString(f, message, cursor, false);
 }
 
-/* Bind */
+/* PqMsgBindRequest */
 static void
 pqTraceOutputB(FILE *f, const char *message, int *cursor)
 {
@@ -256,7 +257,7 @@ pqTraceOutputB(FILE *f, const char *message, int *cursor)
 		pqTraceOutputInt16(f, message, cursor);
 }
 
-/* Close(F) or CommandComplete(B) */
+/* PqMsgCloseRequest or PqMsgCommandCompleteResponse */
 static void
 pqTraceOutputC(FILE *f, bool toServer, const char *message, int *cursor)
 {
@@ -273,7 +274,7 @@ pqTraceOutputC(FILE *f, bool toServer, const char *message, int *cursor)
 	}
 }
 
-/* Describe(F) or DataRow(B) */
+/* PqMsgDescribeRequest or PqMsgDataRowResponse */
 static void
 pqTraceOutputD(FILE *f, bool toServer, const char *message, int *cursor)
 {
@@ -322,7 +323,7 @@ pqTraceOutputNR(FILE *f, const char *type, const char *message, int *cursor,
 	}
 }
 
-/* Execute(F) or ErrorResponse(B) */
+/* PqMsgExecuteRequest or PqMsgErrorResponse */
 static void
 pqTraceOutputE(FILE *f, bool toServer, const char *message, int *cursor, bool regress)
 {
@@ -336,7 +337,7 @@ pqTraceOutputE(FILE *f, bool toServer, const char *message, int *cursor, bool re
 		pqTraceOutputNR(f, "ErrorResponse", message, cursor, regress);
 }
 
-/* CopyFail */
+/* PqMsgCopyFailRequest */
 static void
 pqTraceOutputf(FILE *f, const char *message, int *cursor)
 {
@@ -344,7 +345,7 @@ pqTraceOutputf(FILE *f, const char *message, int *cursor)
 	pqTraceOutputString(f, message, cursor, false);
 }
 
-/* FunctionCall */
+/* PqMsgFunctionCallRequest */
 static void
 pqTraceOutputF(FILE *f, const char *message, int *cursor, bool regress)
 {
@@ -371,7 +372,7 @@ pqTraceOutputF(FILE *f, const char *message, int *cursor, bool regress)
 	pqTraceOutputInt16(f, message, cursor);
 }
 
-/* CopyInResponse */
+/* PqMsgCopyInResponse */
 static void
 pqTraceOutputG(FILE *f, const char *message, int *cursor)
 {
@@ -385,7 +386,7 @@ pqTraceOutputG(FILE *f, const char *message, int *cursor)
 		pqTraceOutputInt16(f, message, cursor);
 }
 
-/* CopyOutResponse */
+/* PqMsgCopyOutResponse */
 static void
 pqTraceOutputH(FILE *f, const char *message, int *cursor)
 {
@@ -399,7 +400,7 @@ pqTraceOutputH(FILE *f, const char *message, int *cursor)
 		pqTraceOutputInt16(f, message, cursor);
 }
 
-/* BackendKeyData */
+/* PqMsgBackendKeyDataRequest */
 static void
 pqTraceOutputK(FILE *f, const char *message, int *cursor, bool regress)
 {
@@ -408,7 +409,7 @@ pqTraceOutputK(FILE *f, const char *message, int *cursor, bool regress)
 	pqTraceOutputInt32(f, message, cursor, regress);
 }
 
-/* Parse */
+/* PqMsgParseRequest */
 static void
 pqTraceOutputP(FILE *f, const char *message, int *cursor, bool regress)
 {
@@ -423,7 +424,7 @@ pqTraceOutputP(FILE *f, const char *message, int *cursor, bool regress)
 		pqTraceOutputInt32(f, message, cursor, regress);
 }
 
-/* Query */
+/* PqMsgSimpleQueryRequest */
 static void
 pqTraceOutputQ(FILE *f, const char *message, int *cursor)
 {
@@ -431,7 +432,7 @@ pqTraceOutputQ(FILE *f, const char *message, int *cursor)
 	pqTraceOutputString(f, message, cursor, false);
 }
 
-/* Authentication */
+/* PqMsgAuthenticationRequest */
 static void
 pqTraceOutputR(FILE *f, const char *message, int *cursor)
 {
@@ -439,7 +440,7 @@ pqTraceOutputR(FILE *f, const char *message, int *cursor)
 	pqTraceOutputInt32(f, message, cursor, false);
 }
 
-/* ParameterStatus */
+/* PqMsgParameterStatusResponse */
 static void
 pqTraceOutputS(FILE *f, const char *message, int *cursor)
 {
@@ -448,7 +449,7 @@ pqTraceOutputS(FILE *f, const char *message, int *cursor)
 	pqTraceOutputString(f, message, cursor, false);
 }
 
-/* ParameterDescription */
+/* PqMsgParameterDescriptionResponse */
 static void
 pqTraceOutputt(FILE *f, const char *message, int *cursor, bool regress)
 {
@@ -461,7 +462,7 @@ pqTraceOutputt(FILE *f, const char *message, int *cursor, bool regress)
 		pqTraceOutputInt32(f, message, cursor, regress);
 }
 
-/* RowDescription */
+/* PqMsgRowDescriptionResponse */
 static void
 pqTraceOutputT(FILE *f, const char *message, int *cursor, bool regress)
 {
@@ -482,7 +483,7 @@ pqTraceOutputT(FILE *f, const char *message, int *cursor, bool regress)
 	}
 }
 
-/* NegotiateProtocolVersion */
+/* PqMsgNegotiateProtocolResponse */
 static void
 pqTraceOutputv(FILE *f, const char *message, int *cursor)
 {
@@ -491,7 +492,7 @@ pqTraceOutputv(FILE *f, const char *message, int *cursor)
 	pqTraceOutputInt32(f, message, cursor, false);
 }
 
-/* FunctionCallResponse */
+/* PqMsgFunctionCallResponse */
 static void
 pqTraceOutputV(FILE *f, const char *message, int *cursor)
 {
@@ -503,7 +504,7 @@ pqTraceOutputV(FILE *f, const char *message, int *cursor)
 		pqTraceOutputNchar(f, len, message, cursor);
 }
 
-/* CopyBothResponse */
+/* PqMsgCopyBothResponse */
 static void
 pqTraceOutputW(FILE *f, const char *message, int *cursor, int length)
 {
@@ -514,7 +515,7 @@ pqTraceOutputW(FILE *f, const char *message, int *cursor, int length)
 		pqTraceOutputInt16(f, message, cursor);
 }
 
-/* ReadyForQuery */
+/* PqMsgReadyForQueryResponse */
 static void
 pqTraceOutputZ(FILE *f, const char *message, int *cursor)
 {
@@ -562,110 +563,110 @@ pqTraceOutputMessage(PGconn *conn, const char *message, bool toServer)
 
 	switch (id)
 	{
-		case '1':
+		case PqMsgParseCompleteResponse:
 			fprintf(conn->Pfdebug, "ParseComplete");
 			/* No message content */
 			break;
-		case '2':
+		case PqMsgBindCompleteResponse:
 			fprintf(conn->Pfdebug, "BindComplete");
 			/* No message content */
 			break;
-		case '3':
+		case PqMsgCloseCompleteResponse:
 			fprintf(conn->Pfdebug, "CloseComplete");
 			/* No message content */
 			break;
-		case 'A':				/* Notification Response */
+		case PqMsgNotifyResponse:
 			pqTraceOutputA(conn->Pfdebug, message, &logCursor, regress);
 			break;
-		case 'B':				/* Bind */
+		case PqMsgBindRequest:
 			pqTraceOutputB(conn->Pfdebug, message, &logCursor);
 			break;
-		case 'c':
+		case PqMsgCopyDoneRequest:
 			fprintf(conn->Pfdebug, "CopyDone");
 			/* No message content */
 			break;
-		case 'C':				/* Close(F) or Command Complete(B) */
+		case PqMsgCommandCompleteResponse:				/* Close(F) or Command Complete(B) */
 			pqTraceOutputC(conn->Pfdebug, toServer, message, &logCursor);
 			break;
-		case 'd':				/* Copy Data */
+		case PqMsgCopyDataRequest:
 			/* Drop COPY data to reduce the overhead of logging. */
 			break;
-		case 'D':				/* Describe(F) or Data Row(B) */
+		case PqMsgDescribeRequest:		/* Describe(F) or Data Row(B) */
 			pqTraceOutputD(conn->Pfdebug, toServer, message, &logCursor);
 			break;
-		case 'E':				/* Execute(F) or Error Response(B) */
+		case PqMsgExecuteRequest:		/* Execute(F) or Error Response(B) */
 			pqTraceOutputE(conn->Pfdebug, toServer, message, &logCursor,
 						   regress);
 			break;
-		case 'f':				/* Copy Fail */
+		case PqMsgCopyFailRequest:
 			pqTraceOutputf(conn->Pfdebug, message, &logCursor);
 			break;
-		case 'F':				/* Function Call */
+		case PqMsgFunctionCallRequest:
 			pqTraceOutputF(conn->Pfdebug, message, &logCursor, regress);
 			break;
-		case 'G':				/* Start Copy In */
+		case PqMsgCopyInResponse:
 			pqTraceOutputG(conn->Pfdebug, message, &logCursor);
 			break;
-		case 'H':				/* Flush(F) or Start Copy Out(B) */
+		case PqMsgFlushDataRequest:	/* Flush(F) or Start Copy Out(B) */
 			if (!toServer)
 				pqTraceOutputH(conn->Pfdebug, message, &logCursor);
 			else
 				fprintf(conn->Pfdebug, "Flush");	/* no message content */
 			break;
-		case 'I':
+		case PqMsgEmptyQueryResponse:
 			fprintf(conn->Pfdebug, "EmptyQueryResponse");
 			/* No message content */
 			break;
-		case 'K':				/* secret key data from the backend */
+		case PqMsgBackendKeyDataRequest:		/* secret key data from the backend */
 			pqTraceOutputK(conn->Pfdebug, message, &logCursor, regress);
 			break;
-		case 'n':
+		case PqMsgNoDataResponse:
 			fprintf(conn->Pfdebug, "NoData");
 			/* No message content */
 			break;
-		case 'N':
+		case PqMsgNoticeResponse:
 			pqTraceOutputNR(conn->Pfdebug, "NoticeResponse", message,
 							&logCursor, regress);
 			break;
-		case 'P':				/* Parse */
+		case PqMsgParseRequest:
 			pqTraceOutputP(conn->Pfdebug, message, &logCursor, regress);
 			break;
-		case 'Q':				/* Query */
+		case PqMsgSimpleQueryRequest:
 			pqTraceOutputQ(conn->Pfdebug, message, &logCursor);
 			break;
-		case 'R':				/* Authentication */
+		case PqMsgAuthenticationRequest:
 			pqTraceOutputR(conn->Pfdebug, message, &logCursor);
 			break;
-		case 's':
+		case PqMsgPortalSuspendedResponse:
 			fprintf(conn->Pfdebug, "PortalSuspended");
 			/* No message content */
 			break;
-		case 'S':				/* Parameter Status(B) or Sync(F) */
+		case PqMsgSyncDataRequest:	/* Parameter Status(B) or Sync(F) */
 			if (!toServer)
 				pqTraceOutputS(conn->Pfdebug, message, &logCursor);
 			else
 				fprintf(conn->Pfdebug, "Sync"); /* no message content */
 			break;
-		case 't':				/* Parameter Description */
+		case PqMsgParameterDescriptionResponse:
 			pqTraceOutputt(conn->Pfdebug, message, &logCursor, regress);
 			break;
-		case 'T':				/* Row Description */
+		case PqMsgRowDescriptionResponse:
 			pqTraceOutputT(conn->Pfdebug, message, &logCursor, regress);
 			break;
-		case 'v':				/* Negotiate Protocol Version */
+		case PqMsgNegotiateProtocolResponse:
 			pqTraceOutputv(conn->Pfdebug, message, &logCursor);
 			break;
-		case 'V':				/* Function Call response */
+		case PqMsgFunctionCallResponse:
 			pqTraceOutputV(conn->Pfdebug, message, &logCursor);
 			break;
-		case 'W':				/* Start Copy Both */
+		case PqMsgCopyBothResponse:
 			pqTraceOutputW(conn->Pfdebug, message, &logCursor, length);
 			break;
-		case 'X':
+		case PqMsgTerminateRequest:
 			fprintf(conn->Pfdebug, "Terminate");
 			/* No message content */
 			break;
-		case 'Z':				/* Ready For Query */
+		case PqMsgReadyForQueryResponse:
 			pqTraceOutputZ(conn->Pfdebug, message, &logCursor);
 			break;
 		default:
-- 
2.37.1 (Apple Git-137.1)



^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 18:59     ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 20:00       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 20:02         ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 21:47           ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
  2023-08-07 22:49             ` Re: Using defines for protocol characters Tatsuo Ishii <[email protected]>
  2023-08-07 23:55               ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
@ 2023-08-08 00:37                 ` Tatsuo Ishii <[email protected]>
  1 sibling, 0 replies; 18+ messages in thread

From: Tatsuo Ishii @ 2023-08-08 00:37 UTC (permalink / raw)
  To: [email protected]; +Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]

> On Mon, 7 Aug 2023 at 16:50, Tatsuo Ishii <[email protected]> wrote:
> 
>> > On Mon, Aug 07, 2023 at 04:02:08PM -0400, Tom Lane wrote:
>> >> Dave Cramer <[email protected]> writes:
>> >>> On Mon, 7 Aug 2023 at 12:59, Robert Haas <[email protected]>
>> wrote:
>> >>>> PqMsgEmptyQueryResponse or something like that seems better, if we
>> >>>> want to keep the current capitalization. I'm not a huge fan of the way
>> >>>> we vary our capitalization conventions so much all over the code base,
>> >>>> but I think we would at least do well to keep it consistent from one
>> >>>> end of a certain identifier to the other.
>> >>
>> >>> I don't have a strong preference, but before I make the changes I'd
>> like to
>> >>> get consensus.
>> >>> Can we vote or whatever it takes to decide on a naming pattern that is
>> >>> acceptable ?
>> >>
>> >> I'm good with Robert's proposal above.
>> >
>> > +1
>>
>> +1.
>>
>> Also we need to decide what to do with them:
>>
>> > #define PQMSG_REQ_PREPARED 'S'
>> > #define PQMSG_REQ_PORTAL 'P'
>>
>> If we go "PqMsgEmptyQueryResponse", probably we should go something
>> like for these?
>>
>> #define PqMsgReqPrepared 'S'
>> #define PqMsgReqPortal 'P'
>>
> 
> I went with PqMsgPortalSubCommand and PqMsgPreparedSubCommand
> 
> See attached patch

Looks good to me.

Best reagards,
--
Tatsuo Ishii
SRA OSS LLC
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 18:59     ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 20:00       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 20:02         ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 21:47           ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
  2023-08-07 22:49             ` Re: Using defines for protocol characters Tatsuo Ishii <[email protected]>
  2023-08-07 23:55               ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
@ 2023-08-09 15:19                 ` Peter Eisentraut <[email protected]>
  2023-08-09 16:27                   ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  1 sibling, 1 reply; 18+ messages in thread

From: Peter Eisentraut @ 2023-08-09 15:19 UTC (permalink / raw)
  To: Dave Cramer <[email protected]>; Tatsuo Ishii <[email protected]>; +Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]

1. As was discussed, these definitions should go into 
src/include/libpq/pqcomm.h, not a new file.

2. I would prefer an underscore after PgMsg, like PqMsg_DescribeRequest, 
so it's easier to visually locate the start of the actual message name.

3. IMO, the names of the protocol messages in protocol.sgml are 
canonical.  Your patch appends "Request" and "Response" in cases where 
that is not part of the actual name.  Also, some messages are documented 
to go both ways, so this separation doesn't make sense strictly 
speaking.  Please use the names as in protocol.sgml without augmenting them.







^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 18:59     ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 20:00       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 20:02         ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 21:47           ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
  2023-08-07 22:49             ` Re: Using defines for protocol characters Tatsuo Ishii <[email protected]>
  2023-08-07 23:55               ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-09 15:19                 ` Re: Using defines for protocol characters Peter Eisentraut <[email protected]>
@ 2023-08-09 16:27                   ` Dave Cramer <[email protected]>
  2023-08-09 16:34                     ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  0 siblings, 1 reply; 18+ messages in thread

From: Dave Cramer @ 2023-08-09 16:27 UTC (permalink / raw)
  To: Peter Eisentraut <[email protected]>; +Cc: Tatsuo Ishii <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]

On Wed, 9 Aug 2023 at 09:19, Peter Eisentraut <[email protected]> wrote:

> 1. As was discussed, these definitions should go into
> src/include/libpq/pqcomm.h, not a new file.
>

I'm ambivalent, this is very easy to do.

>
> 2. I would prefer an underscore after PgMsg, like PqMsg_DescribeRequest,
> so it's easier to visually locate the start of the actual message name.
>
> 3. IMO, the names of the protocol messages in protocol.sgml are
> canonical.  Your patch appends "Request" and "Response" in cases where
> that is not part of the actual name.  Also, some messages are documented
> to go both ways, so this separation doesn't make sense strictly
> speaking.  Please use the names as in protocol.sgml without augmenting
> them.
>
>
I've changed this a number of times. I do not mind changing it again, but
can we reach a consensus ?

Dave


^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 18:59     ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 20:00       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 20:02         ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 21:47           ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
  2023-08-07 22:49             ` Re: Using defines for protocol characters Tatsuo Ishii <[email protected]>
  2023-08-07 23:55               ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-09 15:19                 ` Re: Using defines for protocol characters Peter Eisentraut <[email protected]>
  2023-08-09 16:27                   ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
@ 2023-08-09 16:34                     ` Tom Lane <[email protected]>
  2023-08-09 16:44                       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  0 siblings, 1 reply; 18+ messages in thread

From: Tom Lane @ 2023-08-09 16:34 UTC (permalink / raw)
  To: Dave Cramer <[email protected]>; +Cc: Peter Eisentraut <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]

Dave Cramer <[email protected]> writes:
> On Wed, 9 Aug 2023 at 09:19, Peter Eisentraut <[email protected]> wrote:
>> 3. IMO, the names of the protocol messages in protocol.sgml are
>> canonical.  Your patch appends "Request" and "Response" in cases where
>> that is not part of the actual name.  Also, some messages are documented
>> to go both ways, so this separation doesn't make sense strictly
>> speaking.  Please use the names as in protocol.sgml without augmenting
>> them.

> I've changed this a number of times. I do not mind changing it again, but
> can we reach a consensus ?

I agree with Peter: let's use the names in the protocol document
with a single prefix.  I've got mixed feelings about whether that prefix
should have an underscore, though.

			regards, tom lane






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 18:59     ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 20:00       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 20:02         ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 21:47           ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
  2023-08-07 22:49             ` Re: Using defines for protocol characters Tatsuo Ishii <[email protected]>
  2023-08-07 23:55               ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-09 15:19                 ` Re: Using defines for protocol characters Peter Eisentraut <[email protected]>
  2023-08-09 16:27                   ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-09 16:34                     ` Re: Using defines for protocol characters Tom Lane <[email protected]>
@ 2023-08-09 16:44                       ` Dave Cramer <[email protected]>
  2023-08-09 16:51                         ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
  0 siblings, 1 reply; 18+ messages in thread

From: Dave Cramer @ 2023-08-09 16:44 UTC (permalink / raw)
  To: Tom Lane <[email protected]>; +Cc: Peter Eisentraut <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]

On Wed, 9 Aug 2023 at 10:34, Tom Lane <[email protected]> wrote:

> Dave Cramer <[email protected]> writes:
> > On Wed, 9 Aug 2023 at 09:19, Peter Eisentraut <[email protected]>
> wrote:
> >> 3. IMO, the names of the protocol messages in protocol.sgml are
> >> canonical.  Your patch appends "Request" and "Response" in cases where
> >> that is not part of the actual name.  Also, some messages are documented
> >> to go both ways, so this separation doesn't make sense strictly
> >> speaking.  Please use the names as in protocol.sgml without augmenting
> >> them.
>
> > I've changed this a number of times. I do not mind changing it again, but
> > can we reach a consensus ?
>
> I agree with Peter: let's use the names in the protocol document
> with a single prefix.  I've got mixed feelings about whether that prefix
> should have an underscore, though.
>

Well, we're getting closer :)

Dave


^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 18:59     ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 20:00       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 20:02         ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 21:47           ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
  2023-08-07 22:49             ` Re: Using defines for protocol characters Tatsuo Ishii <[email protected]>
  2023-08-07 23:55               ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-09 15:19                 ` Re: Using defines for protocol characters Peter Eisentraut <[email protected]>
  2023-08-09 16:27                   ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-09 16:34                     ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-09 16:44                       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
@ 2023-08-09 16:51                         ` Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 18+ messages in thread

From: Nathan Bossart @ 2023-08-09 16:51 UTC (permalink / raw)
  To: Dave Cramer <[email protected]>; +Cc: Tom Lane <[email protected]>; Peter Eisentraut <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]

On Wed, Aug 09, 2023 at 10:44:42AM -0600, Dave Cramer wrote:
> On Wed, 9 Aug 2023 at 10:34, Tom Lane <[email protected]> wrote:
>> I agree with Peter: let's use the names in the protocol document
>> with a single prefix.  I've got mixed feelings about whether that prefix
>> should have an underscore, though.
> 
> Well, we're getting closer :)

I'm +0.5 for the underscore.

-- 
Nathan Bossart
Amazon Web Services: https://aws.amazon.com






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* Re: Using defines for protocol characters
  2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 17:36 ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 18:24   ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 18:59     ` Re: Using defines for protocol characters Robert Haas <[email protected]>
  2023-08-07 20:00       ` Re: Using defines for protocol characters Dave Cramer <[email protected]>
  2023-08-07 20:02         ` Re: Using defines for protocol characters Tom Lane <[email protected]>
  2023-08-07 21:47           ` Re: Using defines for protocol characters Nathan Bossart <[email protected]>
@ 2023-08-08 06:27             ` Alvaro Herrera <[email protected]>
  1 sibling, 0 replies; 18+ messages in thread

From: Alvaro Herrera @ 2023-08-08 06:27 UTC (permalink / raw)
  To: Nathan Bossart <[email protected]>; +Cc: Tom Lane <[email protected]>; Dave Cramer <[email protected]>; Robert Haas <[email protected]>; Peter Smith <[email protected]>; Tatsuo Ishii <[email protected]>; [email protected]

On 2023-Aug-07, Nathan Bossart wrote:

> On Mon, Aug 07, 2023 at 04:02:08PM -0400, Tom Lane wrote:
> > Dave Cramer <[email protected]> writes:

> >> Can we vote or whatever it takes to decide on a naming pattern that is
> >> acceptable ?
> > 
> > I'm good with Robert's proposal above.
> 
> +1

WFM as well.

-- 
Álvaro Herrera        Breisgau, Deutschland  —  https://www.EnterpriseDB.com/
"Every machine is a smoke machine if you operate it wrong enough."
https://twitter.com/libseybieda/status/1541673325781196801






^ permalink  raw  reply  [nested|flat] 18+ messages in thread

* [PATCH v2 02/11] Change section heading to better describe reference of existing types
@ 2023-09-24 20:52 Karl O. Pinc <[email protected]>
  0 siblings, 0 replies; 18+ messages in thread

From: Karl O. Pinc @ 2023-09-24 20:52 UTC (permalink / raw)

The section heading of "Copying Types" does not reflect what the
section is about.  It is not about making copies of data types but
about using the data type of existing columns (or rows) in new type
declarations without having to know what the existing type is.

"Re-Using the Type of Columns and Variables" seems adequate.  Getting
something in there about declartions seems too wordy.  I thought
perhaps "Referencing" instead of "Re-Using", but "referencing" isn't
perfect and "re-using" is generic enough, shorter, and simpler to read.
---
 doc/src/sgml/plpgsql.sgml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index 8747e84245..874578265e 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -672,7 +672,7 @@ DECLARE
    </sect2>
 
   <sect2 id="plpgsql-declaration-type">
-   <title>Copying Types</title>
+   <title>Re-Using the Type of Columns and Variables</title>
 
 <synopsis>
 <replaceable>variable</replaceable>%TYPE
-- 
2.30.2


--MP_/RgO6TscyR9fMvkEm1k5N=yu
Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename=v2-0003-Better-section-heading-for-plpgsql-exception-trap.patch



^ permalink  raw  reply  [nested|flat] 18+ messages in thread


end of thread, other threads:[~2023-09-24 20:52 UTC | newest]

Thread overview: 18+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2023-08-07 17:19 Re: Using defines for protocol characters Dave Cramer <[email protected]>
2023-08-07 17:36 ` Robert Haas <[email protected]>
2023-08-07 18:24   ` Tom Lane <[email protected]>
2023-08-07 18:38     ` Nathan Bossart <[email protected]>
2023-08-07 18:59     ` Robert Haas <[email protected]>
2023-08-07 20:00       ` Dave Cramer <[email protected]>
2023-08-07 20:02         ` Tom Lane <[email protected]>
2023-08-07 21:47           ` Nathan Bossart <[email protected]>
2023-08-07 22:49             ` Tatsuo Ishii <[email protected]>
2023-08-07 23:55               ` Dave Cramer <[email protected]>
2023-08-08 00:37                 ` Tatsuo Ishii <[email protected]>
2023-08-09 15:19                 ` Peter Eisentraut <[email protected]>
2023-08-09 16:27                   ` Dave Cramer <[email protected]>
2023-08-09 16:34                     ` Tom Lane <[email protected]>
2023-08-09 16:44                       ` Dave Cramer <[email protected]>
2023-08-09 16:51                         ` Nathan Bossart <[email protected]>
2023-08-08 06:27             ` Alvaro Herrera <[email protected]>
2023-09-24 20:52 [PATCH v2 02/11] Change section heading to better describe reference of existing types Karl O. Pinc <[email protected]>

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox