Postgresは、バックエンドへの関数呼び出しに近道 (fast-path) インタフェースを用意しています。 これはシステム内部への抜け穴であると同時に、潜在的なセキュリティホールにもなり得ます。 大多数のユーザーの人はこの機能を必要とはしないでしょう。
PQfn 近道インタフェースを使ってバックエンドの関数実行を要求します。
PGresult* PQfn(PGconn* conn, int fnid, int *result_buf, int *result_len, int result_is_int, const PQArgBlock *args, int nargs);
このうち fnid 引数は、実行する関数のオブジェクト識別子、result_buf は戻り値を格納するバッファです。 呼び出し側は戻り値を格納するのに十分な領域を確保しておかなければいけません(ライブラリ側ではこのチェックはしていません!)。 結果の実データ長は result_len が指す整数で返されます。 結果が 4 バイト整数だと想定できるなら result_is_int を 1 に、そうでなければ0を設定します(result_is_int を 1 にすれば、必要に応じて値のバイト順を入れ換えるよう libpq に指示することになります。 そしてクライアントマシン上で正しい整数値となるように転送します。 result_is_int が 0 の場合は、バックエンドが送ったバイト列を何も修正せずに返します)。 args と nargs は関数に渡す引数を指定します。
typedef struct { int len; int isint; union { int *ptr; int integer; } u; } PQArgBlock;
PQfnは有効な正しい PGresult* を返します。結果を使う前にはまず、結果ステータスを調べておくべきでしょう。 結果が必要なくなった時点で、PQclearによって、PGresult を解放するのは、呼び出し側の責任です。