O PostgreSQL disponibiliza uma interface de caminho rápido (fast-path) para enviar chamadas simples de função para o servidor.
Dica: Esta interface está um tanto obsoleta, porque pode ser obtido um desempenho semelhante e uma funcionalidade melhor definindo uma declaração preparada para a chamada da função. Então, a execução da declaração com transmissão binária dos parâmetros e resultados substitui a chamada de função de caminho rápido.
A função PQfn solicita a execução da função do servidor através da interface de caminho rápido:
PGresult *PQfn(PGconn *conn, int fnid, int *result_buf, int *result_len, int result_is_int, const PQArgBlock *args, int nargs); typedef struct { int len; int isint; union { int *ptr; int integer; } u; } PQArgBlock;
O argumento fnid é o OID da função a ser executada. Os parâmetros args e nargs definem os parâmetros a serem passados para a função; estes parâmetros devem corresponder a lista declarada de argumentos da função. Quando o campo isint da estrutura do parâmetro tem o valor verdade, o valor de u.integer é enviado para o servidor como um inteiro do comprimento indicado (devendo ser 1, 2 ou 4 bytes); ocorre a troca apropriada de bytes. Quando isint tem o valor falso, o número de bytes indicados por *u.ptr é enviado sem processamento; os dados devem estar no formato esperado pelo servidor para transmissão binária do tipo de dado do argumento da função. O parâmetro result_buf é o buffer no qual é colocado o valor do retornado. Quem chama deve alocar espaço suficiente para armazenar o valor retornado (Não há verificação!) O real comprimento do resultado é retornado no inteiro apontado por result_len. Se for esperado um resultado inteiro de 1, 2 ou 4 bytes, result_is_int deve ser definido com o valor 1, senão com o valor 0. Definir result_is_int como 1 faz com que a libpq faça a troca de bytes do valor, caso seja necessário, para que este seja entregue como um valor do tipo int apropriado para a máquina cliente. Quando o valor de result_is_int é igual a 0, a cadeia de bytes no formato binário enviada pelo servidor é retornada sem modificações.
A função PQfn sempre retorna um ponteiro válido para PGresult. O status do resultado deve ser verificado antes do resultado ser utilizado. Quem chama é responsável por liberar PGresult através da função PQclear, quando esta não for mais necessária.
Deve ser observado que não é possível tratar argumentos nulos, resultados nulos, nem resultados de conjunto de valores nulos quando se utiliza esta interface.