From f12089999ee79ff0aed114b7790eb4df7bee9be9 Mon Sep 17 00:00:00 2001 From: Dave Cramer 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 --- src/backend/access/common/printsimple.c | 5 +- src/backend/access/transam/parallel.c | 15 ++--- src/backend/backup/basebackup_copy.c | 15 ++--- src/backend/commands/async.c | 3 +- src/backend/commands/copyfromparse.c | 23 ++++---- src/backend/commands/copyto.c | 5 +- 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 | 5 +- src/backend/tcop/fastpath.c | 3 +- src/backend/tcop/postgres.c | 77 +++++++++++++------------ src/backend/utils/error/elog.c | 3 +- src/backend/utils/misc/guc.c | 3 +- src/include/protocol.h | 59 +++++++++++++++++++ src/interfaces/libpq/fe-auth.c | 3 +- src/interfaces/libpq/fe-connect.c | 15 ++--- src/interfaces/libpq/fe-exec.c | 41 ++++++------- src/interfaces/libpq/fe-protocol3.c | 56 +++++++++--------- src/interfaces/libpq/fe-trace.c | 57 +++++++++--------- 21 files changed, 251 insertions(+), 171 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..70cb2e4c1d 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, ROW_DESCRIPTION_RESPONSE); /* RowDescription */ 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, DATA_ROW_RESPONSE); 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 7133ec0b22..39a927bac3 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -32,6 +32,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" @@ -1126,7 +1127,7 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg) switch (msgtype) { - case 'K': /* BackendKeyData */ + case BACKEND_KEY_DATA: /* BackendKeyData */ { int32 pid = pq_getmsgint(msg, 4); @@ -1136,8 +1137,8 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg) break; } - case 'E': /* ErrorResponse */ - case 'N': /* NoticeResponse */ + case ERROR_RESPONSE: /* ErrorResponse */ + case NOTICE_RESPONSE: /* NoticeResponse */ { ErrorData edata; ErrorContextCallback *save_error_context_stack; @@ -1182,7 +1183,7 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg) break; } - case 'A': /* NotifyResponse */ + case NOTIFY_RESPONSE: /* NotifyResponse */ { /* Propagate NotifyResponse. */ int32 pid; @@ -1199,7 +1200,7 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg) break; } - case 'X': /* Terminate, indicating clean exit */ + case TERMINATE_REQUEST: /* Terminate, indicating clean exit */ { shm_mq_detach(pcxt->worker[i].error_mqh); pcxt->worker[i].error_mqh = NULL; @@ -1354,7 +1355,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, BACKEND_KEY_DATA); pq_sendint32(&msgbuf, (int32) MyProcPid); pq_sendint32(&msgbuf, (int32) MyCancelKey); pq_endmessage(&msgbuf); @@ -1532,7 +1533,7 @@ ParallelWorkerMain(Datum main_arg) DetachSession(); /* Report success. */ - pq_putmessage('X', NULL, 0); + pq_putmessage(TERMINATE_REQUEST, NULL, 0); } /* diff --git a/src/backend/backup/basebackup_copy.c b/src/backend/backup/basebackup_copy.c index 73a3f4a970..885855c18c 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" @@ -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, COPY_DATA); /* CopyData */ 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, COPY_DATA); /* CopyData */ + pq_sendbyte(&buf, COPY_PROGRESS); /* Progress report */ pq_sendint64(&buf, state->bytes_done); pq_endmessage(&buf); pq_flush_if_writable(); @@ -246,7 +247,7 @@ 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_beginmessage(&buf, COPY_DATA); /* CopyData */ pq_sendbyte(&buf, 'p'); /* Progress report */ pq_sendint64(&buf, state->bytes_done); pq_endmessage(&buf); @@ -261,7 +262,7 @@ bbsink_copystream_begin_manifest(bbsink *sink) { StringInfoData buf; - pq_beginmessage(&buf, 'd'); /* CopyData */ + pq_beginmessage(&buf, COPY_DATA); /* CopyData */ pq_sendbyte(&buf, 'm'); /* Manifest */ pq_endmessage(&buf); } @@ -318,7 +319,7 @@ SendCopyOutResponse(void) { StringInfoData buf; - pq_beginmessage(&buf, 'H'); + pq_beginmessage(&buf, COPY_OUT_RESPONSE); 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(COPY_DONE); } /* diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index ef909cf4e0..cd703bcf09 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, NOTIFY_RESPONSE); 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 3853902a16..cd8924b37d 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, COPY_IN_RESPONSE); 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 COPY_DATA: /* CopyData */ maxmsglen = PQ_LARGE_MESSAGE_LIMIT; break; - case 'c': /* CopyDone */ - case 'f': /* CopyFail */ - case 'H': /* Flush */ - case 'S': /* Sync */ + case COPY_DONE: /* CopyDone */ + case COPY_FAIL: /* CopyFail */ + case FLUSH_DATA_REQUEST: /* Flush */ + case SYNC_DATA_REQUEST: /* Sync */ 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 COPY_DATA: /* CopyData */ break; - case 'c': /* CopyDone */ + case COPY_DONE: /* CopyDone */ /* COPY IN correctly terminated by frontend */ cstate->raw_reached_eof = true; return bytesread; - case 'f': /* CopyFail */ + case COPY_FAIL: /* CopyFail */ 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 FLUSH_DATA_REQUEST: /* Flush */ + case SYNC_DATA_REQUEST: /* Sync */ /* * Ignore Flush/Sync for the convenience of client diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c index 9e4b2437a5..4eaa5b9ec3 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, COPY_OUT_RESPONSE); 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(COPY_DONE); } /*---------- diff --git a/src/backend/libpq/auth-sasl.c b/src/backend/libpq/auth-sasl.c index 684680897b..9477331e27 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 != GSS_RESPONSE) { /* 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 a1a826e37f..19f2ad3f47 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, AUTHENTICATION_REQUEST); 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 != PASSWORD_RESPONSE) { /* * If the client just disconnects without offering a password, don't @@ -966,7 +967,7 @@ pg_GSS_recvauth(Port *port) CHECK_FOR_INTERRUPTS(); mtype = pq_getbyte(); - if (mtype != 'p') + if (mtype != GSS_RESPONSE) { /* Only log error if client didn't disconnect. */ if (mtype != EOF) @@ -1237,7 +1238,7 @@ pg_SSPI_recvauth(Port *port) { pq_startmsgread(); mtype = pq_getbyte(); - if (mtype != 'p') + if (mtype != GSS_RESPONSE) { if (sspictx != NULL) { diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 4c49393fc5..75becab234 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" @@ -2385,7 +2386,7 @@ SendNegotiateProtocolVersion(List *unrecognized_protocol_options) StringInfoData buf; ListCell *lc; - pq_beginmessage(&buf, 'v'); /* NegotiateProtocolVersion */ + pq_beginmessage(&buf, NEGOTIATE_PROTOCOL); /* NegotiateProtocolVersion */ 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 45b8b3684f..4e43ec3458 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, DATA_ROW_RESPONSE); 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, COPY_BOTH_RESPONSE); pq_sendbyte(&buf, 0); pq_sendint16(&buf, 0); pq_endmessage(&buf); @@ -1295,7 +1296,7 @@ StartLogicalReplication(StartReplicationCmd *cmd) WalSndSetState(WALSNDSTATE_CATCHUP); /* Send a CopyBothResponse message, and start streaming */ - pq_beginmessage(&buf, 'W'); + pq_beginmessage(&buf, COPY_BOTH_RESPONSE); pq_sendbyte(&buf, 0); pq_sendint16(&buf, 0); pq_endmessage(&buf); @@ -1924,11 +1925,11 @@ ProcessRepliesIfAny(void) /* Validate message type and set packet size limit */ switch (firstchar) { - case 'd': + case COPY_DATA: maxmsglen = PQ_LARGE_MESSAGE_LIMIT; break; - case 'c': - case 'X': + case COPY_DONE: + case TERMINATE_REQUEST: maxmsglen = PQ_SMALL_MESSAGE_LIMIT; break; default: @@ -1956,7 +1957,7 @@ ProcessRepliesIfAny(void) /* * 'd' means a standby reply wrapped in a CopyData packet. */ - case 'd': + case COPY_DATA: ProcessStandbyMessage(); received = true; break; @@ -1965,7 +1966,7 @@ ProcessRepliesIfAny(void) * CopyDone means the standby requested to finish streaming. * Reply with CopyDone, if we had not sent that already. */ - case 'c': + case COPY_DONE: if (!streamingDoneSending) { pq_putmessage_noblock('c', NULL, 0); @@ -1979,7 +1980,7 @@ ProcessRepliesIfAny(void) /* * 'X' means that the standby is closing down the socket. */ - case 'X': + case TERMINATE_REQUEST: proc_exit(0); default: diff --git a/src/backend/tcop/dest.c b/src/backend/tcop/dest.c index c0406e2ee5..4b5e2e12e5 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" @@ -220,7 +221,7 @@ NullCommand(CommandDest dest) case DestRemoteSimple: /* Tell the FE that we saw an empty query string */ - pq_putemptymessage('I'); + pq_putemptymessage(EMPTY_QUERY_RESPONSE); break; case DestNone: @@ -258,7 +259,7 @@ ReadyForQuery(CommandDest dest) { StringInfoData buf; - pq_beginmessage(&buf, 'Z'); + pq_beginmessage(&buf, READY_FOR_QUERY); pq_sendbyte(&buf, TransactionBlockStatusCode()); pq_endmessage(&buf); } diff --git a/src/backend/tcop/fastpath.c b/src/backend/tcop/fastpath.c index 2f70ebd5fa..83320cd3f7 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, FUNCTION_CALL_RESPONSE); if (isnull) { diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 01b6cc1f7d..0b084a4292 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 SIMPLE_QUERY: /* simple query */ maxmsglen = PQ_LARGE_MESSAGE_LIMIT; doing_extended_query_message = false; break; - case 'F': /* fastpath function call */ + case FUNCTION_CALL_REQUEST: /* fastpath function call */ maxmsglen = PQ_LARGE_MESSAGE_LIMIT; doing_extended_query_message = false; break; - case 'X': /* terminate */ + case TERMINATE_REQUEST: /* terminate */ maxmsglen = PQ_SMALL_MESSAGE_LIMIT; doing_extended_query_message = false; ignore_till_sync = false; break; - case 'B': /* bind */ - case 'P': /* parse */ + case BIND_REQUEST : /* bind */ + case PARSE_REQUEST: /* parse */ maxmsglen = PQ_LARGE_MESSAGE_LIMIT; doing_extended_query_message = true; break; - case 'C': /* close */ - case 'D': /* describe */ - case 'E': /* execute */ - case 'H': /* flush */ + case CLOSE_REQUEST: /* close */ + case DESCRIBE_REQUEST: /* describe */ + case EXECUTE_REQUEST: /* execute */ + case FLUSH_DATA_REQUEST: /* flush */ maxmsglen = PQ_SMALL_MESSAGE_LIMIT; doing_extended_query_message = true; break; - case 'S': /* sync */ + case SYNC_DATA_REQUEST: /* sync */ 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 COPY_DATA: /* copy data */ maxmsglen = PQ_LARGE_MESSAGE_LIMIT; doing_extended_query_message = false; break; - case 'c': /* copy done */ - case 'f': /* copy fail */ + case COPY_DONE: /* copy done */ + case COPY_FAIL: /* copy fail */ 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(PARSE_COMPLETE_RESPONSE); /* * 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(BIND_COMPLETE_RESPONSE); /* * 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(PORTAL_SUSPENDED_RESPONSE); /* * 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(NO_DATA_RESPONSE); /* NoData */ } /* @@ -2736,7 +2737,7 @@ exec_describe_portal_message(const char *portal_name) FetchPortalTargetList(portal), portal->formats); else - pq_putemptymessage('n'); /* NoData */ + pq_putemptymessage(NO_DATA_RESPONSE); /* NoData */ } @@ -4239,7 +4240,7 @@ PostgresMain(const char *dbname, const char *username) { StringInfoData buf; - pq_beginmessage(&buf, 'K'); + pq_beginmessage(&buf, BACKEND_KEY_DATA); pq_sendint32(&buf, (int32) MyProcPid); pq_sendint32(&buf, (int32) MyCancelKey); pq_endmessage(&buf); @@ -4613,7 +4614,7 @@ PostgresMain(const char *dbname, const char *username) switch (firstchar) { - case 'Q': /* simple query */ + case SIMPLE_QUERY: /* simple query */ { const char *query_string; @@ -4637,7 +4638,7 @@ PostgresMain(const char *dbname, const char *username) } break; - case 'P': /* parse */ + case PARSE_REQUEST: /* parse */ { const char *stmt_name; const char *query_string; @@ -4667,7 +4668,7 @@ PostgresMain(const char *dbname, const char *username) } break; - case 'B': /* bind */ + case BIND_REQUEST: /* bind */ forbidden_in_wal_sender(firstchar); /* Set statement_timestamp() */ @@ -4682,7 +4683,7 @@ PostgresMain(const char *dbname, const char *username) /* exec_bind_message does valgrind_report_error_query */ break; - case 'E': /* execute */ + case EXECUTE_REQUEST: /* execute */ { const char *portal_name; int max_rows; @@ -4702,7 +4703,7 @@ PostgresMain(const char *dbname, const char *username) } break; - case 'F': /* fastpath function call */ + case FUNCTION_CALL_REQUEST: /* fastpath function call */ forbidden_in_wal_sender(firstchar); /* Set statement_timestamp() */ @@ -4737,7 +4738,7 @@ PostgresMain(const char *dbname, const char *username) send_ready_for_query = true; break; - case 'C': /* close */ + case CLOSE_REQUEST: /* close */ { int close_type; const char *close_target; @@ -4750,7 +4751,7 @@ PostgresMain(const char *dbname, const char *username) switch (close_type) { - case 'S': + case DESCRIBE_PREPARED: if (close_target[0] != '\0') DropPreparedStatement(close_target, false); else @@ -4759,7 +4760,7 @@ PostgresMain(const char *dbname, const char *username) drop_unnamed_stmt(); } break; - case 'P': + case DESCRIBE_PORTAL: { Portal portal; @@ -4777,13 +4778,13 @@ PostgresMain(const char *dbname, const char *username) } if (whereToSendOutput == DestRemote) - pq_putemptymessage('3'); /* CloseComplete */ + pq_putemptymessage(CLOSE_COMPLETE_RESPONSE); /* CloseComplete */ valgrind_report_error_query("CLOSE message"); } break; - case 'D': /* describe */ + case DESCRIBE_REQUEST: /* describe */ { int describe_type; const char *describe_target; @@ -4799,10 +4800,10 @@ PostgresMain(const char *dbname, const char *username) switch (describe_type) { - case 'S': + case DESCRIBE_PREPARED: exec_describe_statement_message(describe_target); break; - case 'P': + case DESCRIBE_PORTAL: exec_describe_portal_message(describe_target); break; default: @@ -4817,13 +4818,13 @@ PostgresMain(const char *dbname, const char *username) } break; - case 'H': /* flush */ + case FLUSH_DATA_REQUEST: /* flush */ pq_getmsgend(&input_message); if (whereToSendOutput == DestRemote) pq_flush(); break; - case 'S': /* sync */ + case SYNC_DATA_REQUEST: /* sync */ pq_getmsgend(&input_message); finish_xact_command(); valgrind_report_error_query("SYNC message"); @@ -4842,7 +4843,7 @@ PostgresMain(const char *dbname, const char *username) /* FALLTHROUGH */ - case 'X': + case TERMINATE_REQUEST: /* * Reset whereToSendOutput to prevent ereport from attempting @@ -4860,9 +4861,9 @@ PostgresMain(const char *dbname, const char *username) */ proc_exit(0); - case 'd': /* copy data */ - case 'c': /* copy done */ - case 'f': /* copy fail */ + case COPY_DATA: /* copy data */ + case COPY_DONE: /* copy done */ + case COPY_FAIL: /* copy fail */ /* * Accept but ignore these messages, per protocol spec; we @@ -4892,7 +4893,7 @@ forbidden_in_wal_sender(char firstchar) { if (am_walsender) { - if (firstchar == 'F') + if (firstchar == FUNCTION_CALL_REQUEST) ereport(ERROR, (errcode(ERRCODE_PROTOCOL_VIOLATION), errmsg("fastpath function calls not supported in a replication connection"))); diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 5898100acb..17c75479b6 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) ? NOTICE_RESPONSE : ERROR_RESPONSE); 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 9dd624b3ae..724b422b44 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" @@ -2592,7 +2593,7 @@ ReportGUCOption(struct config_generic *record) { StringInfoData msgbuf; - pq_beginmessage(&msgbuf, 'S'); + pq_beginmessage(&msgbuf, PARAMETER_STATUS_RESPONSE); 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..ffdaf91414 --- /dev/null +++ b/src/include/protocol.h @@ -0,0 +1,59 @@ +/*------------------------------------------------------------------------- + * + * 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 BIND_REQUEST 'B' +#define CLOSE_REQUEST 'C' +#define DESCRIBE_REQUEST 'D' +#define EXECUTE_REQUEST 'E' +#define FUNCTION_CALL_REQUEST 'F' +#define FLUSH_DATA_REQUEST 'H' +#define BACKEND_KEY_DATA 'K' +#define PARSE_REQUEST 'P' +#define AUTHENTICATION_REQUEST 'R' +#define SYNC_DATA_REQUEST 'S' +#define SIMPLE_QUERY 'Q' +#define TERMINATE_REQUEST 'X' +#define COPY_FAIL 'f' +#define COPY_DONE 'c' +#define COPY_DATA 'd' +#define COPY_PROGRESS 'p' +#define DESCRIBE_PREPARED 'S' +#define DESCRIBE_PORTAL 'P' + +/* +Responses +*/ +#define PARSE_COMPLETE_RESPONSE '1' +#define BIND_COMPLETE_RESPONSE '2' +#define CLOSE_COMPLETE_RESPONSE '3' +#define NOTIFY_RESPONSE 'A' +#define COMMAND_COMPLETE 'C' +#define DATA_ROW_RESPONSE 'D' +#define ERROR_RESPONSE 'E' +#define COPY_IN_RESPONSE 'G' +#define COPY_OUT_RESPONSE 'H' +#define EMPTY_QUERY_RESPONSE 'I' +#define NOTICE_RESPONSE 'N' +#define FUNCTION_CALL_RESPONSE 'V' +#define PARAMETER_STATUS_RESPONSE 'S' +#define ROW_DESCRIPTION_RESPONSE 'T' +#define COPY_BOTH_RESPONSE 'W' +#define READY_FOR_QUERY 'Z' +#define NO_DATA_RESPONSE 'n' +#define PASSWORD_RESPONSE 'p' +#define GSS_RESPONSE 'p' +#define PORTAL_SUSPENDED_RESPONSE 's' +#define PARAMETER_DESCRIPTION_RESPONSE 't' +#define NEGOTIATE_PROTOCOL '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 fe2634230a..b1158946df 100644 --- a/src/interfaces/libpq/fe-auth.c +++ b/src/interfaces/libpq/fe-auth.c @@ -42,6 +42,7 @@ #include "fe-auth.h" #include "fe-auth-sasl.h" #include "libpq-fe.h" +#include "protocol.h" #ifdef ENABLE_GSS /* @@ -585,7 +586,7 @@ pg_SASL_init(PGconn *conn, int payloadlen) /* * Build a SASLInitialResponse message, and send it. */ - if (pqPutMsgStart('p', conn)) + if (pqPutMsgStart(GSS_RESPONSE, 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 fcd3d0d9a3..035a5aa407 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" @@ -3593,7 +3594,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 == AUTHENTICATION_REQUEST || beresp == NEGOTIATE_PROTOCOL || beresp == ERROR_RESPONSE)) { libpq_append_conn_error(conn, "expected authentication request from server, but received %c", beresp); @@ -3620,19 +3621,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 == AUTHENTICATION_REQUEST && (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 == NEGOTIATE_PROTOCOL && (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 == ERROR_RESPONSE && (msgLength < 8 || msgLength > MAX_ERRLEN)) { /* Handle error from a pre-3.0 server */ conn->inCursor = conn->inStart + 1; /* reread data */ @@ -3695,7 +3696,7 @@ keep_going: /* We will come back to here until there is } /* Handle errors. */ - if (beresp == 'E') + if (beresp == ERROR_RESPONSE) { if (pqGetErrorNotice3(conn, true)) { @@ -3772,7 +3773,7 @@ keep_going: /* We will come back to here until there is goto error_return; } - else if (beresp == 'v') + else if (beresp == NEGOTIATE_PROTOCOL) { if (pqGetNegotiateProtocolVersion3(conn)) { @@ -4542,7 +4543,7 @@ sendTerminateConn(PGconn *conn) * Try to send "close connection" message to backend. Ignore any * error. */ - pqPutMsgStart('X', conn); + pqPutMsgStart(TERMINATE_REQUEST, conn); pqPutMsgEnd(conn); (void) pqFlush(conn); } diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index a16bbf32ef..850043dc91 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(SIMPLE_QUERY, 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(PARSE_REQUEST, 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(SYNC_DATA_REQUEST, 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(PARSE_REQUEST, 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(BIND_REQUEST, 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 || + if (pqPutMsgStart(DESCRIBE_PORTAL, conn) < 0 || pqPutc('P', conn) < 0 || pqPuts("", conn) < 0 || pqPutMsgEnd(conn) < 0) goto sendFailed; /* construct the Execute message */ - if (pqPutMsgStart('E', conn) < 0 || + if (pqPutMsgStart(EXECUTE_REQUEST, 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(SYNC_DATA_REQUEST, conn) < 0 || pqPutMsgEnd(conn) < 0) goto sendFailed; } @@ -2423,7 +2424,7 @@ PQdescribePrepared(PGconn *conn, const char *stmt) { if (!PQexecStart(conn)) return NULL; - if (!PQsendDescribe(conn, 'S', stmt)) + if (!PQsendDescribe(conn, DESCRIBE_PREPARED, stmt)) return NULL; return PQexecFinish(conn); } @@ -2442,7 +2443,7 @@ PQdescribePortal(PGconn *conn, const char *portal) { if (!PQexecStart(conn)) return NULL; - if (!PQsendDescribe(conn, 'P', portal)) + if (!PQsendDescribe(conn, DESCRIBE_PORTAL, portal)) return NULL; return PQexecFinish(conn); } @@ -2457,7 +2458,7 @@ PQdescribePortal(PGconn *conn, const char *portal) int PQsendDescribePrepared(PGconn *conn, const char *stmt) { - return PQsendDescribe(conn, 'S', stmt); + return PQsendDescribe(conn, DESCRIBE_PREPARED, stmt); } /* @@ -2470,7 +2471,7 @@ PQsendDescribePrepared(PGconn *conn, const char *stmt) int PQsendDescribePortal(PGconn *conn, const char *portal) { - return PQsendDescribe(conn, 'P', portal); + return PQsendDescribe(conn, DESCRIBE_PORTAL, portal); } /* @@ -2499,7 +2500,7 @@ PQsendDescribe(PGconn *conn, char desc_type, const char *desc_target) return 0; /* error msg already set */ /* construct the Describe message */ - if (pqPutMsgStart('D', conn) < 0 || + if (pqPutMsgStart(DESCRIBE_REQUEST, conn) < 0 || pqPutc(desc_type, conn) < 0 || pqPuts(desc_target, conn) < 0 || pqPutMsgEnd(conn) < 0) @@ -2508,7 +2509,7 @@ PQsendDescribe(PGconn *conn, char desc_type, const char *desc_target) /* construct the Sync message */ if (conn->pipelineStatus == PQ_PIPELINE_OFF) { - if (pqPutMsgStart('S', conn) < 0 || + if (pqPutMsgStart(SYNC_DATA_REQUEST, conn) < 0 || pqPutMsgEnd(conn) < 0) goto sendFailed; } @@ -2615,7 +2616,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(COPY_DATA, conn) < 0 || pqPutnchar(buffer, nbytes, conn) < 0 || pqPutMsgEnd(conn) < 0) return -1; @@ -2650,7 +2651,7 @@ PQputCopyEnd(PGconn *conn, const char *errormsg) if (errormsg) { /* Send COPY FAIL */ - if (pqPutMsgStart('f', conn) < 0 || + if (pqPutMsgStart(COPY_FAIL, conn) < 0 || pqPuts(errormsg, conn) < 0 || pqPutMsgEnd(conn) < 0) return -1; @@ -2658,7 +2659,7 @@ PQputCopyEnd(PGconn *conn, const char *errormsg) else { /* Send COPY DONE */ - if (pqPutMsgStart('c', conn) < 0 || + if (pqPutMsgStart(COPY_DONE, conn) < 0 || pqPutMsgEnd(conn) < 0) return -1; } @@ -2670,7 +2671,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(SYNC_DATA_REQUEST, conn) < 0 || pqPutMsgEnd(conn) < 0) return -1; } @@ -3181,7 +3182,7 @@ PQpipelineSync(PGconn *conn) entry->query = NULL; /* construct the Sync message */ - if (pqPutMsgStart('S', conn) < 0 || + if (pqPutMsgStart(SYNC_DATA_REQUEST, conn) < 0 || pqPutMsgEnd(conn) < 0) goto sendFailed; @@ -3229,7 +3230,7 @@ PQsendFlushRequest(PGconn *conn) return 0; } - if (pqPutMsgStart('H', conn) < 0 || + if (pqPutMsgStart(FLUSH_DATA_REQUEST, conn) < 0 || pqPutMsgEnd(conn) < 0) { return 0; diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c index 8ab6a88416..2e6c6c9132 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) == ROW_DESCRIPTION_RESPONSE || (id) == DATA_ROW_RESPONSE || (id) == COPY_DATA || \ + (id) == FUNCTION_CALL_RESPONSE || (id) == ERROR_RESPONSE || (id) == NOTICE_RESPONSE || \ + (id) == NOTIFY_RESPONSE) 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 == NOTIFY_RESPONSE) { if (getNotify(conn)) return; } - else if (id == 'N') + else if (id == NOTICE_RESPONSE) { 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 == ERROR_RESPONSE) { if (pqGetErrorNotice3(conn, false /* treat as notice */ )) return; } - else if (id == 'S') + else if (id == PARAMETER_STATUS_RESPONSE) { if (getParameterStatus(conn)) return; @@ -192,7 +194,7 @@ pqParseInput3(PGconn *conn) */ switch (id) { - case 'C': /* command complete */ + case COMMAND_COMPLETE: /* command complete */ 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 ERROR_RESPONSE: /* error return */ if (pqGetErrorNotice3(conn, true)) return; conn->asyncStatus = PGASYNC_READY; break; - case 'Z': /* sync response, backend is ready for new + case READY_FOR_QUERY: /* 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 EMPTY_QUERY_RESPONSE: /* empty query */ if (!pgHavePendingResult(conn)) { conn->result = PQmakeEmptyPGresult(conn, @@ -259,7 +261,7 @@ pqParseInput3(PGconn *conn) } conn->asyncStatus = PGASYNC_READY; break; - case '1': /* Parse Complete */ + case PARSE_COMPLETE_RESPONSE: /* Parse Complete */ /* If we're doing PQprepare, we're done; else ignore */ if (conn->cmd_queue_head && conn->cmd_queue_head->queryclass == PGQUERY_PREPARE) @@ -277,15 +279,15 @@ pqParseInput3(PGconn *conn) conn->asyncStatus = PGASYNC_READY; } break; - case '2': /* Bind Complete */ - case '3': /* Close Complete */ + case BIND_COMPLETE_RESPONSE: /* Bind Complete */ + case CLOSE_COMPLETE_RESPONSE: /* Close Complete */ /* Nothing to do for these message types */ break; - case 'S': /* parameter status */ + case PARAMETER_STATUS_RESPONSE: /* parameter status */ if (getParameterStatus(conn)) return; break; - case 'K': /* secret key data from the backend */ + case BACKEND_KEY_DATA: /* secret key data from the backend */ /* * This is expected only during backend startup, but it's @@ -297,7 +299,7 @@ pqParseInput3(PGconn *conn) if (pqGetInt(&(conn->be_key), 4, conn)) return; break; - case 'T': /* Row Description */ + case ROW_DESCRIPTION_RESPONSE: /* Row Description */ if (conn->error_result || (conn->result != NULL && conn->result->resultStatus == PGRES_FATAL_ERROR)) @@ -329,7 +331,7 @@ pqParseInput3(PGconn *conn) return; } break; - case 'n': /* No Data */ + case NO_DATA_RESPONSE: /* No Data */ /* * NoData indicates that we will not be seeing a @@ -357,11 +359,11 @@ pqParseInput3(PGconn *conn) conn->asyncStatus = PGASYNC_READY; } break; - case 't': /* Parameter Description */ + case PARAMETER_DESCRIPTION_RESPONSE: /* Parameter Description */ if (getParamDescriptions(conn, msgLength)) return; break; - case 'D': /* Data Row */ + case DATA_ROW_RESPONSE: /* Data Row */ if (conn->result != NULL && conn->result->resultStatus == PGRES_TUPLES_OK) { @@ -388,24 +390,24 @@ pqParseInput3(PGconn *conn) conn->inCursor += msgLength; } break; - case 'G': /* Start Copy In */ + case COPY_IN_RESPONSE: /* Start Copy In */ if (getCopyStart(conn, PGRES_COPY_IN)) return; conn->asyncStatus = PGASYNC_COPY_IN; break; - case 'H': /* Start Copy Out */ + case COPY_OUT_RESPONSE: /* Start Copy Out */ if (getCopyStart(conn, PGRES_COPY_OUT)) return; conn->asyncStatus = PGASYNC_COPY_OUT; conn->copy_already_done = 0; break; - case 'W': /* Start Copy Both */ + case COPY_BOTH_RESPONSE: /* Start Copy Both */ if (getCopyStart(conn, PGRES_COPY_BOTH)) return; conn->asyncStatus = PGASYNC_COPY_BOTH; conn->copy_already_done = 0; break; - case 'd': /* Copy Data */ + case COPY_DATA: /* Copy Data */ /* * If we see Copy Data, just silently drop it. This would @@ -414,7 +416,7 @@ pqParseInput3(PGconn *conn) */ conn->inCursor += msgLength; break; - case 'c': /* Copy Done */ + case COPY_DONE: /* Copy Done */ /* * If we see Copy Done, just silently drop it. This is @@ -1911,7 +1913,7 @@ pqEndcopy3(PGconn *conn) if (conn->asyncStatus == PGASYNC_COPY_IN || conn->asyncStatus == PGASYNC_COPY_BOTH) { - if (pqPutMsgStart('c', conn) < 0 || + if (pqPutMsgStart(COPY_DONE, conn) < 0 || pqPutMsgEnd(conn) < 0) return 1; @@ -1922,7 +1924,7 @@ pqEndcopy3(PGconn *conn) if (conn->cmd_queue_head && conn->cmd_queue_head->queryclass != PGQUERY_SIMPLE) { - if (pqPutMsgStart('S', conn) < 0 || + if (pqPutMsgStart(SYNC_DATA_REQUEST, conn) < 0 || pqPutMsgEnd(conn) < 0) return 1; } @@ -2005,7 +2007,7 @@ pqFunctionCall3(PGconn *conn, Oid fnid, /* PQfn already validated connection state */ - if (pqPutMsgStart('F', conn) < 0 || /* function call msg */ + if (pqPutMsgStart(FUNCTION_CALL_REQUEST, 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..a39228816d 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 */ @@ -562,72 +563,72 @@ pqTraceOutputMessage(PGconn *conn, const char *message, bool toServer) switch (id) { - case '1': + case PARSE_COMPLETE_RESPONSE: fprintf(conn->Pfdebug, "ParseComplete"); /* No message content */ break; - case '2': + case BIND_COMPLETE_RESPONSE: fprintf(conn->Pfdebug, "BindComplete"); /* No message content */ break; - case '3': + case CLOSE_COMPLETE_RESPONSE: fprintf(conn->Pfdebug, "CloseComplete"); /* No message content */ break; - case 'A': /* Notification Response */ + case NOTIFY_RESPONSE: /* Notification Response */ pqTraceOutputA(conn->Pfdebug, message, &logCursor, regress); break; - case 'B': /* Bind */ + case BIND_REQUEST: /* Bind */ pqTraceOutputB(conn->Pfdebug, message, &logCursor); break; - case 'c': + case COPY_DONE: fprintf(conn->Pfdebug, "CopyDone"); /* No message content */ break; - case 'C': /* Close(F) or Command Complete(B) */ + case COMMAND_COMPLETE: /* Close(F) or Command Complete(B) */ pqTraceOutputC(conn->Pfdebug, toServer, message, &logCursor); break; - case 'd': /* Copy Data */ + case COPY_DATA: /* Copy Data */ /* Drop COPY data to reduce the overhead of logging. */ break; - case 'D': /* Describe(F) or Data Row(B) */ + case DESCRIBE_REQUEST: /* Describe(F) or Data Row(B) */ pqTraceOutputD(conn->Pfdebug, toServer, message, &logCursor); break; - case 'E': /* Execute(F) or Error Response(B) */ + case EXECUTE_REQUEST: /* Execute(F) or Error Response(B) */ pqTraceOutputE(conn->Pfdebug, toServer, message, &logCursor, regress); break; - case 'f': /* Copy Fail */ + case COPY_FAIL: /* Copy Fail */ pqTraceOutputf(conn->Pfdebug, message, &logCursor); break; - case 'F': /* Function Call */ + case FUNCTION_CALL_REQUEST: /* Function Call */ pqTraceOutputF(conn->Pfdebug, message, &logCursor, regress); break; - case 'G': /* Start Copy In */ + case COPY_IN_RESPONSE: /* Start Copy In */ pqTraceOutputG(conn->Pfdebug, message, &logCursor); break; - case 'H': /* Flush(F) or Start Copy Out(B) */ + case FLUSH_DATA_REQUEST: /* 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 EMPTY_QUERY_RESPONSE: fprintf(conn->Pfdebug, "EmptyQueryResponse"); /* No message content */ break; - case 'K': /* secret key data from the backend */ + case BACKEND_KEY_DATA: /* secret key data from the backend */ pqTraceOutputK(conn->Pfdebug, message, &logCursor, regress); break; - case 'n': + case NO_DATA_RESPONSE: fprintf(conn->Pfdebug, "NoData"); /* No message content */ break; - case 'N': + case NOTICE_RESPONSE: pqTraceOutputNR(conn->Pfdebug, "NoticeResponse", message, &logCursor, regress); break; - case 'P': /* Parse */ + case PARSE_REQUEST: /* Parse */ pqTraceOutputP(conn->Pfdebug, message, &logCursor, regress); break; case 'Q': /* Query */ @@ -636,36 +637,36 @@ pqTraceOutputMessage(PGconn *conn, const char *message, bool toServer) case 'R': /* Authentication */ pqTraceOutputR(conn->Pfdebug, message, &logCursor); break; - case 's': + case PORTAL_SUSPENDED_RESPONSE: fprintf(conn->Pfdebug, "PortalSuspended"); /* No message content */ break; - case 'S': /* Parameter Status(B) or Sync(F) */ + case SYNC_DATA_REQUEST: /* 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 PARAMETER_DESCRIPTION_RESPONSE: /* Parameter Description */ pqTraceOutputt(conn->Pfdebug, message, &logCursor, regress); break; - case 'T': /* Row Description */ + case ROW_DESCRIPTION_RESPONSE: /* Row Description */ pqTraceOutputT(conn->Pfdebug, message, &logCursor, regress); break; - case 'v': /* Negotiate Protocol Version */ + case NEGOTIATE_PROTOCOL: /* Negotiate Protocol Version */ pqTraceOutputv(conn->Pfdebug, message, &logCursor); break; - case 'V': /* Function Call response */ + case FUNCTION_CALL_RESPONSE: /* Function Call response */ pqTraceOutputV(conn->Pfdebug, message, &logCursor); break; - case 'W': /* Start Copy Both */ + case COPY_BOTH_RESPONSE: /* Start Copy Both */ pqTraceOutputW(conn->Pfdebug, message, &logCursor, length); break; - case 'X': + case TERMINATE_REQUEST: fprintf(conn->Pfdebug, "Terminate"); /* No message content */ break; - case 'Z': /* Ready For Query */ + case READY_FOR_QUERY: /* Ready For Query */ pqTraceOutputZ(conn->Pfdebug, message, &logCursor); break; default: -- 2.37.1 (Apple Git-137.1)