Que tal lista
Estoy trantando de migrar una bd de pgsql 8.1.8 a la 9. Tiene muchas funciones en plpgsql (incluyendo triggers). Al tratar de cargar el dump del 8.1.8 en la 9 me marca error por que en las funciones de plpgsql existen comparaciones entre un character y un entero .... ¡ por alguna razon en pgsql 8.1.8 lo permite ! ... por ejemplo - Si ejecuto el sig. script en pgsql 8.1.8 : begin; create table pba ( metodo character ); insert into pba values ('1'); insert into pba values ('2'); insert into pba values ('3'); insert into pba values ('4'); insert into pba values ('5'); select * from pba where metodo = 1; rollback; El resultado es: BEGIN CREATE TABLE INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 metodo -------- 1 (1 fila) ROLLBACK OK .... observar que la ultima consulta obtiene un registro .... sin embargo si lo ejecuto en pgsql 9.1.3 obtengo: CREATE TABLE INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 psql:t1.sql:13: ERROR: el operador no existe: character = integer LÍNEA 1: select * from pba where metodo = 1; ^ SUGERENCIA: Ningún operador coincide con el nombre y el tipo de los argumentos. Puede ser necesario agregar conversiones explícitas de tipos. ROLLBACK mmmm ... lo que se me ocurrio fue crear un CAST, de la siguiente forma: script: CREATE OR REPLACE FUNCTION pg_catalog.int4(character) RETURNS integer LANGUAGE internal IMMUTABLE STRICT AS $function$chartoi4$function$; CREATE CAST ( character AS integer ) WITH FUNCTION pg_catalog.int4(character) as implicit ; create table pba ( metodo character ); insert into pba values ('1'); insert into pba values ('2'); insert into pba values ('3'); insert into pba values ('4'); insert into pba values ('5'); select * from pba where metodo = 1; al ejecutarlo en el cliente de psql (9.1.3): ren=# \i t.sql BEGIN CREATE FUNCTION CREATE CAST CREATE TABLE INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 metodo -------- (0 filas) ROLLBACK observen que la ultima consulta del script no retorna el registro ..... intente la sig. modificacion en el script: begin; CREATE OR REPLACE FUNCTION pg_catalog.tointeger(x character) RETURNS INTEGER AS $$ BEGIN RETURN x::integer; END; $$ LANGUAGE 'plpgsql'; CREATE CAST ( character AS integer ) WITH FUNCTION pg_catalog.tointeger(character) as implicit ; create table pba ( metodo character ); insert into pba values ('1'); insert into pba values ('2'); insert into pba values ('3'); insert into pba values ('4'); insert into pba values ('5'); select * from pba where metodo = 1; rollback; y el resultado es (pgsql 9.1.3) BEGIN CREATE FUNCTION CREATE CAST CREATE TABLE INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 INSERT 0 1 psql:t1.sql:26: ERROR: límite de profundidad de stack alcanzado SUGERENCIA: Incremente el parámetro de configuración «max_stack_depth» (actualmente 2048kB), después de asegurarse que el límite de profundidad de stack de la plataforma es adecuado. CONTEXTO: sentencia SQL: «SELECT x::integer» PL/pgSQL function "tointeger" line 3 at RETURN sentencia SQL: «SELECT x::integer» PL/pgSQL function "tointeger" line 3 at RETURN sentencia SQL: «SELECT x::integer» PL/pgSQL function "tointeger" line 3 at RETURN ...... ...... No entiendo por que pasa lo anterior, si alguien me puede dar una idea en donde investigar estaré muy agradecido. Lo que estoy tratando es de evitar la modificación de la funciones en plgsql de la bd en postgres 8.1.8 y lo que se me ocurrio fue crear el cast; otra posible solucion que se me ocurre es crear un operador. Esta última todavia no la pruebo ... que opinan de estas opciones??? Saludos y gracias de antemano