next up previous contents index
Next: Aserciones Up: Estructura de PL/pgSQL Previous: Tipos de datos   Índice General   Índice de Materias

Expresiones

Todas las expresiones empleadas en PL/pgSQL son procesadas utilizando el ejecutor del servidor remoto. Incluso las expresiones que aparentemente contienen constantes deberán ser evaluadas en tiempo de ejecución (por ejemplo el caso 'now' que se menciona en la subsección 10.3.2), de tal manera que es imposible para el reconocedor sintáctico de PL/pgSQL identificar valores constantes distintos a NULL. Todas las expresiones son evaluadas internamente ejecutando la aserción SELECT expresion utilizando el controlador SPI. En la expresión, las ocurrencias de identificadores de variables son substituidos por parámetros y los valores actuales de las variables son pasadas al ejecutor en el arreglo de parámetros. Todas las expresiones empleadas en las funciones de PL/pgSQL son preparadas y salvadas sólo una vez.

La comparación de tipos echa por el reconocedor sintáctico de PostgreSQL tiene algunos efectos colaterales para la interpretación de valores constantes. En particular hay una diferencia entre lo que las dos funciones

CREATE FUNCTION logfunc1 (text) RETURNS datetime AS '
    DECLARE
        logtxt ALIAS FOR $1;
    BEGIN
        INSERT INTO logtable VALUES (logtxt, ''now'');
        RETURN ''now'';
    END;
' LANGUAGE 'plpgsql';

y

CREATE FUNCTION logfunc2 (text) RETURNS datetime AS '
    DECLARE
        logtxt ALIAS FOR $1;
        curtime datetime;
    BEGIN
        curtime := ''now'';
        INSERT INTO logtable VALUES (logtxt, curtime);
        RETURN curtime;
    END;
' LANGUAGE 'plpgsql';

hacen. En el caso de la función logfunc1() el reconocedor sintáctico sabe cuando prepara el plan para el INSERT, que la cadena 'now' debe de ser interpretada como del tipo datetime porque el campo destino de logtable es de ese tipo. De esta manera, lo almacenerá como una constante en ese instante y este valor constante será empleado en las posteriores invocaciones, durante el tiempo de la conexión. No es necesario aclarar que esto no es lo que el programador tenía en mente al definir la función.

En el caso de la función logfunc2(), el reconocedor sintáctico no conoce el tipo al que 'now' deberá de ser convertido y por lo tanto regresa un tipo de datos text conteniendo la cadena 'now'. Durante la asignación a la variable curtime al momendo de ejecución, el intérprete de PL/pgSQL convierte esta cadena al tipo datetime invocando a las funciones text_out() y datetime_in() para la conversión.

Esta verificación de tipos hecha por el reconocedor sintáctico fué implementado después de que PL/pgSQL fuese integrado por completo en PostgreSQL. Es una diferencia entre las versiones 6.3 y 6.4 y afecta a todas las funciones que usan la preparación de planes de ejecución realizada por el controlador SPI. Utilizando una variable local en la forma previamente descrita es la única manera en que PL/pgSQL pueda interpretar este tipo de valores correctamente.

Si los registros de campos son empleados en expresiones o aserciones, el tipo de los datos de los campos no deberá de cambiar durante las invocaciones a la misma expresión. Es indispensable mantener esto en mente al escribir triggers que manejen eventos para más de una tabla.


next up previous contents index
Next: Aserciones Up: Estructura de PL/pgSQL Previous: Tipos de datos   Índice General   Índice de Materias
Ismael Olea 2001-04-21