more response
messages depending on the contents of the query command string,
and finally a ReadyForQuery response message. ReadyForQuery
informs the frontend that it can safely send a new command.
(It is not actually necessary for the frontend to wait for
ReadyForQuery before issuing another command, but the frontend must
then take responsibility for figuring out what happens if the earlier
command fails and already-issued later commands succeed.)
</para>
<para>
The possible response messages from the backend are:
<variablelist>
<varlistentry>
<term>CommandComplete</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; see <xref linkend="protocol-copy"/>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>CopyOutResponse</term>
<listitem>
<para>
The backend is ready to copy data from a table to the
frontend; see <xref linkend="protocol-copy"/>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>RowDescription</term>
<listitem>
<para>
Indicates that rows are about to be returned in response to
a <command>SELECT</command>, <command>FETCH</command>, etc. query.
The contents of this message describe the column layout of the rows.
This will be followed by a DataRow message for each row being returned
to the frontend.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>DataRow</term>
<listitem>
<para>
One of the set of rows returned by
a <command>SELECT</command>, <command>FETCH</command>, etc. query.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>EmptyQueryResponse</term>
<listitem>
<para>
An empty query string was recognized.
</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 might
contain multiple SQL commands. (CommandComplete 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>
The response to a <command>SELECT</command> query (or other queries that
return row sets, such as <command>EXPLAIN</command> or <command>SHOW</command>)
normally consists of RowDescription, zero or more
DataRow messages, and then CommandComplete.
<command>COPY</command> to or from the frontend invokes special protocol
as described in <xref linkend="protocol-copy"/>.
All other query types normally produce only
a CommandComplete message.
</para>
<para>
Since a query string could contain several queries (separated by
semicolons), there might be several such response sequences before the
backend finishes processing the query string. ReadyForQuery is issued
when the entire string has been processed