Funciones

Evaluación de función

  1. Busca una entrada exacta en el catálogo del sistema pg_proc.

  2. Busca la mejor entrada.

    1. Hace una lista de todas las funciones con el mismo nombre y con el mismo número de argumentos.

    2. Si solo hay una función en la lista, usa esta si los tipos de la entrada pueden ser convertidos, y produce un error si los tipos no pueden ser convertidos.

    3. Guarda todas las funciones con los ajustes más explícitos para los tipos. Guarda todas si no hay ajustes explícitos y salta al siguiente paso. Si solo queda un candidato, usa este si el tipo puede ser convertido.

    4. Si cualquiera de los argumentos de entrada son de tipo desconocido, clasifica los argumentos de entrada candidatos en categorías como boolean, numeric, string, geometric o user-defined. Si hay una mezcla de categorías, o más de un tipo definido por el usuario, se produce un error debido a que la elección correcta no puede ser deducida si no se aportan más pistas. Si solo hay una categoría , entonces asigna el "tipo preferido" a la columna de entrada que antes era de tipo desconocido.

    5. Escoge el candidato con el ajuste de tipos más exacto, y el cual ajusta el "tipo preferido" a cada categoría de columna desde el paso anterior. Si hay más de un candidato, o si no hay ninguno, entonces se produce un error.

Ejemplos

Función factorial

Solo hay una función factorial definida en el catálogo pg_proc. Debido a esto, las siguientes consultas convierten automáticamente el argumento int2 a int4:

tgl=> select int4fac(int2 '4');
int4fac
-------
     24
(1 row)
y es de hecho transformado por el analizador a
tgl=> select int4fac(int4(int2 '4'));
int4fac
-------
     24
(1 row)

Función substring

Hay dos funciones substr declaradas en pg_proc. Sin embargo, solo una tiene dos argumentos, de tipos text y int4.

Si es llamada con una constante de cadena de tipo sin especificar, el tipo es ajustado directamente con la única función candidata de tipo:

tgl=> select substr('1234', 3);
substr
------
    34
(1 row)

Si la cadena es declarada como tipo varchar, como puede ser en el caso de que venga de una tabla, entonces el analizador intentará convertirla al tipo text:

tgl=> select substr(varchar '1234', 3);
substr
------
    34
(1 row)
lo que es transformado por el analizador a:
tgl=> select substr(text(varchar '1234'), 3);
substr
------
    34
(1 row)

Nota

Hay algunas estrategias en el analizador para optimizar la relación entre los tipos char, varchar y text. En este caso, la función substr es llamada directamente con una cadena varchar en vez de hacer una llamada para realizar una conversión explícita.

Y, si la función es llamada con un int4, el analizador intentará convertirlo a text

tgl=> select substr(1234, 3);
substr
------
    34
(1 row)
realmente se ejecuta como
tgl=> select substr(text(1234), 3);
substr
------
    34
(1 row)