45.4. メッセージの書式
ここではそれぞれのメッセージの書式について説明します。 それぞれにはフロントエンド(F)、バックエンド(B)あるいは双方(F & B)から送出されることを示す印が付いています。 各メッセージには先頭にバイト数を持っていますが、バイト数を参照しなくてもメッセージの終わりを検知できるようにメッセージ書式は定義されています。 これは有効性検査を補助します (これはデータストリームの一部を形成しますので、CopyDataメッセージは例外です。 個々のCopyDataメッセージの内容は自身でも解釈することができません )。
- AuthenticationOk (B)
- Byte1('R')
認証要求としてメッセージを識別します。
- Int32(8)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32(0)
認証が成功したことを指定します。
- AuthenticationKerberosV5 (B)
- Byte1('R')
メッセージが認証要求であることを識別します。
- Int32(8)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32(2)
Kerberos V5認証が必要であることを指定します。
- AuthenticationCleartextPassword (B)
- Byte1('R')
メッセージが認証要求であることを識別します。
- Int32(8)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32(3)
平文パスワードが必要であることを指定します。
- AuthenticationCryptPassword (B)
- Byte1('R')
メッセージが認証要求であることを識別します。
- Int32(10)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32(4)
crypt()暗号化パスワードが必要であることを指定します。
- Byte2
パスワード暗号化用ソルトです。
- AuthenticationMD5Password (B)
- Byte1('R')
メッセージが認証要求であることを識別します。
- Int32(12)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32(5)
MD5暗号化パスワードが必要であることを指定します。
- Byte4
パスワード暗号化用ソルトです。
- AuthenticationSCMCredential (B)
- Byte1('R')
メッセージが認証要求であることを識別します。
- Int32(8)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32(6)
SCM資格証明メッセージが必要であることを指定します。
- AuthenticationGSS (B)
- Byte1('R')
メッセージが認証要求であることを識別します。
- Int32(8)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32(7)
GSSAPI認証証明メッセージが必要であることを指定します。
- AuthenticationSSPI (B)
- Byte1('R')
メッセージが認証要求であることを識別します。
- Int32(8)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32(9)
SSPI認証証明メッセージが必要であることを指定します。
- AuthenticationGSSContinue (B)
- Byte1('R')
メッセージが認証要求であることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32(8)
このメッセージがGSSPAIまたはSSPIデータを含むことを指定します。
- Byten
GSSAPIまたはSSPI認証データです。
- BackendKeyData (B)
- Byte1('K')
メッセージが取消用キーデータであることを識別します。 もし、後でCancelRequestメッセージを発行する可能性があれば、フロントエンドはこの値を保存しなければなりません。
- Int32(12)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32
このバックエンドのプロセスID。
- Int32
このバックエンドの秘密鍵。
- Bind (F)
- Byte1('B')
このメッセージがBindコマンドであることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- String
宛先ポータルの名前です (空文字列で無名ポータルを選択します)。
- String
元となる準備された文の名前です (空文字列で無名の準備された文を選択します)。
- Int16
後続するパラメータ書式コードの数 (以下ではCで表します)。 これは、パラメータが存在しない、あるいは全てのパラメータがデフォルトの書式(テキスト)を使用することを示す0に、指定する書式コードを全てのパラメータに適用することを示す1にすることができます。 さもなくば、これは実際のパラメータ数と同じになります。
- Int16[C]
パラメータ書式コード。 現在、それぞれは0(テキスト)もしくは1(バイナリ)のいずれかでなければなりません。
- Int16
後続するパラメータ値の数 (0の場合もあります)。 これは問い合わせが必要とするパラメータ数と一致する必要があります。
次に、各パラメータに対して、以下のフィールドのペアが現れます。
- Int32
パラメータ値のバイト単位の長さ(これには自身は含まれません)。 0にすることもできます。 特別な場合として、-1はNULLというパラメータ値を示します。 NULLの場合、後続の値用のバイトはありません。
- Byten
関連する書式コードで示される書式におけるパラメータの値。 nは上述の長さです。
最後のパラメータの後に、以下のフィールドが現れます。
- Int16
後続する結果列書式コードの数 (以下ではRで表します)。 これは、結果列が存在しないことを示す0、あるいは全ての結果列が(もしあれば)デフォルトの書式コード(テキスト)を使用することを示す1にすることができます。 さもなくば、問い合わせの結果列の実際の数と同じになります。
- Int16[R]
結果列の書式コード。 現在それぞれは0(テキスト)もしくは1(バイナリ)のいずれかでなければなりません。
- BindComplete (B)
- Byte1('2')
メッセージがBind完了指示子であることを識別します。
- Int32(4)
自身を含む、メッセージ内容の長さ(バイト単位)。
- CancelRequest (F)
- Int32(16)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32(80877102)
取消要求コードです。 この値は、最上位16ビットに1234が、下位16ビットに5678を持つように選択されます (混乱を防ぐため、このコードはプロトコルバージョン番号と同一になってはいけません)。
- Int32
対象バックエンドのプロセスIDです。
- Int32
対象バックエンドの秘密鍵です。
- Close (F)
- Byte1('C')
メッセージがCloseコマンドであることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- Byte1
準備された文を閉ざす時は'S'。 ポータルを閉ざす時は'P'です。
- String
閉ざす準備された文またはポータルの名前です (空文字列で無名の準備された文または無名ポータルを選択します)。
- CloseComplete (B)
- Byte1('3')
メッセージがClose完了指示子であることを識別します。
- Int32(4)
自身を含む、メッセージ内容の長さ(バイト単位)。
- CommandComplete (B)
- Byte1('C')
メッセージがコマンド完了応答であることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- String
コマンドタグです。 これは通常どのSQLコマンドが完了したかを表す単一の単語です。
INSERTコマンドの場合、タグはINSERT oid rowsです。 ここでrowsは挿入された行数です。 oidは、rowsが1、かつ、対象テーブルがOIDを持つ場合、挿入された行のオブジェクトIDです。 さもなければ、oidは0です。
DELETEコマンドの場合、タグはDELETE rowsです。 ここでrowsは削除された行数です。
UPDATEコマンドの場合、タグはUPDATE rowsです。 ここでrowsは更新された行数です。
MOVEコマンドの場合、タグはMOVE rowsです。 ここでrowsは、カーソル位置が何行変更されたかを示す数です。
FETCHコマンドの場合、タグはFETCH rowsです。 ここでrowsは、カーソルから何行取り出したかを示す行数です。
COPYコマンドの場合、タグはCOPY rowsです。 ここでrowsは、コピーされた行数です(注意:この行数はPostgreSQL 8.2以降でのみ出力されます)。
- CopyData (F & B)
- Byte1('d')
メッセージがデータのCOPYであることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- Byten
COPYデータストリームの一部を形成するデータです。 バックエンドから送信されるメッセージは、常に1つのデータ行に対応します。 しかし、フロントエンドから送信されるメッセージは任意のデータストリームに分割される可能性があります。
- CopyDone (F & B)
- Byte1('c')
メッセージがCOPY完了指示子であることを識別します。
- Int32(4)
自身を含む、メッセージ内容の長さ(バイト単位)。
- CopyFail (F)
- Byte1('f')
メッセージがCOPY失敗指示子であることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- String
失敗の原因を報告するエラーメッセージです。
- CopyInResponse (B)
- Byte1('G')
メッセージがコピーインの開始指示子であることを識別します。 フロントエンドはここで必ずコピーインデータを送信しなければなりません (まだ準備ができていない場合はCopyFailメッセージを送信してください)。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int8
0は、COPY全体の書式がテキスト(行は改行で区切られ、列は区切り文字などで区切られます)であることを示します。 1は、コピー全体の書式がバイナリ(DataRowの書式と同様)であることを示します。 より詳細についてはCOPYを参照してください。
- Int16
コピーされるデータ内の列数です (以下ではNと表されます)。
- Int16[N]
各列で使用される書式コードです。 現在それぞれは0(テキスト)または1(バイナリ)でなければなりません。 コピー全体の書式がテキストの場合、全てが0でなければなりません。
- CopyOutResponse (B)
- Byte1('H')
メッセージがコピーアウト開始応答であることを識別します。 このメッセージの後にコピーアウトデータが続きます。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int8
0は、COPY全体の書式がテキスト(行は改行で区切られ、列は区切り文字などで区切られます)であることを示します。 1は、コピー全体の書式がバイナリ(DataRowの書式同様)であることを示します。 詳細についてはCOPYを参照してください。
- Int16
コピーされるデータ内の列数です (以下ではNと表されます)。
- Int16[N]
各列で使用される書式コードです。 現在それぞれは0(テキスト)または1(バイナリ)でなければなりません。 コピー全体の書式がテキストの場合、全てが0でなければなりません。
- DataRow (B)
- Byte1('D')
メッセージがデータ行であることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int16
後に続く列値の数です (0の場合もあります)。
次に、各列について以下のフィールドのペアが現れます。
- Int32
列値のバイト単位の長さです (これには自身は含まれません)。 0とすることもできます。 特別な場合として、-1はNULLという列値を示します。 NULLの場合、後続の値用のバイトはありません。
- Byten
関連する書式コードで示される書式における列の値。 nは上述の長さです。
- Describe (F)
- Byte1('D')
メッセージがDescribeコマンドであることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- Byte1
準備された文の記述の場合は'S'。 ポータルの記述の場合は'P'です。
- String
記述を求める準備された文またはポータルの名前です (空文字列で無名の準備された文または無名ポータルを選択します)。
- EmptyQueryResponse (B)
- Byte1('I')
メッセージが空の問い合わせ文字列に対する応答であることを識別します (これはCommandCompleteを置き換えます)。
- Int32(4)
自身を含む、メッセージ内容の長さ(バイト単位)。
- ErrorResponse (B)
- Byte1('E')
メッセージがエラーであることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
このメッセージの本体には、ゼロバイトを終端として後続する、1つ以上の識別されるフィールドが含まれます。 フィールドは任意の順番で現れる可能性があります。 各フィールドには以下があります。
- Byte1
フィールド種類を識別するコードです。 ゼロならば、メッセージの終端であり、後続する文字列がないことを表します。 項45.5に、現時点でフィールド種類として定義されているものを列挙します。 将来もっと多くのフィールド種類が追加される可能性がありますので、フロントエンドは、認知できない種類のフィールドに対して何もせずに無視すべきです。
- String
フィールド値です。
- Execute (F)
- Byte1('E')
メッセージがExecuteコマンドであることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- String
実行するポータルの名前です。 (空文字列で無名ポータルを選択します)。
- Int32
ポータルが行を返す問い合わせの場合、返される行数の最大値です (他の問い合わせでは無視されます)。 0は"無制限"を表します。
- Flush (F)
- Byte1('H')
メッセージがFlushであることを識別します。
- Int32(4)
自身を含む、メッセージ内容の長さ(バイト単位)。
- FunctionCall (F)
- Byte1('F')
メッセージが関数呼び出しであることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32
呼び出す関数のオブジェクトIDを指定します。
- Int16
後述する書式コード数です (以下ではCと表します)。 これは、引数が存在しない、あるいは、全ての引数がデフォルトの書式(テキスト)を使用することを示す0に、指定する書式コードを全ての引数に適用することを示す1にすることができます。 さもなくば、これは実際の引数の数と同じになります。
- Int16[C]
引数の書式コードです。 それぞれは、0(テキスト)もしくは1(バイナリ)でなければなりません。
- Int16
関数に提供する引数の数を指定します。
次に、各引数に対して以下のフィールドのペアが現れます。
- Int32
引数の値のバイト単位の長さです (これには自身は含まれません)。 0とすることもできます。 特別な場合として、-1はNULLという引数の値を示します。 NULLの場合、後続の値用のバイトはありません。
- Byten
関連する書式コードで示される書式における引数の値。 nは上述の長さです。
最後の引数の後に、以下のフィールドが現れます。
- Int16
関数結果用の書式コードです。 現在、0(テキスト)または1(バイナリ)でなければなりません。
- FunctionCallResponse (B)
- Byte1('V')
メッセージが関数呼び出しの結果であることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32
関数の結果の値のバイト単位の長さです (これには自身は含まれません)。 0とすることもできます。 特別な場合として、-1はNULLという関数の結果の値を示します。 NULLの場合、後続の値用のバイトはありません。
- Byten
関連する書式コードで示される書式における関数の結果の値。 nは上述の長さです。
- NoData (B)
- Byte1('n')
メッセージがデータなしの指示子であることを識別します。
- Int32(4)
自身を含む、メッセージ内容の長さ(バイト単位)。
- NoticeResponse (B)
- Byte1('N')
メッセージが警報であることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
このメッセージの本体には、ゼロバイトを終端として後続する、1つ以上の識別されるフィールドが含まれます。 フィールドは任意の順番で現れる可能性があります。 各フィールドには以下があります。
- Byte1
フィールド種類を識別するコードです。 0ならば、メッセージの終端であり、後続する文字列がないことを表します。 項45.5に、現時点でフィールド種類として定義されているものを列挙します。 将来もっと多くのフィールド種類が追加される可能性がありますので、フロントエンドは、認知できない種類のフィールドに対して何もせずに無視すべきです。
- String
フィールドの値です。
- NotificationResponse (B)
- Byte1('A')
メッセージが通知応答であることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32
通知元バックエンドのプロセスIDです。
- String
通知の発生元となった条件名です。
- String
通知プロセスから渡された追加情報です (現在、この機能は実装されていませんので、このフィールドは常に空文字列です)。
- ParameterDescription (B)
- Byte1('t')
メッセージがパラメータ記述であることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int16
文で使用されるパラメータ数です (0ととすることができます)。
そして、各パラメータに対して、以下が続きます。
- Int32
パラメータのデータ型のオブジェクトIDを指定します。
- ParameterStatus (B)
- Byte1('S')
メッセージが実行時パラメータ状態報告であることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- String
報告される実行時パラメータの名前です。
- String
そのパラメータの現在値です。
- Parse (F)
- Byte1('P')
メッセージがParseコマンドであることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- String
宛先の準備された文の名前です (空文字列で無名の準備された文を選択します)。
- String
解析される問い合わせ文字列です。
- Int16
指定されるパラメータデータ型の数です (0ととすることができます)。 これは、問い合わせ文字列内にあるパラメータの数を示すものではないことに注意してください。 フロントエンドが型指定を希望するパラメータの数でしかありません。
その後、各パラメータに対し、以下が続きます。
- Int32
パラメータのデータ型のオブジェクトIDを指定します。 ここに0を書くことは型指定を行わないことと同じです。
- ParseComplete (B)
- Byte1('1')
メッセージがParse完了指示子であることを識別します。
- Int32(4)
自身を含む、メッセージ内容の長さ(バイト単位)。
- PasswordMessage (F)
- Byte1('p')
メッセージがパスワード応答であることを識別します。 これがGSSAPIまたはSSPI応答メッセージでも使用されることに注意してください。 (これは本当は設計エラーです。こうした場合含まれるデータはヌル終端の文字列ではなく、任意のバイナリデータを取り得るためです。)
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- String
パスワードです (必要ならば暗号化されています)。
- PortalSuspended (B)
- Byte1('s')
メッセージがポータル中断指示子であることを識別します。 これは、Executeメッセージの行数制限に達した場合にのみ現れることに注意してください。
- Int32(4)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Query (F)
- Byte1('Q')
メッセージが簡易問い合わせであることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- String
問い合わせ文字列自体です。
- ReadyForQuery (B)
- Byte1('Z')
このメッセージ種類を識別します。 バックエンドで新しい問い合わせサイクルの準備が整った時には常にReadyForQueryが送信されます。
- Int32(5)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Byte1
現在のバックエンドのトランザクション状態指示子です。 取り得る値は、待機状態(トランザクションブロックにない状態)に'I'、トランザクションブロック内の場合に'T'、失敗したトランザクションブロック(ブロックが終わるまで問い合わせは拒絶されます)内の場合に'E'です。
- RowDescription (B)
- Byte1('T')
メッセージが行の記述であることを識別します。
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int16
行内のフィールド数を指定します (0とすることができます)。
その後、各フィールドに対して以下が続きます。
- String
フィールド名です。
- Int32
フィールドが特定のテーブルの列として識別できる場合、テーブルのオブジェクトIDです。 さもなくば0です。
- Int16
フィールドが特定のテーブルの列として識別できる場合、列の属性番号です。 さもなくば0です。
- Int32
フィールドのデータ型のオブジェクトIDです。
- Int16
データ型の大きさ(pg_type.typlenを参照)です。 負の値が可変長の型を表すことに注意してください。
- Int32
型修飾子(pg_attribute.atttypmodを参照)です。 修飾子の意味は型に固有です。
- Int16
フィールドに使用される書式コードです。 現在、0(テキスト)または1(バイナリ)のいずれかになります。 RowDescriptionがステートメント用のDescribeから返された場合、書式コードはまだ不明ですので、常に0になります。
- SSLRequest (F)
- Int32(8)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32(80877103)
SSL要求コードです。 この値は、最上位16ビットに1234が、下位16ビットに5679を持つように選択されます (混乱を防ぐため、このコードはプロトコルバージョン番号と同一になってはいけません)。
- StartupMessage (F)
- Int32
自身を含む、メッセージ内容の長さ(バイト単位)。
- Int32(196608)
プロトコルバージョン番号です。 最上位16ビットは主バージョン番号(本章で説明したプロトコルでは3)です。 下位16ビットは副バージョン番号(本章で説明したプロトコルでは0)です。
プロトコルバージョン番号の後に、1つ以上のパラメータ名と値文字列のペアが続きます。 最後の名前と値のペアの後に終端としてゼロバイトが必要です。 パラメータは任意の順番で現れることができます。 userは必須です。 他は省略可能です。 各パラメータは以下のように指定されます。
- String
パラメータ名です。 現在認識される名前を以下に示します。
- user
接続するデータベースユーザ名です。 必須。 デフォルトはありません。
- database
接続するデータベースです。 デフォルトはユーザ名です。
- options
バックエンド用のコマンドライン引数です (これは個々の実行時パラメータ設定のため、廃棄予定です)。
上記に加え、バックエンドの起動時に設定可能な、任意の実行時パラメータが列挙される可能性があります。 こうした設定は、バックエンド起動時に(もしあればコマンドラインオプションの解析の後に)適用されます。 この値はセッションのデフォルトとして動作します。
- String
パラメータの値です。
- Sync (F)
- Byte1('S')
メッセージがSyncコマンドであることを識別します。
- Int32(4)
自身を含む、メッセージ内容の長さ(バイト単位)。
- Terminate (F)
- Byte1('X')
メッセージが終了であることを識別します。
- Int32(4)
自身を含む、メッセージ内容の長さ(バイト単位)。