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)