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

Responder a