本节为试图把现有客户端库升级到协议 3.0 的开发者 提供一个快速的变化清单。
初始启动包使用一种灵活的字符串列表格式,
取代了固定格式。注意,运行时参数的会话默认值
现在可以直接在启动包中指定。
(实际上,以前可以通过 options 字段做到这一点,
但考虑到 options 的宽度有限,
而且没有办法在值中引用空白,那并不是一种很安全的技术。)
现在所有消息都在消息类型字节之后紧接着有一个长度计数 (启动包除外,它们没有类型字节)。 另请注意,PasswordMessage 现在也有一个类型字节。
ErrorResponse 和 NoticeResponse('E' 和
'N')
消息现在包含多个字段,客户端代码可以从中组装出
所需详细程度的错误消息。注意,各个字段通常不以换行结尾,
而旧协议中发送的单个字符串总是以换行结尾。
ReadyForQuery('Z')消息包含一个事务状态指示器。
BinaryRow 与 DataRow 消息类型之间的区别已经消失; 单一的 DataRow 消息类型可用于以所有格式返回数据。 注意,DataRow 的布局已经改变,使其更易于解析。 此外,二进制值的表示方式也发生了变化: 它不再与服务器内部表示直接绑定。
新增了一个“扩展查询”子协议,它增加了前端的 Parse、Bind、Execute、Describe、Close、Flush 和 Sync 消息类型, 以及后端的 ParseComplete、BindComplete、PortalSuspended、 ParameterDescription、NoData 和 CloseComplete 消息类型。 现有客户端不必关心这个子协议, 但使用它可能会带来性能或功能上的改进。
COPY 数据现在被封装进 CopyData 和 CopyDone 消息。
对于 COPY 期间发生的错误,
现在有一种明确定义的恢复方式。
特殊的“\.”末行不再需要,
在 COPY OUT 期间也不会再发送。
(在文本模式的 COPY IN 中它仍被识别为终止符,
但在 CSV 模式中不是。文本模式的行为已被弃用,
并可能最终被移除。)现在支持二进制 COPY。
CopyInResponse 和 CopyOutResponse 消息包含指出列数
和每列格式的字段。
FunctionCall 和 FunctionCallResponse 消息的布局已经改变。 FunctionCall 现在可以支持向函数传递 NULL 参数。 它还能以文本或二进制格式传递参数和检索结果。 已经没有任何理由再把 FunctionCall 视为一个潜在的安全漏洞, 因为它不再提供对服务器内部数据表示的直接访问。
后端会在连接启动期间为其认为客户端库感兴趣的
所有参数发送 ParameterStatus('S')消息。
此后,只要这些参数中任何一个的活动值发生变化,
就会发送一条 ParameterStatus 消息。
RowDescription('T')消息为所描述行的每一列
携带了新的表 OID 和列号字段。它还展示了每列的格式代码。
后端不再生成 CursorResponse('P')消息。
NotificationResponse('A')消息多了一个字符串字段,
它可以携带由 NOTIFY 事件发送方传入的
“载荷”(payload)字符串。
EmptyQueryResponse('I')消息过去包含一个空字符串参数;
该参数已被移除。