36.14. Operadores definidos pelo usuário #

Todo operador é um açúcar sintático [118] para a chamada de uma função subjacente que faz o trabalho real; portanto, primeiro deve ser criada a função subjacente antes de criar o operador. Entretanto, o operador não é apenas um açúcar sintático, porque carrega informações adicionais que ajudam o planejador de consultas a otimizar as consultas que usam o operador. A próxima seção será dedicada a explicar essas informações adicionais.

O PostgreSQL oferece suporte a operadores de prefixo e infixo. Os operadores podem ser sobrecarregados; ou seja, o mesmo nome de operador pode ser usado para diferentes operadores que possuem diferentes números e tipos de dados de operandos. Quando uma consulta é executada, o sistema determina o operador a ser chamado a partir do número e tipos de dados dos operandos fornecidos.

A seguir está um exemplo de criação de um operador para adicionar dois números complexos. Assumimos que já foi criada a definição do tipo de dados complex (veja Tipos de dados definidos pelo usuário). Primeiro é necessária uma função que faça o trabalho, para então o operador poder ser definido:

CREATE FUNCTION complex_add(complex, complex)
    RETURNS complex
    AS 'nome_do_arquivo', 'complex_add'
    LANGUAGE C IMMUTABLE STRICT;

CREATE OPERATOR + (
    leftarg = complex,
    rightarg = complex,
    function = complex_add,
    commutator = +
);

Finalmente, pode ser executada uma consulta como essa:

SELECT (a + b) AS c FROM test_complex;

        c
-----------------
 (5.2,6.05)
 (133.42,144.95)

Aqui foi mostrado como criar um operador binário. Para criar um operador de prefixo, basta omitir leftarg. A cláusula function e as cláusulas de argumento são os únicos itens obrigatórios no comando CREATE OPERATOR. A cláusula commutator mostrada no exemplo é uma dica opcional para o otimizador de consulta. Detalhes adicionais sobre o commutator e outras dicas para o otimizador são mostrados na próxima seção.



[118] Syntactic sugar: Em ciência da computação, açúcar sintático é a sintaxe interna de uma linguagem de programação projetada para tornar as coisas mais fáceis de ler ou expressar. Isso torna a linguagem "mais doce" para o uso humano: as coisas podem ser expressas de forma mais clara, mais concisa, ou em um estilo alternativo que alguns podem preferir. (N. T.)