55.10. 自协议 2.0 以来变更摘要#
本部分提供变更的快速检查清单,供尝试将现有客户端库更新到协议 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
期间的终止符,但其使用已弃用,最终将被移除。)支持二进制COPY
。CopyInResponse 和 CopyOutResponse 消息包括指示列数和每列格式的字段。
FunctionCall 和 FunctionCallResponse 消息的布局已更改。FunctionCall 现在支持将 NULL 参数传递给函数。它还可以处理以文本或二进制格式传递参数和检索结果。不再有任何理由将 FunctionCall 视为潜在的安全漏洞,因为它不提供对内部服务器数据表示的直接访问。
后端在连接启动期间发送 ParameterStatus('S
')消息,用于客户端库认为有趣的所有参数。随后,每当这些参数的活动值发生更改时,都会发送 ParameterStatus 消息。
RowDescription('T
')消息为所描述行的每一列携带新的表 OID 和列号字段。它还显示每列的格式代码。
CursorResponse('P
')消息不再由后端生成。
NotificationResponse('A
')消息有一个附加的字符串字段,它可以携带从NOTIFY
事件发送者传递的“有效负载”字符串。
EmptyQueryResponse('I
')消息用于包含一个空字符串参数;这已被移除。