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

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: "Silvio Quadri" <silvioq(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: funcion plpgsql .... corrupcion de indice
Date: 2008-12-12 22:10:51
Message-ID: c31298e50812121410ub34ff27td555c04b4fbb6e7a@mail.gmail.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
El 12 de diciembre de 2008 14:59, Alvaro Herrera
<alvherre(at)alvh(dot)no-ip(dot)org>escribió:

> Felipe de Jesús Molina Bravo escribió:
>
> > ya probe lo que acorde y sigue igual ... en cuanta a las dudas de la
> macro
> > de cmp, segun yo esta correcta ...
> >
> > #define Comparar(x,y) ((x)->num*(y)->den - (x)->den*(y)->num)
> >
> > si x= 3/4   y= 6/8 entonces
> >
> > Comparar(x,y)= (3*8) - (4*6) = 0
> >
> > si x= 3/4   y= 6/8 entonces
>
> Sigo pensando que esto no es necesariamente correcto, porque el btree
> necesita ser aún mas estricto.  Sin embargo
>
> > x=(57133/ 73908)  y= (363669/470447)
> >
> > Comparar = (57133*470447) - (73908*363669) = 26878048451 - 26878048452=
> -1
> >
> > mi duda es .... alguna multiplicacion de este tipo podria causar algun
> > desbordamiento en el tipo de datos ... no creen? ....lo dudo pero que
> > piensan ....
>
> Obviamente esto podría estar causando el problema.  Quizás deberías
> hacer las multiplicaciones en uint64, supongo que debería ser algo así
>
> #define Comparar(x,y) ((uint32) ((uint64)(x)->num* (uint64)(y)->den - \
>                                (uint64)(x)->den* (uint64)(y)->num))


ya lo probe y volvio a fallar .... pero hice lo que me indicastes en uno de
tus correos, comparando los numeradores y denominadores ... y funciono!!!! .
La forma en que  se me ocurrió implantar la comparación es la siguiente
(definitivamente la tengo que analizar un poco mas para expresarla de una
manera correcta y mantenible):

#define Comparar(x,y) ((x)->num*(y)->den - (x)->den*(y)->num)

static int racional_abs_cmp_internal(Racional * a, Racional * b){
           double amag;

 if ( ( a->num == b->num ) && ( a->den == b->den ) )
     return 0;

  if ( ( a->num > b->num ) && ( a->den > b->den ) )
     return -1;

  if ( ( a->num < b->num ) && ( a->den < b->den ) )
     return 1;

  if (  a->den < b->den   )
     return 1;

  if (  a->den > b->den   )
     return -1;

  if (  (a->num > b->num) && (a->den == b->den)  )
     return 1;

  if (  (a->num < b->num) && (a->den == b->den)  )
     return -1;

//por si me falto alguna regla.....

  amag = Comparar( a, b );
  if ( amag < 0 ) //a es menor que cero
    return -1;
  if ( amag > 0 ) //a es mayor que b
    return 1;
  return 0; //son iguales
}

En cuanto la termine la posteo

Alvaro y a todos los que contribuyeron... muchas gracias ... definitivamente
por gente como tu y los que participan en esta lista, postgres esta entre
las mejores bases de datos...

Seguimos....




>
>
> --
> Alvaro Herrera
> http://www.flickr.com/photos/alvherre/
> "Las cosas son buenas o malas segun las hace nuestra opinión" (Lisias)
>

In response to

Responses

pgsql-es-ayuda by date

Next:From: M CDate: 2008-12-12 22:27:18
Subject: Obtener el valor de un campo serial luego de un insert
Previous:From: Edwin QuijadaDate: 2008-12-12 21:01:34
Subject: RE: Mejoras del diseño de la DB con PostgreSQL

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