44.6. プロトコル2.0からの変更点の要約

本節では、既存のクライアントライブラリをプロトコル3.0に更新しようとする開発者向けに、変更点の簡易チェックリストを示します。

最初の開始パケットは、固定書式ではなく、柔軟な文字列のリスト書式を使用します。 実行時パラメータのセッションのデフォルト値が直接開始パケット内に指定できるようになった点に注意してください (実際、以前でもoptionsフィールドを使用してこれを行うことができましたが、optionsには長さに制限があること、および値内の空白文字を引用符で括る方法がないことから、非常に安全な技法ではありませんでした)。

全てのメッセージが、メッセージ種類バイトの直後にバイト数を持つようになりました (種類バイトがない開始パケットは例外です)。 また、PasswordMessageが種類バイトを持つようになったことにも注意してください。

ErrorResponseおよびNoticeResponse('E'および'N')メッセージが複数のフィールドを持つようになりました。 これを使用して、クライアントコードは、必要な冗長度に合わせて、エラーメッセージを組み立てることができます。 個々のフィールドが通常改行で終わらないことに注意してください。 単一の文字列を送信する古いプロトコルでは、常に改行で終わっていました。

ReadyForQuery('Z')メッセージに、トランザクション状態指示子が含まれます。

BinaryRowとDataRowメッセージ種類間の区別がなくなりました。 1つのDataRowメッセージ種類で、全ての書式で記述されたデータを返すことができます。 DataRowのレイアウトが解析しやすいように変更されたことに注意してください。 また、バイナリ値の表現も変更されました。 もはや、サーバの内部表現に直接束縛されません。

新しい、"拡張問い合わせ"サブプロトコルがあります。 これにより、フロントエンドメッセージ種類にParse、Execute、Describe、Close、Flush、およびSyncが、バックエンドメッセージ種類にParseComplete、BindComplete、PortalSuspended、ParameterDescription、NoData、およびCloseCompleteが追加されました。 既存のクライアントは、このサブプロトコルを意識する必要はありませんが、これを使用することで、性能や機能を向上させることが可能です。

COPYデータがCopyDataとCopyDoneメッセージにカプセル化されるようになりました。 COPY中のエラーから復旧するための十分に定義された方法があります。 特別な"\."という最後の行はもはや不要で、COPY OUTで送信されません (COPY INではまだ終端として認識されます。しかし、この使用は廃止予定で、最終的には削除されます)。 バイナリCOPYがサポートされます。 CopyInResponseとCopyOutResponseメッセージは、列数と各列の書式を示すフィールドが含まれます。

FunctionCallとFunctionCallResponseメッセージのレイアウトが変更されました。 FunctionCallは関数へのNULL引数を渡すことができるようになりました。 また、テキストとバイナリ書式のどちらでもパラメータの引き渡しと結果の取り出しを扱うことができます。 サーバの内部データ表現への直接アクセスを提供しなくなりましたので、FunctionCallを潜在的なセキュリティホールとみなす理由はもはやありません。

バックエンドは、接続開始時にクライアントライブラリが興味を持つとみなされる全てのパラメータのためにParameterStatus('S')メッセージを送信します。 その後、これらのパラメータのいずれかの実際の値が変更された時は常に、ParameterStatusメッセージが送信されます。

RowDescription('T')メッセージは、新規に、記述する各列に対してテーブルのOIDと列番号フィールドを伝えます。 また、各列の書式コードも示します。

CursorResponse('P')メッセージはもはやバックエンドで生成されません。

NotificationResponse('A')メッセージは追加文字列フィールドを持ちます。 現在ここは空ですが、将来、NOTIFYイベントの送信者から渡される追加データを伝えるものになります。

EmptyQueryResponse('I')メッセージは、空の文字列パラメータを含めるために使用されていました。 これは削除されました。