aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/src/sgml/protocol.sgml1631
1 files changed, 807 insertions, 824 deletions
diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml
index e83cf8cbe8a..ec35b9c96df 100644
--- a/doc/src/sgml/protocol.sgml
+++ b/doc/src/sgml/protocol.sgml
@@ -1,624 +1,607 @@
-<Chapter Id="protocol">
-<DocInfo>
-<Author>
-<FirstName>Phil</FirstName>
-<Surname>Thompson</Surname>
-</Author>
-<Date>1998-08-08</Date>
-</DocInfo>
-<Title>Frontend/Backend Protocol</Title>
-
-<Para>
-<Note>
-<Para>
-Written by Phil Thompson (<email>phil@river-bank.demon.co.uk</email>).
-Updates for protocol 2.0 by Tom Lane (<email>tgl@sss.pgh.pa.us</email>).
-</Para>
-</Note>
-</para>
-
-<Para>
-<ProductName>Postgres</ProductName> uses a message-based protocol for communication between frontends
-and backends. The protocol is implemented over <Acronym>TCP/IP</Acronym> and also on Unix sockets.
-<ProductName>Postgres</ProductName> 6.3 introduced version numbers into the protocol.
-This was done in such
-a way as to still allow connections from earlier versions of frontends, but
-this document does not cover the protocol used by those earlier versions.
-</para>
-
-<Para>
-This document describes version 2.0 of the protocol, implemented in
-<ProductName>Postgres</ProductName> 6.4 and later.
-</para>
-
-<Para>
-Higher level features built on this protocol (for example, how <FileName>libpq</FileName> passes
-certain environment variables after the connection is established)
-are covered elsewhere.
-</para>
-
-<Sect1 id="protocol-overview">
-<Title>Overview</Title>
-
-<Para>
-The three major components are the frontend (running on the client) and the
-postmaster and backend (running on the server). The postmaster and backend
-have different roles but may be implemented by the same executable.
-</para>
-
-<Para>
-A frontend sends a start-up packet to the postmaster. This includes the names
-of the user and the database the user wants to connect to. The postmaster then
-uses this, and the information in the <filename>pg_hba.conf</filename>
-file
-to determine what
-further authentication information it requires the frontend to send (if any)
-and responds to the frontend accordingly.
-</para>
-
-<Para>
-The frontend then sends any required authentication information. Once the
-postmaster validates this it responds to the frontend that it is authenticated
-and hands over the connection to a backend. The backend then sends a message
-indicating successful start-up (normal case) or failure (for example, an
-invalid database name).
-</para>
-
-<Para>
-Subsequent communications are query and result packets exchanged between the
-frontend and the backend. The postmaster takes no further part in ordinary
-query/result communication. (However, the postmaster is involved when the
-frontend wishes to cancel a query currently being executed by its backend.
-Further details about that appear below.)
-</para>
-
-<Para>
-When the frontend wishes to disconnect it sends an appropriate packet and
-closes the connection without waiting for a response for the backend.
-</para>
-
-<Para>
-Packets are sent as a data stream. The first byte determines what should be
-expected in the rest of the packet. The exception is packets sent from a
-frontend to the postmaster, which comprise a packet length then the packet
-itself. The difference is historical.
-</para>
-</sect1>
-
-<Sect1 id="protocol-protocol">
-<Title>Protocol</Title>
-
-<Para>
-This section describes the message flow. There are four different types of
-flows depending on the state of the connection:
-start-up, query, function call, and termination.
-There are also special provisions for notification responses and command
-cancellation, which can occur at any time after the start-up phase.
-</para>
-
-
-<Sect2>
-<Title>Start-up</Title>
-
-<Para>
-Start-up is divided into an authentication phase and a backend start-up phase.
-</para>
-
-<Para>
-Initially, the frontend sends a StartupPacket. The postmaster uses this info
-and the contents of the pg_hba.conf file to determine what authentication
-method the frontend must use. The postmaster then responds with one of the
-following messages:
-</para>
-
-<Para>
-<VariableList>
-<VarListEntry>
-<Term>
- ErrorResponse
-</Term>
-<ListItem>
-<Para>
- The postmaster then immediately closes the connection.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- AuthenticationOk
-</Term>
-<ListItem>
-<Para>
- The postmaster then hands over to the backend. The postmaster
- takes no further part in the communication.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- AuthenticationKerberosV4
-</Term>
-<ListItem>
-<Para>
- The frontend must then take part in a Kerberos V4
- authentication dialog (not described here) with the postmaster.
- If this is successful, the postmaster responds with an
- AuthenticationOk, otherwise it responds with an ErrorResponse.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- AuthenticationKerberosV5
-</Term>
-<ListItem>
-<Para>
- The frontend must then take part in a Kerberos V5
- authentication dialog (not described here) with the postmaster.
- If this is successful, the postmaster responds with an
- AuthenticationOk, otherwise it responds with an ErrorResponse.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- AuthenticationUnencryptedPassword
-</Term>
-<ListItem>
-<Para>
- The frontend must then send an UnencryptedPasswordPacket.
- If this is the correct password, the postmaster responds with
- an AuthenticationOk, otherwise it responds with an
- ErrorResponse.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- AuthenticationEncryptedPassword
-</Term>
-<ListItem>
-<Para>
- The frontend must then send an EncryptedPasswordPacket.
- If this is the correct password, the postmaster responds with
- an AuthenticationOk, otherwise it responds with an
- ErrorResponse.
-</Para>
-</ListItem>
-</VarListEntry>
-</VariableList>
-</Para>
-
-<Para>
-If the frontend does not support the authentication method requested by the
-postmaster, then it should immediately close the connection.
-</para>
-
-<Para>
-After sending AuthenticationOk, the postmaster attempts to launch a backend
-process. Since this might fail, or the backend might encounter a failure
-during start-up, the frontend must wait for the backend to acknowledge
-successful start-up. The frontend should send no messages at this point.
-The possible messages from the backend during this phase are:
-
-<VariableList>
-<VarListEntry>
-<Term>
- BackendKeyData
-</Term>
-<ListItem>
-<Para>
- This message is issued after successful backend start-up.
- It provides secret-key data that the frontend must save
- if it wants to be able to issue cancel requests later.
- The frontend should not respond to this message, but should
- continue listening for a ReadyForQuery message.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- ReadyForQuery
-</Term>
-<ListItem>
-<Para>
- Backend start-up is successful. The frontend may now issue
- query or function call messages.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- ErrorResponse
-</Term>
-<ListItem>
-<Para>
- Backend start-up failed. The connection is closed after
- sending this message.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- NoticeResponse
-</Term>
-<ListItem>
-<Para>
- A warning message has been issued. The frontend should
- display the message but continue listening for ReadyForQuery
- or ErrorResponse.
-</Para>
-</ListItem>
-</VarListEntry>
-</VariableList>
-</Para>
-
-<Para>
-The ReadyForQuery message is the same one that the backend will issue after
-each query cycle. Depending on the coding needs of the frontend, it is
-reasonable to consider ReadyForQuery as starting a query cycle (and then
-BackendKeyData indicates successful conclusion of the start-up phase),
-or to consider ReadyForQuery as ending the start-up phase and each subsequent
-query cycle.
-</para>
-</sect2>
-
-<Sect2>
-<Title>Query</Title>
-
-<Para>
-A Query cycle is initiated by the frontend sending a Query message to the
-backend. The backend then sends one or more response messages depending
-on the contents of the query command string, and finally a ReadyForQuery
-response message. ReadyForQuery informs the frontend that it may safely
-send a new query or function call.
-</para>
-
-<Para>
-The possible response messages from the backend are:
-
-<VariableList>
-<VarListEntry>
-<Term>
- CompletedResponse
-</Term>
-<ListItem>
-<Para>
- An SQL command completed normally.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- CopyInResponse
-</Term>
-<ListItem>
-<Para>
- The backend is ready to copy data from the frontend to a
- relation. The frontend should then send a CopyDataRows
- message. The backend will then respond with a
- CompletedResponse message with a tag of "COPY".
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- CopyOutResponse
-</Term>
-<ListItem>
-<Para>
- The backend is ready to copy data from a relation to the
- frontend. It then sends a CopyDataRows message, and then a
- CompletedResponse message with a tag of "COPY".
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- CursorResponse
-</Term>
-<ListItem>
-<Para>
- The query was either an insert(l), delete(l), update(l),
- fetch(l) or a select(l) command.
- If the transaction has been
- aborted then the backend sends a CompletedResponse message with
- a tag of "*ABORT STATE*". Otherwise the following responses
- are sent.
-</Para>
-<Para>
- For an insert(l) command, the backend then sends a
- CompletedResponse message with a tag of "INSERT <Replaceable>oid</Replaceable> <Replaceable>rows</Replaceable>"
- where <Replaceable>rows</Replaceable> is the number of rows inserted, and <Replaceable>oid</Replaceable> is the
- object ID of the inserted row if <Replaceable>rows</Replaceable> is 1, otherwise <Replaceable>oid</Replaceable>
- is 0.
-</Para>
-<Para>
- For a delete(l) command, the backend then sends a
- CompletedResponse message with a tag of "DELETE <Replaceable>rows</Replaceable>" where
- <Replaceable>rows</Replaceable> is the number of rows deleted.
-</Para>
-<Para>
- For an update(l) command, the backend then sends a
- CompletedResponse message with a tag of "UPDATE <Replaceable>rows</Replaceable>" where
- <Replaceable>rows</Replaceable> is the number of rows deleted.
-</Para>
-<Para>
- For a fetch(l) or select(l) command, the backend sends a
- RowDescription message. This is then followed by an AsciiRow
- or BinaryRow message (depending on whether a binary cursor was
- specified) for each row being returned to the frontend.
- Finally, the backend sends a CompletedResponse message with a
- tag of "SELECT".
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- EmptyQueryResponse
-</Term>
-<ListItem>
-<Para>
- An empty query string was recognized. (The need to specially
- distinguish this case is historical.)
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- ErrorResponse
-</Term>
-<ListItem>
-<Para>
- An error has occurred.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- ReadyForQuery
-</Term>
-<ListItem>
-<Para>
- Processing of the query string is complete. A separate
- message is sent to indicate this because the query string
- may contain multiple SQL commands. (CompletedResponse marks
- the end of processing one SQL command, not the whole string.)
- ReadyForQuery will always be sent, whether processing
- terminates successfully or with an error.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- NoticeResponse
-</Term>
-<ListItem>
-<Para>
- A warning message has been issued in relation to the query.
- Notices are in addition to other responses, i.e., the backend
- will continue processing the command.
-</Para>
-</ListItem>
-</VarListEntry>
-</VariableList>
-</Para>
-
-<Para>
-A frontend must be prepared to accept ErrorResponse and NoticeResponse
-messages whenever it is expecting any other type of message.
-</para>
-
-<Para>
-Actually, it is possible for NoticeResponse to arrive even when the frontend
-is not expecting any kind of message, that is, the backend is nominally idle.
-(In particular, the backend can be commanded to terminate by its postmaster.
-In that case it will send a NoticeResponse before closing the connection.)
-It is recommended that the frontend check for such asynchronous notices just
-before issuing any new command.
-</para>
-
-<Para>
-Also, if the frontend issues any listen(l) commands then it must be prepared
-to accept NotificationResponse messages at any time; see below.
-</para>
-</sect2>
-
-<Sect2>
-<Title>Function Call</Title>
-
-<Para>
-A Function Call cycle is initiated by the frontend sending a FunctionCall
-message to the backend. The backend then sends one or more response messages
-depending on the results of the function call, and finally a ReadyForQuery
-response message. ReadyForQuery informs the frontend that it may safely send
-a new query or function call.
-</para>
-
-<Para>
-The possible response messages from the backend are:
-
-<VariableList>
-<VarListEntry>
-<Term>
- ErrorResponse
-</Term>
-<ListItem>
-<Para>
- An error has occurred.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- FunctionResultResponse
-</Term>
-<ListItem>
-<Para>
- The function call was executed and returned a result.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- FunctionVoidResponse
-</Term>
-<ListItem>
-<Para>
- The function call was executed and returned no result.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- ReadyForQuery
-</Term>
-<ListItem>
-<Para>
- Processing of the function call is complete.
- ReadyForQuery will always be sent, whether processing
- terminates successfully or with an error.
-</Para>
-</ListItem>
-</VarListEntry>
-<VarListEntry>
-<Term>
- NoticeResponse
-</Term>
-<ListItem>
-<Para>
- A warning message has been issued in relation to the function
- call.
- Notices are in addition to other responses, i.e., the backend
- will continue processing the command.
-</Para>
-</ListItem>
-</VarListEntry>
-</VariableList>
-</Para>
-
-<Para>
-A frontend must be prepared to accept ErrorResponse and NoticeResponse
-messages whenever it is expecting any other type of message. Also,
-if it issues any listen(l) commands then it must be prepared to accept
-NotificationResponse messages at any time; see below.
-</para>
-</sect2>
-
-<Sect2>
-<Title>Notification Responses</Title>
-
-<Para>
-If a frontend issues a listen(l) command, then the backend will send a
-NotificationResponse message (not to be confused with NoticeResponse!)
-whenever a notify(l) command is executed for the same notification name.
-</para>
-
-<Para>
-Notification responses are permitted at any point in the protocol (after
-start-up), except within another backend message. Thus, the frontend
-must be prepared to recognize a NotificationResponse message whenever it is
-expecting any message. Indeed, it should be able to handle
-NotificationResponse messages even when it is not engaged in a query.
-
-<VariableList>
-<VarListEntry>
-<Term>
- NotificationResponse
-</Term>
-<ListItem>
-<Para>
- A notify(l) command has been executed for a name for which
- a previous listen(l) command was executed. Notifications
- may be sent at any time.
-</Para>
-</ListItem>
-</VarListEntry>
-</VariableList>
-</Para>
-
-<Para>
-It may be worth pointing out that the names used in listen and notify
-commands need not have anything to do with names of relations (tables)
-in the SQL database. Notification names are simply arbitrarily chosen
-condition names.
-</para>
-</sect2>
-
-<Sect2>
-<Title>Cancelling Requests in Progress</Title>
-
-<Para>
-During the processing of a query, the frontend may request cancellation of the
-query by sending an appropriate request to the postmaster. The cancel request
-is not sent directly to the backend for reasons of implementation efficiency:
-we don't want to have the backend constantly checking for new input from
-the frontend during query processing. Cancel requests should be relatively
-infrequent, so we make them slightly cumbersome in order to avoid a penalty
-in the normal case.
-</para>
-
-<Para>
-To issue a cancel request, the frontend opens a new connection to the
-postmaster and sends a CancelRequest message, rather than the StartupPacket
-message that would ordinarily be sent across a new connection. The postmaster
-will process this request and then close the connection. For security
-reasons, no direct reply is made to the cancel request message.
-</para>
-
-<Para>
-A CancelRequest message will be ignored unless it contains the same key data
-(PID and secret key) passed to the frontend during connection start-up. If the
-request matches the PID and secret key for a currently executing backend, the
-postmaster signals the backend to abort processing of the current query.
-</para>
-
-<Para>
-The cancellation signal may or may not have any effect --- for example, if it
-arrives after the backend has finished processing the query, then it will have
-no effect. If the cancellation is effective, it results in the current
-command being terminated early with an error message.
-</para>
-
-<Para>
-The upshot of all this is that for reasons of both security and efficiency,
-the frontend has no direct way to tell whether a cancel request has succeeded.
-It must continue to wait for the backend to respond to the query. Issuing a
-cancel simply improves the odds that the current query will finish soon,
-and improves the odds that it will fail with an error message instead of
-succeeding.
-</para>
-
-<Para>
-Since the cancel request is sent to the postmaster and not across the
-regular frontend/backend communication link, it is possible for the cancel
-request to be issued by any process, not just the frontend whose query is
-to be canceled. This may have some benefits of flexibility in building
-multiple-process applications. It also introduces a security risk, in that
-unauthorized persons might try to cancel queries. The security risk is
-addressed by requiring a dynamically generated secret key to be supplied
-in cancel requests.
-</para>
-</sect2>
-
-<Sect2>
-<Title>Termination</Title>
-
-<Para>
-The normal, graceful termination procedure is that the frontend sends a
-Terminate message and immediately closes the connection. On receipt of the
-message, the backend immediately closes the connection and terminates.
-</para>
-
-<Para>
-An ungraceful termination may occur due to software failure (i.e., core dump)
-at either end. If either frontend or backend sees an unexpected closure of
-the connection, it should clean up and terminate. The frontend has the option
-of launching a new backend by recontacting the postmaster, if it doesn't want
-to terminate itself.
-</para>
-</sect2>
-</sect1>
+<!-- $Header: /cvsroot/pgsql/doc/src/sgml/protocol.sgml,v 1.18 2001/06/22 23:27:48 petere Exp $ -->
+
+<chapter id="protocol">
+ <title>Frontend/Backend Protocol</title>
+
+ <note>
+ <para>
+ Written by Phil Thompson (<email>phil@river-bank.demon.co.uk</email>).
+ Updates for protocol 2.0 by Tom Lane (<email>tgl@sss.pgh.pa.us</email>).
+ </para>
+ </note>
+
+ <para>
+ <application>PostgreSQL</application> uses a message-based protocol
+ for communication between frontends and backends. The protocol is
+ implemented over <acronym>TCP/IP</acronym> and also on Unix domain
+ sockets. <productname>PostgreSQL</productname> 6.3 introduced
+ version numbers into the protocol. This was done in such a way as
+ to still allow connections from earlier versions of frontends, but
+ this document does not cover the protocol used by those earlier
+ versions.
+ </para>
+
+ <para>
+ This document describes version 2.0 of the protocol, implemented in
+ <application>PostgreSQL</application> 6.4 and later.
+ </para>
+
+ <para>
+ Higher level features built on this protocol (for example, how
+ <application>libpq</application> passes certain environment
+ variables after the connection is established) are covered
+ elsewhere.
+ </para>
+
+ <sect1 id="protocol-overview">
+ <title>Overview</title>
+
+ <para>
+ A frontend opens a connection to the server and sends a start-up
+ packet. This includes the names of the user and the database the
+ user wants to connect to. The server then uses this, and the
+ information in the <filename>pg_hba.conf</filename> file to
+ determine what further authentication information it requires the
+ frontend to send (if any) and responds to the frontend accordingly.
+ </para>
+
+ <para>
+ The frontend then sends any required authentication information.
+ Once the server validates this it responds to the frontend that it
+ is authenticated and sends a message indicating successful start-up
+ (normal case) or failure (for example, an invalid database name).
+ </para>
+
+ <para>
+ In order to serve multiple clients efficiently, the server would
+ normally create a new child process to handle each incoming
+ connection. However, this is not required. In the current
+ implementation, a new child process is created immediately after an
+ incoming connection is detected. In earlier versions of PostgreSQL
+ (7.1 and earlier), the child process was created after sending the
+ authentication confirmation message.
+ </para>
+
+ <para>
+ When the frontend wishes to disconnect it sends an appropriate packet and
+ closes the connection without waiting for a response for the backend.
+ </para>
+
+ <para>
+ Packets are sent as a data stream. The first byte determines what
+ should be expected in the rest of the packet. The exceptions are
+ packets sent as part of the startup and authentication exchange,
+ which comprise a packet length followed by the packet itself. The
+ difference is historical.
+ </para>
+ </sect1>
+
+ <sect1 id="protocol-protocol">
+ <title>Protocol</title>
+
+ <para>
+ This section describes the message flow. There are four different
+ types of flows depending on the state of the connection: start-up,
+ query, function call, and termination. There are also special
+ provisions for notification responses and command cancellation,
+ which can occur at any time after the start-up phase.
+ </para>
+
+ <sect2>
+ <title>Start-up</Title>
+
+ <para>
+ Initially, the frontend sends a StartupPacket. The server uses
+ this info and the contents of the <filename>pg_hba.conf</filename>
+ file to determine what authentication method the frontend must
+ use. The server then responds with one of the following messages:
+
+ <variablelist>
+ <varlistentry>
+ <term>ErrorResponse</term>
+ <listitem>
+ <para>
+ The server then immediately closes the connection.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>AuthenticationOk</term>
+ <listitem>
+ <para>
+ The authentication exchange is completed.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>AuthenticationKerberosV4</Term>
+ <listitem>
+ <para>
+ The frontend must then take part in a Kerberos V4
+ authentication dialog (not described here, part of the
+ Kerberos specification) with the server. If this is
+ successful, the server responds with an AuthenticationOk,
+ otherwise it responds with an ErrorResponse.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <Term>AuthenticationKerberosV5</Term>
+ <ListItem>
+ <Para>
+ The frontend must then take part in a Kerberos V5
+ authentication dialog (not described here, part of the
+ Kerberos specification) with the server. If this is
+ successful, the server responds with an AuthenticationOk,
+ otherwise it responds with an ErrorResponse.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>AuthenticationUnencryptedPassword</Term>
+ <ListItem>
+ <Para>
+ The frontend must then send an UnencryptedPasswordPacket. If
+ this is the correct password, the server responds with an
+ AuthenticationOk, otherwise it responds with an ErrorResponse.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>AuthenticationEncryptedPassword</Term>
+ <ListItem>
+ <Para>
+ The frontend must then send an EncryptedPasswordPacket. If
+ this is the correct password, the server responds with an
+ AuthenticationOk, otherwise it responds with an ErrorResponse.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ </VariableList>
+ </Para>
+
+ <para>
+ If the frontend does not support the authentication method
+ requested by the server, then it should immediately close the
+ connection.
+ </para>
+
+ <para>
+ After having received AuthenticationOk, the frontend should wait
+ for further messages from the server. The possible messages from
+ the backend in this phase are:
+
+ <VariableList>
+ <VarListEntry>
+ <Term>BackendKeyData</Term>
+ <ListItem>
+ <Para>
+ This message provides secret-key data that the frontend must
+ save if it wants to be able to issue cancel requests later.
+ The frontend should not respond to this message, but should
+ continue listening for a ReadyForQuery message.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>ReadyForQuery</Term>
+ <ListItem>
+ <Para>
+ Start-up is completed. The frontend may now issue query or
+ function call messages.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>ErrorResponse</Term>
+ <ListItem>
+ <Para>
+ Start-up failed. The connection is closed after sending this
+ message.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>NoticeResponse</Term>
+ <ListItem>
+ <Para>
+ A warning message has been issued. The frontend should
+ display the message but continue listening for ReadyForQuery
+ or ErrorResponse.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+ </VariableList>
+ </Para>
+
+ <para>
+ The ReadyForQuery message is the same one that the backend will
+ issue after each query cycle. Depending on the coding needs of
+ the frontend, it is reasonable to consider ReadyForQuery as
+ starting a query cycle (and then BackendKeyData indicates
+ successful conclusion of the start-up phase), or to consider
+ ReadyForQuery as ending the start-up phase and each subsequent
+ query cycle.
+ </para>
+ </sect2>
+
+ <Sect2>
+ <Title>Query</Title>
+
+ <Para>
+ A Query cycle is initiated by the frontend sending a Query message
+ to the backend. The backend then sends one or more response
+ messages depending on the contents of the query command string,
+ and finally a ReadyForQuery response message. ReadyForQuery
+ informs the frontend that it may safely send a new query or
+ function call.
+ </para>
+
+ <Para>
+ The possible response messages from the backend are:
+
+ <VariableList>
+ <VarListEntry>
+ <Term>CompletedResponse</Term>
+ <ListItem>
+ <Para>
+ An SQL command completed normally.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>CopyInResponse</Term>
+ <ListItem>
+ <Para>
+ The backend is ready to copy data from the frontend to a
+ table. The frontend should then send a CopyDataRows message.
+ The backend will then respond with a CompletedResponse message
+ with a tag of <literal>COPY</literal>.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>CopyOutResponse</Term>
+ <ListItem>
+ <Para>
+ The backend is ready to copy data from a table to the
+ frontend. It then sends a CopyDataRows message, and then a
+ CompletedResponse message with a tag of <literal>COPY</literal>.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>CursorResponse</Term>
+ <ListItem>
+ <Para>
+ The query was either an <literal>INSERT</literal>,
+ <literal>UPDATE</literal>, <literal>DELETE</literal>,
+ <literal>FETCH</literal>, or a <literal>SELECT</literal>
+ command. If the transaction has been aborted then the backend
+ sends a CompletedResponse message with a tag of <literal>*ABORT
+ STATE*</literal>. Otherwise the following responses are sent.
+ </Para>
+
+ <Para>
+ For an <literal>INSERT</literal> command, the backend then
+ sends a CompletedResponse message with a tag of
+ <literal>INSERT <replaceable>oid</replaceable>
+ <replaceable>rows</replaceable></literal>, where
+ <replaceable>rows</replaceable> is the number of rows
+ inserted, and <replaceable>oid</replaceable> is the object ID
+ of the inserted row if <Replaceable>rows</Replaceable> is 1,
+ otherwise <Replaceable>oid</Replaceable> is 0.
+ </Para>
+
+ <Para>
+ For a <literal>DELETE</literal> command, the backend then
+ sends a CompletedResponse message with a tag of <literal>DELETE
+ <Replaceable>rows</Replaceable></literal> where
+ <Replaceable>rows</Replaceable> is the number of rows deleted.
+ </Para>
+
+ <Para>
+ For an <literal>UPDATE</literal> command, the backend then
+ sends a CompletedResponse message with a tag of <literal>UPDATE
+ <Replaceable>rows</Replaceable></literal> where
+ <Replaceable>rows</Replaceable> is the number of rows affected
+ by the update.
+ </Para>
+
+ <Para>
+ For a <literal>FETCH</literal> or <literal>SELECT</literal>
+ command, the backend sends a RowDescription message. This is
+ then followed by an AsciiRow or BinaryRow message (depending
+ on whether a binary cursor was specified) for each row being
+ returned to the frontend. Finally, the backend sends a
+ CompletedResponse message with a tag of <literal>SELECT</literal>.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>EmptyQueryResponse</Term>
+ <ListItem>
+ <Para>
+ An empty query string was recognized. (The need to specially
+ distinguish this case is historical.)
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>ErrorResponse</Term>
+ <ListItem>
+ <Para>
+ An error has occurred.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>ReadyForQuery</Term>
+ <ListItem>
+ <Para>
+ Processing of the query string is complete. A separate
+ message is sent to indicate this because the query string may
+ contain multiple SQL commands. (CompletedResponse marks the
+ end of processing one SQL command, not the whole string.)
+ ReadyForQuery will always be sent, whether processing
+ terminates successfully or with an error.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>NoticeResponse</Term>
+ <ListItem>
+ <Para>
+ A warning message has been issued in relation to the query.
+ Notices are in addition to other responses, i.e., the backend
+ will continue processing the command.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ </VariableList>
+ </Para>
+
+ <para>
+ A frontend must be prepared to accept ErrorResponse and
+ NoticeResponse messages whenever it is expecting any other type of
+ message.
+ </para>
+
+ <Para>
+ Actually, it is possible for NoticeResponse to arrive even when
+ the frontend is not expecting any kind of message, that is, the
+ backend is nominally idle. (In particular, the backend can be
+ commanded to terminate by its parent process. In that case it will
+ send a NoticeResponse before closing the connection.) It is
+ recommended that the frontend check for such asynchronous notices
+ just before issuing any new command.
+ </para>
+
+ <Para>
+ Also, if the frontend issues any <literal>LISTEN</literal>
+ commands then it must be prepared to accept NotificationResponse
+ messages at any time; see below.
+ </para>
+ </sect2>
+
+ <Sect2>
+ <Title>Function Call</Title>
+
+ <Para>
+ A Function Call cycle is initiated by the frontend sending a
+ FunctionCall message to the backend. The backend then sends one
+ or more response messages depending on the results of the function
+ call, and finally a ReadyForQuery response message. ReadyForQuery
+ informs the frontend that it may safely send a new query or
+ function call.
+ </para>
+
+ <Para>
+ The possible response messages from the backend are:
+
+ <VariableList>
+ <VarListEntry>
+ <Term>ErrorResponse</Term>
+ <ListItem>
+ <Para>
+ An error has occurred.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>FunctionResultResponse</Term>
+ <ListItem>
+ <Para>
+ The function call was executed and returned a result.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>FunctionVoidResponse</Term>
+ <ListItem>
+ <Para>
+ The function call was executed and returned no result.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>ReadyForQuery</Term>
+ <ListItem>
+ <Para>
+ Processing of the function call is complete. ReadyForQuery
+ will always be sent, whether processing terminates
+ successfully or with an error.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+
+ <VarListEntry>
+ <Term>NoticeResponse</Term>
+ <ListItem>
+ <Para>
+ A warning message has been issued in relation to the function
+ call. Notices are in addition to other responses, i.e., the
+ backend will continue processing the command.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+ </VariableList>
+ </Para>
+
+ <para>
+ A frontend must be prepared to accept ErrorResponse and
+ NoticeResponse messages whenever it is expecting any other type of
+ message. Also, if it issues any <literal>LISTEN</literal>
+ commands then it must be prepared to accept NotificationResponse
+ messages at any time; see below.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Notification Responses</title>
+
+ <Para>
+ If a frontend issues a <literal>LISTEN</literal> command, then the
+ backend will send a NotificationResponse message (not to be
+ confused with NoticeResponse!) whenever a
+ <literal>NOTIFY</literal> command is executed for the same
+ notification name.
+ </para>
+
+ <para>
+ Notification responses are permitted at any point in the protocol
+ (after start-up), except within another backend message. Thus,
+ the frontend must be prepared to recognize a NotificationResponse
+ message whenever it is expecting any message. Indeed, it should
+ be able to handle NotificationResponse messages even when it is
+ not engaged in a query.
+
+ <VariableList>
+ <VarListEntry>
+ <Term>NotificationResponse</Term>
+ <ListItem>
+ <Para>
+ A <literal>NOTIFY</literal> command has been executed for a
+ name for which a previous <literal>LISTEN</literal> command
+ was executed. Notifications may be sent at any time.
+ </Para>
+ </ListItem>
+ </VarListEntry>
+ </VariableList>
+ </Para>
+
+ <para>
+ It may be worth pointing out that the names used in listen and
+ notify commands need not have anything to do with names of
+ relations (tables) in the SQL database. Notification names are
+ simply arbitrarily chosen condition names.
+ </para>
+ </sect2>
+
+ <Sect2>
+ <Title>Cancelling Requests in Progress</Title>
+
+ <Para>
+ During the processing of a query, the frontend may request
+ cancellation of the query. The cancel request is not sent
+ directly on the open connection to the backend for reasons of
+ implementation efficiency: we don't want to have the backend
+ constantly checking for new input from the frontend during query
+ processing. Cancel requests should be relatively infrequent, so
+ we make them slightly cumbersome in order to avoid a penalty in
+ the normal case.
+ </para>
+
+ <Para>
+ To issue a cancel request, the frontend opens a new connection to
+ the server and sends a CancelRequest message, rather than the
+ StartupPacket message that would ordinarily be sent across a new
+ connection. The server will process this request and then close
+ the connection. For security reasons, no direct reply is made to
+ the cancel request message.
+ </para>
+
+ <Para>
+ A CancelRequest message will be ignored unless it contains the
+ same key data (PID and secret key) passed to the frontend during
+ connection start-up. If the request matches the PID and secret
+ key for a currently executing backend, the processing of the
+ current query is aborted. (In the existing implemenation, this is
+ done by sending a special signal to the backend process that is
+ processing the query.)
+ </para>
+
+ <Para>
+ The cancellation signal may or may not have any effect --- for
+ example, if it arrives after the backend has finished processing
+ the query, then it will have no effect. If the cancellation is
+ effective, it results in the current command being terminated
+ early with an error message.
+ </para>
+
+ <Para>
+ The upshot of all this is that for reasons of both security and
+ efficiency, the frontend has no direct way to tell whether a
+ cancel request has succeeded. It must continue to wait for the
+ backend to respond to the query. Issuing a cancel simply improves
+ the odds that the current query will finish soon, and improves the
+ odds that it will fail with an error message instead of
+ succeeding.
+ </para>
+
+ <Para>
+ Since the cancel request is sent across a new connection to the
+ server and not across the regular frontend/backend communication
+ link, it is possible for the cancel request to be issued by any
+ process, not just the frontend whose query is to be canceled.
+ This may have some benefits of flexibility in building
+ multiple-process applications. It also introduces a security
+ risk, in that unauthorized persons might try to cancel queries.
+ The security risk is addressed by requiring a dynamically
+ generated secret key to be supplied in cancel requests.
+ </para>
+ </sect2>
+
+ <Sect2>
+ <Title>Termination</Title>
+
+ <Para>
+ The normal, graceful termination procedure is that the frontend
+ sends a Terminate message and immediately closes the connection.
+ On receipt of the message, the backend immediately closes the
+ connection and terminates.
+ </para>
+
+ <Para>
+ An ungraceful termination may occur due to software failure (i.e.,
+ core dump) at either end. If either frontend or backend sees an
+ unexpected closure of the connection, it should clean up and
+ terminate. The frontend has the option of launching a new backend
+ by recontacting the server if it doesn't want to terminate
+ itself.
+ </para>
+ </sect2>
+ </sect1>
<Sect1 id="protocol-message-types">
<Title>Message Data Types</Title>
@@ -629,41 +612,41 @@ This section describes the base data types used in messages.
<VariableList>
<VarListEntry>
<Term>
- Int<Replaceable>n</Replaceable>(<Replaceable>i</Replaceable>)
+ Int<Replaceable>n</Replaceable>(<Replaceable>i</Replaceable>)
</Term>
<ListItem>
<Para>
- An <Replaceable>n</Replaceable> bit integer in network byte order.
+ An <Replaceable>n</Replaceable> bit integer in network byte order.
If <Replaceable>i</Replaceable> is specified it
- is the literal value. Eg. Int16, Int32(42).
+ is the literal value. Eg. Int16, Int32(42).
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- LimString<Replaceable>n</Replaceable>(<Replaceable>s</Replaceable>)
+ LimString<Replaceable>n</Replaceable>(<Replaceable>s</Replaceable>)
</Term>
<ListItem>
<Para>
- A character array of exactly <Replaceable>n</Replaceable> bytes interpreted as a '\0'
- terminated string. The '\0' is omitted if there is
- insufficient room. If <Replaceable>s</Replaceable> is specified it is the literal value.
- Eg. LimString32, LimString64("user").
+ A character array of exactly <Replaceable>n</Replaceable> bytes interpreted as a '\0'
+ terminated string. The '\0' is omitted if there is
+ insufficient room. If <Replaceable>s</Replaceable> is specified it is the literal value.
+ Eg. LimString32, LimString64("user").
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- String(<Replaceable>s</Replaceable>)
+ String(<Replaceable>s</Replaceable>)
</Term>
<ListItem>
<Para>
- A conventional C '\0' terminated string with no length
- limitation.
- If <Replaceable>s</Replaceable> is specified it is the literal value.
- Eg. String, String("user").
+ A conventional C '\0' terminated string with no length
+ limitation.
+ If <Replaceable>s</Replaceable> is specified it is the literal value.
+ Eg. String, String("user").
</Para>
-
+
<Note>
<Para>
<Emphasis>There is no predefined limit</Emphasis> on the length of a string
@@ -677,12 +660,12 @@ characters that don't fit into your fixed-size buffer.
</VarListEntry>
<VarListEntry>
<Term>
- Byte<Replaceable>n</Replaceable>(<Replaceable>c</Replaceable>)
+ Byte<Replaceable>n</Replaceable>(<Replaceable>c</Replaceable>)
</Term>
<ListItem>
<Para>
- Exactly <Replaceable>n</Replaceable> bytes. If <Replaceable>c</Replaceable> is specified it is the literal
- value. Eg. Byte, Byte1('\n').
+ Exactly <Replaceable>n</Replaceable> bytes. If <Replaceable>c</Replaceable> is specified it is the literal
+ value. Eg. Byte, Byte1('\n').
</Para>
</ListItem>
</VarListEntry>
@@ -695,7 +678,7 @@ characters that don't fit into your fixed-size buffer.
<Para>
This section describes the detailed format of each message. Each can be sent
-by either a frontend (F), a postmaster/backend (B), or both (F & B).
+by either a frontend (F), a backend (B), or both (F & B).
</para>
<VariableList>
@@ -708,19 +691,19 @@ AsciiRow (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('D')
+ Byte1('D')
</Term>
<ListItem>
<Para>
- Identifies the message as an <Acronym>ASCII</Acronym> data row.
- (A prior RowDescription message defines the number of
- fields in the row and their data types.)
+ Identifies the message as an <Acronym>ASCII</Acronym> data row.
+ (A prior RowDescription message defines the number of
+ fields in the row and their data types.)
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Byte<Replaceable>n</Replaceable>
+ Byte<Replaceable>n</Replaceable>
</Term>
<ListItem>
<Para>
@@ -734,30 +717,30 @@ AsciiRow (B)
of the last byte in the bit map is wasted.
</Para>
<Para>
- Then, for each field with a non-NULL value, there is the following:
+ Then, for each field with a non-NULL value, there is the following:
<VariableList>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- Specifies the size of the value of the field, including
- this size.
+ Specifies the size of the value of the field, including
+ this size.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Byte<Replaceable>n</Replaceable>
+ Byte<Replaceable>n</Replaceable>
</Term>
<ListItem>
<Para>
- Specifies the value of the field itself in <Acronym>ASCII</Acronym>
- characters. <Replaceable>n</Replaceable> is the above
- size minus 4.
+ Specifies the value of the field itself in <Acronym>ASCII</Acronym>
+ characters. <Replaceable>n</Replaceable> is the above
+ size minus 4.
There is no trailing '\0' in the field data; the front
- end must add one if it wants one.
+ end must add one if it wants one.
</Para>
</ListItem>
</VarListEntry>
@@ -781,21 +764,21 @@ AuthenticationOk (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('R')
+ Byte1('R')
</Term>
<ListItem>
<Para>
- Identifies the message as an authentication request.
+ Identifies the message as an authentication request.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32(0)
+ Int32(0)
</Term>
<ListItem>
<Para>
- Specifies that the authentication was successful.
+ Specifies that the authentication was successful.
</Para>
</ListItem>
</VarListEntry>
@@ -814,21 +797,21 @@ AuthenticationKerberosV4 (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('R')
+ Byte1('R')
</Term>
<ListItem>
<Para>
- Identifies the message as an authentication request.
+ Identifies the message as an authentication request.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32(1)
+ Int32(1)
</Term>
<ListItem>
<Para>
- Specifies that Kerberos V4 authentication is required.
+ Specifies that Kerberos V4 authentication is required.
</Para>
</ListItem>
</VarListEntry>
@@ -848,21 +831,21 @@ AuthenticationKerberosV5 (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('R')
+ Byte1('R')
</Term>
<ListItem>
<Para>
- Identifies the message as an authentication request.
+ Identifies the message as an authentication request.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32(2)
+ Int32(2)
</Term>
<ListItem>
<Para>
- Specifies that Kerberos V5 authentication is required.
+ Specifies that Kerberos V5 authentication is required.
</Para>
</ListItem>
</VarListEntry>
@@ -882,21 +865,21 @@ AuthenticationUnencryptedPassword (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('R')
+ Byte1('R')
</Term>
<ListItem>
<Para>
- Identifies the message as an authentication request.
+ Identifies the message as an authentication request.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32(3)
+ Int32(3)
</Term>
<ListItem>
<Para>
- Specifies that an unencrypted password is required.
+ Specifies that an unencrypted password is required.
</Para>
</ListItem>
</VarListEntry>
@@ -916,31 +899,31 @@ AuthenticationEncryptedPassword (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('R')
+ Byte1('R')
</Term>
<ListItem>
<Para>
- Identifies the message as an authentication request.
+ Identifies the message as an authentication request.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32(4)
+ Int32(4)
</Term>
<ListItem>
<Para>
- Specifies that an encrypted password is required.
+ Specifies that an encrypted password is required.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Byte2
+ Byte2
</Term>
<ListItem>
<Para>
- The salt to use when encrypting the password.
+ The salt to use when encrypting the password.
</Para>
</ListItem>
</VarListEntry>
@@ -959,33 +942,33 @@ BackendKeyData (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('K')
+ 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.
+ 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
+ Int32
</Term>
<ListItem>
<Para>
- The process ID of this backend.
+ The process ID of this backend.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- The secret key of this backend.
+ The secret key of this backend.
</Para>
</ListItem>
</VarListEntry>
@@ -1005,19 +988,19 @@ BinaryRow (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('B')
+ Byte1('B')
</Term>
<ListItem>
<Para>
- Identifies the message as a binary data row.
- (A prior RowDescription message defines the number of
- fields in the row and their data types.)
+ Identifies the message as a binary data row.
+ (A prior RowDescription message defines the number of
+ fields in the row and their data types.)
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Byte<Replaceable>n</Replaceable>
+ Byte<Replaceable>n</Replaceable>
</Term>
<ListItem>
<Para>
@@ -1031,27 +1014,27 @@ BinaryRow (B)
of the last byte in the bit map is wasted.
</Para>
<Para>
- Then, for each field with a non-NULL value, there is the following:
+ Then, for each field with a non-NULL value, there is the following:
<VariableList>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- Specifies the size of the value of the field, excluding
- this size.
+ Specifies the size of the value of the field, excluding
+ this size.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Byte<Replaceable>n</Replaceable>
+ Byte<Replaceable>n</Replaceable>
</Term>
<ListItem>
<Para>
- Specifies the value of the field itself in binary
- format. <Replaceable>n</Replaceable> is the above size.
+ Specifies the value of the field itself in binary
+ format. <Replaceable>n</Replaceable> is the above size.
</Para>
</ListItem>
</VarListEntry>
@@ -1075,44 +1058,44 @@ CancelRequest (F)
<VariableList>
<VarListEntry>
<Term>
- Int32(16)
+ Int32(16)
</Term>
<ListItem>
<Para>
- The size of the packet in bytes.
+ The size of the packet in bytes.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32(80877102)
+ Int32(80877102)
</Term>
<ListItem>
<Para>
- The cancel request code. The value is chosen to contain
- "1234" in the most significant 16 bits, and "5678" in the
- least 16 significant bits. (To avoid confusion, this code
- must not be the same as any protocol version number.)
+ The cancel request code. The value is chosen to contain
+ "1234" in the most significant 16 bits, and "5678" in the
+ least 16 significant bits. (To avoid confusion, this code
+ must not be the same as any protocol version number.)
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- The process ID of the target backend.
+ The process ID of the target backend.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- The secret key for the target backend.
+ The secret key for the target backend.
</Para>
</ListItem>
</VarListEntry>
@@ -1132,22 +1115,22 @@ CompletedResponse (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('C')
+ Byte1('C')
</Term>
<ListItem>
<Para>
- Identifies the message as a completed response.
+ Identifies the message as a completed response.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- String
+ String
</Term>
<ListItem>
<Para>
- The command tag. This is usually (but not always) a single
- word that identifies which SQL command was completed.
+ The command tag. This is usually (but not always) a single
+ word that identifies which SQL command was completed.
</Para>
</ListItem>
</VarListEntry>
@@ -1163,9 +1146,9 @@ CopyDataRows (B & F)
</Term>
<ListItem>
<Para>
- This is a stream of rows where each row is terminated by a Byte1('\n').
- This is then followed by the sequence Byte1('\\'), Byte1('.'),
- Byte1('\n').
+ This is a stream of rows where each row is terminated by a Byte1('\n').
+ This is then followed by the sequence Byte1('\\'), Byte1('.'),
+ Byte1('\n').
</Para>
</ListItem>
</VarListEntry>
@@ -1179,12 +1162,12 @@ CopyInResponse (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('G')
+ Byte1('G')
</Term>
<ListItem>
<Para>
- Identifies the message as a Start Copy In response.
- The frontend must now send a CopyDataRows message.
+ Identifies the message as a Start Copy In response.
+ The frontend must now send a CopyDataRows message.
</Para>
</ListItem>
</VarListEntry>
@@ -1204,12 +1187,12 @@ CopyOutResponse (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('H')
+ Byte1('H')
</Term>
<ListItem>
<Para>
- Identifies the message as a Start Copy Out response.
- This message will be followed by a CopyDataRows message.
+ Identifies the message as a Start Copy Out response.
+ This message will be followed by a CopyDataRows message.
</Para>
</ListItem>
</VarListEntry>
@@ -1229,22 +1212,22 @@ CursorResponse (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('P')
+ Byte1('P')
</Term>
<ListItem>
<Para>
- Identifies the message as a cursor response.
+ Identifies the message as a cursor response.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- String
+ String
</Term>
<ListItem>
<Para>
- The name of the cursor. This will be "blank" if the cursor is
- implicit.
+ The name of the cursor. This will be "blank" if the cursor is
+ implicit.
</Para>
</ListItem>
</VarListEntry>
@@ -1264,21 +1247,21 @@ EmptyQueryResponse (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('I')
+ Byte1('I')
</Term>
<ListItem>
<Para>
- Identifies the message as a response to an empty query string.
+ Identifies the message as a response to an empty query string.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- String("")
+ String("")
</Term>
<ListItem>
<Para>
- Unused.
+ Unused.
</Para>
</ListItem>
</VarListEntry>
@@ -1298,21 +1281,21 @@ EncryptedPasswordPacket (F)
<VariableList>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- The size of the packet in bytes.
+ The size of the packet in bytes.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- String
+ String
</Term>
<ListItem>
<Para>
- The encrypted (using crypt()) password.
+ The encrypted (using crypt()) password.
</Para>
</ListItem>
</VarListEntry>
@@ -1332,21 +1315,21 @@ ErrorResponse (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('E')
+ Byte1('E')
</Term>
<ListItem>
<Para>
- Identifies the message as an error.
+ Identifies the message as an error.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- String
+ String
</Term>
<ListItem>
<Para>
- The error message itself.
+ The error message itself.
</Para>
</ListItem>
</VarListEntry>
@@ -1366,65 +1349,65 @@ FunctionCall (F)
<VariableList>
<VarListEntry>
<Term>
- Byte1('F')
+ Byte1('F')
</Term>
<ListItem>
<Para>
- Identifies the message as a function call.
+ Identifies the message as a function call.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- String("")
+ String("")
</Term>
<ListItem>
<Para>
- Unused.
+ Unused.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- Specifies the object ID of the function to call.
+ Specifies the object ID of the function to call.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- Specifies the number of arguments being supplied to the
- function.
+ Specifies the number of arguments being supplied to the
+ function.
</Para>
<Para>
- Then, for each argument, there is the following:
+ Then, for each argument, there is the following:
<VariableList>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- Specifies the size of the value of the argument,
- excluding this size.
+ Specifies the size of the value of the argument,
+ excluding this size.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Byte<Replaceable>n</Replaceable>
+ Byte<Replaceable>n</Replaceable>
</Term>
<ListItem>
<Para>
- Specifies the value of the field itself in binary
- format. <Replaceable>n</Replaceable> is the above size.
+ Specifies the value of the field itself in binary
+ format. <Replaceable>n</Replaceable> is the above size.
</Para>
</ListItem>
</VarListEntry>
@@ -1449,55 +1432,55 @@ FunctionResultResponse (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('V')
+ Byte1('V')
</Term>
<ListItem>
<Para>
- Identifies the message as a function call result.
+ Identifies the message as a function call result.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Byte1('G')
+ Byte1('G')
</Term>
<ListItem>
<Para>
- Specifies that a nonempty result was returned.
+ Specifies that a nonempty result was returned.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- Specifies the size of the value of the result, excluding this
- size.
+ Specifies the size of the value of the result, excluding this
+ size.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Byte<Replaceable>n</Replaceable>
+ Byte<Replaceable>n</Replaceable>
</Term>
<ListItem>
<Para>
- Specifies the value of the result itself in binary format.
- <Replaceable>n</Replaceable> is the above size.
+ Specifies the value of the result itself in binary format.
+ <Replaceable>n</Replaceable> is the above size.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Byte1('0')
+ Byte1('0')
</Term>
<ListItem>
<Para>
- Unused. (Strictly speaking, FunctionResultResponse and
- FunctionVoidResponse are the same thing but with some optional
- parts to the message.)
+ Unused. (Strictly speaking, FunctionResultResponse and
+ FunctionVoidResponse are the same thing but with some optional
+ parts to the message.)
</Para>
</ListItem>
</VarListEntry>
@@ -1517,21 +1500,21 @@ FunctionVoidResponse (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('V')
+ Byte1('V')
</Term>
<ListItem>
<Para>
- Identifies the message as a function call result.
+ Identifies the message as a function call result.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Byte1('0')
+ Byte1('0')
</Term>
<ListItem>
<Para>
- Specifies that an empty result was returned.
+ Specifies that an empty result was returned.
</Para>
</ListItem>
</VarListEntry>
@@ -1551,21 +1534,21 @@ NoticeResponse (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('N')
+ Byte1('N')
</Term>
<ListItem>
<Para>
- Identifies the message as a notice.
+ Identifies the message as a notice.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- String
+ String
</Term>
<ListItem>
<Para>
- The notice message itself.
+ The notice message itself.
</Para>
</ListItem>
</VarListEntry>
@@ -1585,31 +1568,31 @@ NotificationResponse (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('A')
+ Byte1('A')
</Term>
<ListItem>
<Para>
- Identifies the message as a notification response.
+ Identifies the message as a notification response.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- The process ID of the notifying backend process.
+ The process ID of the notifying backend process.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- String
+ String
</Term>
<ListItem>
<Para>
- The name of the condition that the notify has been raised on.
+ The name of the condition that the notify has been raised on.
</Para>
</ListItem>
</VarListEntry>
@@ -1629,21 +1612,21 @@ Query (F)
<VariableList>
<VarListEntry>
<Term>
- Byte1('Q')
+ Byte1('Q')
</Term>
<ListItem>
<Para>
- Identifies the message as a query.
+ Identifies the message as a query.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- String
+ String
</Term>
<ListItem>
<Para>
- The query string itself.
+ The query string itself.
</Para>
</ListItem>
</VarListEntry>
@@ -1663,12 +1646,12 @@ ReadyForQuery (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('Z')
+ Byte1('Z')
</Term>
<ListItem>
<Para>
- Identifies the message type. ReadyForQuery is sent
- whenever the backend is ready for a new query cycle.
+ Identifies the message type. ReadyForQuery is sent
+ whenever the backend is ready for a new query cycle.
</Para>
</ListItem>
</VarListEntry>
@@ -1688,62 +1671,62 @@ RowDescription (B)
<VariableList>
<VarListEntry>
<Term>
- Byte1('T')
+ Byte1('T')
</Term>
<ListItem>
<Para>
- Identifies the message as a row description.
+ Identifies the message as a row description.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int16
+ Int16
</Term>
<ListItem>
<Para>
- Specifies the number of fields in a row (may be zero).
+ Specifies the number of fields in a row (may be zero).
</Para>
<Para>
- Then, for each field, there is the following:
+ Then, for each field, there is the following:
<VariableList>
<VarListEntry>
<Term>
- String
+ String
</Term>
<ListItem>
<Para>
- Specifies the field name.
+ Specifies the field name.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- Specifies the object ID of the field type.
+ Specifies the object ID of the field type.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int16
+ Int16
</Term>
<ListItem>
<Para>
- Specifies the type size.
+ Specifies the type size.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- Specifies the type modifier.
+ Specifies the type modifier.
</Para>
</ListItem>
</VarListEntry>
@@ -1768,74 +1751,74 @@ StartupPacket (F)
<VariableList>
<VarListEntry>
<Term>
- Int32(296)
+ Int32(296)
</Term>
<ListItem>
<Para>
- The size of the packet in bytes.
+ The size of the packet in bytes.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- The protocol version number. The most significant 16 bits are
- the major version number. The least 16 significant bits are
- the minor version number.
+ The protocol version number. The most significant 16 bits are
+ the major version number. The least 16 significant bits are
+ the minor version number.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- LimString64
+ LimString64
</Term>
<ListItem>
<Para>
- The database name, defaults to the user name if empty.
+ The database name, defaults to the user name if empty.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- LimString32
+ LimString32
</Term>
<ListItem>
<Para>
- The user name.
+ The user name.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- LimString64
+ LimString64
</Term>
<ListItem>
<Para>
- Any additional command line arguments to be passed to the
- backend by the postmaster.
+ Any additional command line arguments to be passed to the
+ backend child process by the server.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- LimString64
+ LimString64
</Term>
<ListItem>
<Para>
- Unused.
+ Unused.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- LimString64
+ LimString64
</Term>
<ListItem>
<Para>
- The optional tty the backend should use for debugging messages.
+ The optional tty the backend should use for debugging messages.
</Para>
</ListItem>
</VarListEntry>
@@ -1855,11 +1838,11 @@ Terminate (F)
<VariableList>
<VarListEntry>
<Term>
- Byte1('X')
+ Byte1('X')
</Term>
<ListItem>
<Para>
- Identifies the message as a termination.
+ Identifies the message as a termination.
</Para>
</ListItem>
</VarListEntry>
@@ -1879,21 +1862,21 @@ UnencryptedPasswordPacket (F)
<VariableList>
<VarListEntry>
<Term>
- Int32
+ Int32
</Term>
<ListItem>
<Para>
- The size of the packet in bytes.
+ The size of the packet in bytes.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
- String
+ String
</Term>
<ListItem>
<Para>
- The unencrypted password.
+ The unencrypted password.
</Para>
</ListItem>
</VarListEntry>