Migrar bd de pgsql 8.1.8 a 9.1.3. cast character to integer

From: Felipe de Jesús Molina Bravo <fjmolinabravo(at)gmail(dot)com>
To: pgsql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Migrar bd de pgsql 8.1.8 a 9.1.3. cast character to integer
Date: 2012-06-21 15:08:25
Message-ID: CALrs2KO4KgCFZJsxakLgs3KBTD8FOVRTw+-qQF-jNMqufLbWZA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Sergio Gabriel Rodriguez 2012-06-21 15:15:49 Re: Migrar bd de pgsql 8.1.8 a 9.1.3. cast character to integer
Previous Message Eduardo Morras 2012-06-21 13:40:08 Re: Replicacion Multimaster y Hot Standby