64.4. 消息格式
本节描述每种消息的详细格式。每种消息可以由前端(F)、postmaster/后端(B)或两者(F & B)发送。
- AsciiRow (B)
- Byte1('D')
标识此消息为 ASCII 数据行。(先前的 RowDescription 消息定义了行中字段的数量及其数据类型。)
- Byte
n 一个位图,行中每个字段一位。第 1 个字段对应第 1 个字节的第 7 位(MSB),第 2 个字段对应第 1 个字节的第 6 位,第 8 个字段对应第 1 个字节的第 0 位(LSB),第 9 个字段对应第 2 个字节的第 7 位,依此类推。如果对应字段的值不是 NULL,则每个位被置位。如果字段数不是 8 的倍数,位图中最后一个字节的剩余部分就被浪费了。
然后,对每个非 NULL 值的字段,有下列内容:
- Int32
Specifies the size of the value of the field, including this size.
- Byte
n 以 ASCII 字符指定字段本身的值。n 是上面的尺寸减 4。字段数据中没有尾随的 '\0';如果前端需要,必须自己添加一个。
- AuthenticationOk (B)
- Byte1('R')
标识此消息为认证请求。
- Int32(0)
指定认证成功。
- AuthenticationKerberosV4 (B)
- Byte1('R')
标识此消息为认证请求。
- Int32(1)
指定需要 Kerberos V4 认证。
- AuthenticationKerberosV5 (B)
- Byte1('R')
标识此消息为认证请求。
- Int32(2)
指定需要 Kerberos V5 认证。
- AuthenticationUnencryptedPassword (B)
- Byte1('R')
标识此消息为认证请求。
- Int32(3)
指定需要未加密的密码。
- AuthenticationEncryptedPassword (B)
- Byte1('R')
标识此消息为认证请求。
- Int32(4)
指定需要加密的密码。
- Byte2
加密密码时使用的盐。
- BackendKeyData (B)
- Byte1('K')
标识此消息为取消密钥数据。如果前端希望以后能够发出 CancelRequest 消息,就必须保存这些值。
- Int32
此后端的进程 ID。
- Int32
此后端的密钥。
- BinaryRow (B)
- Byte1('B')
标识此消息为二进制数据行。(先前的 RowDescription 消息定义了行中字段的数量及其数据类型。)
- Byte
n 一个位图,行中每个字段一位。第 1 个字段对应第 1 个字节的第 7 位(MSB),第 2 个字段对应第 1 个字节的第 6 位,第 8 个字段对应第 1 个字节的第 0 位(LSB),第 9 个字段对应第 2 个字节的第 7 位,依此类推。如果对应字段的值不是 NULL,则每个位被置位。如果字段数不是 8 的倍数,位图中最后一个字节的剩余部分就被浪费了。
然后,对于每个具有非 NULL 值的字段,有以下内容:
- Int32
Specifies the size of the value of the field, excluding this size.
- Byte
n 以二进制格式指定字段本身的值。
nis the above size.
- CancelRequest (F)
- Int32(16)
包的尺寸(字节)。
- Int32(80877102)
取消请求码。该值经过选择,使其高 16 位包含 1234,低 16 位包含 5678。(To avoid confusion, this code must not be the same as any protocol version number.)
- Int32
目标后端的进程 ID。
- Int32
目标后端的密钥。
- CompletedResponse (B)
- Byte1('C')
标识此消息为完成响应。
- String
命令标签。这通常是(但不总是)标识完成了哪条 SQL 命令的单个词。
- CopyDataRows (B & F)
这是一个行流,其中每行以 Byte1('\n') 结束。然后跟随序列 Byte1('\\')、Byte1('.')、Byte1('\n')。
- CopyInResponse (B)
- Byte1('G')
标识此消息为 Start Copy In 响应。前端现在必须发送 CopyDataRows 消息。
- CopyOutResponse (B)
- Byte1('H')
标识此消息为 Start Copy Out 响应。此消息后面将跟随 CopyDataRows 消息。
- CursorResponse (B)
- Byte1('P')
标识此消息为游标响应。
- String
游标的名称。如果游标是隐式的,则为“blank”。
- EmptyQueryResponse (B)
- Byte1('I')
标识此消息为对空查询串的响应。
- String("")
未使用。
- EncryptedPasswordPacket (F)
- Int32
包的尺寸(字节)。
- String
加密(使用 crypt())的密码。
- ErrorResponse (B)
- Byte1('E')
标识此消息为错误。
- String
错误消息本身。
- FunctionCall (F)
- Byte1('F')
标识此消息为函数调用。
- String("")
未使用。
- Int32
指定要调用的函数的对象 ID。
- Int32
指定提供给函数的参数数量。
然后,对每个参数,有下列内容:
- Int32
Specifies the size of the value of the argument, excluding this size.
- Byte
n 以二进制格式指定字段本身的值。
nis the above size.
- FunctionResultResponse (B)
- Byte1('V')
标识此消息为函数调用结果。
- Byte1('G')
指定返回了非空结果。
- Int32
指定结果的值的尺寸,不包括此尺寸本身。
- Byte
n 以二进制格式指定结果本身的值。n 是上面的尺寸。
- Byte1('0')
未使用。(严格说来,FunctionResultResponse 和 FunctionVoidResponse 是同一个东西,只是消息的某些部分是可选的。)
- FunctionVoidResponse (B)
- Byte1('V')
标识此消息为函数调用结果。
- Byte1('0')
指定返回了空结果。
- NoticeResponse (B)
- Byte1('N')
标识此消息为通知。
- String
通知消息本身。
- NotificationResponse (B)
- Byte1('A')
标识此消息为通知响应。
- Int32
发出通知的后端进程的进程 ID。
- String
引发此通知的条件名称。
- Query (F)
- Byte1('Q')
标识此消息为查询。
- String
查询串本身。
- ReadyForQuery (B)
- Byte1('Z')
标识消息类型。每当后端准备好进入新的查询周期时发送 ReadyForQuery。
- RowDescription (B)
- Byte1('T')
标识此消息为行描述。
- Int16
指定一行中的字段数(可以为零)。
Then, for each field, there is the following:
- String
指定字段名。
- Int32
指定字段类型的对象 ID。
- Int16
指定类型尺寸。
- Int32
指定类型修饰符。
- StartupPacket (F)
- Int32(296)
包的尺寸(字节)。
- Int32
协议版本号。高 16 位是主版本号。低 16 位是次版本号。
- LimString64
数据库名,如果为空则默认为用户名。
- LimString32
用户名。
- LimString64
要由 postmaster 传递给后端的任何附加命令行参数。
- LimString64
未使用。
- LimString64
后端应用于调试消息的可选 tty。
- Terminate (F)
- Byte1('X')
标识此消息为终止。
- UnencryptedPasswordPacket (F)
- Int32
包的尺寸(字节)。
- String
未加密的密码。