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