Cada operador es “azúcar sintáctico” para una llamada a una función subyacente que hace el trabajo real; por lo que debes primero crear la función subyacente antes de poder crear el operador. Sin embargo, un operador no es meramente azúcar sintáctico, porque lleva información adicional que ayuda al planificador de consultas a optimizar las consultas que utilizan el operador. La siguiente sección se dedicará a explicar esa información adicional.
PostgreSQL admite operadores prefijos e infijos. Los operadores se pueden sobrecargar; es decir, se puede utilizar el mismo nombre de operador para diferentes operadores que tengan diferente número y tipo de operandos. Cuando se ejecuta una consulta, el sistema determina el operador a llamar a partir del número y tipo de los operandos proporcionados.
Aquí tienes un ejemplo de cómo crear un operador para sumar dos números
complejos. Asumimos que ya hemos creado la definición del tipo
complex (consulta la sección Section 36.13). Primero necesitamos una
función que realice el trabajo, luego podemos definir el operador:
CREATE FUNCTION complex_add(complex, complex)
RETURNS complex
AS 'filename', 'complex_add'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR + (
leftarg = complex,
rightarg = complex,
function = complex_add,
commutator = +
);
Ahora podríamos ejecutar una consulta como esta:
SELECT (a + b) AS c FROM test_complex;
c
-----------------
(5.2,6.05)
(133.42,144.95)
Aquí hemos mostrado cómo crear un operador binario. Para crear un operador prefijo,
simplemente omite el leftarg.
La cláusula function
y las cláusulas de argumentos son los únicos elementos requeridos en
CREATE OPERATOR. La cláusula commutator
que se muestra en el ejemplo es una sugerencia opcional para el optimizador
de consultas. En la siguiente sección aparecen más detalles sobre commutator y otras
sugerencias del optimizador.