# 53.1.概述
该协议有单独的启动和正常运行阶段。在启动阶段,前端打开与服务器的连接,并对自己进行身份验证,使服务器满意。(这可能涉及一条消息,也可能涉及多条消息,具体取决于所使用的身份验证方法。)如果一切顺利,服务器将向前端发送状态信息,并最终进入正常操作。除了初始启动请求消息,协议的这一部分由服务器驱动。
在正常操作期间,前端向后端发送查询和其他命令,后端返回查询结果和其他响应。有几个案例(例如通知
)其中后端将发送未经请求的消息,但在大多数情况下,会话的这一部分由前端请求驱动。
会话的终止通常由前端选择,但在某些情况下可以由后端强制。在任何情况下,当后端关闭连接时,它将在退出之前回滚任何打开(未完成)的事务。
在正常操作中,SQL命令可以通过两个子协议之一执行。在“简单查询”协议中,前端只发送一个文本查询字符串,由后端解析并立即执行。在“扩展查询”协议中,查询的处理分为多个步骤:解析、参数值绑定和执行。这提供了灵活性和性能优势,但代价是额外的复杂性。
正常操作有额外的子协议用于特殊操作,例如复制
.
# 53.1.1.信息概述
所有的交流都是通过信息流进行的。消息的第一个字节标识消息类型,接下来的四个字节指定消息其余部分的长度(此长度计数包括其自身,但不包括消息类型字节)。消息的其余内容由消息类型决定。由于历史原因,客户端发送的第一条消息(启动消息)没有初始消息类型字节。
为了避免丢失与消息流的同步,服务器和客户端通常在试图处理其内容之前将整个消息读入缓冲区(使用字节计数)。如果在处理内容时检测到错误,则可以轻松恢复。在极端情况下(例如没有足够的内存来缓冲消息),接收器可以使用字节计数来确定在恢复读取消息之前要跳过多少输入。
相反,服务器和客户端都必须注意不要发送不完整的消息。这通常是通过在开始发送之前在缓冲区中封送整个消息来完成的。如果在发送或接收消息的过程中发生通信故障,唯一明智的反应是放弃连接,因为恢复消息边界同步的希望很小。
# 53.1.2.扩展查询概述
在扩展查询协议中,SQL命令的执行分为多个步骤。步骤之间保留的状态由两种类型的对象表示:准备好的声明和入口。准备好的语句表示文本查询字符串的解析和语义分析结果。准备好的语句本身并没有准备好执行,因为它可能缺少特定的参数.门户表示准备执行或已部分执行的语句,并填入任何缺少的参数值。(用于选择
语句,门户相当于打开的游标,但我们选择使用不同的术语,因为游标不处理非-选择
声明。)
整个执行周期包括作语法分析步骤,从文本查询字符串创建准备好的语句;A.绑定步骤,该步骤创建一个门户,为任何需要的参数提供准备好的语句和值;还有处决运行门户查询的步骤。对于返回行的查询(选择
, 显示
,等等),执行步骤可以被告知只获取有限数量的行,因此可能需要多个执行步骤来完成操作。
后端可以跟踪多个准备好的语句和门户(但请注意,这些语句和门户只存在于一个会话中,不会在会话之间共享)。现有的准备好的语句和门户在创建时会被指定的名称引用。此外,还存在一个“未命名”的准备语句和门户。尽管这些对象的行为与命名对象基本相同,但对它们的操作进行了优化,以便只执行一次查询,然后将其丢弃,而对命名对象的操作则根据多种用途的预期进行了优化。
# 53.1.3.格式和格式代码
特定数据类型的数据可能以几种不同的方式传输格式.从PostgreSQL 7.4开始,只支持“文本”和“二进制”格式,但该协议为将来的扩展做了规定。任何值的所需格式由格式代码.客户端可以为每个传输的参数值和查询结果的每列指定格式代码。文本的格式代码为零,二进制的格式代码为一,所有其他格式代码保留供将来定义。
值的文本表示是特定数据类型的输入/输出转换函数生成和接受的任何字符串。在传输的表示中,没有尾随的空字符;如果前端希望将接收到的值作为C字符串处理,则必须向其添加一个值。(顺便说一句,文本格式不允许嵌入空值。)
整数的二进制表示使用网络字节顺序(最高有效字节优先)。对于其他数据类型,请参阅文档或源代码以了解二进制表示。请记住,复杂数据类型的二进制表示可能会随着服务器版本的不同而变化;文本格式通常是更便于携带的选择。