本节描述了每条消息的详细格式。每条消息都标记了可以由前端(F)、后端(B)或两者(F&B)发送。 请注意,尽管每条消息开头包含字节计数,但消息格式被定义为可以在不参考字节计数的情况下找到消息结尾。这有助于有效性检查。 (CopyData消息是一个例外,因为它是数据流的一部分;任何单独的CopyData消息的内容本身都无法解释。)
标识消息为认证请求。
消息内容的长度,包括自身,在字节中。
指定认证成功。
标识消息为认证请求。
消息内容的长度,包括自身,在字节中。
指定需要Kerberos V5身份验证。
标识消息为认证请求。
消息内容的长度,包括自身,在字节中。
指定需要明文密码。
标识消息为认证请求。
消息内容的长度,包括自身,在字节中。
指定需要MD5加密的密码。
用于加密密码时使用的盐。
标识消息为认证请求。
消息内容的长度,包括自身,在字节中。
指定需要一个SCM凭据消息。
标识消息为认证请求。
消息内容的长度,包括自身,在字节中。
指定需要GSSAPI身份验证。
标识消息为认证请求。
消息内容的长度,包括自身,在字节中。
指定此消息包含GSSAPI或SSPI数据。
n
GSSAPI或SSPI身份验证数据。
标识消息为认证请求。
消息内容的长度,包括自身,在字节中。
指定需要SSPI身份验证。
标识消息为认证请求。
消息内容的长度,包括自身,在字节中。
指定需要SASL身份验证。
消息正文是服务器首选的SASL身份验证机制列表。在最后一个身份验证机制名称后需要一个零字节作为终止符。对于每个机制,有以下内容:
SASL身份验证机制的名称。
标识消息为认证请求。
消息内容的长度,包括自身,在字节中。
指定此消息包含一个SASL挑战。
n
SASL数据,特定于正在使用的SASL机制。
标识消息为认证请求。
消息内容的长度,包括自身,在字节中。
指定SASL认证已完成。
n
SASL结果"附加数据",特定于正在使用的SASL机制。
标识消息为取消键数据。 如果前端希望能够稍后发出CancelRequest消息,必须保存这些值。
消息内容的长度,包括自身,在字节中。
这个后端的进程ID。
这个后端的秘钥。
将消息标识为绑定命令。
消息内容的长度,包括自身,在字节中。
目标门户的名称(空字符串选择未命名的门户)。
源准备语句的名称(空字符串选择未命名的准备语句)。
后面跟着的参数格式代码的数量(以下标记为C
)。
这可以是零,表示没有参数或者所有参数都使用默认格式(文本);
或者是一个,这种情况下指定的格式代码应用于所有参数;
或者等于实际参数的数量。
C
]参数格式代码。每个目前必须是零(文本)或一(二进制)。
后面跟着的参数值的数量(可能为零)。 这个数量必须与查询所需的参数数量匹配。
接下来,对于每个参数,都会出现以下一对字段:
参数值的长度,以字节为单位(此计数不包括自身)。可以为零。 作为特殊情况,-1表示空参数值。 在空参数值的情况下,不会跟随任何值字节。
n
参数的值,以相关格式代码指示的格式表示。
n
是上述长度。
在最后一个参数之后,出现以下字段:
后跟的结果列格式代码数量(以下标记为R
)。
这可以是零,表示没有结果列,或者所有结果列应该使用默认格式(文本);
或者是一个,此时指定的格式代码将应用于所有结果列(如果有);
或者等于查询的实际结果列数。
R
]结果列格式代码。每个目前必须是零(文本)或一(二进制)。
标识消息为绑定完成指示器。
消息内容的长度,包括自身,在字节中。
消息内容的长度,包括自身,在字节中。
取消请求代码。该值被选择为在最高的16位中包含1234
,在最低的16位中包含5678
。
(为避免混淆,此代码不得与任何协议版本号相同。)
目标后端的进程ID。
目标后端的秘钥。
将消息标识为关闭命令。
消息内容的长度,包括自身,在字节中。
'S
' 用于关闭一个准备好的语句;或者
'P
' 用于关闭一个门户。
要关闭的预处理语句或门户的名称(空字符串选择未命名的预处理语句或门户)。
标识消息为关闭完成指示符。
消息内容的长度,包括自身,在字节中。
标识消息为命令完成响应。
消息内容的长度,包括自身,在字节中。
命令标签。这通常是一个单词,用于标识已完成的SQL命令。
对于INSERT
命令,标签是
INSERT
,其中
oid
rows
rows
是插入的行数。
如果rows
为1且目标表具有OIDs,
则oid
曾经是插入行的对象ID,
但不再支持OIDs系统列;因此oid
总是0。
对于DELETE
命令,标签是DELETE
,
其中rows
rows
表示删除的行数。
对于UPDATE
命令,标签是UPDATE
,
其中rows
rows
是更新的行数。
对于MERGE
命令,标签是MERGE
,
其中rows
rows
是插入、更新或删除的行数。
对于SELECT
或CREATE TABLE AS
命令,标签是SELECT
,
其中rows
rows
是检索到的行数。
对于MOVE
命令,标签是MOVE
,
其中rows
rows
表示光标位置改变的行数。
对于FETCH
命令,标签是FETCH
,
其中rows
rows
是从游标中检索出的行数。
对于COPY
命令,标签是
COPY
,其中
rows
rows
是复制的行数。
(注意:行数仅出现在PostgreSQL 8.2及更高版本中。)
标识消息为COPY
数据。
消息内容的长度,包括自身,在字节中。
n
数据是COPY
数据流的一部分。来自后端的消息始终对应单个数据行,
但来自前端的消息可能会任意划分数据流。
将消息标识为COPY
完成指示符。
消息内容的长度,包括自身,在字节中。
将消息标识为COPY
失败指示器。
消息内容的长度,包括自身,在字节中。
作为失败原因报告的错误消息。
标识消息为开始复制响应。 前端现在必须发送复制数据(如果没有准备好,发送CopyFail消息)。
消息内容的长度,包括自身,在字节中。
0表示整体COPY
格式是文本的(行由换行符分隔,列由分隔符分隔等)。
1表示整体复制格式是二进制的(类似于DataRow格式)。
更多信息请参见COPY。
要复制的数据中的列数(以下用N
表示)。
N
]每列要使用的格式代码。 每个必须目前为零(文本)或一(二进制)。 如果整体复制格式为文本,则所有必须为零。
标识消息为开始复制输出响应。 该消息将被复制输出数据跟随。
消息内容的长度,包括自身,在字节中。
0表示整体COPY
格式为文本格式(行由换行符分隔,列由分隔符字符分隔等)。
1表示整体复制格式为二进制格式(类似于DataRow格式)。更多信息请参见COPY。
要复制的数据中的列数(以下用N
表示)。
N
]每列要使用的格式代码。 每个必须目前为零(文本)或一(二进制)。 如果整体复制格式为文本,则所有必须为零。
标识消息为开始复制双响应。此消息仅用于流复制。
消息内容的长度,包括自身,在字节中。
0表示整体COPY
格式为文本格式(行由换行符分隔,列由分隔符字符分隔等)。
1表示整体复制格式为二进制格式(类似于DataRow格式)。更多信息请参见COPY。
要复制的数据中的列数(以下用N
表示)。
N
]每列要使用的格式代码。 每个必须目前为零(文本)或一(二进制)。 如果整体复制格式为文本,则所有必须为零。
标识消息为数据行。
消息内容的长度,包括自身,在字节中。
后面跟着的列值的数量(可能为零)。
接下来,对于每一列,都会出现以下一对字段:
列值的长度,以字节为单位(此计数不包括其本身)。可以为零。 作为特殊情况,-1表示空列值。在空值情况下,不跟随任何值字节。
n
列的值,格式由相关的格式代码指示。
n
是上述长度。
标识消息为描述命令。
消息内容的长度,包括自身,在字节中。
'S
'用于描述一个准备好的语句;或者
'P
'用于描述一个门户。
要描述的预处理语句或门户的名称(空字符串选择未命名的预处理语句或门户)。
将消息标识为对空查询字符串的响应。(这相当于CommandComplete。)
消息内容的长度,包括自身,在字节中。
将消息标识为错误。
消息内容的长度,包括自身,在字节中。
消息正文由一个或多个已识别的字段组成,后跟一个零字节作为终止符。字段可以以任何顺序出现。对于每个字段,都有以下内容:
一个用于标识字段类型的代码;如果为零,则这是消息终止符,后面没有字符串。 目前定义的字段类型列在第 55.8 节中。 由于将来可能会添加更多的字段类型,前端应该静默地忽略未识别类型的字段。
字段数值。
标识消息为一个执行命令。
消息内容的长度,包括自身,在字节中。
要执行的门户的名称(空字符串选择未命名的门户)。
返回的最大行数,如果门户包含返回行的查询(否则忽略)。零表示“没有限制”。
将消息标识为Flush命令。
消息内容的长度,包括自身,在字节中。
标识消息为函数调用。
消息内容的长度,包括自身,在字节中。
指定要调用的函数的对象ID。
后面跟着的参数格式代码的数量(以下标记为C
)。
这可以是零,表示没有参数或所有参数都使用默认格式(文本);
或者是一个,这种情况下指定的格式代码应用于所有参数;
或者等于实际参数的数量。
C
]参数格式代码。每个目前必须是零(文本)或一(二进制)。
指定传递给函数的参数数量。
接下来,对于每个参数,都会出现以下一对字段:
参数值的长度,以字节为单位(此计数不包括自身)。可以为零。 作为特殊情况,-1表示空参数值。 在空参数值的情况下,不会跟随任何值字节。
n
参数的值,以相关格式代码指示的格式表示。
n
是上述长度。
在最后一个参数之后,出现以下字段:
函数结果的格式代码。目前必须是零(文本)或一(二进制)。
标识消息为函数调用结果。
消息内容的长度,包括自身,在字节中。
函数结果值的长度,以字节为单位(此计数不包括本身)。可以为零。 作为特殊情况,-1表示NULL函数结果。 在NULL情况下,不会跟随任何值字节。
n
函数结果的值,格式由相关的格式代码指示。
n
是上述长度。
消息内容的长度,包括自身,在字节中。
GSSAPI加密请求代码。该值被选择为包含最高16位中的1234
,
以及最低16位中的5680
。(为避免混淆,此代码不得与任何协议版本号相同。)
识别消息为GSSAPI或SSPI响应。请注意,这也用于SASL和密码响应消息。 可以从上下文中推断出确切的消息类型。
消息内容的长度,包括自身,在字节中。
n
GSSAPI/SSPI 特定的消息数据。
标识消息为协议版本协商消息。
消息内容的长度,包括自身,在字节中。
服务器支持的最新次要协议版本,用于客户端请求的主要协议版本。
服务器未识别的协议选项数量。
然后,对于服务器未识别的协议选项,有以下内容:
选项名称。
将消息标识为无数据指示器。
消息内容的长度,包括自身,在字节中。
将消息标识为通知。
消息内容的长度,包括自身,在字节中。
消息正文由一个或多个已识别的字段组成,后跟一个零字节作为终止符。字段可以以任何顺序出现。对于每个字段,都有以下内容:
一个用于标识字段类型的代码;如果为零,则这是消息终止符,后面没有字符串。 目前定义的字段类型列在第 55.8 节中。 由于将来可能会添加更多的字段类型,前端应该静默地忽略未识别类型的字段。
字段数值。
标识消息为通知响应。
消息内容的长度,包括自身,在字节中。
通知后端进程的进程ID。
通知被触发的频道名称。
从通知进程传递的“有效负载”字符串。
标识消息为参数描述。
消息内容的长度,包括自身,在字节中。
语句使用的参数数量(可以为零)。
然后,对于每个参数,都有以下内容:
指定参数数据类型的对象ID。
标识消息为运行时参数状态报告。
消息内容的长度,包括自身,在字节中。
正在报告的运行时参数的名称。
参数的当前值。
将消息标识为解析命令。
消息内容的长度,包括自身,在字节中。
目标准备语句的名称(空字符串选择未命名的准备语句)。
要解析的查询字符串。
指定的参数数据类型的数量(可以为零)。请注意,这不是查询字符串中可能出现的参数数量的指示, 而是前端希望为其预先指定类型的参数数量。
然后,对于每个参数,都有以下内容:
指定参数数据类型的对象ID。在这里放置零相当于未指定类型。
将消息标识为解析完成指示器。
消息内容的长度,包括自身,在字节中。
标识消息为密码响应。请注意,这也用于GSSAPI、SSPI和SASL响应消息。 可以从上下文中推断出确切的消息类型。
消息内容的长度,包括自身,在字节中。
密码(如果需要,已加密)。
标识消息为门户暂停指示器。 请注意,仅当执行消息的行数限制达到时才会出现此消息。
消息内容的长度,包括自身,在字节中。
标识消息为简单查询。
消息内容的长度,包括自身,在字节中。
查询字符串本身。
标识消息类型。ReadyForQuery在后端准备好进行新的查询周期时发送。
消息内容的长度,包括自身,在字节中。
当前后端事务状态指示器。
可能的值为'I
',如果空闲(不在事务块中);'T
',如果在事务块中;
或'E
',如果在失败的事务块中(查询将被拒绝,直到块结束)。
标识消息为行描述。
消息内容的长度,包括自身,在字节中。
指定一行中的字段数(可以为零)。
然后,对于每个字段,都有以下内容:
字段名称。
如果该字段可以被识别为特定表的列,则为该表的对象ID;否则为零。
如果该字段可以被识别为特定表格的列,则为该列的属性编号;否则为零。
字段数据类型的对象ID。
数据类型大小(参见pg_type.typlen
)。
注意,负值表示可变宽度类型。
类型修饰符(参见pg_attribute.atttypmod
)。
修饰符的含义是特定于类型的。
正在使用的字段格式代码。目前将为零(文本)或一(二进制)。在从描述语句变体返回的RowDescription中,格式代码尚未知晓,将始终为零。
标识消息为初始SASL响应。请注意,这也用于GSSAPI、SSPI和密码响应消息。 精确的消息类型是从上下文中推断出来的。
消息内容的长度,包括自身,在字节中。
客户端选择的SASL认证机制的名称。
长度为SASL机制特定的“初始客户端响应”,如果没有初始响应,则为-1。
n
SASL机制特定的“初始响应”。
标识消息为SASL响应。请注意,这也用于GSSAPI、SSPI和密码响应消息。 可以从上下文中推断出确切的消息类型。
消息内容的长度,包括自身,在字节中。
n
SASL机制特定的消息数据。
消息内容的长度,包括自身,在字节中。
SSL请求代码。该值被选择为在最高的16位中包含1234
,
在最低的16位中包含5679
。(为避免混淆,此代码
不得与任何协议版本号相同。)
消息内容的长度,包括自身,在字节中。
协议版本号。最重要的16位是主版本号(此处描述的协议为3)。 最不重要的16位是次版本号(此处描述的协议为0)。
协议版本号后面跟着一个或多个参数名和值字符串对。在最后一个名/值对之后需要一个零字节作为终止符。
参数可以以任何顺序出现。user
是必需的,其他是可选的。
每个参数的指定方式为:
参数名称。当前识别的名称包括:
user
要连接的数据库用户名称。必填项;没有默认值。
database
要连接的数据库。默认为用户名。
options
后端的命令行参数。(已弃用,建议设置单独的运行时参数。)此字符串中的空格被视为分隔参数,除非用反斜杠(\
)转义;写\\
表示字面反斜杠。
replication
用于以流式复制模式连接,可以发出一小组复制命令而不是SQL语句。值可以是true
、false
或database
,默认为false
。详细信息请参见第 55.4 节。
除上述之外,还可以列出其他参数。以_pq_.
开头的参数名称保留用于协议扩展,而其他参数被视为后端启动时设置的运行时参数。这些设置将在后端启动时应用(在解析命令行参数后,如果有的话),并将作为会话默认值。
参数数值。
将消息标识为同步命令。
消息内容的长度,包括自身,在字节中。
标识消息为终止。
消息内容的长度,包括自身,在字节中。