mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
more decimail bugs fixed
This commit is contained in:
@ -585,7 +585,7 @@ int decimal2bin(decimal *from, char *to, int precision, int frac)
|
|||||||
{
|
{
|
||||||
dec1 mask=from->sign ? -1 : 0, *buf1=from->buf, *stop1;
|
dec1 mask=from->sign ? -1 : 0, *buf1=from->buf, *stop1;
|
||||||
int error=E_DEC_OK, intg=precision-frac,
|
int error=E_DEC_OK, intg=precision-frac,
|
||||||
isize1, intg1, intg1x=from->intg,
|
isize1, intg1, intg1x, from_intg=from->intg,
|
||||||
intg0=intg/DIG_PER_DEC1,
|
intg0=intg/DIG_PER_DEC1,
|
||||||
frac0=frac/DIG_PER_DEC1,
|
frac0=frac/DIG_PER_DEC1,
|
||||||
intg0x=intg-intg0*DIG_PER_DEC1,
|
intg0x=intg-intg0*DIG_PER_DEC1,
|
||||||
@ -597,33 +597,33 @@ int decimal2bin(decimal *from, char *to, int precision, int frac)
|
|||||||
fsize1=frac1*sizeof(dec1)+dig2bytes[frac1x];
|
fsize1=frac1*sizeof(dec1)+dig2bytes[frac1x];
|
||||||
|
|
||||||
/* removing leading zeroes */
|
/* removing leading zeroes */
|
||||||
intg1=((intg1x-1) % DIG_PER_DEC1)+1;
|
intg1=((from_intg-1) % DIG_PER_DEC1)+1;
|
||||||
while (intg1x > 0 && *buf1 == 0)
|
while (from_intg > 0 && *buf1 == 0)
|
||||||
{
|
{
|
||||||
intg1x-=intg1;
|
from_intg-=intg1;
|
||||||
intg1=DIG_PER_DEC1;
|
intg1=DIG_PER_DEC1;
|
||||||
buf1++;
|
buf1++;
|
||||||
}
|
}
|
||||||
if (intg1x > 0)
|
if (from_intg > 0)
|
||||||
{
|
{
|
||||||
for (intg1=(intg1x-1) % DIG_PER_DEC1; *buf1 < powers10[intg1--]; intg1x--) ;
|
for (intg1=(from_intg-1) % DIG_PER_DEC1; *buf1 < powers10[intg1--]; from_intg--) ;
|
||||||
DBUG_ASSERT(intg1x > 0);
|
DBUG_ASSERT(from_intg > 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
intg1x=0;
|
from_intg=0;
|
||||||
|
|
||||||
if (unlikely(intg1x+fsize1==0))
|
if (unlikely(from_intg+fsize1==0))
|
||||||
{
|
{
|
||||||
mask=0; /* just in case */
|
mask=0; /* just in case */
|
||||||
intg=1;
|
intg=1;
|
||||||
buf1=&mask;
|
buf1=&mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
intg1=intg1x/DIG_PER_DEC1;
|
intg1=from_intg/DIG_PER_DEC1;
|
||||||
intg1x=intg1x-intg1*DIG_PER_DEC1;
|
intg1x=from_intg-intg1*DIG_PER_DEC1;
|
||||||
isize1=intg1*sizeof(dec1)+dig2bytes[intg1x];
|
isize1=intg1*sizeof(dec1)+dig2bytes[intg1x];
|
||||||
|
|
||||||
if (isize0 < isize1)
|
if (intg < from_intg)
|
||||||
{
|
{
|
||||||
buf1+=intg1-intg0+(intg1x>0)-(intg0x>0);
|
buf1+=intg1-intg0+(intg1x>0)-(intg0x>0);
|
||||||
intg1=intg0; intg1x=intg0x;
|
intg1=intg0; intg1x=intg0x;
|
||||||
@ -873,7 +873,7 @@ int decimal_round(decimal *from, decimal *to, int scale, decimal_round_mode mode
|
|||||||
error=E_DEC_TRUNCATED;
|
error=E_DEC_TRUNCATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scale+from->intg <= 0)
|
if (scale+from->intg < 0)
|
||||||
{
|
{
|
||||||
decimal_make_zero(to);
|
decimal_make_zero(to);
|
||||||
return E_DEC_OK;
|
return E_DEC_OK;
|
||||||
@ -944,6 +944,16 @@ int decimal_round(decimal *from, decimal *to, int scale, decimal_round_mode mode
|
|||||||
to->intg++;
|
to->intg++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (unlikely(*buf1 == 0) && buf1 >= to->buf)
|
||||||
|
buf1--;
|
||||||
|
if (buf1 < to->buf)
|
||||||
|
{
|
||||||
|
decimal_make_zero(to);
|
||||||
|
return E_DEC_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (scale<0) scale=0;
|
if (scale<0) scale=0;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
@ -2028,6 +2038,7 @@ main()
|
|||||||
test_d2b2d(".12345000098765", 30, 20);
|
test_d2b2d(".12345000098765", 30, 20);
|
||||||
test_d2b2d("-.000000012345000098765", 30, 20);
|
test_d2b2d("-.000000012345000098765", 30, 20);
|
||||||
test_d2b2d("1234500009876.5", 30, 5);
|
test_d2b2d("1234500009876.5", 30, 5);
|
||||||
|
test_d2b2d("111111111.11", 10, 2);
|
||||||
|
|
||||||
printf("==== decimal_cmp ====\n");
|
printf("==== decimal_cmp ====\n");
|
||||||
test_dc("12","13");
|
test_dc("12","13");
|
||||||
@ -2076,7 +2087,6 @@ main()
|
|||||||
test_ro("999999999999999999999.999", 0, CEILING);
|
test_ro("999999999999999999999.999", 0, CEILING);
|
||||||
test_ro("-999999999999999999999.999", 0, FLOOR);
|
test_ro("-999999999999999999999.999", 0, FLOOR);
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user