Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-es-ayuda by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group