51.2. 协议
本节描述消息流。根据连接的状态,有四种不同类型的流:认证、查询、函数调用和终止。
51.2.1. 认证
前端发送一个 StartupPacket。postmaster 使用它以及 pg_hba.conf(5) 文件的内容确定前端必须使用哪种认证方法。postmaster 然后用下列消息之一响应:
- ErrorResponse
然后 postmaster 立即关闭连接。
- AuthenticationOk
然后 postmaster 移交给后端。postmaster 不再参与通信。
- AuthenticationKerberosV4
然后前端必须与 postmaster 进行 Kerberos V4 认证对话(此处不描述)。如果成功,postmaster 以 AuthenticationOk 响应,否则以 ErrorResponse 响应。
- AuthenticationKerberosV5
然后前端必须与 postmaster 进行 Kerberos V5 认证对话(此处不描述)。如果成功,postmaster 以 AuthenticationOk 响应,否则以 ErrorResponse 响应。
- AuthenticationUnencryptedPassword
然后前端必须发送一个 UnencryptedPasswordPacket。如果密码正确,postmaster 以 AuthenticationOk 响应,否则以 ErrorResponse 响应。
- AuthenticationEncryptedPassword
然后前端必须发送一个 EncryptedPasswordPacket。如果密码正确,postmaster 以 AuthenticationOk 响应,否则以 ErrorResponse 响应。
如果前端不支持 postmaster 请求的认证方法,那么它应当立即关闭连接。
51.2.2. 查询
前端向后端发送一条 Query 消息。后端发送的响应取决于查询的内容。可能的响应如下。
- CompletedResponse
查询正常完成。
- CopyInResponse
后端准备好把数据从前端复制到关系。前端然后应发送 CopyDataRows 消息。后端随后将以带 "COPY" 标签的 CompletedResponse 消息响应。
- CopyOutResponse
后端准备好把数据从关系复制到前端。然后它发送 CopyDataRows 消息,再发送带 "COPY" 标签的 CompletedResponse 消息。
- CursorResponse
查询是 insert(l)、delete(l)、update(l)、fetch(l) 或 select(l) 命令之一。如果事务已被中止,则后端发送带 "*ABORT STATE*" 标签的 CompletedResponse 消息。否则发送以下响应。
对于 insert(l) 命令,后端随后发送一条带 "INSERT
oidrows" 标签的 CompletedResponse 消息,其中rows是插入的行数,oid在rows为 1 时是所插入行的对象 ID,否则oid为 0。对于 delete(l) 命令,后端随后发送一条带 "DELETE
rows" 标签的 CompletedResponse 消息,其中rows是删除的行数。对于 update(l) 命令,后端随后发送一条带 "UPDATE
rows" 标签的 CompletedResponse 消息,其中rows是更新的行数。对于 fetch(l) 或 select(l) 命令,后端发送一条 RowDescription 消息。然后对返回给前端的每一行,跟着一条 AsciiRow 或 BinaryRow 消息(取决于是否指定了二进制游标)。最后,后端发送一条带 "SELECT" 标签的 CompletedResponse 消息。
- EmptyQueryResponse
查询为空。
- ErrorResponse
发生了一个错误。
- NoticeResponse
发出了与查询有关的警告消息。通知是其他响应之外的附加内容,即后端会立即发送另一条响应消息。
- NotificationResponse
对一个先前执行过 listen(l) 命令的关系执行了 notify(l) 命令。通知是其他响应之外的附加内容,即后端会立即发送另一条响应消息。
每当期待任何其他类型的消息时,前端必须准备好接受 ErrorResponse 和 NoticeResponse 消息。
51.2.3. 函数调用
前端向后端发送一条 FunctionCall 消息。后端发送的响应取决于函数调用的结果。可能的响应如下。
- ErrorResponse
发生了一个错误。
- FunctionResultResponse
函数调用已执行并返回了结果。
- FunctionVoidResponse
函数调用已执行但没有返回结果。
- NoticeResponse
发出了与函数调用有关的警告消息。通知是其他响应之外的附加内容,即后端会立即发送另一条响应消息。
每当期待任何其他类型的消息时,前端必须准备好接受 ErrorResponse 和 NoticeResponse 消息。
51.2.4. 终止
前端发送一条 Terminate 消息并立即关闭连接。收到该消息后,后端立即关闭连接并终止。