消息格式
本节描述各种消息的详细格式.每种消息都可以由一个前端 (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)