消息格式
本节描述各种消息的详细格式.每种消息都可以由一个前端 (F),一个 posmaster/后端
(B)或者两者(F & B)发送.
- 
AsciiRow (B)
 
- 
Byte1('D')
 
- 
标识消息是一个 ASCII 数据行.(一个前面的
RowDescription 消息定义该行里面的字段数和它们的数据类型.)
 
- 
Byten
 
- 
一个每个位对应(数据)行里一个字段的位图.第一字段对应第一字节的位7 (MSB,最高位),第二字段对应第一字节位6,第八字段对应第一字节位
0 (LSB,最低位),第九字段对应第二字节的位7,等等.如果对应域的值不为
NULL,对应位设置为1,如果字段的个数不为8的倍数,位图最后一个字节余下的位就没有用.
 
然后,每个非空的字段值(non-NULL),有下面规则:
- 
Int32
 
- 
声明字段值的尺寸,包括尺寸本身.
 
- 
Byten
 
- 
声明以 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
 
 
- 
加密口令使用的'种子'(salt).
 
- 
BackendKeyData (B)
 
- 
Byte1('K')
 
- 
标识该消息是一个取消键字数据.如果前端希望能够在稍后发出 CancelRequest
消息,那么它必须保存这个值.
 
- 
Int32
 
- 
后端的进程号(PID).
 
- 
Int32
 
 
- 
此后端的密钥(secret key ).
 
- 
BinaryRow (B)
 
- 
Byte1('B')
 
- 
标识消息为为二进制(数据)行.(一个前面的 RowDescription 消息定义数据行里的字段数和它们的数据类型.)
 
- 
Byten
 
- 
一个每个位对应(数据)行里一个字段的位图.第一字段对应第一字节的位7 (MSB,最高位),第二字段对应第一字节位6,第八字段对应第一字节位
0 (LSB,最低位),第九字段对应第二字节的位7,等等.如果对应域的值不为
NULL,对应位设置为1,如果字段的个数不为8的倍数,位图最后一个字节余下的位就没有用.
 
 
 
 
 
然后,每个非空的字段值(non-NULL),有下面规则:
- 
Int32
 
- 
声明字段值的尺寸,包括尺寸本身.
 
- 
Byten
 
 
 
- 
以二进制格式声明字段本身的值.n 就是上面的尺寸.
 
- 
CancelRequest (F)
 
- 
Int32(16)
 
- 
以字节计的包尺寸.
 
- 
Int32(80877102)
 
- 
取消请求代码.选这个值是为了在高16位包含 "1234",低16位包含 "5678".(要避免混乱,这个代码必须与协议版本号不同.)
 
- 
Int32
 
- 
目标后端的进程号(PID).
 
- 
Int32
 
 
- 
目标后端的密钥(secret key ).
 
- 
CompletedResponse (B)
 
- 
Byte1('C')
 
- 
标识此消息是一个完成响应.
 
- 
String
 
- 
命令标记.它通常是(但并不总是)一个单字,标识完成了哪条 SQL 命令.
 
 
 
- 
CopyDataRows (B & F)
 
- 
这是一个行的流,这里每行都是一个 Byte1('\n') 结尾的.后面顺序跟着 Byte1('\\'),Byte1('.'),Byte1('\n').
 
 
- 
CopyInResponse (B)
 
- 
标识这条消息是一条 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)
 
- 
加密了(使用 crypt())的口令.
 
- 
ErrorResponse (B)
 
- 
Byte1('E')
 
- 
标识消息是一条错误.
 
- 
String
 
 
- 
错误消息本身.
 
- 
FunctionCall (F)
 
- 
Byte1('F')
 
- 
标识消息是一个函数调用.
 
- 
String("")
 
- 
未使用.
 
- 
Int32
 
- 
声明待调用的函数的对象标识(OID).
 
- 
Int32
 
- 
声明提供给函数的参数个数.
 
 
然后,每个参数用下面格式声明:
- 
Int32
 
- 
声明参数值的尺寸,除去尺寸本身的长度.
 
- 
Byten
 
 
 
- 
声明以二进制格式表示的字段值本身. n 是上面的尺寸.
 
- 
FunctionResultResponse (B)
 
- 
Byte1('V')
 
- 
标识这条消息是函数调用结果.
 
- 
Byte1('G')
 
- 
声明返回了一个非空结果.
 
- 
Int32
 
- 
声明结果值的尺寸,除去尺寸本身长度.
 
- 
Byten
 
- 
声明二进制格式表示的结果值本身.n 是上面的尺寸.
 
- 
Byte1('0')
 
未用.(严格的说,FunctionResultResponse 和 FunctionVoidResponse
都是一样的东西,但是消息里有一些可选的部分.)
 
- 
FunctionVoidResponse (B)
 
- 
Byte1('V')
 
- 
标识这条消息是一个函数调用结果.
 
- 
Byte1('0')
 
 
- 
声明返回了一个空结果.
 
- 
NoticeResponse (B)
 
- 
Byte1('N')
 
- 
标识消息是一个通知.
 
- 
String
 
 
- 
通知消息本身.
 
- 
NotificationResponse (B)
 
- 
Byte1('A')
 
- 
标识消息是一个通知响应.
 
- 
Int32
 
- 
发出通知的后端进程的进程号(PID).
 
- 
String
 
 
- 
生成通知的条件名.
 
- 
Query (F)
 
- 
Byte1('Q')
 
- 
标识此消息是一条查询.
 
- 
String
 
 
- 
查询字串本身.
 
- 
ReadyForQuery (B)
 
- 
标识消息类型.当后端准备好进入一个新的查询循环时,它发送一条 ReadyForQuery.
 
- 
RowDescription (B)
 
- 
Byte1('T')
 
- 
标识消息是一个行描述消息.
 
- 
Int16
 
- 
声明一行里的字段数(可以是零).
 
 
然后每个字段,用下面格式表示:
- 
String
 
- 
声明字段名称.
 
- 
Int32
 
- 
声明字段的对象标识(OID).
 
- 
Int16
 
- 
声明类型尺寸.
 
- 
Int32
 
 
 
- 
声明类型修改器.
 
- 
StartupPacket (F)
 
- 
Int32(296)
 
- 
以字节计的包的尺寸.
 
- 
Int32
 
- 
协议版本号.最高16位是主版本号.低16位是次版本号.
 
- 
LimString64
 
- 
数据库名,缺省时是用户名.
 
- 
LimString32
 
- 
用户名.
 
- 
LimString64
 
- 
由 postmaster 传递给后端的任何附加的命令行参数.
 
- 
LimString64
 
- 
未使用.
 
- 
LimString64
 
 
- 
后端用于调试信息输出的可选 tty (控制台).
 
- 
Terminate (F)
 
- 
标识这条消息是终止消息.
 
- 
UnencryptedPasswordPacket (F)