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.