Re: funcion plpgsql .... corrupcion de indice

From: Felipe de Jesús Molina Bravo <fjmolinabravo(at)gmail(dot)com>
To: "Alvaro Herrera" <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: funcion plpgsql .... corrupcion de indice
Date: 2008-12-12 18:39:52
Message-ID: c31298e50812121039r62edfd9oc3cb3784943911c0@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Pues sigo con este problema ... el codigo que uso para el numero racional es
muy parecido al complex que se encuentra en los fuentes de pgsql
src/tutorial ... incluido en el mensaje anterior a este.

Que he realizado .... cree una tabla de pba (con la finalidad de ir
encajonando el problema)

aeevrm=# \d pba
Tabla «public.pba»
Columna | Tipo | Modificadores
---------+----------+---------------
padre | racional |
izq | racional |
der | racional |
Índices:
«idx_izq» btree (izq, der)
Triggers:
tbi_pba BEFORE INSERT ON pba FOR EACH ROW EXECUTE PROCEDURE
pba_inserta_farey()

La función de pba_inserta_farey es:

CREATE or REPLACE function pba_inserta_farey() RETURNS TRIGGER AS $$
DECLARE
padre RECORD;
r_izq racional; --rango izquierdo de un hijo probable
r2_izq racional;
temp racional;
sql text;
BEGIN
raise notice 'pba_inserta_farey. El padre que se esta buscando es:
%',new.padre;
SELECT into padre izq,der FROM pba a WHERE izq = new.padre;
IF padre IS NULL THEN
RAISE EXCEPTION 'pba_inserta_farey. El padre % no existe en
%',new.padre,TG_TABLE_NAME::text;
END IF;
-- obtenemos el izq
r_izq := racional_obt_mitad(padre.izq , padre.der );
r2_izq := r_izq;
loop
select into temp izq from pba where izq = r2_izq;
if temp is null then
exit;
end if;
r_izq:= racional_obt_mitad ( padre.izq, r_izq );
r2_izq=r_izq;
end loop;

new.izq = r_izq;
new.der = obt_derecho(new.padre,new.izq);
-- raise notice 'salio';
return new;
END;
$$ LANGUAGE 'plpgsql';

cuando ejecuto la siguiente consulta:

aeevrm=# insert into pba( padre )
select j.izq::racional from obt_rama( '(2,3)', 'pba') as j,
obt_nivel('(16,17)', '(1,1)') nivel_tpadre
where nivel_tpadre = obt_nivel(j.izq, j.der);

obtengo los siguientes mensajes (por los notices que tengo en el trigger):

NOTICE: pba_inserta_farey. El padre que se esta buscando es: (424811,
540271)
NOTICE: pba_inserta_farey. El padre que se esta buscando es: (66529, 79435)
ERROR: pba_inserta_farey. El padre (66529, 79435) no existe en pba

si yo hago la siguiente consulta:
aeevrm=# select * from pba where izq = '(424811, 540271)';
padre | izq | der
------------------+------------------+------------------
(126093, 160364) | (424811, 540271) | (298718, 379907)
(1 fila)

pero si hago:

aeevrm=# select * from pba where izq = '(66529, 79435)';
padre | izq | der
-------+-----+-----
(0 filas)

y luego:
aeevrm=# REINDEX TABLE pba;
REINDEX
aeevrm=# select * from pba where izq = '(66529, 79435)';
padre | izq | der
----------------+----------------+----------------
(19769, 23604) | (66529, 79435) | (46760, 55831)
(1 fila)

entonces mi problema es el indice.... esta corrupto ... pero estoy ante una
limitante de postgres o ante un error de programacion?

Estoy seguro que tengo un error de programación que pudiera ser entre las
librerias del racional o las que genera el codigo de farey. Pero no se como
encontrarlo ... existe alguna libreria que me permita hacer un debug?

alguna idea????

gracias de antemano

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2008-12-12 18:47:24 Re: funcion plpgsql .... corrupcion de indice
Previous Message Claudio Gajardo Garrido 2008-12-12 17:17:49 Re: Select desde ASP