Indent protocol.sgml
authorPeter Eisentraut <peter@eisentraut.org>
Fri, 13 May 2022 14:14:16 +0000 (16:14 +0200)
committerPeter Eisentraut <peter@eisentraut.org>
Fri, 13 May 2022 14:16:28 +0000 (16:16 +0200)
protocol.sgml had some unusual indentation that kept getting added on
to with new additions in that file.  This reindents it to be more in
line with the style elsewhere.

Discussion: https://www.postgresql.org/message-id/flat/15113594-649b-ce82-24c8-7522f1373da4%40enterprisedb.com

doc/src/sgml/protocol.sgml

index 75a7a76a55876345bb8c18ae52b8538ac8ac727d..a155370a3c4786d302ae8d296205d22cbf01a1c0 100644 (file)
@@ -1597,6679 +1597,5787 @@ SELCT 1/0;<!-- this typo is intentional -->
   </sect2>
  </sect1>
 
-<sect1 id="sasl-authentication">
-<title>SASL Authentication</title>
-
-<para>
-<firstterm>SASL</firstterm> is a framework for authentication in connection-oriented
-protocols. At the moment, <productname>PostgreSQL</productname> implements two SASL
-authentication mechanisms, SCRAM-SHA-256 and SCRAM-SHA-256-PLUS. More
-might be added in the future. The below steps illustrate how SASL
-authentication is performed in general, while the next subsection gives
-more details on SCRAM-SHA-256 and SCRAM-SHA-256-PLUS.
-</para>
-
-<procedure>
-<title>SASL Authentication Message Flow</title>
-
-<step id="sasl-auth-begin">
-<para>
-  To begin a SASL authentication exchange, the server sends an
-  AuthenticationSASL message. It includes a list of SASL authentication
-  mechanisms that the server can accept, in the server's preferred order.
-</para>
-</step>
-
-<step id="sasl-auth-initial-response">
-<para>
-  The client selects one of the supported mechanisms from the list, and sends
-  a SASLInitialResponse message to the server. The message includes the name
-  of the selected mechanism, and an optional Initial Client Response, if the
-  selected mechanism uses that.
-</para>
-</step>
-
-<step id="sasl-auth-continue">
-<para>
-  One or more server-challenge and client-response message will follow. Each
-  server-challenge is sent in an AuthenticationSASLContinue message, followed
-  by a response from client in a SASLResponse message. The particulars of
-  the messages are mechanism specific.
-</para>
-</step>
-
-<step id="sasl-auth-end">
-<para>
-  Finally, when the authentication exchange is completed successfully, the
-  server sends an AuthenticationSASLFinal message, followed
-  immediately by an AuthenticationOk message. The AuthenticationSASLFinal
-  contains additional server-to-client data, whose content is particular to the
-  selected authentication mechanism. If the authentication mechanism doesn't
-  use additional data that's sent at completion, the AuthenticationSASLFinal
-  message is not sent.
-</para>
-</step>
-</procedure>
-
-<para>
-On error, the server can abort the authentication at any stage, and send an
-ErrorMessage.
-</para>
-
- <sect2 id="sasl-scram-sha-256">
-  <title>SCRAM-SHA-256 Authentication</title>
+ <sect1 id="sasl-authentication">
+  <title>SASL Authentication</title>
 
   <para>
-   The implemented SASL mechanisms at the moment
-   are <literal>SCRAM-SHA-256</literal> and its variant with channel
-   binding <literal>SCRAM-SHA-256-PLUS</literal>. They are described in
-   detail in <ulink url="https://tools.ietf.org/html/rfc7677">RFC 7677</ulink>
-   and <ulink url="https://tools.ietf.org/html/rfc5802">RFC 5802</ulink>.
+   <firstterm>SASL</firstterm> is a framework for authentication in connection-oriented
+   protocols. At the moment, <productname>PostgreSQL</productname> implements two SASL
+   authentication mechanisms, SCRAM-SHA-256 and SCRAM-SHA-256-PLUS. More
+   might be added in the future. The below steps illustrate how SASL
+   authentication is performed in general, while the next subsection gives
+   more details on SCRAM-SHA-256 and SCRAM-SHA-256-PLUS.
   </para>
 
-  <para>
-When SCRAM-SHA-256 is used in PostgreSQL, the server will ignore the user name
-that the client sends in the <structname>client-first-message</structname>. The user name
-that was already sent in the startup message is used instead.
-<productname>PostgreSQL</productname> supports multiple character encodings, while SCRAM
-dictates UTF-8 to be used for the user name, so it might be impossible to
-represent the PostgreSQL user name in UTF-8.
-  </para>
+  <procedure>
+   <title>SASL Authentication Message Flow</title>
 
-  <para>
-The SCRAM specification dictates that the password is also in UTF-8, and is
-processed with the <firstterm>SASLprep</firstterm> algorithm.
-<productname>PostgreSQL</productname>, however, does not require UTF-8 to be used for
-the password. When a user's password is set, it is processed with SASLprep
-as if it was in UTF-8, regardless of the actual encoding used. However, if
-it is not a legal UTF-8 byte sequence, or it contains UTF-8 byte sequences
-that are prohibited by the SASLprep algorithm, the raw password will be used
-without SASLprep processing, instead of throwing an error. This allows the
-password to be normalized when it is in UTF-8, but still allows a non-UTF-8
-password to be used, and doesn't require the system to know which encoding
-the password is in.
-  </para>
+   <step id="sasl-auth-begin">
+    <para>
+     To begin a SASL authentication exchange, the server sends an
+     AuthenticationSASL message. It includes a list of SASL authentication
+     mechanisms that the server can accept, in the server's preferred order.
+    </para>
+   </step>
 
-  <para>
-<firstterm>Channel binding</firstterm> is supported in PostgreSQL builds with
-SSL support. The SASL mechanism name for SCRAM with channel binding is
-<literal>SCRAM-SHA-256-PLUS</literal>.  The channel binding type used by
-PostgreSQL is <literal>tls-server-end-point</literal>.
-  </para>
+   <step id="sasl-auth-initial-response">
+    <para>
+     The client selects one of the supported mechanisms from the list, and sends
+     a SASLInitialResponse message to the server. The message includes the name
+     of the selected mechanism, and an optional Initial Client Response, if the
+     selected mechanism uses that.
+    </para>
+   </step>
 
-  <para>
-   In <acronym>SCRAM</acronym> without channel binding, the server chooses
-   a random number that is transmitted to the client to be mixed with the
-   user-supplied password in the transmitted password hash.  While this
-   prevents the password hash from being successfully retransmitted in
-   a later session, it does not prevent a fake server between the real
-   server and client from passing through the server's random value
-   and successfully authenticating.
-  </para>
+   <step id="sasl-auth-continue">
+    <para>
+     One or more server-challenge and client-response message will follow. Each
+     server-challenge is sent in an AuthenticationSASLContinue message, followed
+     by a response from client in a SASLResponse message. The particulars of
+     the messages are mechanism specific.
+    </para>
+   </step>
+
+   <step id="sasl-auth-end">
+    <para>
+     Finally, when the authentication exchange is completed successfully, the
+     server sends an AuthenticationSASLFinal message, followed
+     immediately by an AuthenticationOk message. The AuthenticationSASLFinal
+     contains additional server-to-client data, whose content is particular to the
+     selected authentication mechanism. If the authentication mechanism doesn't
+     use additional data that's sent at completion, the AuthenticationSASLFinal
+     message is not sent.
+    </para>
+   </step>
+  </procedure>
 
   <para>
-   <acronym>SCRAM</acronym> with channel binding prevents such
-   man-in-the-middle attacks by mixing the signature of the server's
-   certificate into the transmitted password hash. While a fake server can
-   retransmit the real server's certificate, it doesn't have access to the
-   private key matching that certificate, and therefore cannot prove it is
-   the owner, causing SSL connection failure.
+   On error, the server can abort the authentication at any stage, and send an
+   ErrorMessage.
   </para>
 
-<procedure>
-<title>Example</title>
-  <step id="scram-begin">
-<para>
-  The server sends an AuthenticationSASL message. It includes a list of
-  SASL authentication mechanisms that the server can accept.
-  This will be <literal>SCRAM-SHA-256-PLUS</literal>
-  and <literal>SCRAM-SHA-256</literal> if the server is built with SSL
-  support, or else just the latter.
-</para>
-</step>
-<step id="scram-client-first">
-<para>
-  The client responds by sending a SASLInitialResponse message, which
-  indicates the chosen mechanism, <literal>SCRAM-SHA-256</literal> or
-  <literal>SCRAM-SHA-256-PLUS</literal>. (A client is free to choose either
-  mechanism, but for better security it should choose the channel-binding
-  variant if it can support it.) In the Initial Client response field, the
-  message contains the SCRAM <structname>client-first-message</structname>.
-  The <structname>client-first-message</structname> also contains the channel
-  binding type chosen by the client.
-</para>
-</step>
-<step id="scram-server-first">
-<para>
-  Server sends an AuthenticationSASLContinue message, with a SCRAM
-  <structname>server-first-message</structname> as the content.
-</para>
-</step>
-<step id="scram-client-final">
-<para>
-  Client sends a SASLResponse message, with SCRAM
-  <structname>client-final-message</structname> as the content.
-</para>
-</step>
-<step id="scram-server-final">
-<para>
-  Server sends an AuthenticationSASLFinal message, with the SCRAM
-  <structname>server-final-message</structname>, followed immediately by
-  an AuthenticationOk message.
-</para>
-</step>
-</procedure>
-</sect2>
-</sect1>
+  <sect2 id="sasl-scram-sha-256">
+   <title>SCRAM-SHA-256 Authentication</title>
 
-<sect1 id="protocol-replication">
-<title>Streaming Replication Protocol</title>
-
-<para>
-To initiate streaming replication, the frontend sends the
-<literal>replication</literal> parameter in the startup message. A Boolean
-value of <literal>true</literal> (or <literal>on</literal>,
-<literal>yes</literal>, <literal>1</literal>) tells the backend to go into
-physical replication walsender mode, wherein a small set of replication
-commands, shown below, can be issued instead of SQL statements.
-</para>
-
-<para>
-Passing <literal>database</literal> as the value for the
-<literal>replication</literal> parameter instructs the backend to go into
-logical replication walsender mode, connecting to the database specified in
-the <literal>dbname</literal> parameter.  In logical replication walsender
-mode, the replication commands shown below as well as normal SQL commands can
-be issued.
-</para>
-
-<para>
-In either physical replication or logical replication walsender mode, only the
-simple query protocol can be used.
-</para>
-
-<para>
- For the purpose of testing replication commands, you can make a replication
- connection via <application>psql</application> or any other
- <application>libpq</application>-using tool with a connection string including
- the <literal>replication</literal> option,
- e.g.:
-<programlisting>
-psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
-</programlisting>
- However, it is often more useful to use
- <xref linkend="app-pgreceivewal"/> (for physical replication) or
- <xref linkend="app-pgrecvlogical"/> (for logical replication).
-</para>
-
-<para>
-Replication commands are logged in the server log when
-<xref linkend="guc-log-replication-commands"/> is enabled.
-</para>
-
-<para>
-The commands accepted in replication mode are:
-<variablelist>
-  <varlistentry id="protocol-replication-identify-system">
-    <term><literal>IDENTIFY_SYSTEM</literal>
-     <indexterm><primary>IDENTIFY_SYSTEM</primary></indexterm>
-    </term>
-    <listitem>
-     <para>
-      Requests the server to identify itself. Server replies with a result
-      set of a single row, containing four fields:
-     </para>
+   <para>
+    The implemented SASL mechanisms at the moment
+    are <literal>SCRAM-SHA-256</literal> and its variant with channel
+    binding <literal>SCRAM-SHA-256-PLUS</literal>. They are described in
+    detail in <ulink url="https://tools.ietf.org/html/rfc7677">RFC 7677</ulink>
+    and <ulink url="https://tools.ietf.org/html/rfc5802">RFC 5802</ulink>.
+   </para>
 
-     <para>
-      <variablelist>
-      <varlistentry>
-      <term>
-       <literal>systemid</literal> (<type>text</type>)
-      </term>
-      <listitem>
-      <para>
-       The unique system identifier identifying the cluster. This
-       can be used to check that the base backup used to initialize the
-       standby came from the same cluster.
-      </para>
-      </listitem>
-      </varlistentry>
+   <para>
+    When SCRAM-SHA-256 is used in PostgreSQL, the server will ignore the user name
+    that the client sends in the <structname>client-first-message</structname>. The user name
+    that was already sent in the startup message is used instead.
+    <productname>PostgreSQL</productname> supports multiple character encodings, while SCRAM
+    dictates UTF-8 to be used for the user name, so it might be impossible to
+    represent the PostgreSQL user name in UTF-8.
+   </para>
 
-      <varlistentry>
-      <term>
-       <literal>timeline</literal> (<type>int4</type>)
-      </term>
-      <listitem>
-      <para>
-       Current timeline ID. Also useful to check that the standby is
-       consistent with the primary.
-      </para>
-      </listitem>
-      </varlistentry>
+   <para>
+    The SCRAM specification dictates that the password is also in UTF-8, and is
+    processed with the <firstterm>SASLprep</firstterm> algorithm.
+    <productname>PostgreSQL</productname>, however, does not require UTF-8 to be used for
+    the password. When a user's password is set, it is processed with SASLprep
+    as if it was in UTF-8, regardless of the actual encoding used. However, if
+    it is not a legal UTF-8 byte sequence, or it contains UTF-8 byte sequences
+    that are prohibited by the SASLprep algorithm, the raw password will be used
+    without SASLprep processing, instead of throwing an error. This allows the
+    password to be normalized when it is in UTF-8, but still allows a non-UTF-8
+    password to be used, and doesn't require the system to know which encoding
+    the password is in.
+   </para>
 
-      <varlistentry>
-      <term>
-       <literal>xlogpos</literal> (<type>text</type>)
-      </term>
-      <listitem>
-      <para>
-       Current WAL flush location. Useful to get a known location in the
-       write-ahead log where streaming can start.
-      </para>
-      </listitem>
-      </varlistentry>
+   <para>
+    <firstterm>Channel binding</firstterm> is supported in PostgreSQL builds with
+    SSL support. The SASL mechanism name for SCRAM with channel binding is
+    <literal>SCRAM-SHA-256-PLUS</literal>.  The channel binding type used by
+    PostgreSQL is <literal>tls-server-end-point</literal>.
+   </para>
 
-      <varlistentry>
-      <term>
-       <literal>dbname</literal> (<type>text</type>)
-      </term>
-      <listitem>
-      <para>
-       Database connected to or null.
-      </para>
-      </listitem>
-      </varlistentry>
+   <para>
+    In <acronym>SCRAM</acronym> without channel binding, the server chooses
+    a random number that is transmitted to the client to be mixed with the
+    user-supplied password in the transmitted password hash.  While this
+    prevents the password hash from being successfully retransmitted in
+    a later session, it does not prevent a fake server between the real
+    server and client from passing through the server's random value
+    and successfully authenticating.
+   </para>
 
-      </variablelist>
-     </para>
-    </listitem>
-  </varlistentry>
+   <para>
+    <acronym>SCRAM</acronym> with channel binding prevents such
+    man-in-the-middle attacks by mixing the signature of the server's
+    certificate into the transmitted password hash. While a fake server can
+    retransmit the real server's certificate, it doesn't have access to the
+    private key matching that certificate, and therefore cannot prove it is
+    the owner, causing SSL connection failure.
+   </para>
 
-  <varlistentry id="protocol-replication-show">
-    <term><literal>SHOW</literal> <replaceable class="parameter">name</replaceable>
-     <indexterm><primary>SHOW</primary></indexterm>
-    </term>
-    <listitem>
+   <procedure>
+    <title>Example</title>
+    <step id="scram-begin">
      <para>
-      Requests the server to send the current setting of a run-time parameter.
-      This is similar to the SQL command <xref linkend="sql-show"/>.
+      The server sends an AuthenticationSASL message. It includes a list of
+      SASL authentication mechanisms that the server can accept.
+      This will be <literal>SCRAM-SHA-256-PLUS</literal>
+      and <literal>SCRAM-SHA-256</literal> if the server is built with SSL
+      support, or else just the latter.
      </para>
+    </step>
 
-     <variablelist>
-      <varlistentry>
-       <term><replaceable class="parameter">name</replaceable></term>
-       <listitem>
-         <para>
-          The name of a run-time parameter. Available parameters are documented
-          in <xref linkend="runtime-config"/>.
-         </para>
-       </listitem>
-      </varlistentry>
-     </variablelist>
-    </listitem>
-  </varlistentry>
-
-  <varlistentry id="protocol-replication-timeline-history">
-    <term><literal>TIMELINE_HISTORY</literal> <replaceable class="parameter">tli</replaceable>
-     <indexterm><primary>TIMELINE_HISTORY</primary></indexterm>
-    </term>
-    <listitem>
+    <step id="scram-client-first">
      <para>
-      Requests the server to send over the timeline history file for timeline
-      <replaceable class="parameter">tli</replaceable>.  Server replies with a
-      result set of a single row, containing two fields.  While the fields
-      are labeled as <type>text</type>, they effectively return raw bytes,
-      with no encoding conversion:
+      The client responds by sending a SASLInitialResponse message, which
+      indicates the chosen mechanism, <literal>SCRAM-SHA-256</literal> or
+      <literal>SCRAM-SHA-256-PLUS</literal>. (A client is free to choose either
+      mechanism, but for better security it should choose the channel-binding
+      variant if it can support it.) In the Initial Client response field, the
+      message contains the SCRAM <structname>client-first-message</structname>.
+      The <structname>client-first-message</structname> also contains the channel
+      binding type chosen by the client.
      </para>
+    </step>
 
+    <step id="scram-server-first">
      <para>
-      <variablelist>
-      <varlistentry>
-      <term>
-       <literal>filename</literal> (<type>text</type>)
-      </term>
-      <listitem>
-      <para>
-       File name of the timeline history file, e.g., <filename>00000002.history</filename>.
-      </para>
-      </listitem>
-      </varlistentry>
-
-      <varlistentry>
-      <term>
-       <literal>content</literal> (<type>text</type>)
-      </term>
-      <listitem>
-      <para>
-       Contents of the timeline history file.
-      </para>
-      </listitem>
-      </varlistentry>
+      Server sends an AuthenticationSASLContinue message, with a SCRAM
+      <structname>server-first-message</structname> as the content.
+     </para>
+    </step>
 
-      </variablelist>
+    <step id="scram-client-final">
+     <para>
+      Client sends a SASLResponse message, with SCRAM
+      <structname>client-final-message</structname> as the content.
      </para>
-    </listitem>
-  </varlistentry>
+    </step>
 
-  <varlistentry id="protocol-replication-create-replication-slot" xreflabel="CREATE_REPLICATION_SLOT">
-   <term><literal>CREATE_REPLICATION_SLOT</literal> <replaceable class="parameter">slot_name</replaceable> [ <literal>TEMPORARY</literal> ] { <literal>PHYSICAL</literal> | <literal>LOGICAL</literal> } [ ( <replaceable class="parameter">option</replaceable> [, ...] ) ]
-     <indexterm><primary>CREATE_REPLICATION_SLOT</primary></indexterm>
-    </term>
-    <listitem>
+    <step id="scram-server-final">
      <para>
-      Create a physical or logical replication
-      slot. See <xref linkend="streaming-replication-slots"/> for more about
-      replication slots.
+      Server sends an AuthenticationSASLFinal message, with the SCRAM
+      <structname>server-final-message</structname>, followed immediately by
+      an AuthenticationOk message.
      </para>
-     <variablelist>
-      <varlistentry>
-       <term><replaceable class="parameter">slot_name</replaceable></term>
-       <listitem>
-         <para>
-          The name of the slot to create. Must be a valid replication slot
-          name (see <xref linkend="streaming-replication-slots-manipulation"/>).
-         </para>
-       </listitem>
-      </varlistentry>
+    </step>
+   </procedure>
+  </sect2>
+ </sect1>
 
-      <varlistentry>
-       <term><replaceable class="parameter">output_plugin</replaceable></term>
-       <listitem>
-         <para>
-          The name of the output plugin used for logical decoding
-          (see <xref linkend="logicaldecoding-output-plugin"/>).
-         </para>
-       </listitem>
-      </varlistentry>
+ <sect1 id="protocol-replication">
+  <title>Streaming Replication Protocol</title>
 
-      <varlistentry>
-       <term><literal>TEMPORARY</literal></term>
-       <listitem>
-        <para>
-         Specify that this replication slot is a temporary one. Temporary
-         slots are not saved to disk and are automatically dropped on error
-         or when the session has finished.
-        </para>
-       </listitem>
-      </varlistentry>
-     </variablelist>
+  <para>
+   To initiate streaming replication, the frontend sends the
+   <literal>replication</literal> parameter in the startup message. A Boolean
+   value of <literal>true</literal> (or <literal>on</literal>,
+   <literal>yes</literal>, <literal>1</literal>) tells the backend to go into
+   physical replication walsender mode, wherein a small set of replication
+   commands, shown below, can be issued instead of SQL statements.
+  </para>
+
+  <para>
+   Passing <literal>database</literal> as the value for the
+   <literal>replication</literal> parameter instructs the backend to go into
+   logical replication walsender mode, connecting to the database specified in
+   the <literal>dbname</literal> parameter.  In logical replication walsender
+   mode, the replication commands shown below as well as normal SQL commands can
+   be issued.
+  </para>
 
-     <para>The following options are supported:</para>
+  <para>
+   In either physical replication or logical replication walsender mode, only the
+   simple query protocol can be used.
+  </para>
 
-     <variablelist>
-      <varlistentry>
-       <term><literal>TWO_PHASE [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
-       <listitem>
-        <para>
-         If true, this logical replication slot supports decoding of two-phase
-         transactions. With this option, two-phase commands like
-         <literal>PREPARE TRANSACTION</literal>, <literal>COMMIT PREPARED</literal>
-         and <literal>ROLLBACK PREPARED</literal> are decoded and transmitted.
-         The transaction will be decoded and transmitted at
-         <literal>PREPARE TRANSACTION</literal> time.
-         The default is false.
-        </para>
-       </listitem>
-      </varlistentry>
+  <para>
+   For the purpose of testing replication commands, you can make a replication
+   connection via <application>psql</application> or any other
+   <application>libpq</application>-using tool with a connection string including
+   the <literal>replication</literal> option,
+   e.g.:
+<programlisting>
+psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
+</programlisting>
+   However, it is often more useful to use
+   <xref linkend="app-pgreceivewal"/> (for physical replication) or
+   <xref linkend="app-pgrecvlogical"/> (for logical replication).
+  </para>
 
-      <varlistentry>
-       <term><literal>RESERVE_WAL [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
-       <listitem>
-        <para>
-         If true, this physical replication slot reserves <acronym>WAL</acronym>
-         immediately.  Otherwise, <acronym>WAL</acronym> is only reserved upon
-         connection from a streaming replication client.
-         The default is false.
-        </para>
-       </listitem>
-      </varlistentry>
+  <para>
+   Replication commands are logged in the server log when
+   <xref linkend="guc-log-replication-commands"/> is enabled.
+  </para>
 
-      <varlistentry>
-       <term><literal>SNAPSHOT { 'export' | 'use' | 'nothing' }</literal></term>
-       <listitem>
-        <para>
-         Decides what to do with the snapshot created during logical slot
-         initialization. <literal>'export'</literal>, which is the default,
-         will export the snapshot for use in other sessions. This option can't
-         be used inside a transaction.  <literal>'use'</literal> will use the
-         snapshot for the current transaction executing the command. This
-         option must be used in a transaction, and
-         <literal>CREATE_REPLICATION_SLOT</literal> must be the first command
-         run in that transaction.  Finally, <literal>'nothing'</literal> will
-         just use the snapshot for logical decoding as normal but won't do
-         anything else with it.
-        </para>
-       </listitem>
-      </varlistentry>
-     </variablelist>
+  <para>
+   The commands accepted in replication mode are:
 
-     <para>
-      In response to this command, the server will send a one-row result set
-      containing the following fields:
+   <variablelist>
+    <varlistentry id="protocol-replication-identify-system">
+     <term><literal>IDENTIFY_SYSTEM</literal>
+      <indexterm><primary>IDENTIFY_SYSTEM</primary></indexterm>
+     </term>
+     <listitem>
+      <para>
+       Requests the server to identify itself. Server replies with a result
+       set of a single row, containing four fields:
+      </para>
 
       <variablelist>
        <varlistentry>
-        <term><literal>slot_name</literal> (<type>text</type>)</term>
+        <term><literal>systemid</literal> (<type>text</type>)</term>
         <listitem>
          <para>
-          The name of the newly-created replication slot.
+          The unique system identifier identifying the cluster. This
+          can be used to check that the base backup used to initialize the
+          standby came from the same cluster.
          </para>
         </listitem>
        </varlistentry>
 
        <varlistentry>
-        <term><literal>consistent_point</literal> (<type>text</type>)</term>
+        <term><literal>timeline</literal> (<type>int4</type>)</term>
         <listitem>
          <para>
-          The WAL location at which the slot became consistent.  This is the
-          earliest location from which streaming can start on this replication
-          slot.
+          Current timeline ID. Also useful to check that the standby is
+          consistent with the primary.
          </para>
         </listitem>
        </varlistentry>
 
        <varlistentry>
-        <term><literal>snapshot_name</literal> (<type>text</type>)</term>
+        <term><literal>xlogpos</literal> (<type>text</type>)</term>
         <listitem>
          <para>
-          The identifier of the snapshot exported by the command.  The
-          snapshot is valid until a new command is executed on this connection
-          or the replication connection is closed.  Null if the created slot
-          is physical.
+          Current WAL flush location. Useful to get a known location in the
+          write-ahead log where streaming can start.
          </para>
         </listitem>
        </varlistentry>
 
        <varlistentry>
-        <term><literal>output_plugin</literal> (<type>text</type>)</term>
+        <term><literal>dbname</literal> (<type>text</type>)</term>
         <listitem>
          <para>
-          The name of the output plugin used by the newly-created replication
-          slot.  Null if the created slot is physical.
+          Database connected to or null.
          </para>
         </listitem>
        </varlistentry>
       </variablelist>
-     </para>
-    </listitem>
-  </varlistentry>
+     </listitem>
+    </varlistentry>
 
-  <varlistentry id="protocol-replication-create-replication-slot-legacy">
-    <term><literal>CREATE_REPLICATION_SLOT</literal> <replaceable class="parameter">slot_name</replaceable> [ <literal>TEMPORARY</literal> ] { <literal>PHYSICAL</literal> [ <literal>RESERVE_WAL</literal> ] | <literal>LOGICAL</literal> <replaceable class="parameter">output_plugin</replaceable> [ <literal>EXPORT_SNAPSHOT</literal> | <literal>NOEXPORT_SNAPSHOT</literal> | <literal>USE_SNAPSHOT</literal> | <literal>TWO_PHASE</literal> ] }
-    </term>
-    <listitem>
-     <para>
-      For compatibility with older releases, this alternative syntax for
-      the <literal>CREATE_REPLICATION_SLOT</literal> command is still supported.
-     </para>
-    </listitem>
-  </varlistentry>
+    <varlistentry id="protocol-replication-show">
+     <term><literal>SHOW</literal> <replaceable class="parameter">name</replaceable>
+      <indexterm><primary>SHOW</primary></indexterm>
+     </term>
+     <listitem>
+      <para>
+       Requests the server to send the current setting of a run-time parameter.
+       This is similar to the SQL command <xref linkend="sql-show"/>.
+      </para>
 
-  <varlistentry id="protocol-replication-read-replication-slot">
-    <term><literal>READ_REPLICATION_SLOT</literal> <replaceable class="parameter">slot_name</replaceable>
-      <indexterm><primary>READ_REPLICATION_SLOT</primary></indexterm>
-    </term>
-    <listitem>
-     <para>
-      Read some information associated with a replication slot. Returns a tuple
-      with <literal>NULL</literal> values if the replication slot does not
-      exist. This command is currently only supported for physical replication
-      slots.
-     </para>
-     <para>
-      In response to this command, the server will return a one-row result set,
-      containing the following fields:
       <variablelist>
        <varlistentry>
-        <term><literal>slot_type</literal> (<type>text</type>)</term>
+        <term><replaceable class="parameter">name</replaceable></term>
         <listitem>
          <para>
-          The replication slot's type, either <literal>physical</literal> or
-          <literal>NULL</literal>.
+          The name of a run-time parameter. Available parameters are documented
+          in <xref linkend="runtime-config"/>.
          </para>
         </listitem>
        </varlistentry>
+      </variablelist>
+     </listitem>
+    </varlistentry>
+
+    <varlistentry id="protocol-replication-timeline-history">
+     <term><literal>TIMELINE_HISTORY</literal> <replaceable class="parameter">tli</replaceable>
+      <indexterm><primary>TIMELINE_HISTORY</primary></indexterm>
+     </term>
+     <listitem>
+      <para>
+       Requests the server to send over the timeline history file for timeline
+       <replaceable class="parameter">tli</replaceable>.  Server replies with a
+       result set of a single row, containing two fields.  While the fields
+       are labeled as <type>text</type>, they effectively return raw bytes,
+       with no encoding conversion:
+      </para>
 
+      <variablelist>
        <varlistentry>
-        <term><literal>restart_lsn</literal> (<type>text</type>)</term>
+        <term><literal>filename</literal> (<type>text</type>)</term>
         <listitem>
          <para>
-          The replication slot's <literal>restart_lsn</literal>.
+          File name of the timeline history file, e.g., <filename>00000002.history</filename>.
          </para>
         </listitem>
        </varlistentry>
 
        <varlistentry>
-        <term><literal>restart_tli</literal> (<type>int8</type>)</term>
+        <term><literal>content</literal> (<type>text</type>)</term>
         <listitem>
          <para>
-          The timeline ID associated with <literal>restart_lsn</literal>,
-          following the current timeline history.
+          Contents of the timeline history file.
          </para>
         </listitem>
        </varlistentry>
       </variablelist>
-     </para>
-    </listitem>
-  </varlistentry>
+     </listitem>
+    </varlistentry>
 
-  <varlistentry id="protocol-replication-start-replication">
-    <term><literal>START_REPLICATION</literal> [ <literal>SLOT</literal> <replaceable class="parameter">slot_name</replaceable> ] [ <literal>PHYSICAL</literal> ] <replaceable class="parameter">XXX/XXX</replaceable> [ <literal>TIMELINE</literal> <replaceable class="parameter">tli</replaceable> ]
-     <indexterm><primary>START_REPLICATION</primary></indexterm>
-    </term>
-    <listitem>
-     <para>
-      Instructs server to start streaming WAL, starting at
-      WAL location <replaceable class="parameter">XXX/XXX</replaceable>.
-      If <literal>TIMELINE</literal> option is specified,
-      streaming starts on timeline <replaceable class="parameter">tli</replaceable>;
-      otherwise, the server's current timeline is selected. The server can
-      reply with an error, for example if the requested section of WAL has already
-      been recycled. On success, the server responds with a CopyBothResponse
-      message, and then starts to stream WAL to the frontend.
-     </para>
+    <varlistentry id="protocol-replication-create-replication-slot" xreflabel="CREATE_REPLICATION_SLOT">
+     <term><literal>CREATE_REPLICATION_SLOT</literal> <replaceable class="parameter">slot_name</replaceable> [ <literal>TEMPORARY</literal> ] { <literal>PHYSICAL</literal> | <literal>LOGICAL</literal> } [ ( <replaceable class="parameter">option</replaceable> [, ...] ) ]
+      <indexterm><primary>CREATE_REPLICATION_SLOT</primary></indexterm>
+     </term>
+     <listitem>
+      <para>
+       Create a physical or logical replication
+       slot. See <xref linkend="streaming-replication-slots"/> for more about
+       replication slots.
+      </para>
 
-     <para>
-      If a slot's name is provided
-      via <replaceable class="parameter">slot_name</replaceable>, it will be updated
-      as replication progresses so that the server knows which WAL segments,
-      and if <varname>hot_standby_feedback</varname> is on which transactions,
-      are still needed by the standby.
-     </para>
+      <variablelist>
+       <varlistentry>
+        <term><replaceable class="parameter">slot_name</replaceable></term>
+        <listitem>
+         <para>
+          The name of the slot to create. Must be a valid replication slot
+          name (see <xref linkend="streaming-replication-slots-manipulation"/>).
+         </para>
+        </listitem>
+       </varlistentry>
 
-     <para>
-      If the client requests a timeline that's not the latest but is part of
-      the history of the server, the server will stream all the WAL on that
-      timeline starting from the requested start point up to the point where
-      the server switched to another timeline. If the client requests
-      streaming at exactly the end of an old timeline, the server skips COPY
-      mode entirely.
-     </para>
+       <varlistentry>
+        <term><replaceable class="parameter">output_plugin</replaceable></term>
+        <listitem>
+         <para>
+          The name of the output plugin used for logical decoding
+          (see <xref linkend="logicaldecoding-output-plugin"/>).
+         </para>
+        </listitem>
+       </varlistentry>
 
-     <para>
-      After streaming all the WAL on a timeline that is not the latest one,
-      the server will end streaming by exiting the COPY mode. When the client
-      acknowledges this by also exiting COPY mode, the server sends a result
-      set with one row and two columns, indicating the next timeline in this
-      server's history. The first column is the next timeline's ID (type <type>int8</type>), and the
-      second column is the WAL location where the switch happened (type <type>text</type>). Usually,
-      the switch position is the end of the WAL that was streamed, but there
-      are corner cases where the server can send some WAL from the old
-      timeline that it has not itself replayed before promoting. Finally, the
-      server sends two CommandComplete messages (one that ends the CopyData
-      and the other ends the <literal>START_REPLICATION</literal> itself), and
-      is ready to accept a new command.
-     </para>
+       <varlistentry>
+        <term><literal>TEMPORARY</literal></term>
+        <listitem>
+         <para>
+          Specify that this replication slot is a temporary one. Temporary
+          slots are not saved to disk and are automatically dropped on error
+          or when the session has finished.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
 
-     <para>
-      WAL data is sent as a series of CopyData messages.  (This allows
-      other information to be intermixed; in particular the server can send
-      an ErrorResponse message if it encounters a failure after beginning
-      to stream.)  The payload of each CopyData message from server to the
-      client contains a message of one of the following formats:
-     </para>
+      <para>The following options are supported:</para>
 
-     <para>
-      <variablelist>
-      <varlistentry id="protocol-replication-xlogdata">
-      <term>
-          XLogData (B)
-      </term>
-      <listitem>
-      <para>
       <variablelist>
-      <varlistentry>
-      <term>
-          Byte1('w')
-      </term>
-      <listitem>
-      <para>
-          Identifies the message as WAL data.
-      </para>
-      </listitem>
-      </varlistentry>
-      <varlistentry>
-      <term>
-          Int64
-      </term>
-      <listitem>
-      <para>
-          The starting point of the WAL data in this message.
-      </para>
-      </listitem>
-      </varlistentry>
-      <varlistentry>
-      <term>
-          Int64
-      </term>
-      <listitem>
-      <para>
-          The current end of WAL on the server.
-      </para>
-      </listitem>
+       <varlistentry>
+        <term><literal>TWO_PHASE [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
+        <listitem>
+         <para>
+          If true, this logical replication slot supports decoding of two-phase
+          transactions. With this option, two-phase commands like
+          <literal>PREPARE TRANSACTION</literal>, <literal>COMMIT PREPARED</literal>
+          and <literal>ROLLBACK PREPARED</literal> are decoded and transmitted.
+          The transaction will be decoded and transmitted at
+          <literal>PREPARE TRANSACTION</literal> time.
+          The default is false.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>RESERVE_WAL [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
+        <listitem>
+         <para>
+          If true, this physical replication slot reserves <acronym>WAL</acronym>
+          immediately.  Otherwise, <acronym>WAL</acronym> is only reserved upon
+          connection from a streaming replication client.
+          The default is false.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>SNAPSHOT { 'export' | 'use' | 'nothing' }</literal></term>
+        <listitem>
+         <para>
+          Decides what to do with the snapshot created during logical slot
+          initialization. <literal>'export'</literal>, which is the default,
+          will export the snapshot for use in other sessions. This option can't
+          be used inside a transaction.  <literal>'use'</literal> will use the
+          snapshot for the current transaction executing the command. This
+          option must be used in a transaction, and
+          <literal>CREATE_REPLICATION_SLOT</literal> must be the first command
+          run in that transaction.  Finally, <literal>'nothing'</literal> will
+          just use the snapshot for logical decoding as normal but won't do
+          anything else with it.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+
+      <para>
+       In response to this command, the server will send a one-row result set
+       containing the following fields:
+
+       <variablelist>
+        <varlistentry>
+         <term><literal>slot_name</literal> (<type>text</type>)</term>
+         <listitem>
+          <para>
+           The name of the newly-created replication slot.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>consistent_point</literal> (<type>text</type>)</term>
+         <listitem>
+          <para>
+           The WAL location at which the slot became consistent.  This is the
+           earliest location from which streaming can start on this replication
+           slot.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>snapshot_name</literal> (<type>text</type>)</term>
+         <listitem>
+          <para>
+           The identifier of the snapshot exported by the command.  The
+           snapshot is valid until a new command is executed on this connection
+           or the replication connection is closed.  Null if the created slot
+           is physical.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>output_plugin</literal> (<type>text</type>)</term>
+         <listitem>
+          <para>
+           The name of the output plugin used by the newly-created replication
+           slot.  Null if the created slot is physical.
+          </para>
+         </listitem>
+        </varlistentry>
+       </variablelist>
+      </para>
+     </listitem>
+    </varlistentry>
+
+    <varlistentry id="protocol-replication-create-replication-slot-legacy">
+     <term><literal>CREATE_REPLICATION_SLOT</literal> <replaceable class="parameter">slot_name</replaceable> [ <literal>TEMPORARY</literal> ] { <literal>PHYSICAL</literal> [ <literal>RESERVE_WAL</literal> ] | <literal>LOGICAL</literal> <replaceable class="parameter">output_plugin</replaceable> [ <literal>EXPORT_SNAPSHOT</literal> | <literal>NOEXPORT_SNAPSHOT</literal> | <literal>USE_SNAPSHOT</literal> | <literal>TWO_PHASE</literal> ] }
+     </term>
+     <listitem>
+      <para>
+       For compatibility with older releases, this alternative syntax for
+       the <literal>CREATE_REPLICATION_SLOT</literal> command is still supported.
+      </para>
+     </listitem>
+    </varlistentry>
+
+    <varlistentry id="protocol-replication-read-replication-slot">
+     <term><literal>READ_REPLICATION_SLOT</literal> <replaceable class="parameter">slot_name</replaceable>
+      <indexterm><primary>READ_REPLICATION_SLOT</primary></indexterm>
+     </term>
+     <listitem>
+      <para>
+       Read some information associated with a replication slot. Returns a tuple
+       with <literal>NULL</literal> values if the replication slot does not
+       exist. This command is currently only supported for physical replication
+       slots.
+      </para>
+
+      <para>
+       In response to this command, the server will return a one-row result set,
+       containing the following fields:
+       <variablelist>
+        <varlistentry>
+         <term><literal>slot_type</literal> (<type>text</type>)</term>
+         <listitem>
+          <para>
+           The replication slot's type, either <literal>physical</literal> or
+           <literal>NULL</literal>.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>restart_lsn</literal> (<type>text</type>)</term>
+         <listitem>
+          <para>
+           The replication slot's <literal>restart_lsn</literal>.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>restart_tli</literal> (<type>int8</type>)</term>
+         <listitem>
+          <para>
+           The timeline ID associated with <literal>restart_lsn</literal>,
+           following the current timeline history.
+          </para>
+         </listitem>
+        </varlistentry>
+       </variablelist>
+      </para>
+     </listitem>
+    </varlistentry>
+
+    <varlistentry id="protocol-replication-start-replication">
+     <term><literal>START_REPLICATION</literal> [ <literal>SLOT</literal> <replaceable class="parameter">slot_name</replaceable> ] [ <literal>PHYSICAL</literal> ] <replaceable class="parameter">XXX/XXX</replaceable> [ <literal>TIMELINE</literal> <replaceable class="parameter">tli</replaceable> ]
+      <indexterm><primary>START_REPLICATION</primary></indexterm>
+     </term>
+     <listitem>
+      <para>
+       Instructs server to start streaming WAL, starting at
+       WAL location <replaceable class="parameter">XXX/XXX</replaceable>.
+       If <literal>TIMELINE</literal> option is specified,
+       streaming starts on timeline <replaceable class="parameter">tli</replaceable>;
+       otherwise, the server's current timeline is selected. The server can
+       reply with an error, for example if the requested section of WAL has already
+       been recycled. On success, the server responds with a CopyBothResponse
+       message, and then starts to stream WAL to the frontend.
+      </para>
+
+      <para>
+       If a slot's name is provided
+       via <replaceable class="parameter">slot_name</replaceable>, it will be updated
+       as replication progresses so that the server knows which WAL segments,
+       and if <varname>hot_standby_feedback</varname> is on which transactions,
+       are still needed by the standby.
+      </para>
+
+      <para>
+       If the client requests a timeline that's not the latest but is part of
+       the history of the server, the server will stream all the WAL on that
+       timeline starting from the requested start point up to the point where
+       the server switched to another timeline. If the client requests
+       streaming at exactly the end of an old timeline, the server skips COPY
+       mode entirely.
+      </para>
+
+      <para>
+       After streaming all the WAL on a timeline that is not the latest one,
+       the server will end streaming by exiting the COPY mode. When the client
+       acknowledges this by also exiting COPY mode, the server sends a result
+       set with one row and two columns, indicating the next timeline in this
+       server's history. The first column is the next timeline's ID (type <type>int8</type>), and the
+       second column is the WAL location where the switch happened (type <type>text</type>). Usually,
+       the switch position is the end of the WAL that was streamed, but there
+       are corner cases where the server can send some WAL from the old
+       timeline that it has not itself replayed before promoting. Finally, the
+       server sends two CommandComplete messages (one that ends the CopyData
+       and the other ends the <literal>START_REPLICATION</literal> itself), and
+       is ready to accept a new command.
+      </para>
+
+      <para>
+       WAL data is sent as a series of CopyData messages.  (This allows
+       other information to be intermixed; in particular the server can send
+       an ErrorResponse message if it encounters a failure after beginning
+       to stream.)  The payload of each CopyData message from server to the
+       client contains a message of one of the following formats:
+      </para>
+
+      <variablelist>
+       <varlistentry id="protocol-replication-xlogdata">
+        <term>XLogData (B)</term>
+        <listitem>
+         <variablelist>
+          <varlistentry>
+           <term>Byte1('w')</term>
+           <listitem>
+            <para>
+             Identifies the message as WAL data.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int64</term>
+           <listitem>
+            <para>
+             The starting point of the WAL data in this message.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int64</term>
+           <listitem>
+            <para>
+             The current end of WAL on the server.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int64</term>
+           <listitem>
+            <para>
+             The server's system clock at the time of transmission, as
+             microseconds since midnight on 2000-01-01.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Byte<replaceable>n</replaceable></term>
+           <listitem>
+            <para>
+             A section of the WAL data stream.
+            </para>
+
+            <para>
+             A single WAL record is never split across two XLogData messages.
+             When a WAL record crosses a WAL page boundary, and is therefore
+             already split using continuation records, it can be split at the page
+             boundary. In other words, the first main WAL record and its
+             continuation records can be sent in different XLogData messages.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry id="protocol-replication-primary-keepalive-message">
+        <term>Primary keepalive message (B)</term>
+        <listitem>
+         <variablelist>
+          <varlistentry>
+           <term>Byte1('k')</term>
+           <listitem>
+            <para>
+             Identifies the message as a sender keepalive.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int64</term>
+           <listitem>
+            <para>
+             The current end of WAL on the server.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int64</term>
+           <listitem>
+            <para>
+             The server's system clock at the time of transmission, as
+             microseconds since midnight on 2000-01-01.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Byte1</term>
+           <listitem>
+            <para>
+             1 means that the client should reply to this message as soon as
+             possible, to avoid a timeout disconnect. 0 otherwise.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+
+      <para>
+       The receiving process can send replies back to the sender at any time,
+       using one of the following message formats (also in the payload of a
+       CopyData message):
+      </para>
+
+      <variablelist>
+       <varlistentry id="protocol-replication-standby-status-update">
+        <term>Standby status update (F)</term>
+        <listitem>
+         <variablelist>
+          <varlistentry>
+           <term>Byte1('r')</term>
+           <listitem>
+            <para>
+             Identifies the message as a receiver status update.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int64</term>
+           <listitem>
+            <para>
+             The location of the last WAL byte + 1 received and written to disk
+             in the standby.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int64</term>
+           <listitem>
+            <para>
+             The location of the last WAL byte + 1 flushed to disk in
+             the standby.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int64</term>
+           <listitem>
+            <para>
+             The location of the last WAL byte + 1 applied in the standby.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int64</term>
+           <listitem>
+            <para>
+             The client's system clock at the time of transmission, as
+             microseconds since midnight on 2000-01-01.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Byte1</term>
+           <listitem>
+            <para>
+             If 1, the client requests the server to reply to this message
+             immediately. This can be used to ping the server, to test if
+             the connection is still healthy.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry id="protocol-replication-hot-standby-feedback-message">
+        <term>Hot standby feedback message (F)</term>
+        <listitem>
+         <variablelist>
+          <varlistentry>
+           <term>Byte1('h')</term>
+           <listitem>
+            <para>
+             Identifies the message as a hot standby feedback message.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int64</term>
+           <listitem>
+            <para>
+             The client's system clock at the time of transmission, as
+             microseconds since midnight on 2000-01-01.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int32</term>
+           <listitem>
+            <para>
+             The standby's current global xmin, excluding the catalog_xmin from any
+             replication slots. If both this value and the following
+             catalog_xmin are 0 this is treated as a notification that hot standby
+             feedback will no longer be sent on this connection. Later non-zero
+             messages may reinitiate the feedback mechanism.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int32</term>
+           <listitem>
+            <para>
+             The epoch of the global xmin xid on the standby.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int32</term>
+           <listitem>
+            <para>
+             The lowest catalog_xmin of any replication slots on the standby. Set to 0
+             if no catalog_xmin exists on the standby or if hot standby feedback is being
+             disabled.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int32</term>
+           <listitem>
+            <para>
+             The epoch of the catalog_xmin xid on the standby.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </listitem>
+    </varlistentry>
+
+    <varlistentry id="protocol-replication-start-replication-slot-logical">
+     <term><literal>START_REPLICATION</literal> <literal>SLOT</literal> <replaceable class="parameter">slot_name</replaceable> <literal>LOGICAL</literal> <replaceable class="parameter">XXX/XXX</replaceable> [ ( <replaceable>option_name</replaceable> [ <replaceable>option_value</replaceable> ] [, ...] ) ]</term>
+     <listitem>
+      <para>
+       Instructs server to start streaming WAL for logical replication,
+       starting at either WAL location <replaceable
+       class="parameter">XXX/XXX</replaceable> or the slot's
+       <literal>confirmed_flush_lsn</literal> (see <xref
+       linkend="view-pg-replication-slots"/>), whichever is greater. This
+       behavior makes it easier for clients to avoid updating their local LSN
+       status when there is no data to process. However, starting at a
+       different LSN than requested might not catch certain kinds of client
+       errors; so the client may wish to check that
+       <literal>confirmed_flush_lsn</literal> matches its expectations before
+       issuing <literal>START_REPLICATION</literal>.
+      </para>
+
+      <para>
+       The server can reply with an error, for example if the
+       slot does not exist. On success, the server responds with a CopyBothResponse
+       message, and then starts to stream WAL to the frontend.
+      </para>
+
+      <para>
+       The messages inside the CopyBothResponse messages are of the same format
+       documented for <literal>START_REPLICATION ... PHYSICAL</literal>, including
+       two CommandComplete messages.
+      </para>
+
+      <para>
+       The output plugin associated with the selected slot is used
+       to process the output for streaming.
+      </para>
+
+      <variablelist>
+       <varlistentry>
+        <term><literal>SLOT</literal> <replaceable class="parameter">slot_name</replaceable></term>
+        <listitem>
+         <para>
+          The name of the slot to stream changes from. This parameter is required,
+          and must correspond to an existing logical replication slot created
+          with <literal>CREATE_REPLICATION_SLOT</literal> in
+          <literal>LOGICAL</literal> mode.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><replaceable class="parameter">XXX/XXX</replaceable></term>
+        <listitem>
+         <para>
+          The WAL location to begin streaming at.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><replaceable class="parameter">option_name</replaceable></term>
+        <listitem>
+         <para>
+          The name of an option passed to the slot's logical decoding plugin.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><replaceable class="parameter">option_value</replaceable></term>
+        <listitem>
+         <para>
+          Optional value, in the form of a string constant, associated with the
+          specified option.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </listitem>
+    </varlistentry>
+
+    <varlistentry id="protocol-replication-drop-replication-slot">
+     <term>
+      <literal>DROP_REPLICATION_SLOT</literal> <replaceable class="parameter">slot_name</replaceable> <optional> <literal>WAIT</literal> </optional>
+      <indexterm><primary>DROP_REPLICATION_SLOT</primary></indexterm>
+     </term>
+     <listitem>
+      <para>
+       Drops a replication slot, freeing any reserved server-side resources.
+       If the slot is a logical slot that was created in a database other than
+       the database the walsender is connected to, this command fails.
+      </para>
+
+      <variablelist>
+       <varlistentry>
+        <term><replaceable class="parameter">slot_name</replaceable></term>
+        <listitem>
+         <para>
+          The name of the slot to drop.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term><literal>WAIT</literal></term>
+        <listitem>
+         <para>
+          This option causes the command to wait if the slot is active until
+          it becomes inactive, instead of the default behavior of raising an
+          error.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </listitem>
+    </varlistentry>
+
+    <varlistentry id="protocol-replication-base-backup" xreflabel="BASE_BACKUP">
+     <term><literal>BASE_BACKUP</literal> [ ( <replaceable class="parameter">option</replaceable> [, ...] ) ]
+      <indexterm><primary>BASE_BACKUP</primary></indexterm>
+     </term>
+     <listitem>
+      <para>
+       Instructs the server to start streaming a base backup.
+       The system will automatically be put in backup mode before the backup
+       is started, and taken out of it when the backup is complete. The
+       following options are accepted:
+
+       <variablelist>
+        <varlistentry>
+         <term><literal>LABEL</literal> <replaceable>'label'</replaceable></term>
+         <listitem>
+          <para>
+           Sets the label of the backup. If none is specified, a backup label
+           of <literal>base backup</literal> will be used. The quoting rules
+           for the label are the same as a standard SQL string with
+           <xref linkend="guc-standard-conforming-strings"/> turned on.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>TARGET</literal> <replaceable>'target'</replaceable></term>
+         <listitem>
+          <para>
+           Tells the server where to send the backup.  If the target is
+           <literal>client</literal>, which is the default, the backup data is
+           sent to the client. If it is <literal>server</literal>, the backup
+           data is written to the server at the pathname specified by the
+           <literal>TARGET_DETAIL</literal> option. If it is
+           <literal>blackhole</literal>, the backup data is not sent
+           anywhere; it is simply discarded.
+          </para>
+
+          <para>
+           The <literal>server</literal> target requires superuser privilege or
+           being granted the <literal>pg_write_server_files</literal> role.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>TARGET_DETAIL</literal> <replaceable>'detail'</replaceable></term>
+         <listitem>
+          <para>
+           Provides additional information about the backup target.
+          </para>
+
+          <para>
+           Currently, this option can only be used when the backup target is
+           <literal>server</literal>. It specifies the server directory
+           to which the backup should be written.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>PROGRESS [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
+         <listitem>
+          <para>
+           If set to true, request information required to generate a progress
+           report. This will send back an approximate size in the header of each
+           tablespace, which can be used to calculate how far along the stream
+           is done. This is calculated by enumerating all the file sizes once
+           before the transfer is even started, and might as such have a
+           negative impact on the performance.  In particular, it might take
+           longer before the first data
+           is streamed. Since the database files can change during the backup,
+           the size is only approximate and might both grow and shrink between
+           the time of approximation and the sending of the actual files.
+           The default is false.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>CHECKPOINT { 'fast' | 'spread' }</literal></term>
+         <listitem>
+          <para>
+           Sets the type of checkpoint to be performed at the beginning of the
+           base backup. The default is <literal>spread</literal>.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>WAL [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
+         <listitem>
+          <para>
+           If set to true, include the necessary WAL segments in the backup.
+           This will include all the files between start and stop backup in the
+           <filename>pg_wal</filename> directory of the base directory tar
+           file. The default is false.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>WAIT [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
+         <listitem>
+          <para>
+           If set to true, the backup will wait until the last required WAL
+           segment has been archived, or emit a warning if log archiving is
+           not enabled. If false, the backup will neither wait nor warn,
+           leaving the client responsible for ensuring the required log is
+           available. The default is true.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>COMPRESSION</literal> <replaceable>'method'</replaceable></term>
+         <listitem>
+          <para>
+           Instructs the server to compress the backup using the specified
+           method. Currently, the supported methods are <literal>gzip</literal>,
+           <literal>lz4</literal>, and <literal>zstd</literal>.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>COMPRESSION_DETAIL</literal> <replaceable>detail</replaceable></term>
+         <listitem>
+          <para>
+           Specifies details for the chosen compression method. This should only
+           be used in conjunction with the <literal>COMPRESSION</literal>
+           option.  If the value is an integer, it specifies the compression
+           level.  Otherwise, it should be a comma-separated list of items,
+           each of the form <literal>keyword</literal> or
+           <literal>keyword=value</literal>. Currently, the supported keywords
+           are <literal>level</literal> and <literal>workers</literal>.
+          </para>
+
+          <para>
+           The <literal>level</literal> keyword sets the compression level.
+           For <literal>gzip</literal> the compression level should be an
+           integer between 1 and 9, for <literal>lz4</literal> an integer
+           between 1 and 12, and for <literal>zstd</literal> an integer
+           between 1 and 22.
+          </para>
+
+          <para>
+           The <literal>workers</literal> keyword sets the number of threads
+           that should be used for parallel compression. Parallel compression
+           is supported only for <literal>zstd</literal>.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>MAX_RATE</literal> <replaceable>rate</replaceable></term>
+         <listitem>
+          <para>
+           Limit (throttle) the maximum amount of data transferred from server
+           to client per unit of time.  The expected unit is kilobytes per second.
+           If this option is specified, the value must either be equal to zero
+           or it must fall within the range from 32 kB through 1 GB (inclusive).
+           If zero is passed or the option is not specified, no restriction is
+           imposed on the transfer.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>TABLESPACE_MAP [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
+         <listitem>
+          <para>
+           If true, include information about symbolic links present in the
+           directory <filename>pg_tblspc</filename> in a file named
+           <filename>tablespace_map</filename>. The tablespace map file includes
+           each symbolic link name as it exists in the directory
+           <filename>pg_tblspc/</filename> and the full path of that symbolic link.
+           The default is false.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>VERIFY_CHECKSUMS [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
+         <listitem>
+          <para>
+           If true, checksums are verified during a base backup if they are
+           enabled. If false, this is skipped. The default is true.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>MANIFEST</literal> <replaceable>manifest_option</replaceable></term>
+         <listitem>
+          <para>
+           When this option is specified with a value of <literal>yes</literal>
+           or <literal>force-encode</literal>, a backup manifest is created
+           and sent along with the backup.  The manifest is a list of every
+           file present in the backup with the exception of any WAL files that
+           may be included. It also stores the size, last modification time, and
+           optionally a checksum for each file.
+           A value of <literal>force-encode</literal> forces all filenames
+           to be hex-encoded; otherwise, this type of encoding is performed only
+           for files whose names are non-UTF8 octet sequences.
+           <literal>force-encode</literal> is intended primarily for testing
+           purposes, to be sure that clients which read the backup manifest
+           can handle this case. For compatibility with previous releases,
+           the default is <literal>MANIFEST 'no'</literal>.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>MANIFEST_CHECKSUMS</literal> <replaceable>checksum_algorithm</replaceable></term>
+         <listitem>
+          <para>
+           Specifies the checksum algorithm that should be applied to each file included
+           in the backup manifest. Currently, the available
+           algorithms are <literal>NONE</literal>, <literal>CRC32C</literal>,
+           <literal>SHA224</literal>, <literal>SHA256</literal>,
+           <literal>SHA384</literal>, and <literal>SHA512</literal>.
+           The default is <literal>CRC32C</literal>.
+          </para>
+         </listitem>
+        </varlistentry>
+       </variablelist>
+      </para>
+
+      <para>
+       When the backup is started, the server will first send two
+       ordinary result sets, followed by one or more CopyOutResponse
+       results.
+      </para>
+
+      <para>
+       The first ordinary result set contains the starting position of the
+       backup, in a single row with two columns. The first column contains
+       the start position given in XLogRecPtr format, and the second column
+       contains the corresponding timeline ID.
+      </para>
+
+      <para>
+       The second ordinary result set has one row for each tablespace.
+       The fields in this row are:
+
+       <variablelist>
+        <varlistentry>
+         <term><literal>spcoid</literal> (<type>oid</type>)</term>
+         <listitem>
+          <para>
+           The OID of the tablespace, or null if it's the base
+           directory.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>spclocation</literal> (<type>text</type>)</term>
+         <listitem>
+          <para>
+           The full path of the tablespace directory, or null
+           if it's the base directory.
+          </para>
+         </listitem>
+        </varlistentry>
+
+        <varlistentry>
+         <term><literal>size</literal> (<type>int8</type>)</term>
+         <listitem>
+          <para>
+           The approximate size of the tablespace, in kilobytes (1024 bytes),
+           if progress report has been requested; otherwise it's null.
+          </para>
+         </listitem>
+        </varlistentry>
+       </variablelist>
+      </para>
+
+      <para>
+       After the second regular result set, a CopyOutResponse will be sent.
+       The payload of each CopyData message will contain a message in one of
+       the following formats:
+      </para>
+
+      <variablelist>
+       <varlistentry>
+        <term>new archive (B)</term>
+        <listitem>
+         <variablelist>
+          <varlistentry>
+           <term>Byte1('n')</term>
+           <listitem><para>
+            Identifes the messaage as indicating the start of a new archive.
+            There will be one archive for the main data directory and one
+            for each additional tablespace; each will use tar format
+            (following the <quote>ustar interchange format</quote> specified
+            in the POSIX 1003.1-2008 standard).
+           </para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>String</term>
+           <listitem><para>
+            The file name for this archive.
+           </para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>String</term>
+           <listitem><para>
+            For the main data directory, an empty string. For other
+            tablespaces, the full path to the directory from which this
+            archive was created.
+           </para></listitem>
+          </varlistentry>
+         </variablelist>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term>manifest (B)</term>
+        <listitem>
+         <variablelist>
+          <varlistentry>
+           <term>Byte1('m')</term>
+           <listitem><para>
+            Identifes the message as indicating the start of the backup
+            manifest.
+           </para></listitem>
+          </varlistentry>
+         </variablelist>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term>archive or manifest data (B)</term>
+        <listitem>
+         <variablelist>
+          <varlistentry>
+           <term>Byte1('d')</term>
+           <listitem><para>
+            Identifes the message as containing archive or manifest data.
+           </para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Byte<replaceable>n</replaceable></term>
+           <listitem><para>
+            Data bytes.
+           </para></listitem>
+          </varlistentry>
+         </variablelist>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
+        <term>progress report (B)</term>
+        <listitem>
+         <variablelist>
+          <varlistentry>
+           <term>Byte1('p')</term>
+           <listitem><para>
+            Identifes the message as a progress report.
+           </para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term>Int64</term>
+           <listitem><para>
+            The number of bytes from the current tablespace for which
+            processing has been completed.
+           </para></listitem>
+          </varlistentry>
+         </variablelist>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+
+      <para>
+       After the CopyOutResponse, or all such responses, have been sent, a
+       final ordinary result set will be sent, containing the WAL end position
+       of the backup, in the same format as the start position.
+      </para>
+
+      <para>
+       The tar archive for the data directory and each tablespace will contain
+       all files in the directories, regardless of whether they are
+       <productname>PostgreSQL</productname> files or other files added to the same
+       directory. The only excluded files are:
+
+       <itemizedlist spacing="compact" mark="bullet">
+        <listitem>
+         <para>
+          <filename>postmaster.pid</filename>
+         </para>
+        </listitem>
+        <listitem>
+         <para>
+          <filename>postmaster.opts</filename>
+         </para>
+        </listitem>
+        <listitem>
+         <para>
+          <filename>pg_internal.init</filename> (found in multiple directories)
+         </para>
+        </listitem>
+        <listitem>
+         <para>
+          Various temporary files and directories created during the operation
+          of the PostgreSQL server, such as any file or directory beginning
+          with <filename>pgsql_tmp</filename> and temporary relations.
+         </para>
+        </listitem>
+        <listitem>
+         <para>
+          Unlogged relations, except for the init fork which is required to
+          recreate the (empty) unlogged relation on recovery.
+         </para>
+        </listitem>
+        <listitem>
+         <para>
+          <filename>pg_wal</filename>, including subdirectories. If the backup is run
+          with WAL files included, a synthesized version of <filename>pg_wal</filename> will be
+          included, but it will only contain the files necessary for the
+          backup to work, not the rest of the contents.
+         </para>
+        </listitem>
+        <listitem>
+         <para>
+          <filename>pg_dynshmem</filename>, <filename>pg_notify</filename>,
+          <filename>pg_replslot</filename>, <filename>pg_serial</filename>,
+          <filename>pg_snapshots</filename>, <filename>pg_stat_tmp</filename>, and
+          <filename>pg_subtrans</filename> are copied as empty directories (even if
+          they are symbolic links).
+         </para>
+        </listitem>
+        <listitem>
+         <para>
+          Files other than regular files and directories, such as symbolic
+          links (other than for the directories listed above) and special
+          device files, are skipped.  (Symbolic links
+          in <filename>pg_tblspc</filename> are maintained.)
+         </para>
+        </listitem>
+       </itemizedlist>
+       Owner, group, and file mode are set if the underlying file system on
+       the server supports it.
+      </para>
+     </listitem>
+    </varlistentry>
+   </variablelist>
+  </para>
+ </sect1>
+
+<sect1 id="protocol-logical-replication">
+ <title>Logical Streaming Replication Protocol</title>
+
+ <para>
+  This section describes the logical replication protocol, which is the message
+  flow started by the <literal>START_REPLICATION</literal>
+  <literal>SLOT</literal> <replaceable class="parameter">slot_name</replaceable>
+  <literal>LOGICAL</literal> replication command.
+ </para>
+
+ <para>
+  The logical streaming replication protocol builds on the primitives of
+  the physical streaming replication protocol.
+ </para>
+
+ <sect2 id="protocol-logical-replication-params">
+  <title>Logical Streaming Replication Parameters</title>
+
+  <para>
+   The logical replication <literal>START_REPLICATION</literal> command
+   accepts following parameters:
+
+   <variablelist>
+    <varlistentry>
+     <term>
+      proto_version
+     </term>
+     <listitem>
+      <para>
+       Protocol version. Currently versions <literal>1</literal>, <literal>2</literal>,
+       and <literal>3</literal> are supported.
+      </para>
+      <para>
+       Version <literal>2</literal> is supported only for server version 14
+       and above, and it allows streaming of large in-progress transactions.
+      </para>
+      <para>
+       Version <literal>3</literal> is supported only for server version 15
+       and above, and it allows streaming of two-phase transactions.
+      </para>
+     </listitem>
+    </varlistentry>
+
+    <varlistentry>
+     <term>
+      publication_names
+     </term>
+     <listitem>
+      <para>
+       Comma separated list of publication names for which to subscribe
+       (receive changes). The individual publication names are treated
+       as standard objects names and can be quoted the same as needed.
+      </para>
+     </listitem>
+    </varlistentry>
+   </variablelist>
+
+  </para>
+ </sect2>
+
+ <sect2 id="protocol-logical-messages">
+  <title>Logical Replication Protocol Messages</title>
+
+  <para>
+   The individual protocol messages are discussed in the following
+   subsections. Individual messages are described in
+   <xref linkend="protocol-logicalrep-message-formats"/>.
+  </para>
+
+  <para>
+   All top-level protocol messages begin with a message type byte.
+   While represented in code as a character, this is a signed byte with no
+   associated encoding.
+  </para>
+
+  <para>
+   Since the streaming replication protocol supplies a message length there
+   is no need for top-level protocol messages to embed a length in their
+   header.
+  </para>
+
+ </sect2>
+
+ <sect2 id="protocol-logical-messages-flow">
+  <title>Logical Replication Protocol Message Flow</title>
+
+  <para>
+   With the exception of the <literal>START_REPLICATION</literal> command and
+   the replay progress messages, all information flows only from the backend
+   to the frontend.
+  </para>
+
+  <para>
+   The logical replication protocol sends individual transactions one by one.
+   This means that all messages between a pair of Begin and Commit messages
+   belong to the same transaction. Similarly, all messages between a pair of
+   Begin Prepare and Prepare messages belong to the same transaction.
+   It also sends changes of large in-progress transactions between a pair of
+   Stream Start and Stream Stop messages. The last stream of such a transaction
+   contains a Stream Commit or Stream Abort message.
+  </para>
+
+  <para>
+   Every sent transaction contains zero or more DML messages (Insert,
+   Update, Delete). In case of a cascaded setup it can also contain Origin
+   messages. The origin message indicates that the transaction originated on
+   different replication node. Since a replication node in the scope of logical
+   replication protocol can be pretty much anything, the only identifier
+   is the origin name. It's downstream's responsibility to handle this as
+   needed (if needed). The Origin message is always sent before any DML
+   messages in the transaction.
+  </para>
+
+  <para>
+   Every DML message contains a relation OID, identifying the publisher's
+   relation that was acted on.  Before the first DML message for a given
+   relation OID, a Relation message will be sent, describing the schema of
+   that relation.  Subsequently, a new Relation message will be sent if
+   the relation's definition has changed since the last Relation message
+   was sent for it.  (The protocol assumes that the client is capable of
+   remembering this metadata for as many relations as needed.)
+  </para>
+
+  <para>
+   Relation messages identify column types by their OIDs.  In the case
+   of a built-in type, it is assumed that the client can look up that
+   type OID locally, so no additional data is needed.  For a non-built-in
+   type OID, a Type message will be sent before the Relation message,
+   to provide the type name associated with that OID.  Thus, a client that
+   needs to specifically identify the types of relation columns should
+   cache the contents of Type messages, and first consult that cache to
+   see if the type OID is defined there.  If not, look up the type OID
+   locally.
+  </para>
+ </sect2>
+</sect1>
+
+ <sect1 id="protocol-message-types">
+  <title>Message Data Types</title>
+
+  <para>
+   This section describes the base data types used in messages.
+  </para>
+
+  <variablelist>
+   <varlistentry>
+    <term>Int<replaceable>n</replaceable>(<replaceable>i</replaceable>)</term>
+    <listitem>
+     <para>
+      An <replaceable>n</replaceable>-bit integer in network byte
+      order (most significant byte first).
+      If <replaceable>i</replaceable> is specified it
+      is the exact value that will appear, otherwise the value
+      is variable.  Eg. Int16, Int32(42).
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term>Int<replaceable>n</replaceable>[<replaceable>k</replaceable>]</term>
+    <listitem>
+     <para>
+      An array of <replaceable>k</replaceable>
+      <replaceable>n</replaceable>-bit integers, each in network
+      byte order.  The array length <replaceable>k</replaceable>
+      is always determined by an earlier field in the message.
+      Eg. Int16[M].
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term>String(<replaceable>s</replaceable>)</term>
+    <listitem>
+     <para>
+      A null-terminated string (C-style string).  There is no
+      specific length limitation on strings.
+      If <replaceable>s</replaceable> is specified it is the exact
+      value that will appear, otherwise the value is variable.
+      Eg. String, String("user").
+     </para>
+
+     <note>
+      <para>
+       <emphasis>There is no predefined limit</emphasis> on the length of a string
+       that can be returned by the backend.  Good coding strategy for a frontend
+       is to use an expandable buffer so that anything that fits in memory can be
+       accepted.  If that's not feasible, read the full string and discard trailing
+       characters that don't fit into your fixed-size buffer.
+      </para>
+     </note>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term>Byte<replaceable>n</replaceable>(<replaceable>c</replaceable>)</term>
+    <listitem>
+     <para>
+      Exactly <replaceable>n</replaceable> bytes.  If the field
+      width <replaceable>n</replaceable> is not a constant, it is
+      always determinable from an earlier field in the message.
+      If <replaceable>c</replaceable> is specified it is the exact
+      value.  Eg. Byte2, Byte1('\n').
+     </para>
+    </listitem>
+   </varlistentry>
+  </variablelist>
+ </sect1>
+
+ <sect1 id="protocol-message-formats">
+  <title>Message Formats</title>
+
+  <para>
+   This section describes the detailed format of each message.  Each is marked to
+   indicate that it can be sent by a frontend (F), a backend (B), or both
+   (F &amp; B).
+   Notice that although each message includes a byte count at the beginning,
+   the message format is defined so that the message end can be found without
+   reference to the byte count.  This aids validity checking.  (The CopyData
+   message is an exception, because it forms part of a data stream; the contents
+   of any individual CopyData message cannot be interpretable on their own.)
+  </para>
+
+  <variablelist>
+   <varlistentry id="protocol-message-formats-AuthenticationOk">
+    <term>AuthenticationOk (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('R')</term>
+       <listitem>
+        <para>
+         Identifies the message as an authentication request.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(8)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(0)</term>
+       <listitem>
+        <para>
+         Specifies that the authentication was successful.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-AuthenticationKerberosV5">
+    <term>AuthenticationKerberosV5 (B)</term>
+    <listitem>
+
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('R')</term>
+       <listitem>
+        <para>
+         Identifies the message as an authentication request.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(8)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(2)</term>
+       <listitem>
+        <para>
+         Specifies that Kerberos V5 authentication is required.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-AuthenticationCleartextPassword">
+    <term>AuthenticationCleartextPassword (B)</term>
+    <listitem>
+
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('R')</term>
+       <listitem>
+        <para>
+         Identifies the message as an authentication request.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(8)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(3)</term>
+       <listitem>
+        <para>
+         Specifies that a clear-text password is required.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-AuthenticationMD5Password">
+    <term>AuthenticationMD5Password (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('R')</term>
+       <listitem>
+        <para>
+         Identifies the message as an authentication request.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(12)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(5)</term>
+       <listitem>
+        <para>
+         Specifies that an MD5-encrypted password is required.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte4</term>
+       <listitem>
+        <para>
+         The salt to use when encrypting the password.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-AuthenticationSCMCredential">
+    <term>AuthenticationSCMCredential (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('R')</term>
+       <listitem>
+        <para>
+         Identifies the message as an authentication request.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(8)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(6)</term>
+       <listitem>
+        <para>
+         Specifies that an SCM credentials message is required.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-AuthenticationGSS">
+    <term>AuthenticationGSS (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('R')</term>
+       <listitem>
+        <para>
+         Identifies the message as an authentication request.
+        </para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term>Int32(8)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(7)</term>
+       <listitem>
+        <para>
+         Specifies that GSSAPI authentication is required.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-AuthenticationGSSContinue">
+    <term>AuthenticationGSSContinue (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('R')</term>
+       <listitem>
+        <para>
+         Identifies the message as an authentication request.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(8)</term>
+       <listitem>
+        <para>
+         Specifies that this message contains GSSAPI or SSPI data.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte<replaceable>n</replaceable></term>
+       <listitem>
+        <para>
+         GSSAPI or SSPI authentication data.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-AuthenticationSSPI">
+    <term>AuthenticationSSPI (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('R')</term>
+       <listitem>
+        <para>
+         Identifies the message as an authentication request.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(8)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(9)</term>
+       <listitem>
+        <para>
+         Specifies that SSPI authentication is required.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-AuthenticationSASL">
+    <term>AuthenticationSASL (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('R')</term>
+       <listitem>
+        <para>
+         Identifies the message as an authentication request.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(10)</term>
+       <listitem>
+        <para>
+         Specifies that SASL authentication is required.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      The message body is a list of SASL authentication mechanisms, in the
+      server's order of preference. A zero byte is required as terminator after
+      the last authentication mechanism name. For each mechanism, there is the
+      following:
+
+      <variablelist>
+       <varlistentry>
+        <term>String</term>
+        <listitem>
+         <para>
+          Name of a SASL authentication mechanism.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-AuthenticationSASLContinue">
+    <term>AuthenticationSASLContinue (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('R')</term>
+       <listitem>
+        <para>
+         Identifies the message as an authentication request.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(11)</term>
+       <listitem>
+        <para>
+         Specifies that this message contains a SASL challenge.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte<replaceable>n</replaceable></term>
+       <listitem>
+        <para>
+         SASL data, specific to the SASL mechanism being used.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-AuthenticationSASLFinal">
+    <term>AuthenticationSASLFinal (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('R')</term>
+       <listitem>
+        <para>
+         Identifies the message as an authentication request.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(12)</term>
+       <listitem>
+        <para>
+         Specifies that SASL authentication has completed.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte<replaceable>n</replaceable></term>
+       <listitem>
+        <para>
+         SASL outcome "additional data", specific to the SASL mechanism
+         being used.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-BackendKeyData">
+    <term>BackendKeyData (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('K')</term>
+       <listitem>
+        <para>
+         Identifies the message as cancellation key data.
+         The frontend must save these values if it wishes to be
+         able to issue CancelRequest messages later.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(12)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         The process ID of this backend.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         The secret key of this backend.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-Bind">
+    <term>Bind (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('B')</term>
+       <listitem>
+        <para>
+         Identifies the message as a Bind command.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The name of the destination portal
+         (an empty string selects the unnamed portal).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The name of the source prepared statement
+         (an empty string selects the unnamed prepared statement).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         The number of parameter format codes that follow
+         (denoted <replaceable>C</replaceable> below).
+         This can be zero to indicate that there are no parameters
+         or that the parameters all use the default format (text);
+         or one, in which case the specified format code is applied
+         to all parameters; or it can equal the actual number of
+         parameters.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16[<replaceable>C</replaceable>]</term>
+       <listitem>
+        <para>
+         The parameter format codes.  Each must presently be
+         zero (text) or one (binary).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         The number of parameter values that follow (possibly zero).
+         This must match the number of parameters needed by the query.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      Next, the following pair of fields appear for each parameter:
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         The length of the parameter value, in bytes (this count
+         does not include itself).  Can be zero.
+         As a special case, -1 indicates a NULL parameter value.
+         No value bytes follow in the NULL case.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte<replaceable>n</replaceable></term>
+       <listitem>
+        <para>
+         The value of the parameter, in the format indicated by the
+         associated format code.
+         <replaceable>n</replaceable> is the above length.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      After the last parameter, the following fields appear:
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         The number of result-column format codes that follow
+         (denoted <replaceable>R</replaceable> below).
+         This can be zero to indicate that there are no result columns
+         or that the result columns should all use the default format
+         (text);
+         or one, in which case the specified format code is applied
+         to all result columns (if any); or it can equal the actual
+         number of result columns of the query.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16[<replaceable>R</replaceable>]</term>
+       <listitem>
+        <para>
+         The result-column format codes.  Each must presently be
+         zero (text) or one (binary).
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-BindComplete">
+    <term>BindComplete (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('2')</term>
+       <listitem>
+        <para>
+         Identifies the message as a Bind-complete indicator.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(4)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-CancelRequest">
+    <term>CancelRequest (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Int32(16)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(80877102)</term>
+       <listitem>
+        <para>
+         The cancel request code.  The value is chosen to contain
+         <literal>1234</literal> in the most significant 16 bits, and <literal>5678</literal> in the
+         least significant 16 bits.  (To avoid confusion, this code
+         must not be the same as any protocol version number.)
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         The process ID of the target backend.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         The secret key for the target backend.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-Close">
+    <term>Close (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('C')</term>
+       <listitem>
+        <para>
+         Identifies the message as a Close command.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte1</term>
+       <listitem>
+        <para>
+         '<literal>S</literal>' to close a prepared statement; or
+         '<literal>P</literal>' to close a portal.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The name of the prepared statement or portal to close
+         (an empty string selects the unnamed prepared statement
+         or portal).
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-CloseComplete">
+    <term>CloseComplete (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('3')</term>
+       <listitem>
+        <para>
+         Identifies the message as a Close-complete indicator.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(4)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-CommandComplete">
+    <term>CommandComplete (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('C')</term>
+       <listitem>
+        <para>
+         Identifies the message as a command-completed response.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+       <para>
+        The command tag.  This is usually a single
+        word that identifies which SQL command was completed.
+       </para>
+
+       <para>
+        For an <command>INSERT</command> command, the tag is
+        <literal>INSERT <replaceable>oid</replaceable>
+        <replaceable>rows</replaceable></literal>, where
+        <replaceable>rows</replaceable> is the number of rows
+        inserted. <replaceable>oid</replaceable> used to be the object ID
+        of the inserted row if <replaceable>rows</replaceable> was 1
+        and the target table had OIDs, but OIDs system columns are
+        not supported anymore; therefore <replaceable>oid</replaceable>
+        is always 0.
+       </para>
+
+       <para>
+        For a <command>DELETE</command> command, the tag is
+        <literal>DELETE <replaceable>rows</replaceable></literal> where
+        <replaceable>rows</replaceable> is the number of rows deleted.
+       </para>
+
+       <para>
+        For an <command>UPDATE</command> command, the tag is
+        <literal>UPDATE <replaceable>rows</replaceable></literal> where
+        <replaceable>rows</replaceable> is the number of rows updated.
+       </para>
+
+       <para>
+        For a <command>SELECT</command> or <command>CREATE TABLE AS</command>
+        command, the tag is <literal>SELECT <replaceable>rows</replaceable></literal>
+        where <replaceable>rows</replaceable> is the number of rows retrieved.
+       </para>
+
+       <para>
+        For a <command>MOVE</command> command, the tag is
+        <literal>MOVE <replaceable>rows</replaceable></literal> where
+        <replaceable>rows</replaceable> is the number of rows the
+        cursor's position has been changed by.
+       </para>
+
+       <para>
+        For a <command>FETCH</command> command, the tag is
+        <literal>FETCH <replaceable>rows</replaceable></literal> where
+        <replaceable>rows</replaceable> is the number of rows that
+        have been retrieved from the cursor.
+       </para>
+
+       <para>
+        For a <command>COPY</command> command, the tag is
+        <literal>COPY <replaceable>rows</replaceable></literal> where
+        <replaceable>rows</replaceable> is the number of rows copied.
+        (Note: the row count appears only in
+        <productname>PostgreSQL</productname> 8.2 and later.)
+       </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-CopyData">
+    <term>CopyData (F &amp; B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('d')</term>
+       <listitem>
+        <para>
+         Identifies the message as <command>COPY</command> data.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte<replaceable>n</replaceable></term>
+       <listitem>
+        <para>
+         Data that forms part of a <command>COPY</command> data stream.  Messages sent
+         from the backend will always correspond to single data rows,
+         but messages sent by frontends might divide the data stream
+         arbitrarily.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-CopyDone">
+    <term>CopyDone (F &amp; B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('c')</term>
+       <listitem>
+        <para>
+         Identifies the message as a <command>COPY</command>-complete indicator.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(4)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-CopyFail">
+    <term>CopyFail (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('f')</term>
+       <listitem>
+        <para>
+         Identifies the message as a <command>COPY</command>-failure indicator.
+        </para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         An error message to report as the cause of failure.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-CopyInResponse">
+    <term>CopyInResponse (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('G')</term>
+       <listitem>
+        <para>
+         Identifies the message as a Start Copy In response.
+         The frontend must now send copy-in data (if not
+         prepared to do so, send a CopyFail message).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int8</term>
+       <listitem>
+        <para>
+         0 indicates the overall <command>COPY</command> format is textual (rows
+         separated by newlines, columns separated by separator
+         characters, etc).
+         1 indicates the overall copy format is binary (similar
+         to DataRow format).
+         See <xref linkend="sql-copy"/>
+         for more information.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         The number of columns in the data to be copied
+         (denoted <replaceable>N</replaceable> below).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16[<replaceable>N</replaceable>]</term>
+       <listitem>
+        <para>
+         The format codes to be used for each column.
+         Each must presently be zero (text) or one (binary).
+         All must be zero if the overall copy format is textual.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-CopyOutResponse">
+    <term>CopyOutResponse (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('H')</term>
+       <listitem>
+        <para>
+         Identifies the message as a Start Copy Out response.
+         This message will be followed by copy-out data.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int8</term>
+       <listitem>
+        <para>
+         0 indicates the overall <command>COPY</command> format
+         is textual (rows separated by newlines, columns
+         separated by separator characters, etc). 1 indicates
+         the overall copy format is binary (similar to DataRow
+         format). See <xref linkend="sql-copy"/> for more information.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         The number of columns in the data to be copied
+         (denoted <replaceable>N</replaceable> below).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16[<replaceable>N</replaceable>]</term>
+       <listitem>
+        <para>
+         The format codes to be used for each column.
+         Each must presently be zero (text) or one (binary).
+         All must be zero if the overall copy format is textual.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-CopyBothResponse">
+    <term>CopyBothResponse (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('W')</term>
+       <listitem>
+        <para>
+         Identifies the message as a Start Copy Both response.
+         This message is used only for Streaming Replication.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int8</term>
+       <listitem>
+        <para>
+         0 indicates the overall <command>COPY</command> format
+         is textual (rows separated by newlines, columns
+         separated by separator characters, etc). 1 indicates
+         the overall copy format is binary (similar to DataRow
+         format). See <xref linkend="sql-copy"/> for more information.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         The number of columns in the data to be copied
+         (denoted <replaceable>N</replaceable> below).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16[<replaceable>N</replaceable>]</term>
+       <listitem>
+        <para>
+         The format codes to be used for each column.
+         Each must presently be zero (text) or one (binary).
+         All must be zero if the overall copy format is textual.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-DataRow">
+    <term>DataRow (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('D')</term>
+       <listitem>
+        <para>
+         Identifies the message as a data row.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         The number of column values that follow (possibly zero).
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      Next, the following pair of fields appear for each column:
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         The length of the column value, in bytes (this count
+         does not include itself).  Can be zero.
+         As a special case, -1 indicates a NULL column value.
+         No value bytes follow in the NULL case.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte<replaceable>n</replaceable></term>
+       <listitem>
+        <para>
+         The value of the column, in the format indicated by the
+         associated format code.
+         <replaceable>n</replaceable> is the above length.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-Describe">
+    <term>Describe (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('D')</term>
+       <listitem>
+        <para>
+         Identifies the message as a Describe command.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte1</term>
+       <listitem>
+        <para>
+         '<literal>S</literal>' to describe a prepared statement; or
+         '<literal>P</literal>' to describe a portal.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The name of the prepared statement or portal to describe
+         (an empty string selects the unnamed prepared statement
+         or portal).
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-EmptyQueryResponse">
+    <term>EmptyQueryResponse (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('I')</term>
+       <listitem>
+        <para>
+         Identifies the message as a response to an empty query string.
+         (This substitutes for CommandComplete.)
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(4)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-ErrorResponse">
+    <term>ErrorResponse (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('E')</term>
+       <listitem>
+        <para>
+         Identifies the message as an error.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      The message body consists of one or more identified fields,
+      followed by a zero byte as a terminator.  Fields can appear in
+      any order.  For each field there is the following:
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term>Byte1</term>
+       <listitem>
+        <para>
+         A code identifying the field type; if zero, this is
+         the message terminator and no string follows.
+         The presently defined field types are listed in
+         <xref linkend="protocol-error-fields"/>.
+         Since more field types might be added in future,
+         frontends should silently ignore fields of unrecognized
+         type.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The field value.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-Execute">
+    <term>Execute (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('E')</term>
+       <listitem>
+        <para>
+         Identifies the message as an Execute command.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The name of the portal to execute
+         (an empty string selects the unnamed portal).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Maximum number of rows to return, if portal contains
+         a query that returns rows (ignored otherwise).  Zero
+         denotes <quote>no limit</quote>.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-Flush">
+    <term>Flush (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('H')</term>
+       <listitem>
+        <para>
+         Identifies the message as a Flush command.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(4)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-FunctionCall">
+    <term>FunctionCall (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('F')</term>
+       <listitem>
+        <para>
+         Identifies the message as a function call.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Specifies the object ID of the function to call.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         The number of argument format codes that follow
+         (denoted <replaceable>C</replaceable> below).
+         This can be zero to indicate that there are no arguments
+         or that the arguments all use the default format (text);
+         or one, in which case the specified format code is applied
+         to all arguments; or it can equal the actual number of
+         arguments.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16[<replaceable>C</replaceable>]</term>
+       <listitem>
+        <para>
+         The argument format codes.  Each must presently be
+         zero (text) or one (binary).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         Specifies the number of arguments being supplied to the
+         function.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      Next, the following pair of fields appear for each argument:
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         The length of the argument value, in bytes (this count
+         does not include itself).  Can be zero.
+         As a special case, -1 indicates a NULL argument value.
+         No value bytes follow in the NULL case.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte<replaceable>n</replaceable></term>
+       <listitem>
+        <para>
+         The value of the argument, in the format indicated by the
+         associated format code.
+         <replaceable>n</replaceable> is the above length.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      After the last argument, the following field appears:
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         The format code for the function result. Must presently be
+         zero (text) or one (binary).
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-FunctionCallResponse">
+    <term>FunctionCallResponse (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('V')</term>
+       <listitem>
+        <para>
+         Identifies the message as a function call result.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         The length of the function result value, in bytes (this count
+         does not include itself).  Can be zero.
+         As a special case, -1 indicates a NULL function result.
+         No value bytes follow in the NULL case.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte<replaceable>n</replaceable></term>
+       <listitem>
+        <para>
+         The value of the function result, in the format indicated by
+         the associated format code.
+         <replaceable>n</replaceable> is the above length.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-GSSENCRequest">
+    <term>GSSENCRequest (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Int32(8)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(80877104)</term>
+       <listitem>
+        <para>
+         The <acronym>GSSAPI</acronym> Encryption request code.  The value is chosen to contain
+         <literal>1234</literal> in the most significant 16 bits, and <literal>5680</literal> in the
+         least significant 16 bits.  (To avoid confusion, this code
+         must not be the same as any protocol version number.)
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-GSSResponse">
+    <term>GSSResponse (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('p')</term>
+       <listitem>
+        <para>
+         Identifies the message as a GSSAPI or SSPI response. Note that
+         this is also used for SASL and password response messages.
+         The exact message type can be deduced from the context.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte<replaceable>n</replaceable></term>
+       <listitem>
+        <para>
+         GSSAPI/SSPI specific message data.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-NegotiateProtocolVersion">
+    <term>NegotiateProtocolVersion (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('v')</term>
+       <listitem>
+        <para>
+         Identifies the message as a protocol version negotiation
+         message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Newest minor protocol version supported by the server
+         for the major protocol version requested by the client.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Number of protocol options not recognized by the server.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      Then, for protocol option not recognized by the server, there
+      is the following:
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The option name.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-NoData">
+    <term>NoData (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('n')</term>
+       <listitem>
+        <para>
+         Identifies the message as a no-data indicator.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(4)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-NoticeResponse">
+    <term>NoticeResponse (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('N')</term>
+       <listitem>
+        <para>
+         Identifies the message as a notice.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      The message body consists of one or more identified fields,
+      followed by a zero byte as a terminator.  Fields can appear in
+      any order.  For each field there is the following:
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term>Byte1</term>
+       <listitem>
+        <para>
+         A code identifying the field type; if zero, this is
+         the message terminator and no string follows.
+         The presently defined field types are listed in
+         <xref linkend="protocol-error-fields"/>.
+         Since more field types might be added in future,
+         frontends should silently ignore fields of unrecognized
+         type.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The field value.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-NotificationResponse">
+    <term>NotificationResponse (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('A')</term>
+       <listitem>
+        <para>
+         Identifies the message as a notification response.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         The process ID of the notifying backend process.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The name of the channel that the notify has been raised on.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The <quote>payload</quote> string passed from the notifying process.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-ParameterDescription">
+    <term>ParameterDescription (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('t')</term>
+       <listitem>
+        <para>
+         Identifies the message as a parameter description.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         The number of parameters used by the statement
+         (can be zero).
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      Then, for each parameter, there is the following:
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Specifies the object ID of the parameter data type.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-ParameterStatus">
+    <term>ParameterStatus (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('S')</term>
+       <listitem>
+        <para>
+         Identifies the message as a run-time parameter status report.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The name of the run-time parameter being reported.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The current value of the parameter.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-Parse">
+    <term>Parse (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('P')</term>
+       <listitem>
+        <para>
+         Identifies the message as a Parse command.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The name of the destination prepared statement
+         (an empty string selects the unnamed prepared statement).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The query string to be parsed.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         The number of parameter data types specified
+         (can be zero).  Note that this is not an indication of
+         the number of parameters that might appear in the
+         query string, only the number that the frontend wants to
+         prespecify types for.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      Then, for each parameter, there is the following:
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Specifies the object ID of the parameter data type.
+         Placing a zero here is equivalent to leaving the type
+         unspecified.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-ParseComplete">
+    <term>ParseComplete (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('1')</term>
+       <listitem>
+        <para>
+         Identifies the message as a Parse-complete indicator.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(4)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-PasswordMessage">
+    <term>PasswordMessage (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('p')</term>
+       <listitem>
+        <para>
+         Identifies the message as a password response. Note that
+         this is also used for GSSAPI, SSPI and SASL response messages.
+         The exact message type can be deduced from the context.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The password (encrypted, if requested).
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-PortalSuspended">
+    <term>PortalSuspended (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('s')</term>
+       <listitem>
+        <para>
+         Identifies the message as a portal-suspended indicator.
+         Note this only appears if an Execute message's row-count limit
+         was reached.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(4)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-Query">
+    <term>Query (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('Q')</term>
+       <listitem>
+        <para>
+         Identifies the message as a simple query.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The query string itself.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-ReadyForQuery">
+    <term>ReadyForQuery (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('Z')</term>
+       <listitem>
+        <para>
+         Identifies the message type.  ReadyForQuery is sent
+         whenever the backend is ready for a new query cycle.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(5)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte1</term>
+       <listitem>
+        <para>
+         Current backend transaction status indicator.
+         Possible values are '<literal>I</literal>' if idle (not in
+         a transaction block); '<literal>T</literal>' if in a transaction
+         block; or '<literal>E</literal>' if in a failed transaction
+         block (queries will be rejected until block is ended).
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-RowDescription">
+    <term>RowDescription (B)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('T')</term>
+       <listitem>
+        <para>
+         Identifies the message as a row description.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         Specifies the number of fields in a row (can be zero).
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      Then, for each field, there is the following:
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The field name.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         If the field can be identified as a column of a specific
+         table, the object ID of the table; otherwise zero.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         If the field can be identified as a column of a specific
+         table, the attribute number of the column; otherwise zero.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         The object ID of the field's data type.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         The data type size (see <varname>pg_type.typlen</varname>).
+         Note that negative values denote variable-width types.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         The type modifier (see <varname>pg_attribute.atttypmod</varname>).
+         The meaning of the modifier is type-specific.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         The format code being used for the field.  Currently will
+         be zero (text) or one (binary).  In a RowDescription
+         returned from the statement variant of Describe, the
+         format code is not yet known and will always be zero.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-SASLInitialResponse">
+    <term>SASLInitialResponse (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('p')</term>
+       <listitem>
+        <para>
+         Identifies the message as an initial SASL response. Note that
+         this is also used for GSSAPI, SSPI and password response messages.
+         The exact message type is deduced from the context.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         Name of the SASL authentication mechanism that the client
+         selected.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of SASL mechanism specific "Initial Client Response" that
+         follows, or -1 if there is no Initial Response.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte<replaceable>n</replaceable></term>
+       <listitem>
+        <para>
+         SASL mechanism specific "Initial Response".
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-SASLResponse">
+    <term>SASLResponse (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('p')</term>
+       <listitem>
+        <para>
+         Identifies the message as a SASL response. Note that
+         this is also used for GSSAPI, SSPI and password response messages.
+         The exact message type can be deduced from the context.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte<replaceable>n</replaceable></term>
+       <listitem>
+        <para>
+         SASL mechanism specific message data.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-SSLRequest">
+    <term>SSLRequest (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Int32(8)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(80877103)</term>
+       <listitem>
+        <para>
+         The <acronym>SSL</acronym> request code.  The value is chosen to contain
+         <literal>1234</literal> in the most significant 16 bits, and <literal>5679</literal> in the
+         least significant 16 bits.  (To avoid confusion, this code
+         must not be the same as any protocol version number.)
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-StartupMessage">
+    <term>StartupMessage (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(196608)</term>
+       <listitem>
+        <para>
+         The protocol version number.  The most significant 16 bits are
+         the major version number (3 for the protocol described here).
+         The least significant 16 bits are the minor version number
+         (0 for the protocol described here).
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      The protocol version number is followed by one or more pairs of
+      parameter name and value strings.  A zero byte is required as a
+      terminator after the last name/value pair.
+      Parameters can appear in any
+      order.  <literal>user</literal> is required, others are optional.
+      Each parameter is specified as:
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The parameter name.  Currently recognized names are:
+
+         <variablelist>
+          <varlistentry>
+           <term><literal>user</literal></term>
+           <listitem>
+            <para>
+             The database user name to connect as.  Required;
+             there is no default.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>database</literal></term>
+           <listitem>
+            <para>
+             The database to connect to.  Defaults to the user name.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>options</literal></term>
+           <listitem>
+            <para>
+             Command-line arguments for the backend.  (This is
+             deprecated in favor of setting individual run-time
+             parameters.)  Spaces within this string are
+             considered to separate arguments, unless escaped with
+             a backslash (<literal>\</literal>); write <literal>\\</literal> to
+             represent a literal backslash.
+            </para>
+           </listitem>
+          </varlistentry>
+
+          <varlistentry>
+           <term><literal>replication</literal></term>
+           <listitem>
+            <para>
+             Used to connect in streaming replication mode, where
+             a small set of replication commands can be issued
+             instead of SQL statements. Value can be
+             <literal>true</literal>, <literal>false</literal>, or
+             <literal>database</literal>, and the default is
+             <literal>false</literal>. See
+             <xref linkend="protocol-replication"/> for details.
+            </para>
+           </listitem>
+          </varlistentry>
+         </variablelist>
+
+         In addition to the above, other parameters may be listed.
+         Parameter names beginning with <literal>_pq_.</literal> are
+         reserved for use as protocol extensions, while others are
+         treated as run-time parameters to be set at backend start
+         time.  Such settings will be applied during backend start
+         (after parsing the command-line arguments if any) and will
+         act as session defaults.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The parameter value.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-Sync">
+    <term>Sync (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('S')</term>
+       <listitem>
+        <para>
+         Identifies the message as a Sync command.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(4)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-message-formats-Terminate">
+    <term>Terminate (F)</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('X')</term>
+       <listitem>
+        <para>
+         Identifies the message as a termination.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32(4)</term>
+       <listitem>
+        <para>
+         Length of message contents in bytes, including self.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+  </variablelist>
+ </sect1>
+
+ <sect1 id="protocol-error-fields">
+  <title>Error and Notice Message Fields</title>
+
+  <para>
+   This section describes the fields that can appear in ErrorResponse and
+   NoticeResponse messages.  Each field type has a single-byte identification
+   token.  Note that any given field type should appear at most once per
+   message.
+  </para>
+
+  <variablelist>
+   <varlistentry>
+    <term><literal>S</literal></term>
+    <listitem>
+     <para>
+      Severity: the field contents are
+      <literal>ERROR</literal>, <literal>FATAL</literal>, or
+      <literal>PANIC</literal> (in an error message), or
+      <literal>WARNING</literal>, <literal>NOTICE</literal>, <literal>DEBUG</literal>,
+      <literal>INFO</literal>, or <literal>LOG</literal> (in a notice message),
+      or a localized translation of one of these.  Always present.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>V</literal></term>
+    <listitem>
+     <para>
+      Severity: the field contents are
+      <literal>ERROR</literal>, <literal>FATAL</literal>, or
+      <literal>PANIC</literal> (in an error message), or
+      <literal>WARNING</literal>, <literal>NOTICE</literal>, <literal>DEBUG</literal>,
+      <literal>INFO</literal>, or <literal>LOG</literal> (in a notice message).
+      This is identical to the <literal>S</literal> field except
+      that the contents are never localized.  This is present only in
+      messages generated by <productname>PostgreSQL</productname> versions 9.6
+      and later.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>C</literal></term>
+    <listitem>
+     <para>
+      Code: the SQLSTATE code for the error (see <xref
+      linkend="errcodes-appendix"/>).  Not localizable.  Always present.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>M</literal></term>
+    <listitem>
+     <para>
+      Message: the primary human-readable error message.
+      This should be accurate but terse (typically one line).
+      Always present.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>D</literal></term>
+    <listitem>
+     <para>
+      Detail: an optional secondary error message carrying more
+      detail about the problem.  Might run to multiple lines.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>H</literal></term>
+    <listitem>
+     <para>
+      Hint: an optional suggestion what to do about the problem.
+      This is intended to differ from Detail in that it offers advice
+      (potentially inappropriate) rather than hard facts.
+      Might run to multiple lines.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>P</literal></term>
+    <listitem>
+     <para>
+      Position: the field value is a decimal ASCII integer, indicating
+      an error cursor position as an index into the original query string.
+      The first character has index 1, and positions are measured in
+      characters not bytes.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>p</literal></term>
+    <listitem>
+     <para>
+      Internal position: this is defined the same as the <literal>P</literal>
+      field, but it is used when the cursor position refers to an internally
+      generated command rather than the one submitted by the client.
+      The <literal>q</literal> field will always appear when this field appears.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>q</literal></term>
+    <listitem>
+     <para>
+      Internal query: the text of a failed internally-generated command.
+      This could be, for example, an SQL query issued by a PL/pgSQL function.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>W</literal></term>
+    <listitem>
+     <para>
+      Where: an indication of the context in which the error occurred.
+      Presently this includes a call stack traceback of active
+      procedural language functions and internally-generated queries.
+      The trace is one entry per line, most recent first.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>s</literal></term>
+    <listitem>
+     <para>
+      Schema name: if the error was associated with a specific database
+      object, the name of the schema containing that object, if any.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>t</literal></term>
+    <listitem>
+     <para>
+      Table name: if the error was associated with a specific table, the
+      name of the table.  (Refer to the schema name field for the name of
+      the table's schema.)
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>c</literal></term>
+    <listitem>
+     <para>
+      Column name: if the error was associated with a specific table column,
+      the name of the column.  (Refer to the schema and table name fields to
+      identify the table.)
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>d</literal></term>
+    <listitem>
+     <para>
+      Data type name: if the error was associated with a specific data type,
+      the name of the data type.  (Refer to the schema name field for the
+      name of the data type's schema.)
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>n</literal></term>
+    <listitem>
+     <para>
+      Constraint name: if the error was associated with a specific
+      constraint, the name of the constraint.  Refer to fields listed above
+      for the associated table or domain.  (For this purpose, indexes are
+      treated as constraints, even if they weren't created with constraint
+      syntax.)
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>F</literal></term>
+    <listitem>
+     <para>
+      File: the file name of the source-code location where the error
+      was reported.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>L</literal></term>
+    <listitem>
+     <para>
+      Line: the line number of the source-code location where the error
+      was reported.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><literal>R</literal></term>
+    <listitem>
+     <para>
+      Routine: the name of the source-code routine reporting the error.
+     </para>
+    </listitem>
+   </varlistentry>
+  </variablelist>
+
+  <note>
+   <para>
+    The fields for schema name, table name, column name, data type name, and
+    constraint name are supplied only for a limited number of error types;
+    see <xref linkend="errcodes-appendix"/>.  Frontends should not assume that
+    the presence of any of these fields guarantees the presence of another
+    field.  Core error sources observe the interrelationships noted above, but
+    user-defined functions may use these fields in other ways.  In the same
+    vein, clients should not assume that these fields denote contemporary
+    objects in the current database.
+   </para>
+  </note>
+
+  <para>
+   The client is responsible for formatting displayed information to meet its
+   needs; in particular it should break long lines as needed.  Newline characters
+   appearing in the error message fields should be treated as paragraph breaks,
+   not line breaks.
+  </para>
+ </sect1>
+
+ <sect1 id="protocol-logicalrep-message-formats">
+  <title>Logical Replication Message Formats</title>
+
+  <para>
+   This section describes the detailed format of each logical replication
+   message.  These messages are either returned by the replication slot SQL
+   interface or are sent by a walsender.  In the case of a walsender, they are
+   encapsulated inside replication protocol WAL messages as described in
+   <xref linkend="protocol-replication"/>, and generally obey the same message
+   flow as physical replication.
+  </para>
+
+  <variablelist>
+   <varlistentry id="protocol-logicalrep-message-formats-Begin">
+    <term>Begin</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('B')</term>
+       <listitem>
+        <para>
+         Identifies the message as a begin message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int64 (XLogRecPtr)</term>
+       <listitem>
+        <para>
+         The final LSN of the transaction.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int64 (TimestampTz)</term>
+       <listitem>
+        <para>
+         Commit timestamp of the transaction. The value is in number
+         of microseconds since PostgreSQL epoch (2000-01-01).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-logicalrep-message-formats-Message">
+    <term>Message</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('M')</term>
+       <listitem>
+        <para>
+         Identifies the message as a logical decoding message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction (only present for streamed transactions).
+         This field is available since protocol version 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int8</term>
+       <listitem>
+        <para>
+         Flags; Either 0 for no flags or 1 if the logical decoding
+         message is transactional.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int64 (XLogRecPtr)</term>
+       <listitem>
+        <para>
+         The LSN of the logical decoding message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The prefix of the logical decoding message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Length of the content.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte<replaceable>n</replaceable></term>
+       <listitem>
+        <para>
+         The content of the logical decoding message.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-logicalrep-message-formats-Commit">
+    <term>Commit</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('C')</term>
+       <listitem>
+        <para>
+         Identifies the message as a commit message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int8(0)</term>
+       <listitem>
+        <para>
+         Flags; currently unused.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int64 (XLogRecPtr)</term>
+       <listitem>
+        <para>
+         The LSN of the commit.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int64 (XLogRecPtr)</term>
+       <listitem>
+        <para>
+         The end LSN of the transaction.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int64 (TimestampTz)</term>
+       <listitem>
+        <para>
+         Commit timestamp of the transaction. The value is in number
+         of microseconds since PostgreSQL epoch (2000-01-01).
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-logicalrep-message-formats-Origin">
+    <term>Origin</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('O')</term>
+       <listitem>
+        <para>
+         Identifies the message as an origin message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int64 (XLogRecPtr)</term>
+       <listitem>
+        <para>
+         The LSN of the commit on the origin server.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         Name of the origin.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      Note that there can be multiple Origin messages inside a single transaction.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-logicalrep-message-formats-Relation">
+    <term>Relation</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('R')</term>
+       <listitem>
+        <para>
+         Identifies the message as a relation message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction (only present for streamed transactions).
+         This field is available since protocol version 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (Oid)</term>
+       <listitem>
+        <para>
+         OID of the relation.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         Namespace (empty string for <literal>pg_catalog</literal>).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         Relation name.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int8</term>
+       <listitem>
+        <para>
+         Replica identity setting for the relation (same as
+         <structfield>relreplident</structfield> in <structname>pg_class</structname>).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int16</term>
+       <listitem>
+        <para>
+         Number of columns.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      Next, the following message part appears for each column included in
+      the publication (except generated columns):
+     </para>
+
+     <variablelist>
+      <varlistentry>
+       <term>Int8</term>
+       <listitem>
+        <para>
+         Flags for the column. Currently can be either 0 for no flags
+         or 1 which marks the column as part of the key.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         Name of the column.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (Oid)</term>
+       <listitem>
+        <para>
+         OID of the column's data type.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Type modifier of the column (<structfield>atttypmod</structfield>).
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-logicalrep-message-formats-Type">
+    <term>Type</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('Y')</term>
+       <listitem>
+        <para>
+         Identifies the message as a type message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction (only present for streamed transactions).
+         This field is available since protocol version 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (Oid)</term>
+       <listitem>
+        <para>
+         OID of the data type.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         Namespace (empty string for <literal>pg_catalog</literal>).
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         Name of the data type.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-logicalrep-message-formats-Insert">
+    <term>Insert</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('I')</term>
+       <listitem>
+        <para>
+         Identifies the message as an insert message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction (only present for streamed transactions).
+         This field is available since protocol version 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (Oid)</term>
+       <listitem>
+        <para>
+         OID of the relation corresponding to the ID in the relation
+         message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte1('N')</term>
+       <listitem>
+        <para>
+         Identifies the following TupleData message as a new tuple.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>TupleData</term>
+       <listitem>
+        <para>
+         TupleData message part representing the contents of new tuple.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-logicalrep-message-formats-Update">
+    <term>Update</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('U')</term>
+       <listitem>
+        <para>
+         Identifies the message as an update message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction (only present for streamed transactions).
+         This field is available since protocol version 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (Oid)</term>
+       <listitem>
+        <para>
+         OID of the relation corresponding to the ID in the relation
+         message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte1('K')</term>
+       <listitem>
+        <para>
+         Identifies the following TupleData submessage as a key.
+         This field is optional and is only present if
+         the update changed data in any of the column(s) that are
+         part of the REPLICA IDENTITY index.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte1('O')</term>
+       <listitem>
+        <para>
+         Identifies the following TupleData submessage as an old tuple.
+         This field is optional and is only present if table in which
+         the update happened has REPLICA IDENTITY set to FULL.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>TupleData</term>
+       <listitem>
+        <para>
+         TupleData message part representing the contents of the old tuple
+         or primary key. Only present if the previous 'O' or 'K' part
+         is present.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte1('N')</term>
+       <listitem>
+        <para>
+         Identifies the following TupleData message as a new tuple.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>TupleData</term>
+       <listitem>
+        <para>
+         TupleData message part representing the contents of a new tuple.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      The Update message may contain either a 'K' message part or an 'O' message part
+      or neither of them, but never both of them.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-logicalrep-message-formats-Delete">
+    <term>Delete</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('D')</term>
+       <listitem>
+        <para>
+         Identifies the message as a delete message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction (only present for streamed transactions).
+         This field is available since protocol version 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (Oid)</term>
+       <listitem>
+        <para>
+         OID of the relation corresponding to the ID in the relation
+         message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte1('K')</term>
+       <listitem>
+        <para>
+         Identifies the following TupleData submessage as a key.
+         This field is present if the table in which the delete has
+         happened uses an index as REPLICA IDENTITY.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Byte1('O')</term>
+       <listitem>
+        <para>
+         Identifies the following TupleData message as an old tuple.
+         This field is present if the table in which the delete
+         happened has REPLICA IDENTITY set to FULL.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>TupleData</term>
+       <listitem>
+        <para>
+         TupleData message part representing the contents of the old tuple
+         or primary key, depending on the previous field.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <para>
+      The Delete message may contain either a 'K' message part or an 'O' message part,
+      but never both of them.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-logicalrep-message-formats-Truncate">
+    <term>Truncate</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('T')</term>
+       <listitem>
+        <para>
+         Identifies the message as a truncate message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction (only present for streamed transactions).
+         This field is available since protocol version 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32</term>
+       <listitem>
+        <para>
+         Number of relations
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int8</term>
+       <listitem>
+        <para>
+         Option bits for <command>TRUNCATE</command>:
+         1 for <literal>CASCADE</literal>, 2 for <literal>RESTART IDENTITY</literal>
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (Oid)</term>
+       <listitem>
+        <para>
+         OID of the relation corresponding to the ID in the relation
+         message.  This field is repeated for each relation.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+  </variablelist>
+
+  <para>
+   The following messages (Stream Start, Stream Stop, Stream Commit, and
+   Stream Abort) are available since protocol version 2.
+  </para>
+
+  <variablelist>
+   <varlistentry id="protocol-logicalrep-message-formats-Stream-Start">
+    <term>Stream Start</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('S')</term>
+       <listitem>
+        <para>
+         Identifies the message as a stream start message.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int8</term>
+       <listitem>
+        <para>
+         A value of 1 indicates this is the first stream segment for
+         this XID, 0 for any other stream segment.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-logicalrep-message-formats-Stream-Stop">
+    <term>Stream Stop</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('E')</term>
+       <listitem>
+        <para>
+         Identifies the message as a stream stop message.
+        </para>
+       </listitem>
       </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-logicalrep-message-formats-Stream-Commit">
+    <term>Stream Commit</term>
+    <listitem>
+     <variablelist>
       <varlistentry>
-      <term>
-          Int64
-      </term>
-      <listitem>
-      <para>
-          The server's system clock at the time of transmission, as
-          microseconds since midnight on 2000-01-01.
-      </para>
-      </listitem>
+       <term>Byte1('c')</term>
+       <listitem>
+        <para>
+         Identifies the message as a stream commit message.
+        </para>
+       </listitem>
       </varlistentry>
+
       <varlistentry>
-      <term>
-          Byte<replaceable>n</replaceable>
-      </term>
-      <listitem>
-      <para>
-          A section of the WAL data stream.
-      </para>
-      <para>
-          A single WAL record is never split across two XLogData messages.
-          When a WAL record crosses a WAL page boundary, and is therefore
-          already split using continuation records, it can be split at the page
-          boundary. In other words, the first main WAL record and its
-          continuation records can be sent in different XLogData messages.
-      </para>
-      </listitem>
-      </varlistentry>
-      </variablelist>
-      </para>
-      </listitem>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction.
+        </para>
+       </listitem>
       </varlistentry>
-      <varlistentry id="protocol-replication-primary-keepalive-message">
-      <term>
-          Primary keepalive message (B)
-      </term>
-      <listitem>
-      <para>
-      <variablelist>
+
       <varlistentry>
-      <term>
-          Byte1('k')
-      </term>
-      <listitem>
-      <para>
-          Identifies the message as a sender keepalive.
-      </para>
-      </listitem>
+       <term>Int8(0)</term>
+       <listitem>
+        <para>
+         Flags; currently unused.
+        </para>
+       </listitem>
       </varlistentry>
+
       <varlistentry>
-      <term>
-          Int64
-      </term>
-      <listitem>
-      <para>
-          The current end of WAL on the server.
-      </para>
-      </listitem>
+       <term>Int64 (XLogRecPtr)</term>
+       <listitem>
+        <para>
+         The LSN of the commit.
+        </para>
+       </listitem>
       </varlistentry>
+
       <varlistentry>
-      <term>
-          Int64
-      </term>
-      <listitem>
-      <para>
-          The server's system clock at the time of transmission, as
-          microseconds since midnight on 2000-01-01.
-      </para>
-      </listitem>
+       <term>Int64 (XLogRecPtr)</term>
+       <listitem>
+        <para>
+         The end LSN of the transaction.
+        </para>
+       </listitem>
       </varlistentry>
+
       <varlistentry>
-      <term>
-          Byte1
-      </term>
-      <listitem>
-      <para>
-          1 means that the client should reply to this message as soon as
-          possible, to avoid a timeout disconnect. 0 otherwise.
-      </para>
-      </listitem>
-      </varlistentry>
-      </variablelist>
-      </para>
-      </listitem>
+       <term>Int64 (TimestampTz)</term>
+       <listitem>
+        <para>
+         Commit timestamp of the transaction. The value is in number
+         of microseconds since PostgreSQL epoch (2000-01-01).
+        </para>
+       </listitem>
       </varlistentry>
-      </variablelist>
-     </para>
-
-     <para>
-       The receiving process can send replies back to the sender at any time,
-       using one of the following message formats (also in the payload of a
-       CopyData message):
-     </para>
+     </variablelist>
+    </listitem>
+   </varlistentry>
 
-     <para>
-      <variablelist>
-      <varlistentry id="protocol-replication-standby-status-update">
-      <term>
-          Standby status update (F)
-      </term>
-      <listitem>
-      <para>
-      <variablelist>
+   <varlistentry id="protocol-logicalrep-message-formats-Stream-Abort">
+    <term>Stream Abort</term>
+    <listitem>
+     <variablelist>
       <varlistentry>
-      <term>
-          Byte1('r')
-      </term>
-      <listitem>
-      <para>
-          Identifies the message as a receiver status update.
-      </para>
-      </listitem>
+       <term>Byte1('A')</term>
+       <listitem>
+        <para>
+         Identifies the message as a stream abort message.
+        </para>
+       </listitem>
       </varlistentry>
+
       <varlistentry>
-      <term>
-          Int64
-      </term>
-      <listitem>
-      <para>
-          The location of the last WAL byte + 1 received and written to disk
-          in the standby.
-      </para>
-      </listitem>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction.
+        </para>
+       </listitem>
       </varlistentry>
+
       <varlistentry>
-      <term>
-          Int64
-      </term>
-      <listitem>
-      <para>
-          The location of the last WAL byte + 1 flushed to disk in
-          the standby.
-      </para>
-      </listitem>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the subtransaction (will be same as xid of the transaction for top-level
+         transactions).
+        </para>
+       </listitem>
       </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+  </variablelist>
+
+  <para>
+   The following messages (Begin Prepare, Prepare, Commit Prepared, Rollback Prepared, Stream Prepare)
+   are available since protocol version 3.
+  </para>
+
+  <variablelist>
+   <varlistentry id="protocol-logicalrep-message-formats-Begin-Prepare">
+    <term>Begin Prepare</term>
+    <listitem>
+     <variablelist>
       <varlistentry>
-      <term>
-          Int64
-      </term>
-      <listitem>
-      <para>
-          The location of the last WAL byte + 1 applied in the standby.
-      </para>
-      </listitem>
+       <term>Byte1('b')</term>
+       <listitem>
+        <para>
+         Identifies the message as the beginning of a two-phase transaction message.
+        </para>
+       </listitem>
       </varlistentry>
+
       <varlistentry>
-      <term>
-          Int64
-      </term>
-      <listitem>
-      <para>
-          The client's system clock at the time of transmission, as
-          microseconds since midnight on 2000-01-01.
-      </para>
-      </listitem>
+       <term>Int64 (XLogRecPtr)</term>
+       <listitem>
+        <para>
+         The LSN of the prepare.
+        </para>
+       </listitem>
       </varlistentry>
+
       <varlistentry>
-      <term>
-          Byte1
-      </term>
-      <listitem>
-      <para>
-          If 1, the client requests the server to reply to this message
-          immediately. This can be used to ping the server, to test if
-          the connection is still healthy.
-      </para>
-      </listitem>
-      </varlistentry>
-      </variablelist>
-      </para>
-      </listitem>
+       <term>Int64 (XLogRecPtr)</term>
+       <listitem>
+        <para>
+         The end LSN of the prepared transaction.
+        </para>
+       </listitem>
       </varlistentry>
-      </variablelist>
-     </para>
 
-     <para>
-      <variablelist>
-      <varlistentry id="protocol-replication-hot-standby-feedback-message">
-      <term>
-          Hot standby feedback message (F)
-      </term>
-      <listitem>
-      <para>
-      <variablelist>
       <varlistentry>
-      <term>
-          Byte1('h')
-      </term>
-      <listitem>
-      <para>
-          Identifies the message as a hot standby feedback message.
-      </para>
-      </listitem>
+       <term>Int64 (TimestampTz)</term>
+       <listitem>
+        <para>
+         Prepare timestamp of the transaction. The value is in number
+         of microseconds since PostgreSQL epoch (2000-01-01).
+        </para>
+       </listitem>
       </varlistentry>
+
       <varlistentry>
-      <term>
-          Int64
-      </term>
-      <listitem>
-      <para>
-          The client's system clock at the time of transmission, as
-          microseconds since midnight on 2000-01-01.
-      </para>
-      </listitem>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction.
+        </para>
+       </listitem>
       </varlistentry>
+
       <varlistentry>
-      <term>
-          Int32
-      </term>
-      <listitem>
-      <para>
-          The standby's current global xmin, excluding the catalog_xmin from any
-          replication slots. If both this value and the following
-          catalog_xmin are 0 this is treated as a notification that hot standby
-          feedback will no longer be sent on this connection. Later non-zero
-          messages may reinitiate the feedback mechanism.
-      </para>
-      </listitem>
+       <term>String</term>
+       <listitem>
+        <para>
+         The user defined GID of the two-phase transaction.
+        </para>
+       </listitem>
       </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry id="protocol-logicalrep-message-formats-Prepare">
+    <term>Prepare</term>
+    <listitem>
+     <variablelist>
       <varlistentry>
-      <term>
-          Int32
-      </term>
-      <listitem>
-      <para>
-          The epoch of the global xmin xid on the standby.
-      </para>
-      </listitem>
+       <term>Byte1('P')</term>
+       <listitem>
+        <para>
+         Identifies the message as a two-phase prepared transaction message.
+        </para>
+       </listitem>
       </varlistentry>
+
       <varlistentry>
-      <term>
-          Int32
-      </term>
-      <listitem>
-      <para>
-          The lowest catalog_xmin of any replication slots on the standby. Set to 0
-          if no catalog_xmin exists on the standby or if hot standby feedback is being
-          disabled.
-      </para>
-      </listitem>
+       <term>Int8(0)</term>
+       <listitem>
+        <para>
+         Flags; currently unused.
+        </para>
+       </listitem>
       </varlistentry>
+
       <varlistentry>
-      <term>
-          Int32
-      </term>
-      <listitem>
-      <para>
-          The epoch of the catalog_xmin xid on the standby.
-      </para>
-      </listitem>
+       <term>Int64 (XLogRecPtr)</term>
+       <listitem>
+        <para>
+         The LSN of the prepare.
+        </para>
+       </listitem>
       </varlistentry>
-      </variablelist>
-      </para>
-      </listitem>
+
+      <varlistentry>
+       <term>Int64 (XLogRecPtr)</term>
+       <listitem>
+        <para>
+         The end LSN of the prepared transaction.
+        </para>
+       </listitem>
       </varlistentry>
-      </variablelist>
-     </para>
-    </listitem>
-  </varlistentry>
-  <varlistentry id="protocol-replication-start-replication-slot-logical">
-    <term><literal>START_REPLICATION</literal> <literal>SLOT</literal> <replaceable class="parameter">slot_name</replaceable> <literal>LOGICAL</literal> <replaceable class="parameter">XXX/XXX</replaceable> [ ( <replaceable>option_name</replaceable> [ <replaceable>option_value</replaceable> ] [, ...] ) ]</term>
-    <listitem>
-     <para>
-      Instructs server to start streaming WAL for logical replication,
-      starting at either WAL location <replaceable
-      class="parameter">XXX/XXX</replaceable> or the slot's
-      <literal>confirmed_flush_lsn</literal> (see <xref
-      linkend="view-pg-replication-slots"/>), whichever is greater. This
-      behavior makes it easier for clients to avoid updating their local LSN
-      status when there is no data to process. However, starting at a
-      different LSN than requested might not catch certain kinds of client
-      errors; so the client may wish to check that
-      <literal>confirmed_flush_lsn</literal> matches its expectations before
-      issuing <literal>START_REPLICATION</literal>.
-     </para>
 
-     <para>
-      The server can reply with an error, for example if the
-      slot does not exist. On success, the server responds with a CopyBothResponse
-      message, and then starts to stream WAL to the frontend.
-     </para>
+      <varlistentry>
+       <term>Int64 (TimestampTz)</term>
+       <listitem>
+        <para>
+         Prepare timestamp of the transaction. The value is in number
+         of microseconds since PostgreSQL epoch (2000-01-01).
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <para>
-      The messages inside the CopyBothResponse messages are of the same format
-      documented for <literal>START_REPLICATION ... PHYSICAL</literal>, including
-      two CommandComplete messages.
-     </para>
+      <varlistentry>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <para>
-      The output plugin associated with the selected slot is used
-      to process the output for streaming.
-     </para>
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The user defined GID of the two-phase transaction.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
 
+   <varlistentry id="protocol-logicalrep-message-formats-Commit-Prepared">
+    <term>Commit Prepared</term>
+    <listitem>
      <variablelist>
       <varlistentry>
-       <term><literal>SLOT</literal> <replaceable class="parameter">slot_name</replaceable></term>
+       <term>Byte1('K')</term>
        <listitem>
-         <para>
-          The name of the slot to stream changes from. This parameter is required,
-          and must correspond to an existing logical replication slot created
-          with <literal>CREATE_REPLICATION_SLOT</literal> in
-          <literal>LOGICAL</literal> mode.
-         </para>
+        <para>
+         Identifies the message as the commit of a two-phase transaction message.
+        </para>
        </listitem>
       </varlistentry>
+
       <varlistentry>
-       <term><replaceable class="parameter">XXX/XXX</replaceable></term>
+       <term>Int8(0)</term>
        <listitem>
         <para>
-         The WAL location to begin streaming at.
+         Flags; currently unused.
         </para>
        </listitem>
       </varlistentry>
+
       <varlistentry>
-       <term><replaceable class="parameter">option_name</replaceable></term>
+       <term>Int64 (XLogRecPtr)</term>
        <listitem>
         <para>
-         The name of an option passed to the slot's logical decoding plugin.
+         The LSN of the commit prepared.
         </para>
        </listitem>
       </varlistentry>
+
       <varlistentry>
-       <term><replaceable class="parameter">option_value</replaceable></term>
+       <term>Int64 (XLogRecPtr)</term>
        <listitem>
         <para>
-         Optional value, in the form of a string constant, associated with the
-         specified option.
+         The end LSN of the commit prepared transaction.
         </para>
        </listitem>
       </varlistentry>
-     </variablelist>
-    </listitem>
-  </varlistentry>
 
-  <varlistentry id="protocol-replication-drop-replication-slot">
-    <term>
-     <literal>DROP_REPLICATION_SLOT</literal> <replaceable class="parameter">slot_name</replaceable> <optional> <literal>WAIT</literal> </optional>
-     <indexterm><primary>DROP_REPLICATION_SLOT</primary></indexterm>
-    </term>
-    <listitem>
-     <para>
-      Drops a replication slot, freeing any reserved server-side resources.
-      If the slot is a logical slot that was created in a database other than
-      the database the walsender is connected to, this command fails.
-     </para>
-     <variablelist>
       <varlistentry>
-       <term><replaceable class="parameter">slot_name</replaceable></term>
+       <term>Int64 (TimestampTz)</term>
        <listitem>
-         <para>
-          The name of the slot to drop.
-         </para>
+        <para>
+         Commit timestamp of the transaction. The value is in number
+         of microseconds since PostgreSQL epoch (2000-01-01).
+        </para>
        </listitem>
       </varlistentry>
 
       <varlistentry>
-       <term><literal>WAIT</literal></term>
+       <term>Int32 (TransactionId)</term>
        <listitem>
         <para>
-         This option causes the command to wait if the slot is active until
-         it becomes inactive, instead of the default behavior of raising an
-         error.
+         Xid of the transaction.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The user defined GID of the two-phase transaction.
         </para>
        </listitem>
       </varlistentry>
      </variablelist>
     </listitem>
-  </varlistentry>
+   </varlistentry>
 
-  <varlistentry id="protocol-replication-base-backup" xreflabel="BASE_BACKUP">
-    <term><literal>BASE_BACKUP</literal> [ ( <replaceable class="parameter">option</replaceable> [, ...] ) ]
-     <indexterm><primary>BASE_BACKUP</primary></indexterm>
-    </term>
+   <varlistentry id="protocol-logicalrep-message-formats-Rollback-Prepared">
+    <term>Rollback Prepared</term>
     <listitem>
-     <para>
-      Instructs the server to start streaming a base backup.
-      The system will automatically be put in backup mode before the backup
-      is started, and taken out of it when the backup is complete. The
-      following options are accepted:
-      <variablelist>
-       <varlistentry>
-        <term><literal>LABEL</literal> <replaceable>'label'</replaceable></term>
-        <listitem>
-         <para>
-          Sets the label of the backup. If none is specified, a backup label
-          of <literal>base backup</literal> will be used. The quoting rules
-          for the label are the same as a standard SQL string with
-          <xref linkend="guc-standard-conforming-strings"/> turned on.
-         </para>
-        </listitem>
-       </varlistentry>
-
-       <varlistentry>
-        <term><literal>TARGET</literal> <replaceable>'target'</replaceable></term>
-        <listitem>
-         <para>
-          Tells the server where to send the backup.  If the target is
-          <literal>client</literal>, which is the default, the backup data is
-          sent to the client. If it is <literal>server</literal>, the backup
-          data is written to the server at the pathname specified by the
-          <literal>TARGET_DETAIL</literal> option. If it is
-          <literal>blackhole</literal>, the backup data is not sent
-          anywhere; it is simply discarded.
-         </para>
-
-         <para>
-          The <literal>server</literal> target requires superuser privilege or
-          being granted the <literal>pg_write_server_files</literal> role.
-         </para>
-        </listitem>
-       </varlistentry>
-
-       <varlistentry>
-        <term><literal>TARGET_DETAIL</literal> <replaceable>'detail'</replaceable></term>
-        <listitem>
-         <para>
-          Provides additional information about the backup target.
-         </para>
-
-         <para>
-          Currently, this option can only be used when the backup target is
-          <literal>server</literal>. It specifies the server directory
-          to which the backup should be written.
-         </para>
-        </listitem>
-       </varlistentry>
-
-       <varlistentry>
-        <term><literal>PROGRESS [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
-        <listitem>
-         <para>
-          If set to true, request information required to generate a progress
-          report. This will send back an approximate size in the header of each
-          tablespace, which can be used to calculate how far along the stream
-          is done. This is calculated by enumerating all the file sizes once
-          before the transfer is even started, and might as such have a
-          negative impact on the performance.  In particular, it might take
-          longer before the first data
-          is streamed. Since the database files can change during the backup,
-          the size is only approximate and might both grow and shrink between
-          the time of approximation and the sending of the actual files.
-          The default is false.
-         </para>
-        </listitem>
-       </varlistentry>
-
-       <varlistentry>
-        <term><literal>CHECKPOINT { 'fast' | 'spread' }</literal></term>
-        <listitem>
-         <para>
-          Sets the type of checkpoint to be performed at the beginning of the
-          base backup. The default is <literal>spread</literal>.
-         </para>
-        </listitem>
-       </varlistentry>
-
-       <varlistentry>
-        <term><literal>WAL [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
-        <listitem>
-         <para>
-          If set to true, include the necessary WAL segments in the backup.
-          This will include all the files between start and stop backup in the
-          <filename>pg_wal</filename> directory of the base directory tar
-          file. The default is false.
-         </para>
-        </listitem>
-       </varlistentry>
-
-       <varlistentry>
-        <term><literal>WAIT [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
-        <listitem>
-         <para>
-          If set to true, the backup will wait until the last required WAL
-          segment has been archived, or emit a warning if log archiving is
-          not enabled. If false, the backup will neither wait nor warn,
-          leaving the client responsible for ensuring the required log is
-          available. The default is true.
-         </para>
-        </listitem>
-       </varlistentry>
-
-       <varlistentry>
-        <term><literal>COMPRESSION</literal> <replaceable>'method'</replaceable></term>
-        <listitem>
-         <para>
-          Instructs the server to compress the backup using the specified
-          method. Currently, the supported methods are <literal>gzip</literal>,
-          <literal>lz4</literal>, and <literal>zstd</literal>.
-         </para>
-        </listitem>
-       </varlistentry>
-
-       <varlistentry>
-        <term><literal>COMPRESSION_DETAIL</literal> <replaceable>detail</replaceable></term>
-        <listitem>
-         <para>
-          Specifies details for the chosen compression method. This should only
-          be used in conjunction with the <literal>COMPRESSION</literal>
-          option.  If the value is an integer, it specifies the compression
-          level.  Otherwise, it should be a comma-separated list of items,
-          each of the form <literal>keyword</literal> or
-          <literal>keyword=value</literal>. Currently, the supported keywords
-          are <literal>level</literal> and <literal>workers</literal>.
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('r')</term>
+       <listitem>
+        <para>
+         Identifies the message as the rollback of a two-phase transaction message.
         </para>
+       </listitem>
+      </varlistentry>
 
+      <varlistentry>
+       <term>Int8(0)</term>
+       <listitem>
         <para>
-          The <literal>level</literal> keyword sets the compression level.
-          For <literal>gzip</literal> the compression level should be an
-          integer between 1 and 9, for <literal>lz4</literal> an integer
-          between 1 and 12, and for <literal>zstd</literal> an integer
-          between 1 and 22.
-         </para>
+         Flags; currently unused.
+        </para>
+       </listitem>
+      </varlistentry>
 
+      <varlistentry>
+       <term>Int64 (XLogRecPtr)</term>
+       <listitem>
         <para>
-          The <literal>workers</literal> keyword sets the number of threads
-          that should be used for parallel compression. Parallel compression
-          is supported only for <literal>zstd</literal>.
-         </para>
-        </listitem>
-       </varlistentry>
-
-       <varlistentry>
-        <term><literal>MAX_RATE</literal> <replaceable>rate</replaceable></term>
-        <listitem>
-         <para>
-          Limit (throttle) the maximum amount of data transferred from server
-          to client per unit of time.  The expected unit is kilobytes per second.
-          If this option is specified, the value must either be equal to zero
-          or it must fall within the range from 32 kB through 1 GB (inclusive).
-          If zero is passed or the option is not specified, no restriction is
-          imposed on the transfer.
-         </para>
-        </listitem>
-       </varlistentry>
-
-       <varlistentry>
-        <term><literal>TABLESPACE_MAP [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
-        <listitem>
-         <para>
-          If true, include information about symbolic links present in the
-          directory <filename>pg_tblspc</filename> in a file named
-          <filename>tablespace_map</filename>. The tablespace map file includes
-          each symbolic link name as it exists in the directory
-          <filename>pg_tblspc/</filename> and the full path of that symbolic link.
-          The default is false.
-         </para>
-        </listitem>
-       </varlistentry>
-
-       <varlistentry>
-        <term><literal>VERIFY_CHECKSUMS [ <replaceable class="parameter">boolean</replaceable> ]</literal></term>
-        <listitem>
-         <para>
-          If true, checksums are verified during a base backup if they are
-          enabled. If false, this is skipped. The default is true.
-         </para>
-        </listitem>
-       </varlistentry>
-
-       <varlistentry>
-        <term><literal>MANIFEST</literal> <replaceable>manifest_option</replaceable></term>
-        <listitem>
-         <para>
-          When this option is specified with a value of <literal>yes</literal>
-          or <literal>force-encode</literal>, a backup manifest is created
-          and sent along with the backup.  The manifest is a list of every
-          file present in the backup with the exception of any WAL files that
-          may be included. It also stores the size, last modification time, and
-          optionally a checksum for each file.
-          A value of <literal>force-encode</literal> forces all filenames
-          to be hex-encoded; otherwise, this type of encoding is performed only
-          for files whose names are non-UTF8 octet sequences.
-          <literal>force-encode</literal> is intended primarily for testing
-          purposes, to be sure that clients which read the backup manifest
-          can handle this case. For compatibility with previous releases,
-          the default is <literal>MANIFEST 'no'</literal>.
-         </para>
-        </listitem>
-       </varlistentry>
-
-       <varlistentry>
-        <term><literal>MANIFEST_CHECKSUMS</literal> <replaceable>checksum_algorithm</replaceable></term>
-        <listitem>
-         <para>
-          Specifies the checksum algorithm that should be applied to each file included
-          in the backup manifest. Currently, the available
-          algorithms are <literal>NONE</literal>, <literal>CRC32C</literal>,
-          <literal>SHA224</literal>, <literal>SHA256</literal>,
-          <literal>SHA384</literal>, and <literal>SHA512</literal>.
-          The default is <literal>CRC32C</literal>.
-         </para>
-        </listitem>
-       </varlistentry>
-      </variablelist>
-     </para>
-     <para>
-      When the backup is started, the server will first send two
-      ordinary result sets, followed by one or more CopyOutResponse
-      results.
-     </para>
-     <para>
-      The first ordinary result set contains the starting position of the
-      backup, in a single row with two columns. The first column contains
-      the start position given in XLogRecPtr format, and the second column
-      contains the corresponding timeline ID.
-     </para>
-     <para>
-      The second ordinary result set has one row for each tablespace.
-      The fields in this row are:
-      <variablelist>
-       <varlistentry>
-        <term><literal>spcoid</literal> (<type>oid</type>)</term>
-        <listitem>
-         <para>
-          The OID of the tablespace, or null if it's the base
-          directory.
-         </para>
-        </listitem>
-       </varlistentry>
-       <varlistentry>
-        <term><literal>spclocation</literal> (<type>text</type>)</term>
-        <listitem>
-         <para>
-          The full path of the tablespace directory, or null
-          if it's the base directory.
-         </para>
-        </listitem>
-       </varlistentry>
-       <varlistentry>
-        <term><literal>size</literal> (<type>int8</type>)</term>
-        <listitem>
-         <para>
-          The approximate size of the tablespace, in kilobytes (1024 bytes),
-          if progress report has been requested; otherwise it's null.
-         </para>
-        </listitem>
-       </varlistentry>
-      </variablelist>
-     </para>
-
-     <para>
-      After the second regular result set, a CopyOutResponse will be sent.
-      The payload of each CopyData message will contain a message in one of
-      the following formats:
-     </para>
-
-     <para>
-      <variablelist>
+         The end LSN of the prepared transaction.
+        </para>
+       </listitem>
+      </varlistentry>
 
       <varlistentry>
-        <term>new archive (B)</term>
-        <listitem><para><variablelist>
-          <varlistentry>
-            <term>Byte1('n')</term>
-            <listitem><para>
-              Identifes the messaage as indicating the start of a new archive.
-              There will be one archive for the main data directory and one
-              for each additional tablespace; each will use tar format
-              (following the <quote>ustar interchange format</quote> specified
-              in the POSIX 1003.1-2008 standard).
-            </para></listitem>
-          </varlistentry>
-          <varlistentry>
-            <term>String</term>
-            <listitem><para>
-              The file name for this archive.
-            </para></listitem>
-          </varlistentry>
-          <varlistentry>
-            <term>String</term>
-            <listitem><para>
-              For the main data directory, an empty string. For other
-              tablespaces, the full path to the directory from which this
-              archive was created.
-            </para></listitem>
-          </varlistentry>
-        </variablelist></para></listitem>
+       <term>Int64 (XLogRecPtr)</term>
+       <listitem>
+        <para>
+         The end LSN of the rollback prepared transaction.
+        </para>
+       </listitem>
       </varlistentry>
 
       <varlistentry>
-        <term>manifest (B)</term>
-        <listitem><para><variablelist>
-          <varlistentry>
-            <term>Byte1('m')</term>
-            <listitem><para>
-              Identifes the message as indicating the start of the backup
-              manifest.
-            </para></listitem>
-          </varlistentry>
-        </variablelist></para></listitem>
+       <term>Int64 (TimestampTz)</term>
+       <listitem>
+        <para>
+         Prepare timestamp of the transaction. The value is in number
+         of microseconds since PostgreSQL epoch (2000-01-01).
+        </para>
+       </listitem>
       </varlistentry>
 
       <varlistentry>
-        <term>archive or manifest data (B)</term>
-        <listitem><para><variablelist>
-          <varlistentry>
-            <term>Byte1('d')</term>
-            <listitem><para>
-              Identifes the message as containing archive or manifest data.
-            </para></listitem>
-          </varlistentry>
-          <varlistentry>
-            <term>Byte<replaceable>n</replaceable></term>
-            <listitem><para>
-              Data bytes.
-            </para></listitem>
-          </varlistentry>
-        </variablelist></para></listitem>
+       <term>Int64 (TimestampTz)</term>
+       <listitem>
+        <para>
+         Rollback timestamp of the transaction. The value is in number
+         of microseconds since PostgreSQL epoch (2000-01-01).
+        </para>
+       </listitem>
       </varlistentry>
 
       <varlistentry>
-        <term>progress report (B)</term>
-        <listitem><para><variablelist>
-          <varlistentry>
-            <term>Byte1('p')</term>
-            <listitem><para>
-              Identifes the message as a progress report.
-            </para></listitem>
-          </varlistentry>
-          <varlistentry>
-            <term>Int64</term>
-            <listitem><para>
-              The number of bytes from the current tablespace for which
-              processing has been completed.
-            </para></listitem>
-          </varlistentry>
-        </variablelist></para></listitem>
+       <term>Int32 (TransactionId)</term>
+       <listitem>
+        <para>
+         Xid of the transaction.
+        </para>
+       </listitem>
       </varlistentry>
 
-      </variablelist>
-     </para>
-
-     <para>
-      After the CopyOutResponse, or all such responses, have been sent, a
-      final ordinary result set will be sent, containing the WAL end position
-      of the backup, in the same format as the start position.
-     </para>
+      <varlistentry>
+       <term>String</term>
+       <listitem>
+        <para>
+         The user defined GID of the two-phase transaction.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
 
-     <para>
-      The tar archive for the data directory and each tablespace will contain
-      all files in the directories, regardless of whether they are
-      <productname>PostgreSQL</productname> files or other files added to the same
-      directory. The only excluded files are:
-      <itemizedlist spacing="compact" mark="bullet">
+   <varlistentry id="protocol-logicalrep-message-formats-Stream-Prepare">
+    <term>Stream Prepare</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Byte1('p')</term>
        <listitem>
         <para>
-         <filename>postmaster.pid</filename>
+         Identifies the message as a two-phase stream prepare message.
         </para>
        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int8(0)</term>
        <listitem>
         <para>
-         <filename>postmaster.opts</filename>
+         Flags; currently unused.
         </para>
        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int64 (XLogRecPtr)</term>
        <listitem>
         <para>
-         <filename>pg_internal.init</filename> (found in multiple directories)
+         The LSN of the prepare.
         </para>
        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int64 (XLogRecPtr)</term>
        <listitem>
         <para>
-         Various temporary files and directories created during the operation
-         of the PostgreSQL server, such as any file or directory beginning
-         with <filename>pgsql_tmp</filename> and temporary relations.
+         The end LSN of the prepare transaction.
         </para>
        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int64 (TimestampTz)</term>
        <listitem>
         <para>
-         Unlogged relations, except for the init fork which is required to
-         recreate the (empty) unlogged relation on recovery.
+         Prepare timestamp of the transaction. The value is in number
+         of microseconds since PostgreSQL epoch (2000-01-01).
         </para>
        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>Int32 (TransactionId)</term>
        <listitem>
         <para>
-         <filename>pg_wal</filename>, including subdirectories. If the backup is run
-         with WAL files included, a synthesized version of <filename>pg_wal</filename> will be
-         included, but it will only contain the files necessary for the
-         backup to work, not the rest of the contents.
+         Xid of the transaction.
         </para>
        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>String</term>
        <listitem>
         <para>
-         <filename>pg_dynshmem</filename>, <filename>pg_notify</filename>,
-         <filename>pg_replslot</filename>, <filename>pg_serial</filename>,
-         <filename>pg_snapshots</filename>, <filename>pg_stat_tmp</filename>, and
-         <filename>pg_subtrans</filename> are copied as empty directories (even if
-         they are symbolic links).
+         The user defined GID of the two-phase transaction.
         </para>
        </listitem>
+      </varlistentry>
+     </variablelist>
+    </listitem>
+   </varlistentry>
+  </variablelist>
+
+  <para>
+   The following message parts are shared by the above messages.
+  </para>
+
+  <variablelist>
+   <varlistentry id="protocol-logicalrep-message-formats-TupleData">
+    <term>TupleData</term>
+    <listitem>
+     <variablelist>
+      <varlistentry>
+       <term>Int16</term>
        <listitem>
         <para>
-         Files other than regular files and directories, such as symbolic
-         links (other than for the directories listed above) and special
-         device files, are skipped.  (Symbolic links
-         in <filename>pg_tblspc</filename> are maintained.)
+         Number of columns.
         </para>
        </listitem>
-      </itemizedlist>
-      Owner, group, and file mode are set if the underlying file system on
-      the server supports it.
-     </para>
-    </listitem>
-  </varlistentry>
-</variablelist>
-
-</para>
+      </varlistentry>
+     </variablelist>
 
-</sect1>
+     <para>
+      Next, one of the following submessages appears for each column (except generated columns):
 
-<sect1 id="protocol-logical-replication">
- <title>Logical Streaming Replication Protocol</title>
+      <variablelist>
+       <varlistentry>
+        <term>Byte1('n')</term>
+        <listitem>
+         <para>
+          Identifies the data as NULL value.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+      Or
+      <variablelist>
+       <varlistentry>
+        <term>Byte1('u')</term>
+        <listitem>
+         <para>
+          Identifies unchanged TOASTed value (the actual value is not
+          sent).
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+      Or
+      <variablelist>
+       <varlistentry>
+        <term>Byte1('t')</term>
+        <listitem>
+         <para>
+          Identifies the data as text formatted value.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+      Or
+      <variablelist>
+       <varlistentry>
+        <term>Byte1('b')</term>
+        <listitem>
+         <para>
+          Identifies the data as binary formatted value.
+         </para>
+        </listitem>
+       </varlistentry>
 
- <para>
-  This section describes the logical replication protocol, which is the message
-  flow started by the <literal>START_REPLICATION</literal>
-  <literal>SLOT</literal> <replaceable class="parameter">slot_name</replaceable>
-  <literal>LOGICAL</literal> replication command.
- </para>
+       <varlistentry>
+        <term>Int32</term>
+        <listitem>
+         <para>
+          Length of the column value.
+         </para>
+        </listitem>
+       </varlistentry>
 
- <para>
-  The logical streaming replication protocol builds on the primitives of
-  the physical streaming replication protocol.
- </para>
+       <varlistentry>
+        <term>Byte<replaceable>n</replaceable></term>
+        <listitem>
+         <para>
+          The value of the column, either in binary or in text format.
+          (As specified in the preceding format byte).
+          <replaceable>n</replaceable> is the above length.
+         </para>
+        </listitem>
+       </varlistentry>
+      </variablelist>
+     </para>
+    </listitem>
+   </varlistentry>
+  </variablelist>
+ </sect1>
 
- <sect2 id="protocol-logical-replication-params">
-  <title>Logical Streaming Replication Parameters</title>
+ <sect1 id="protocol-changes">
+  <title>Summary of Changes since Protocol 2.0</title>
 
   <para>
-   The logical replication <literal>START_REPLICATION</literal> command
-   accepts following parameters:
-
-   <variablelist>
-    <varlistentry>
-     <term>
-      proto_version
-     </term>
-     <listitem>
-      <para>
-       Protocol version. Currently versions <literal>1</literal>, <literal>2</literal>,
-       and <literal>3</literal> are supported.
-      </para>
-      <para>
-       Version <literal>2</literal> is supported only for server version 14
-       and above, and it allows streaming of large in-progress transactions.
-      </para>
-      <para>
-       Version <literal>3</literal> is supported only for server version 15
-       and above, and it allows streaming of two-phase transactions.
-      </para>
-     </listitem>
-    </varlistentry>
-
-    <varlistentry>
-     <term>
-      publication_names
-     </term>
-     <listitem>
-      <para>
-       Comma separated list of publication names for which to subscribe
-       (receive changes). The individual publication names are treated
-       as standard objects names and can be quoted the same as needed.
-      </para>
-     </listitem>
-    </varlistentry>
-   </variablelist>
-
+   This section provides a quick checklist of changes, for the benefit of
+   developers trying to update existing client libraries to protocol 3.0.
   </para>
- </sect2>
-
- <sect2 id="protocol-logical-messages">
-  <title>Logical Replication Protocol Messages</title>
 
   <para>
-   The individual protocol messages are discussed in the following
-   subsections. Individual messages are described in
-   <xref linkend="protocol-logicalrep-message-formats"/>.
+   The initial startup packet uses a flexible list-of-strings format
+   instead of a fixed format.  Notice that session default values for run-time
+   parameters can now be specified directly in the startup packet.  (Actually,
+   you could do that before using the <literal>options</literal> field, but given the
+   limited width of <literal>options</literal> and the lack of any way to quote
+   whitespace in the values, it wasn't a very safe technique.)
   </para>
 
   <para>
-   All top-level protocol messages begin with a message type byte.
-   While represented in code as a character, this is a signed byte with no
-   associated encoding.
+   All messages now have a length count immediately following the message type
+   byte (except for startup packets, which have no type byte).  Also note that
+   PasswordMessage now has a type byte.
   </para>
 
   <para>
-   Since the streaming replication protocol supplies a message length there
-   is no need for top-level protocol messages to embed a length in their
-   header.
+   ErrorResponse and NoticeResponse ('<literal>E</literal>' and '<literal>N</literal>')
+   messages now contain multiple fields, from which the client code can
+   assemble an error message of the desired level of verbosity.  Note that
+   individual fields will typically not end with a newline, whereas the single
+   string sent in the older protocol always did.
   </para>
 
- </sect2>
-
- <sect2 id="protocol-logical-messages-flow">
-  <title>Logical Replication Protocol Message Flow</title>
-
   <para>
-   With the exception of the <literal>START_REPLICATION</literal> command and
-   the replay progress messages, all information flows only from the backend
-   to the frontend.
+   The ReadyForQuery ('<literal>Z</literal>') message includes a transaction status
+   indicator.
   </para>
 
   <para>
-   The logical replication protocol sends individual transactions one by one.
-   This means that all messages between a pair of Begin and Commit messages
-   belong to the same transaction. Similarly, all messages between a pair of
-   Begin Prepare and Prepare messages belong to the same transaction.
-   It also sends changes of large in-progress transactions between a pair of
-   Stream Start and Stream Stop messages. The last stream of such a transaction
-   contains a Stream Commit or Stream Abort message.
+   The distinction between BinaryRow and DataRow message types is gone; the
+   single DataRow message type serves for returning data in all formats.
+   Note that the layout of DataRow has changed to make it easier to parse.
+   Also, the representation of binary values has changed: it is no longer
+   directly tied to the server's internal representation.
   </para>
 
   <para>
-   Every sent transaction contains zero or more DML messages (Insert,
-   Update, Delete). In case of a cascaded setup it can also contain Origin
-   messages. The origin message indicates that the transaction originated on
-   different replication node. Since a replication node in the scope of logical
-   replication protocol can be pretty much anything, the only identifier
-   is the origin name. It's downstream's responsibility to handle this as
-   needed (if needed). The Origin message is always sent before any DML
-   messages in the transaction.
+   There is a new <quote>extended query</quote> sub-protocol, which adds the frontend
+   message types Parse, Bind, Execute, Describe, Close, Flush, and Sync, and the
+   backend message types ParseComplete, BindComplete, PortalSuspended,
+   ParameterDescription, NoData, and CloseComplete.  Existing clients do not
+   have to concern themselves with this sub-protocol, but making use of it
+   might allow improvements in performance or functionality.
   </para>
 
   <para>
-   Every DML message contains a relation OID, identifying the publisher's
-   relation that was acted on.  Before the first DML message for a given
-   relation OID, a Relation message will be sent, describing the schema of
-   that relation.  Subsequently, a new Relation message will be sent if
-   the relation's definition has changed since the last Relation message
-   was sent for it.  (The protocol assumes that the client is capable of
-   remembering this metadata for as many relations as needed.)
+   <command>COPY</command> data is now encapsulated into CopyData and CopyDone messages.  There
+   is a well-defined way to recover from errors during <command>COPY</command>.  The special
+   <quote><literal>\.</literal></quote> last line is not needed anymore, and is not sent
+   during <command>COPY OUT</command>.
+   (It is still recognized as a terminator during <command>COPY IN</command>, but its use is
+   deprecated and will eventually be removed.)  Binary <command>COPY</command> is supported.
+   The CopyInResponse and CopyOutResponse messages include fields indicating
+   the number of columns and the format of each column.
   </para>
 
   <para>
-   Relation messages identify column types by their OIDs.  In the case
-   of a built-in type, it is assumed that the client can look up that
-   type OID locally, so no additional data is needed.  For a non-built-in
-   type OID, a Type message will be sent before the Relation message,
-   to provide the type name associated with that OID.  Thus, a client that
-   needs to specifically identify the types of relation columns should
-   cache the contents of Type messages, and first consult that cache to
-   see if the type OID is defined there.  If not, look up the type OID
-   locally.
+   The layout of FunctionCall and FunctionCallResponse messages has changed.
+   FunctionCall can now support passing NULL arguments to functions.  It also
+   can handle passing parameters and retrieving results in either text or
+   binary format.  There is no longer any reason to consider FunctionCall a
+   potential security hole, since it does not offer direct access to internal
+   server data representations.
   </para>
- </sect2>
-</sect1>
-
-<sect1 id="protocol-message-types">
-<title>Message Data Types</title>
-
-<para>
-This section describes the base data types used in messages.
-
-<variablelist>
-
-<varlistentry>
-<term>
-        Int<replaceable>n</replaceable>(<replaceable>i</replaceable>)
-</term>
-<listitem>
-<para>
-                An <replaceable>n</replaceable>-bit integer in network byte
-                order (most significant byte first).
-                If <replaceable>i</replaceable> is specified it
-                is the exact value that will appear, otherwise the value
-                is variable.  Eg. Int16, Int32(42).
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int<replaceable>n</replaceable>[<replaceable>k</replaceable>]
-</term>
-<listitem>
-<para>
-                An array of <replaceable>k</replaceable>
-                <replaceable>n</replaceable>-bit integers, each in network
-                byte order.  The array length <replaceable>k</replaceable>
-                is always determined by an earlier field in the message.
-                Eg. Int16[M].
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        String(<replaceable>s</replaceable>)
-</term>
-<listitem>
-<para>
-                A null-terminated string (C-style string).  There is no
-                specific length limitation on strings.
-                If <replaceable>s</replaceable> is specified it is the exact
-                value that will appear, otherwise the value is variable.
-                Eg. String, String("user").
-</para>
-
-<note>
-<para>
-<emphasis>There is no predefined limit</emphasis> on the length of a string
-that can be returned by the backend.  Good coding strategy for a frontend
-is to use an expandable buffer so that anything that fits in memory can be
-accepted.  If that's not feasible, read the full string and discard trailing
-characters that don't fit into your fixed-size buffer.
-</para>
-</note>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>(<replaceable>c</replaceable>)
-</term>
-<listitem>
-<para>
-                Exactly <replaceable>n</replaceable> bytes.  If the field
-                width <replaceable>n</replaceable> is not a constant, it is
-                always determinable from an earlier field in the message.
-                If <replaceable>c</replaceable> is specified it is the exact
-                value.  Eg. Byte2, Byte1('\n').
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-</sect1>
-
-<sect1 id="protocol-message-formats">
-<title>Message Formats</title>
-
-<para>
-This section describes the detailed format of each message.  Each is marked to
-indicate that it can be sent by a frontend (F), a backend (B), or both
-(F &amp; B).
-Notice that although each message includes a byte count at the beginning,
-the message format is defined so that the message end can be found without
-reference to the byte count.  This aids validity checking.  (The CopyData
-message is an exception, because it forms part of a data stream; the contents
-of any individual CopyData message cannot be interpretable on their own.)
-</para>
-
-<variablelist>
-
-
-<varlistentry id="protocol-message-formats-AuthenticationOk">
-<term>
-AuthenticationOk (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('R')
-</term>
-<listitem>
-<para>
-                Identifies the message as an authentication request.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(8)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(0)
-</term>
-<listitem>
-<para>
-                Specifies that the authentication was successful.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-AuthenticationKerberosV5">
-<term>
-AuthenticationKerberosV5 (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('R')
-</term>
-<listitem>
-<para>
-                Identifies the message as an authentication request.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(8)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(2)
-</term>
-<listitem>
-<para>
-                Specifies that Kerberos V5 authentication is required.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-AuthenticationCleartextPassword">
-<term>
-AuthenticationCleartextPassword (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('R')
-</term>
-<listitem>
-<para>
-                Identifies the message as an authentication request.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(8)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(3)
-</term>
-<listitem>
-<para>
-                Specifies that a clear-text password is required.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-AuthenticationMD5Password">
-<term>
-AuthenticationMD5Password (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('R')
-</term>
-<listitem>
-<para>
-                Identifies the message as an authentication request.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(12)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(5)
-</term>
-<listitem>
-<para>
-                Specifies that an MD5-encrypted password is required.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte4
-</term>
-<listitem>
-<para>
-                The salt to use when encrypting the password.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-AuthenticationSCMCredential">
-<term>
-AuthenticationSCMCredential (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('R')
-</term>
-<listitem>
-<para>
-                Identifies the message as an authentication request.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(8)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(6)
-</term>
-<listitem>
-<para>
-                Specifies that an SCM credentials message is required.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-AuthenticationGSS">
-<term>
-AuthenticationGSS (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('R')
-</term>
-<listitem>
-<para>
-                Identifies the message as an authentication request.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(8)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(7)
-</term>
-<listitem>
-<para>
-                Specifies that GSSAPI authentication is required.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-AuthenticationGSSContinue">
-<term>
-AuthenticationGSSContinue (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('R')
-</term>
-<listitem>
-<para>
-                Identifies the message as an authentication request.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(8)
-</term>
-<listitem>
-<para>
-                Specifies that this message contains GSSAPI or SSPI data.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>
-</term>
-<listitem>
-<para>
-                GSSAPI or SSPI authentication data.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-AuthenticationSSPI">
-<term>
-AuthenticationSSPI (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('R')
-</term>
-<listitem>
-<para>
-                Identifies the message as an authentication request.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(8)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(9)
-</term>
-<listitem>
-<para>
-                Specifies that SSPI authentication is required.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-AuthenticationSASL">
-<term>
-AuthenticationSASL (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('R')
-</term>
-<listitem>
-<para>
-                Identifies the message as an authentication request.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(10)
-</term>
-<listitem>
-<para>
-                Specifies that SASL authentication is required.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-The message body is a list of SASL authentication mechanisms, in the
-server's order of preference. A zero byte is required as terminator after
-the last authentication mechanism name. For each mechanism, there is the
-following:
-<variablelist>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                Name of a SASL authentication mechanism.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-AuthenticationSASLContinue">
-<term>
-AuthenticationSASLContinue (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('R')
-</term>
-<listitem>
-<para>
-                Identifies the message as an authentication request.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(11)
-</term>
-<listitem>
-<para>
-                Specifies that this message contains a SASL challenge.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>
-</term>
-<listitem>
-<para>
-                SASL data, specific to the SASL mechanism being used.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-AuthenticationSASLFinal">
-<term>
-AuthenticationSASLFinal (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('R')
-</term>
-<listitem>
-<para>
-                Identifies the message as an authentication request.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(12)
-</term>
-<listitem>
-<para>
-                Specifies that SASL authentication has completed.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>
-</term>
-<listitem>
-<para>
-                SASL outcome "additional data", specific to the SASL mechanism
-                being used.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-BackendKeyData">
-<term>
-BackendKeyData (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('K')
-</term>
-<listitem>
-<para>
-                Identifies the message as cancellation key data.
-                The frontend must save these values if it wishes to be
-                able to issue CancelRequest messages later.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(12)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                The process ID of this backend.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                The secret key of this backend.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-Bind">
-<term>
-Bind (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('B')
-</term>
-<listitem>
-<para>
-                Identifies the message as a Bind command.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The name of the destination portal
-                (an empty string selects the unnamed portal).
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The name of the source prepared statement
-                (an empty string selects the unnamed prepared statement).
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                The number of parameter format codes that follow
-                (denoted <replaceable>C</replaceable> below).
-                This can be zero to indicate that there are no parameters
-                or that the parameters all use the default format (text);
-                or one, in which case the specified format code is applied
-                to all parameters; or it can equal the actual number of
-                parameters.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16[<replaceable>C</replaceable>]
-</term>
-<listitem>
-<para>
-                The parameter format codes.  Each must presently be
-                zero (text) or one (binary).
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                The number of parameter values that follow (possibly zero).
-                This must match the number of parameters needed by the query.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        Next, the following pair of fields appear for each parameter:
-<variablelist>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                The length of the parameter value, in bytes (this count
-                does not include itself).  Can be zero.
-                As a special case, -1 indicates a NULL parameter value.
-                No value bytes follow in the NULL case.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>
-</term>
-<listitem>
-<para>
-                The value of the parameter, in the format indicated by the
-                associated format code.
-                <replaceable>n</replaceable> is the above length.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        After the last parameter, the following fields appear:
-<variablelist>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                The number of result-column format codes that follow
-                (denoted <replaceable>R</replaceable> below).
-                This can be zero to indicate that there are no result columns
-                or that the result columns should all use the default format
-                (text);
-                or one, in which case the specified format code is applied
-                to all result columns (if any); or it can equal the actual
-                number of result columns of the query.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16[<replaceable>R</replaceable>]
-</term>
-<listitem>
-<para>
-                The result-column format codes.  Each must presently be
-                zero (text) or one (binary).
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-BindComplete">
-<term>
-BindComplete (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('2')
-</term>
-<listitem>
-<para>
-                Identifies the message as a Bind-complete indicator.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(4)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-CancelRequest">
-<term>
-CancelRequest (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Int32(16)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(80877102)
-</term>
-<listitem>
-<para>
-                The cancel request code.  The value is chosen to contain
-                <literal>1234</literal> in the most significant 16 bits, and <literal>5678</literal> in the
-                least significant 16 bits.  (To avoid confusion, this code
-                must not be the same as any protocol version number.)
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                The process ID of the target backend.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                The secret key for the target backend.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-Close">
-<term>
-Close (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('C')
-</term>
-<listitem>
-<para>
-                Identifies the message as a Close command.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte1
-</term>
-<listitem>
-<para>
-                '<literal>S</literal>' to close a prepared statement; or
-                '<literal>P</literal>' to close a portal.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The name of the prepared statement or portal to close
-                (an empty string selects the unnamed prepared statement
-                or portal).
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-CloseComplete">
-<term>
-CloseComplete (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('3')
-</term>
-<listitem>
-<para>
-                Identifies the message as a Close-complete indicator.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(4)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-CommandComplete">
-<term>
-CommandComplete (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('C')
-</term>
-<listitem>
-<para>
-                Identifies the message as a command-completed response.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-       <para>
-        The command tag.  This is usually a single
-        word that identifies which SQL command was completed.
-       </para>
-
-       <para>
-        For an <command>INSERT</command> command, the tag is
-        <literal>INSERT <replaceable>oid</replaceable>
-        <replaceable>rows</replaceable></literal>, where
-        <replaceable>rows</replaceable> is the number of rows
-        inserted. <replaceable>oid</replaceable> used to be the object ID
-        of the inserted row if <replaceable>rows</replaceable> was 1
-        and the target table had OIDs, but OIDs system columns are
-        not supported anymore; therefore <replaceable>oid</replaceable>
-        is always 0.
-       </para>
-
-       <para>
-        For a <command>DELETE</command> command, the tag is
-        <literal>DELETE <replaceable>rows</replaceable></literal> where
-        <replaceable>rows</replaceable> is the number of rows deleted.
-       </para>
-
-       <para>
-        For an <command>UPDATE</command> command, the tag is
-        <literal>UPDATE <replaceable>rows</replaceable></literal> where
-        <replaceable>rows</replaceable> is the number of rows updated.
-       </para>
-
-       <para>
-        For a <command>SELECT</command> or <command>CREATE TABLE AS</command>
-        command, the tag is <literal>SELECT <replaceable>rows</replaceable></literal>
-        where <replaceable>rows</replaceable> is the number of rows retrieved.
-       </para>
-
-       <para>
-        For a <command>MOVE</command> command, the tag is
-        <literal>MOVE <replaceable>rows</replaceable></literal> where
-        <replaceable>rows</replaceable> is the number of rows the
-        cursor's position has been changed by.
-       </para>
-
-       <para>
-        For a <command>FETCH</command> command, the tag is
-        <literal>FETCH <replaceable>rows</replaceable></literal> where
-        <replaceable>rows</replaceable> is the number of rows that
-        have been retrieved from the cursor.
-       </para>
-
-       <para>
-        For a <command>COPY</command> command, the tag is
-        <literal>COPY <replaceable>rows</replaceable></literal> where
-        <replaceable>rows</replaceable> is the number of rows copied.
-        (Note: the row count appears only in
-        <productname>PostgreSQL</productname> 8.2 and later.)
-       </para>
-
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-CopyData">
-<term>
-CopyData (F &amp; B)
-</term>
-<listitem>
-<para>
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('d')
-</term>
-<listitem>
-<para>
-                Identifies the message as <command>COPY</command> data.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>
-</term>
-<listitem>
-<para>
-                Data that forms part of a <command>COPY</command> data stream.  Messages sent
-                from the backend will always correspond to single data rows,
-                but messages sent by frontends might divide the data stream
-                arbitrarily.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-CopyDone">
-<term>
-CopyDone (F &amp; B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('c')
-</term>
-<listitem>
-<para>
-                Identifies the message as a <command>COPY</command>-complete indicator.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(4)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-CopyFail">
-<term>
-CopyFail (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('f')
-</term>
-<listitem>
-<para>
-                Identifies the message as a <command>COPY</command>-failure indicator.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                An error message to report as the cause of failure.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-CopyInResponse">
-<term>
-CopyInResponse (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('G')
-</term>
-<listitem>
-<para>
-                Identifies the message as a Start Copy In response.
-                The frontend must now send copy-in data (if not
-                prepared to do so, send a CopyFail message).
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int8
-</term>
-<listitem>
-<para>
-                0 indicates the overall <command>COPY</command> format is textual (rows
-                separated by newlines, columns separated by separator
-                characters, etc).
-                1 indicates the overall copy format is binary (similar
-                to DataRow format).
-                See <xref linkend="sql-copy"/>
-                for more information.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                The number of columns in the data to be copied
-                (denoted <replaceable>N</replaceable> below).
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16[<replaceable>N</replaceable>]
-</term>
-<listitem>
-<para>
-                The format codes to be used for each column.
-                Each must presently be zero (text) or one (binary).
-                All must be zero if the overall copy format is textual.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-CopyOutResponse">
-<term>
-CopyOutResponse (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('H')
-</term>
-<listitem>
-<para>
-                Identifies the message as a Start Copy Out response.
-                This message will be followed by copy-out data.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int8
-</term>
-<listitem>
-<para>
-                0 indicates the overall <command>COPY</command> format
-                is textual (rows separated by newlines, columns
-                separated by separator characters, etc). 1 indicates
-                the overall copy format is binary (similar to DataRow
-                format). See <xref linkend="sql-copy"/> for more information.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                The number of columns in the data to be copied
-                (denoted <replaceable>N</replaceable> below).
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16[<replaceable>N</replaceable>]
-</term>
-<listitem>
-<para>
-                The format codes to be used for each column.
-                Each must presently be zero (text) or one (binary).
-                All must be zero if the overall copy format is textual.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-CopyBothResponse">
-<term>
-CopyBothResponse (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('W')
-</term>
-<listitem>
-<para>
-                Identifies the message as a Start Copy Both response.
-                This message is used only for Streaming Replication.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int8
-</term>
-<listitem>
-<para>
-                0 indicates the overall <command>COPY</command> format
-                is textual (rows separated by newlines, columns
-                separated by separator characters, etc). 1 indicates
-                the overall copy format is binary (similar to DataRow
-                format). See <xref linkend="sql-copy"/> for more information.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                The number of columns in the data to be copied
-                (denoted <replaceable>N</replaceable> below).
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16[<replaceable>N</replaceable>]
-</term>
-<listitem>
-<para>
-                The format codes to be used for each column.
-                Each must presently be zero (text) or one (binary).
-                All must be zero if the overall copy format is textual.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-DataRow">
-<term>
-DataRow (B)
-</term>
-<listitem>
-<para>
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('D')
-</term>
-<listitem>
-<para>
-                Identifies the message as a data row.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                The number of column values that follow (possibly zero).
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        Next, the following pair of fields appear for each column:
-<variablelist>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                The length of the column value, in bytes (this count
-                does not include itself).  Can be zero.
-                As a special case, -1 indicates a NULL column value.
-                No value bytes follow in the NULL case.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>
-</term>
-<listitem>
-<para>
-                The value of the column, in the format indicated by the
-                associated format code.
-                <replaceable>n</replaceable> is the above length.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-Describe">
-<term>
-Describe (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('D')
-</term>
-<listitem>
-<para>
-                Identifies the message as a Describe command.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte1
-</term>
-<listitem>
-<para>
-                '<literal>S</literal>' to describe a prepared statement; or
-                '<literal>P</literal>' to describe a portal.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The name of the prepared statement or portal to describe
-                (an empty string selects the unnamed prepared statement
-                or portal).
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-EmptyQueryResponse">
-<term>
-EmptyQueryResponse (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('I')
-</term>
-<listitem>
-<para>
-                Identifies the message as a response to an empty query string.
-                (This substitutes for CommandComplete.)
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(4)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-ErrorResponse">
-<term>
-ErrorResponse (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('E')
-</term>
-<listitem>
-<para>
-                Identifies the message as an error.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        The message body consists of one or more identified fields,
-        followed by a zero byte as a terminator.  Fields can appear in
-        any order.  For each field there is the following:
-<variablelist>
-<varlistentry>
-<term>
-        Byte1
-</term>
-<listitem>
-<para>
-                A code identifying the field type; if zero, this is
-                the message terminator and no string follows.
-                The presently defined field types are listed in
-                <xref linkend="protocol-error-fields"/>.
-                Since more field types might be added in future,
-                frontends should silently ignore fields of unrecognized
-                type.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The field value.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-Execute">
-<term>
-Execute (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('E')
-</term>
-<listitem>
-<para>
-                Identifies the message as an Execute command.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The name of the portal to execute
-                (an empty string selects the unnamed portal).
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Maximum number of rows to return, if portal contains
-                a query that returns rows (ignored otherwise).  Zero
-                denotes <quote>no limit</quote>.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-Flush">
-<term>
-Flush (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('H')
-</term>
-<listitem>
-<para>
-                Identifies the message as a Flush command.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(4)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-FunctionCall">
-<term>
-FunctionCall (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('F')
-</term>
-<listitem>
-<para>
-                Identifies the message as a function call.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Specifies the object ID of the function to call.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                The number of argument format codes that follow
-                (denoted <replaceable>C</replaceable> below).
-                This can be zero to indicate that there are no arguments
-                or that the arguments all use the default format (text);
-                or one, in which case the specified format code is applied
-                to all arguments; or it can equal the actual number of
-                arguments.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16[<replaceable>C</replaceable>]
-</term>
-<listitem>
-<para>
-                The argument format codes.  Each must presently be
-                zero (text) or one (binary).
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                Specifies the number of arguments being supplied to the
-                function.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        Next, the following pair of fields appear for each argument:
-<variablelist>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                The length of the argument value, in bytes (this count
-                does not include itself).  Can be zero.
-                As a special case, -1 indicates a NULL argument value.
-                No value bytes follow in the NULL case.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>
-</term>
-<listitem>
-<para>
-                The value of the argument, in the format indicated by the
-                associated format code.
-                <replaceable>n</replaceable> is the above length.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        After the last argument, the following field appears:
-<variablelist>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                The format code for the function result. Must presently be
-                zero (text) or one (binary).
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-FunctionCallResponse">
-<term>
-FunctionCallResponse (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('V')
-</term>
-<listitem>
-<para>
-                Identifies the message as a function call result.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                The length of the function result value, in bytes (this count
-                does not include itself).  Can be zero.
-                As a special case, -1 indicates a NULL function result.
-                No value bytes follow in the NULL case.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>
-</term>
-<listitem>
-<para>
-                The value of the function result, in the format indicated by
-                the associated format code.
-                <replaceable>n</replaceable> is the above length.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-GSSENCRequest">
-<term>
-GSSENCRequest (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Int32(8)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(80877104)
-</term>
-<listitem>
-<para>
-                The <acronym>GSSAPI</acronym> Encryption request code.  The value is chosen to contain
-                <literal>1234</literal> in the most significant 16 bits, and <literal>5680</literal> in the
-                least significant 16 bits.  (To avoid confusion, this code
-                must not be the same as any protocol version number.)
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-GSSResponse">
-<term>
-GSSResponse (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('p')
-</term>
-<listitem>
-<para>
-                Identifies the message as a GSSAPI or SSPI response. Note that
-                this is also used for SASL and password response messages.
-                The exact message type can be deduced from the context.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>
-</term>
-<listitem>
-<para>
-                GSSAPI/SSPI specific message data.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-message-formats-NegotiateProtocolVersion">
-<term>
-NegotiateProtocolVersion (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('v')
-</term>
-<listitem>
-<para>
-                Identifies the message as a protocol version negotiation
-                message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Newest minor protocol version supported by the server
-                for the major protocol version requested by the client.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Number of protocol options not recognized by the server.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        Then, for protocol option not recognized by the server, there
-        is the following:
-<variablelist>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The option name.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-message-formats-NoData">
-<term>
-NoData (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('n')
-</term>
-<listitem>
-<para>
-                Identifies the message as a no-data indicator.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(4)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-NoticeResponse">
-<term>
-NoticeResponse (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('N')
-</term>
-<listitem>
-<para>
-                Identifies the message as a notice.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        The message body consists of one or more identified fields,
-        followed by a zero byte as a terminator.  Fields can appear in
-        any order.  For each field there is the following:
-<variablelist>
-<varlistentry>
-<term>
-        Byte1
-</term>
-<listitem>
-<para>
-                A code identifying the field type; if zero, this is
-                the message terminator and no string follows.
-                The presently defined field types are listed in
-                <xref linkend="protocol-error-fields"/>.
-                Since more field types might be added in future,
-                frontends should silently ignore fields of unrecognized
-                type.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The field value.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-NotificationResponse">
-<term>
-NotificationResponse (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('A')
-</term>
-<listitem>
-<para>
-                Identifies the message as a notification response.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                The process ID of the notifying backend process.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The name of the channel that the notify has been raised on.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The <quote>payload</quote> string passed from the notifying process.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-ParameterDescription">
-<term>
-ParameterDescription (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('t')
-</term>
-<listitem>
-<para>
-                Identifies the message as a parameter description.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                The number of parameters used by the statement
-                (can be zero).
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        Then, for each parameter, there is the following:
-<variablelist>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Specifies the object ID of the parameter data type.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-ParameterStatus">
-<term>
-ParameterStatus (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('S')
-</term>
-<listitem>
-<para>
-                Identifies the message as a run-time parameter status report.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The name of the run-time parameter being reported.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The current value of the parameter.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-Parse">
-<term>
-Parse (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('P')
-</term>
-<listitem>
-<para>
-                Identifies the message as a Parse command.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The name of the destination prepared statement
-                (an empty string selects the unnamed prepared statement).
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The query string to be parsed.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                The number of parameter data types specified
-                (can be zero).  Note that this is not an indication of
-                the number of parameters that might appear in the
-                query string, only the number that the frontend wants to
-                prespecify types for.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        Then, for each parameter, there is the following:
-<variablelist>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Specifies the object ID of the parameter data type.
-                Placing a zero here is equivalent to leaving the type
-                unspecified.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-ParseComplete">
-<term>
-ParseComplete (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('1')
-</term>
-<listitem>
-<para>
-                Identifies the message as a Parse-complete indicator.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(4)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-PasswordMessage">
-<term>
-PasswordMessage (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('p')
-</term>
-<listitem>
-<para>
-                Identifies the message as a password response. Note that
-                this is also used for GSSAPI, SSPI and SASL response messages.
-                The exact message type can be deduced from the context.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The password (encrypted, if requested).
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-PortalSuspended">
-<term>
-PortalSuspended (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('s')
-</term>
-<listitem>
-<para>
-                Identifies the message as a portal-suspended indicator.
-                Note this only appears if an Execute message's row-count limit
-                was reached.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(4)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-Query">
-<term>
-Query (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('Q')
-</term>
-<listitem>
-<para>
-                Identifies the message as a simple query.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The query string itself.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-ReadyForQuery">
-<term>
-ReadyForQuery (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('Z')
-</term>
-<listitem>
-<para>
-                Identifies the message type.  ReadyForQuery is sent
-                whenever the backend is ready for a new query cycle.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(5)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte1
-</term>
-<listitem>
-<para>
-                Current backend transaction status indicator.
-                Possible values are '<literal>I</literal>' if idle (not in
-                a transaction block); '<literal>T</literal>' if in a transaction
-                block; or '<literal>E</literal>' if in a failed transaction
-                block (queries will be rejected until block is ended).
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-RowDescription">
-<term>
-RowDescription (B)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('T')
-</term>
-<listitem>
-<para>
-                Identifies the message as a row description.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                Specifies the number of fields in a row (can be zero).
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        Then, for each field, there is the following:
-<variablelist>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The field name.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                If the field can be identified as a column of a specific
-                table, the object ID of the table; otherwise zero.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                If the field can be identified as a column of a specific
-                table, the attribute number of the column; otherwise zero.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                The object ID of the field's data type.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                The data type size (see <varname>pg_type.typlen</varname>).
-                Note that negative values denote variable-width types.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                The type modifier (see <varname>pg_attribute.atttypmod</varname>).
-                The meaning of the modifier is type-specific.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                The format code being used for the field.  Currently will
-                be zero (text) or one (binary).  In a RowDescription
-                returned from the statement variant of Describe, the
-                format code is not yet known and will always be zero.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-SASLInitialResponse">
-<term>
-SASLInitialResponse (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('p')
-</term>
-<listitem>
-<para>
-                Identifies the message as an initial SASL response. Note that
-                this is also used for GSSAPI, SSPI and password response messages.
-                The exact message type is deduced from the context.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                Name of the SASL authentication mechanism that the client
-                selected.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of SASL mechanism specific "Initial Client Response" that
-                follows, or -1 if there is no Initial Response.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>
-</term>
-<listitem>
-<para>
-                SASL mechanism specific "Initial Response".
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-SASLResponse">
-<term>
-SASLResponse (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('p')
-</term>
-<listitem>
-<para>
-                Identifies the message as a SASL response. Note that
-                this is also used for GSSAPI, SSPI and password response messages.
-                The exact message type can be deduced from the context.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>
-</term>
-<listitem>
-<para>
-                SASL mechanism specific message data.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-SSLRequest">
-<term>
-SSLRequest (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Int32(8)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(80877103)
-</term>
-<listitem>
-<para>
-                The <acronym>SSL</acronym> request code.  The value is chosen to contain
-                <literal>1234</literal> in the most significant 16 bits, and <literal>5679</literal> in the
-                least significant 16 bits.  (To avoid confusion, this code
-                must not be the same as any protocol version number.)
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-StartupMessage">
-<term>
-StartupMessage (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(196608)
-</term>
-<listitem>
-<para>
-                The protocol version number.  The most significant 16 bits are
-                the major version number (3 for the protocol described here).
-                The least significant 16 bits are the minor version number
-                (0 for the protocol described here).
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        The protocol version number is followed by one or more pairs of
-        parameter name and value strings.  A zero byte is required as a
-        terminator after the last name/value pair.
-        Parameters can appear in any
-        order.  <literal>user</literal> is required, others are optional.
-        Each parameter is specified as:
-<variablelist>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The parameter name.  Currently recognized names are:
-
-<variablelist>
-<varlistentry>
-<term>
-                <literal>user</literal>
-</term>
-<listitem>
-<para>
-                        The database user name to connect as.  Required;
-                        there is no default.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-                <literal>database</literal>
-</term>
-<listitem>
-<para>
-                        The database to connect to.  Defaults to the user name.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-                <literal>options</literal>
-</term>
-<listitem>
-<para>
-                        Command-line arguments for the backend.  (This is
-                        deprecated in favor of setting individual run-time
-                        parameters.)  Spaces within this string are
-                        considered to separate arguments, unless escaped with
-                        a backslash (<literal>\</literal>); write <literal>\\</literal> to
-                        represent a literal backslash.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-                <literal>replication</literal>
-</term>
-<listitem>
-<para>
-                        Used to connect in streaming replication mode, where
-                        a small set of replication commands can be issued
-                        instead of SQL statements. Value can be
-                        <literal>true</literal>, <literal>false</literal>, or
-                        <literal>database</literal>, and the default is
-                        <literal>false</literal>. See
-                        <xref linkend="protocol-replication"/> for details.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-                In addition to the above, other parameters may be listed.
-                Parameter names beginning with <literal>_pq_.</literal> are
-                reserved for use as protocol extensions, while others are
-                treated as run-time parameters to be set at backend start
-                time.  Such settings will be applied during backend start
-                (after parsing the command-line arguments if any) and will
-                act as session defaults.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The parameter value.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-Sync">
-<term>
-Sync (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('S')
-</term>
-<listitem>
-<para>
-                Identifies the message as a Sync command.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(4)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-<varlistentry id="protocol-message-formats-Terminate">
-<term>
-Terminate (F)
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('X')
-</term>
-<listitem>
-<para>
-                Identifies the message as a termination.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32(4)
-</term>
-<listitem>
-<para>
-                Length of message contents in bytes, including self.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-
-</variablelist>
-
-</sect1>
-
-
-<sect1 id="protocol-error-fields">
-<title>Error and Notice Message Fields</title>
-
-<para>
-This section describes the fields that can appear in ErrorResponse and
-NoticeResponse messages.  Each field type has a single-byte identification
-token.  Note that any given field type should appear at most once per
-message.
-</para>
-
-<variablelist>
-
-<varlistentry>
-<term>
-<literal>S</literal>
-</term>
-<listitem>
-<para>
-        Severity: the field contents are
-        <literal>ERROR</literal>, <literal>FATAL</literal>, or
-        <literal>PANIC</literal> (in an error message), or
-        <literal>WARNING</literal>, <literal>NOTICE</literal>, <literal>DEBUG</literal>,
-        <literal>INFO</literal>, or <literal>LOG</literal> (in a notice message),
-        or a localized translation of one of these.  Always present.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>V</literal>
-</term>
-<listitem>
-<para>
-        Severity: the field contents are
-        <literal>ERROR</literal>, <literal>FATAL</literal>, or
-        <literal>PANIC</literal> (in an error message), or
-        <literal>WARNING</literal>, <literal>NOTICE</literal>, <literal>DEBUG</literal>,
-        <literal>INFO</literal>, or <literal>LOG</literal> (in a notice message).
-        This is identical to the <literal>S</literal> field except
-        that the contents are never localized.  This is present only in
-        messages generated by <productname>PostgreSQL</productname> versions 9.6
-        and later.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>C</literal>
-</term>
-<listitem>
-<para>
-        Code: the SQLSTATE code for the error (see <xref
-        linkend="errcodes-appendix"/>).  Not localizable.  Always present.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>M</literal>
-</term>
-<listitem>
-<para>
-        Message: the primary human-readable error message.
-        This should be accurate but terse (typically one line).
-        Always present.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>D</literal>
-</term>
-<listitem>
-<para>
-        Detail: an optional secondary error message carrying more
-        detail about the problem.  Might run to multiple lines.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>H</literal>
-</term>
-<listitem>
-<para>
-        Hint: an optional suggestion what to do about the problem.
-        This is intended to differ from Detail in that it offers advice
-        (potentially inappropriate) rather than hard facts.
-        Might run to multiple lines.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>P</literal>
-</term>
-<listitem>
-<para>
-        Position: the field value is a decimal ASCII integer, indicating
-        an error cursor position as an index into the original query string.
-        The first character has index 1, and positions are measured in
-        characters not bytes.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>p</literal>
-</term>
-<listitem>
-<para>
-        Internal position: this is defined the same as the <literal>P</literal>
-        field, but it is used when the cursor position refers to an internally
-        generated command rather than the one submitted by the client.
-        The <literal>q</literal> field will always appear when this field appears.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>q</literal>
-</term>
-<listitem>
-<para>
-        Internal query: the text of a failed internally-generated command.
-        This could be, for example, an SQL query issued by a PL/pgSQL function.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>W</literal>
-</term>
-<listitem>
-<para>
-        Where: an indication of the context in which the error occurred.
-        Presently this includes a call stack traceback of active
-        procedural language functions and internally-generated queries.
-        The trace is one entry per line, most recent first.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>s</literal>
-</term>
-<listitem>
-<para>
-        Schema name: if the error was associated with a specific database
-        object, the name of the schema containing that object, if any.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>t</literal>
-</term>
-<listitem>
-<para>
-        Table name: if the error was associated with a specific table, the
-        name of the table.  (Refer to the schema name field for the name of
-        the table's schema.)
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>c</literal>
-</term>
-<listitem>
-<para>
-        Column name: if the error was associated with a specific table column,
-        the name of the column.  (Refer to the schema and table name fields to
-        identify the table.)
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>d</literal>
-</term>
-<listitem>
-<para>
-        Data type name: if the error was associated with a specific data type,
-        the name of the data type.  (Refer to the schema name field for the
-        name of the data type's schema.)
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>n</literal>
-</term>
-<listitem>
-<para>
-        Constraint name: if the error was associated with a specific
-        constraint, the name of the constraint.  Refer to fields listed above
-        for the associated table or domain.  (For this purpose, indexes are
-        treated as constraints, even if they weren't created with constraint
-        syntax.)
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>F</literal>
-</term>
-<listitem>
-<para>
-        File: the file name of the source-code location where the error
-        was reported.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>L</literal>
-</term>
-<listitem>
-<para>
-        Line: the line number of the source-code location where the error
-        was reported.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-<literal>R</literal>
-</term>
-<listitem>
-<para>
-        Routine: the name of the source-code routine reporting the error.
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-
-<note>
- <para>
-  The fields for schema name, table name, column name, data type name, and
-  constraint name are supplied only for a limited number of error types;
-  see <xref linkend="errcodes-appendix"/>.  Frontends should not assume that
-  the presence of any of these fields guarantees the presence of another
-  field.  Core error sources observe the interrelationships noted above, but
-  user-defined functions may use these fields in other ways.  In the same
-  vein, clients should not assume that these fields denote contemporary
-  objects in the current database.
- </para>
-</note>
 
-<para>
-The client is responsible for formatting displayed information to meet its
-needs; in particular it should break long lines as needed.  Newline characters
-appearing in the error message fields should be treated as paragraph breaks,
-not line breaks.
-</para>
-
-</sect1>
-
-<sect1 id="protocol-logicalrep-message-formats">
-<title>Logical Replication Message Formats</title>
-
-<para>
-This section describes the detailed format of each logical replication
-message.  These messages are either returned by the replication slot SQL
-interface or are sent by a walsender.  In the case of a walsender, they are
-encapsulated inside replication protocol WAL messages as described in
-<xref linkend="protocol-replication"/>, and generally obey the same message
-flow as physical replication.
-</para>
-
-<variablelist>
-
-<varlistentry id="protocol-logicalrep-message-formats-Begin">
-<term>
-Begin
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('B')
-</term>
-<listitem>
-<para>
-                Identifies the message as a begin message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem>
-<para>
-                The final LSN of the transaction.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int64 (TimestampTz)
-</term>
-<listitem>
-<para>
-                Commit timestamp of the transaction. The value is in number
-                of microseconds since PostgreSQL epoch (2000-01-01).
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem>
-<para>
-                Xid of the transaction.
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Message">
-<term>
-Message
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('M')
-</term>
-<listitem>
-<para>
-                Identifies the message as a logical decoding message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem>
-<para>
-                Xid of the transaction (only present for streamed transactions).
-                This field is available since protocol version 2.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int8
-</term>
-<listitem>
-<para>
-                Flags; Either 0 for no flags or 1 if the logical decoding
-                message is transactional.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem>
-<para>
-                The LSN of the logical decoding message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                The prefix of the logical decoding message.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of the content.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>
-</term>
-<listitem>
-<para>
-                The content of the logical decoding message.
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Commit">
-<term>
-Commit
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('C')
-</term>
-<listitem>
-<para>
-                Identifies the message as a commit message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int8(0)
-</term>
-<listitem>
-<para>
-                Flags; currently unused.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem>
-<para>
-                The LSN of the commit.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem>
-<para>
-                The end LSN of the transaction.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int64 (TimestampTz)
-</term>
-<listitem>
-<para>
-                Commit timestamp of the transaction. The value is in number
-                of microseconds since PostgreSQL epoch (2000-01-01).
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Origin">
-<term>
-Origin
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('O')
-</term>
-<listitem>
-<para>
-                Identifies the message as an origin message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem>
-<para>
-                The LSN of the commit on the origin server.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                Name of the origin.
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-
-<para>
-  Note that there can be multiple Origin messages inside a single transaction.
-</para>
-
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Relation">
-<term>
-Relation
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('R')
-</term>
-<listitem>
-<para>
-                Identifies the message as a relation message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem>
-<para>
-               Xid of the transaction (only present for streamed transactions).
-               This field is available since protocol version 2.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (Oid)
-</term>
-<listitem>
-<para>
-                OID of the relation.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                Namespace (empty string for <literal>pg_catalog</literal>).
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                Relation name.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int8
-</term>
-<listitem>
-<para>
-                Replica identity setting for the relation (same as
-                <structfield>relreplident</structfield> in <structname>pg_class</structname>).
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                Number of columns.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        Next, the following message part appears for each column included in
-        the publication (except generated columns):
-<variablelist>
-<varlistentry>
-<term>
-        Int8
-</term>
-<listitem>
-<para>
-                Flags for the column. Currently can be either 0 for no flags
-                or 1 which marks the column as part of the key.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                Name of the column.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (Oid)
-</term>
-<listitem>
-<para>
-                OID of the column's data type.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Type modifier of the column (<structfield>atttypmod</structfield>).
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Type">
-<term>
-Type
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('Y')
-</term>
-<listitem>
-<para>
-                Identifies the message as a type message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem>
-<para>
-               Xid of the transaction (only present for streamed transactions).
-               This field is available since protocol version 2.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (Oid)
-</term>
-<listitem>
-<para>
-                OID of the data type.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                Namespace (empty string for <literal>pg_catalog</literal>).
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        String
-</term>
-<listitem>
-<para>
-                Name of the data type.
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Insert">
-<term>
-Insert
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('I')
-</term>
-<listitem>
-<para>
-                Identifies the message as an insert message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem>
-<para>
-                Xid of the transaction (only present for streamed transactions).
-                This field is available since protocol version 2.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (Oid)
-</term>
-<listitem>
-<para>
-                OID of the relation corresponding to the ID in the relation
-                message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte1('N')
-</term>
-<listitem>
-<para>
-                Identifies the following TupleData message as a new tuple.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        TupleData
-</term>
-<listitem>
-<para>
-                TupleData message part representing the contents of new tuple.
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Update">
-<term>
-Update
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('U')
-</term>
-<listitem>
-<para>
-                Identifies the message as an update message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem>
-<para>
-               Xid of the transaction (only present for streamed transactions).
-               This field is available since protocol version 2.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (Oid)
-</term>
-<listitem>
-<para>
-                OID of the relation corresponding to the ID in the relation
-                message.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Byte1('K')
-</term>
-<listitem>
-<para>
-                Identifies the following TupleData submessage as a key.
-                This field is optional and is only present if
-                the update changed data in any of the column(s) that are
-                part of the REPLICA IDENTITY index.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Byte1('O')
-</term>
-<listitem>
-<para>
-                Identifies the following TupleData submessage as an old tuple.
-                This field is optional and is only present if table in which
-                the update happened has REPLICA IDENTITY set to FULL.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        TupleData
-</term>
-<listitem>
-<para>
-                TupleData message part representing the contents of the old tuple
-                or primary key. Only present if the previous 'O' or 'K' part
-                is present.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Byte1('N')
-</term>
-<listitem>
-<para>
-                Identifies the following TupleData message as a new tuple.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        TupleData
-</term>
-<listitem>
-<para>
-                TupleData message part representing the contents of a new tuple.
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-
-<para>
-    The Update message may contain either a 'K' message part or an 'O' message part
-    or neither of them, but never both of them.
-</para>
-
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Delete">
-<term>
-Delete
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('D')
-</term>
-<listitem>
-<para>
-                Identifies the message as a delete message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem>
-<para>
-               Xid of the transaction (only present for streamed transactions).
-               This field is available since protocol version 2.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (Oid)
-</term>
-<listitem>
-<para>
-                OID of the relation corresponding to the ID in the relation
-                message.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Byte1('K')
-</term>
-<listitem>
-<para>
-                Identifies the following TupleData submessage as a key.
-                This field is present if the table in which the delete has
-                happened uses an index as REPLICA IDENTITY.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Byte1('O')
-</term>
-<listitem>
-<para>
-                Identifies the following TupleData message as an old tuple.
-                This field is present if the table in which the delete
-                happened has REPLICA IDENTITY set to FULL.
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        TupleData
-</term>
-<listitem>
-<para>
-                TupleData message part representing the contents of the old tuple
-                or primary key, depending on the previous field.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-</para>
-
-<para>
-    The Delete message may contain either a 'K' message part or an 'O' message part,
-    but never both of them.
-</para>
-
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Truncate">
-<term>
-Truncate
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('T')
-</term>
-<listitem>
-<para>
-                Identifies the message as a truncate message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem>
-<para>
-               Xid of the transaction (only present for streamed transactions).
-               This field is available since protocol version 2.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Number of relations
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int8
-</term>
-<listitem>
-<para>
-                Option bits for <command>TRUNCATE</command>:
-                1 for <literal>CASCADE</literal>, 2 for <literal>RESTART IDENTITY</literal>
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (Oid)
-</term>
-<listitem>
-<para>
-                OID of the relation corresponding to the ID in the relation
-                message.  This field is repeated for each relation.
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-
-<para>
-
-The following messages (Stream Start, Stream Stop, Stream Commit, and
-Stream Abort) are available since protocol version 2.
-
-</para>
-
-<variablelist>
-
-<varlistentry id="protocol-logicalrep-message-formats-Stream-Start">
-<term>
-Stream Start
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('S')
-</term>
-<listitem>
-<para>
-                Identifies the message as a stream start message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem>
-<para>
-                Xid of the transaction.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int8
-</term>
-<listitem>
-<para>
-                A value of 1 indicates this is the first stream segment for
-                this XID, 0 for any other stream segment.
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Stream-Stop">
-<term>
-Stream Stop
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('E')
-</term>
-<listitem>
-<para>
-                Identifies the message as a stream stop message.
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Stream-Commit">
-<term>
-Stream Commit
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('c')
-</term>
-<listitem>
-<para>
-                Identifies the message as a stream commit message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem>
-<para>
-                Xid of the transaction.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int8(0)
-</term>
-<listitem>
-<para>
-                Flags; currently unused.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem>
-<para>
-                The LSN of the commit.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem>
-<para>
-                The end LSN of the transaction.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int64 (TimestampTz)
-</term>
-<listitem>
-<para>
-                Commit timestamp of the transaction. The value is in number
-                of microseconds since PostgreSQL epoch (2000-01-01).
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Stream-Abort">
-<term>
-Stream Abort
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('A')
-</term>
-<listitem>
-<para>
-                Identifies the message as a stream abort message.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem>
-<para>
-                Xid of the transaction.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem>
-<para>
-                Xid of the subtransaction (will be same as xid of the transaction for top-level
-                transactions).
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-
-<para>
-The following messages (Begin Prepare, Prepare, Commit Prepared, Rollback Prepared, Stream Prepare)
-are available since protocol version 3.
-</para>
-
-<variablelist>
-
-<varlistentry id="protocol-logicalrep-message-formats-Begin-Prepare">
-
-<term>Begin Prepare</term>
-<listitem>
-<para>
-
-<variablelist>
-
-<varlistentry>
-<term>Byte1('b')</term>
-<listitem><para>
-                Identifies the message as the beginning of a two-phase transaction message.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem><para>
-                The LSN of the prepare.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem><para>
-                The end LSN of the prepared transaction.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (TimestampTz)
-</term>
-<listitem><para>
-                Prepare timestamp of the transaction. The value is in number
-                of microseconds since PostgreSQL epoch (2000-01-01).
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem><para>
-                Xid of the transaction.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>String</term>
-<listitem><para>
-                The user defined GID of the two-phase transaction.
-</para></listitem>
-</varlistentry>
-
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Prepare">
-
-<term>Prepare</term>
-<listitem>
-<para>
-
-<variablelist>
-
-<varlistentry>
-<term>Byte1('P')</term>
-<listitem><para>
-                Identifies the message as a two-phase prepared transaction message.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int8(0)
-</term>
-<listitem><para>
-                Flags; currently unused.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem><para>
-                The LSN of the prepare.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem><para>
-                The end LSN of the prepared transaction.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (TimestampTz)
-</term>
-<listitem><para>
-                Prepare timestamp of the transaction. The value is in number
-                of microseconds since PostgreSQL epoch (2000-01-01).
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem><para>
-                Xid of the transaction.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>String</term>
-<listitem><para>
-                The user defined GID of the two-phase transaction.
-</para></listitem>
-</varlistentry>
-
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Commit-Prepared">
-
-<term>Commit Prepared</term>
-<listitem>
-<para>
-
-<variablelist>
-
-<varlistentry>
-<term>Byte1('K')</term>
-<listitem><para>
-                Identifies the message as the commit of a two-phase transaction message.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int8(0)
-</term>
-<listitem><para>
-                Flags; currently unused.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem><para>
-                The LSN of the commit prepared.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem><para>
-                The end LSN of the commit prepared transaction.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (TimestampTz)
-</term>
-<listitem><para>
-                Commit timestamp of the transaction. The value is in number
-                of microseconds since PostgreSQL epoch (2000-01-01).
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem><para>
-                Xid of the transaction.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>String</term>
-<listitem><para>
-                The user defined GID of the two-phase transaction.
-</para></listitem>
-</varlistentry>
-
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Rollback-Prepared">
-
-<term>Rollback Prepared</term>
-<listitem>
-<para>
-
-<variablelist>
-
-<varlistentry>
-<term>Byte1('r')</term>
-<listitem><para>
-                Identifies the message as the rollback of a two-phase transaction message.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int8(0)
-</term>
-<listitem><para>
-                Flags; currently unused.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem><para>
-                The end LSN of the prepared transaction.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem><para>
-                The end LSN of the rollback prepared transaction.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (TimestampTz)
-</term>
-<listitem><para>
-                Prepare timestamp of the transaction. The value is in number
-                of microseconds since PostgreSQL epoch (2000-01-01).
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (TimestampTz)
-</term>
-<listitem><para>
-                Rollback timestamp of the transaction. The value is in number
-                of microseconds since PostgreSQL epoch (2000-01-01).
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem><para>
-                Xid of the transaction.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>String</term>
-<listitem><para>
-                The user defined GID of the two-phase transaction.
-</para></listitem>
-</varlistentry>
-
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-<varlistentry id="protocol-logicalrep-message-formats-Stream-Prepare">
-
-<term>Stream Prepare</term>
-<listitem>
-<para>
-
-<variablelist>
-
-<varlistentry>
-<term>Byte1('p')</term>
-<listitem><para>
-                Identifies the message as a two-phase stream prepare message.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int8(0)
-</term>
-<listitem><para>
-                Flags; currently unused.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem><para>
-                The LSN of the prepare.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (XLogRecPtr)
-</term>
-<listitem><para>
-                The end LSN of the prepare transaction.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int64 (TimestampTz)
-</term>
-<listitem><para>
-                Prepare timestamp of the transaction. The value is in number
-                of microseconds since PostgreSQL epoch (2000-01-01).
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>
-        Int32 (TransactionId)
-</term>
-<listitem><para>
-                Xid of the transaction.
-</para></listitem>
-</varlistentry>
-
-<varlistentry>
-<term>String</term>
-<listitem><para>
-                The user defined GID of the two-phase transaction.
-</para></listitem>
-</varlistentry>
-
-</variablelist>
-
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-
-<para>
-
-The following message parts are shared by the above messages.
-
-</para>
-
-<variablelist>
-
-<varlistentry id="protocol-logicalrep-message-formats-TupleData">
-<term>
-TupleData
-</term>
-<listitem>
-<para>
-
-<variablelist>
-<varlistentry>
-<term>
-        Int16
-</term>
-<listitem>
-<para>
-                Number of columns.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        Next, one of the following submessages appears for each column (except generated columns):
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('n')
-</term>
-<listitem>
-<para>
-                Identifies the data as NULL value.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        Or
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('u')
-</term>
-<listitem>
-<para>
-                Identifies unchanged TOASTed value (the actual value is not
-                sent).
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        Or
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('t')
-</term>
-<listitem>
-<para>
-                Identifies the data as text formatted value.
-</para>
-</listitem>
-</varlistentry>
-</variablelist>
-        Or
-<variablelist>
-<varlistentry>
-<term>
-        Byte1('b')
-</term>
-<listitem>
-<para>
-                Identifies the data as binary formatted value.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Int32
-</term>
-<listitem>
-<para>
-                Length of the column value.
-</para>
-</listitem>
-</varlistentry>
-<varlistentry>
-<term>
-        Byte<replaceable>n</replaceable>
-</term>
-<listitem>
-<para>
-                The value of the column, either in binary or in text format.
-                (As specified in the preceding format byte).
-                <replaceable>n</replaceable> is the above length.
-
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
-</para>
-</listitem>
-</varlistentry>
-
-</variablelist>
+  <para>
+   The backend sends ParameterStatus ('<literal>S</literal>') messages during connection
+   startup for all parameters it considers interesting to the client library.
+   Subsequently, a ParameterStatus message is sent whenever the active value
+   changes for any of these parameters.
+  </para>
 
-</sect1>
+  <para>
+   The RowDescription ('<literal>T</literal>') message carries new table OID and column
+   number fields for each column of the described row.  It also shows the format
+   code for each column.
+  </para>
 
-<sect1 id="protocol-changes">
-<title>Summary of Changes since Protocol 2.0</title>
-
-<para>
-This section provides a quick checklist of changes, for the benefit of
-developers trying to update existing client libraries to protocol 3.0.
-</para>
-
-<para>
-The initial startup packet uses a flexible list-of-strings format
-instead of a fixed format.  Notice that session default values for run-time
-parameters can now be specified directly in the startup packet.  (Actually,
-you could do that before using the <literal>options</literal> field, but given the
-limited width of <literal>options</literal> and the lack of any way to quote
-whitespace in the values, it wasn't a very safe technique.)
-</para>
-
-<para>
-All messages now have a length count immediately following the message type
-byte (except for startup packets, which have no type byte).  Also note that
-PasswordMessage now has a type byte.
-</para>
-
-<para>
-ErrorResponse and NoticeResponse ('<literal>E</literal>' and '<literal>N</literal>')
-messages now contain multiple fields, from which the client code can
-assemble an error message of the desired level of verbosity.  Note that
-individual fields will typically not end with a newline, whereas the single
-string sent in the older protocol always did.
-</para>
-
-<para>
-The ReadyForQuery ('<literal>Z</literal>') message includes a transaction status
-indicator.
-</para>
-
-<para>
-The distinction between BinaryRow and DataRow message types is gone; the
-single DataRow message type serves for returning data in all formats.
-Note that the layout of DataRow has changed to make it easier to parse.
-Also, the representation of binary values has changed: it is no longer
-directly tied to the server's internal representation.
-</para>
-
-<para>
-There is a new <quote>extended query</quote> sub-protocol, which adds the frontend
-message types Parse, Bind, Execute, Describe, Close, Flush, and Sync, and the
-backend message types ParseComplete, BindComplete, PortalSuspended,
-ParameterDescription, NoData, and CloseComplete.  Existing clients do not
-have to concern themselves with this sub-protocol, but making use of it
-might allow improvements in performance or functionality.
-</para>
-
-<para>
-<command>COPY</command> data is now encapsulated into CopyData and CopyDone messages.  There
-is a well-defined way to recover from errors during <command>COPY</command>.  The special
-<quote><literal>\.</literal></quote> last line is not needed anymore, and is not sent
-during <command>COPY OUT</command>.
-(It is still recognized as a terminator during <command>COPY IN</command>, but its use is
-deprecated and will eventually be removed.)  Binary <command>COPY</command> is supported.
-The CopyInResponse and CopyOutResponse messages include fields indicating
-the number of columns and the format of each column.
-</para>
-
-<para>
-The layout of FunctionCall and FunctionCallResponse messages has changed.
-FunctionCall can now support passing NULL arguments to functions.  It also
-can handle passing parameters and retrieving results in either text or
-binary format.  There is no longer any reason to consider FunctionCall a
-potential security hole, since it does not offer direct access to internal
-server data representations.
-</para>
-
-<para>
-The backend sends ParameterStatus ('<literal>S</literal>') messages during connection
-startup for all parameters it considers interesting to the client library.
-Subsequently, a ParameterStatus message is sent whenever the active value
-changes for any of these parameters.
-</para>
-
-<para>
-The RowDescription ('<literal>T</literal>') message carries new table OID and column
-number fields for each column of the described row.  It also shows the format
-code for each column.
-</para>
-
-<para>
-The CursorResponse ('<literal>P</literal>') message is no longer generated by
-the backend.
-</para>
-
-<para>
-The NotificationResponse ('<literal>A</literal>') message has an additional string
-field, which can carry a <quote>payload</quote> string passed
-from the <command>NOTIFY</command> event sender.
-</para>
-
-<para>
-The EmptyQueryResponse ('<literal>I</literal>') message used to include an empty
-string parameter; this has been removed.
-</para>
+  <para>
+   The CursorResponse ('<literal>P</literal>') message is no longer generated by
+   the backend.
+  </para>
 
-</sect1>
+  <para>
+   The NotificationResponse ('<literal>A</literal>') message has an additional string
+   field, which can carry a <quote>payload</quote> string passed
+   from the <command>NOTIFY</command> event sender.
+  </para>
 
+  <para>
+   The EmptyQueryResponse ('<literal>I</literal>') message used to include an empty
+   string parameter; this has been removed.
+  </para>
+ </sect1>
 </chapter>