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
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 |